Changeset 9c8c8a6


Ignore:
Timestamp:
Jul 10, 2015, 2:34:48 AM (4 years ago)
Author:
Paul Brossier <piem@piem.org>
Branches:
feature/autosink, feature/constantq, feature/pitchshift, feature/pydocstrings, feature/timestretch, master, pitchshift, sampler, timestretch, yinfft+
Children:
0e362b5
Parents:
31a09d2
Message:

ext/py-musicutils.c: add level_detection (closes #21)

Location:
python
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • python/ext/aubiomodule.c

    r31a09d2 r9c8c8a6  
    244244  {"db_spl", Py_aubio_db_spl, METH_VARARGS, Py_aubio_db_spl_doc},
    245245  {"silence_detection", Py_aubio_silence_detection, METH_VARARGS, Py_aubio_silence_detection_doc},
     246  {"level_detection", Py_aubio_level_detection, METH_VARARGS, Py_aubio_level_detection_doc},
    246247  {"window", Py_aubio_window, METH_VARARGS, Py_aubio_window_doc},
    247248  {NULL, NULL} /* Sentinel */
  • python/ext/py-musicutils.c

    r31a09d2 r9c8c8a6  
    112112  return silence_detection;
    113113}
     114
     115PyObject *
     116Py_aubio_level_detection(PyObject *self, PyObject *args)
     117{
     118  PyObject *input;
     119  fvec_t *vec;
     120  PyObject *level_detection;
     121  smpl_t threshold;
     122
     123  if (!PyArg_ParseTuple (args, "Of:level_detection", &input, &threshold)) {
     124    PyErr_SetString (PyExc_ValueError, "failed parsing arguments");
     125    return NULL;
     126  }
     127
     128  if (input == NULL) {
     129    return NULL;
     130  }
     131
     132  vec = PyAubio_ArrayToCFvec (input);
     133  if (vec == NULL) {
     134    return NULL;
     135  }
     136
     137  level_detection = Py_BuildValue("f", aubio_level_detection(vec, threshold));
     138  if (level_detection == NULL) {
     139    PyErr_SetString (PyExc_ValueError, "failed computing level_detection");
     140    return NULL;
     141  }
     142
     143  return level_detection;
     144}
  • python/ext/py-musicutils.h

    r31a09d2 r9c8c8a6  
    6060PyObject * Py_aubio_silence_detection(PyObject *self, PyObject *args);
    6161
     62static char Py_aubio_level_detection_doc[] = ""
     63"Get buffer level in dB SPL if over a given threshold, 1. otherwise.\n"
     64"\n"
     65"Example\n"
     66"-------\n"
     67"\n"
     68">>> import numpy\n"""
     69">>> level_detection(0.7*numpy.ones(1024, dtype=\"float32\"), -80)\n"
     70"0";
     71
     72PyObject * Py_aubio_level_detection(PyObject *self, PyObject *args);
     73
    6274#endif /* _PY_AUBIO_MUSICUTILS_H_ */
  • python/tests/test_musicutils.py

    r31a09d2 r9c8c8a6  
    66from math import pi
    77
    8 from aubio import window, level_lin, db_spl, silence_detection
     8from aubio import window, level_lin, db_spl, silence_detection, level_detection
    99
    1010from aubio import fvec
     
    9696        assert silence_detection(ones(1024, dtype="float32"), -70) == 0
    9797
     98class aubio_level_detection(TestCase):
     99    def test_accept_fvec(self):
     100        level_detection(fvec(1024), -70.)
     101
     102    def test_fail_not_fvec(self):
     103        try:
     104            level_detection("default", -70)
     105        except ValueError, e:
     106            pass
     107        else:
     108            self.fail('non-number input phase does not raise a TypeError')
     109
     110    def test_zeros_is_one(self):
     111        from math import isinf
     112        assert level_detection(fvec(1024), -70) == 1
     113
     114    def test_minus_ones_is_zero(self):
     115        from numpy import ones
     116        assert level_detection(ones(1024, dtype="float32"), -70) == 0
     117
    98118if __name__ == '__main__':
    99119    from unittest import main
Note: See TracChangeset for help on using the changeset viewer.