ref: 5a7e2c3a1b79adc7f15e9eb3e6614349e431cfa9
parent: efa62ce685043ab3a0195b2e7477c02521f77b14
author: Paul Brossier <piem@piem.org>
date: Thu Jul 9 21:51:25 EDT 2015
ext/py-musicutils.c: add level_lin
--- a/python/ext/aubiomodule.c
+++ b/python/ext/aubiomodule.c
@@ -240,6 +240,7 @@
{"alpha_norm", Py_alpha_norm, METH_VARARGS, Py_alpha_norm_doc},
{"zero_crossing_rate", Py_zero_crossing_rate, METH_VARARGS, Py_zero_crossing_rate_doc},
{"min_removal", Py_min_removal, METH_VARARGS, Py_min_removal_doc},
+ {"level_lin", Py_aubio_level_lin, METH_VARARGS, Py_aubio_level_lin_doc},
{"window", Py_aubio_window, METH_VARARGS, Py_aubio_window_doc},
{NULL, NULL} /* Sentinel */
};
--- a/python/ext/py-musicutils.c
+++ b/python/ext/py-musicutils.c
@@ -20,3 +20,33 @@
return (PyObject *) PyAubio_CFvecToArray(window);
}
+
+PyObject *
+Py_aubio_level_lin(PyObject *self, PyObject *args)
+{
+ PyObject *input;
+ fvec_t *vec;
+ PyObject *level_lin;
+
+ if (!PyArg_ParseTuple (args, "O:level_lin", &input)) {
+ PyErr_SetString (PyExc_ValueError, "failed parsing arguments");
+ return NULL;
+ }
+
+ if (input == NULL) {
+ return NULL;
+ }
+
+ vec = PyAubio_ArrayToCFvec (input);
+ if (vec == NULL) {
+ return NULL;
+ }
+
+ level_lin = Py_BuildValue("f", aubio_level_lin(vec));
+ if (level_lin == NULL) {
+ PyErr_SetString (PyExc_ValueError, "failed computing level_lin");
+ return NULL;
+ }
+
+ return level_lin;
+}
--- a/python/tests/test_musicutils.py
+++ b/python/tests/test_musicutils.py
@@ -1,9 +1,14 @@
#! /usr/bin/env python
from numpy.testing import TestCase
-from numpy.testing.utils import assert_almost_equal
-from aubio import window
+from numpy.testing.utils import assert_equal, assert_almost_equal
+from numpy import cos, arange
+from math import pi
+from aubio import window, level_lin
+
+from aubio import fvec
+
class aubio_window(TestCase):
def test_accept_name_and_size(self):
@@ -26,12 +31,29 @@
self.fail('non-integer window length does not raise a ValueError')
def test_compute_hanning_1024(self):
- from numpy import cos, arange
- from math import pi
size = 1024
aubio_window = window("hanning", size)
numpy_window = .5 - .5 * cos(2. * pi * arange(size) / size)
assert_almost_equal(aubio_window, numpy_window)
+
+class aubio_level_lin(TestCase):
+ def test_accept_fvec(self):
+ level_lin(fvec(1024))
+
+ def test_fail_not_fvec(self):
+ try:
+ level_lin("default")
+ except ValueError, e:
+ pass
+ else:
+ self.fail('non-number input phase does not raise a TypeError')
+
+ def test_zeros_is_zeros(self):
+ assert_equal(level_lin(fvec(1024)), 0.)
+
+ def test_minus_ones_is_one(self):
+ from numpy import ones
+ assert_equal(level_lin(-ones(1024, dtype="float32")), 1.)
if __name__ == '__main__':
from unittest import main