1 #include "aubio-types.h"
4 new_py_fvec(uint_t length) {
5 npy_intp dims[] = { length, 1 };
6 return PyArray_ZEROS(1, dims, AUBIO_NPY_SMPL, 0);
10 new_py_fmat(uint_t height, uint_t length) {
11 npy_intp dims[] = { height, length, 1 };
12 return PyArray_ZEROS(2, dims, AUBIO_NPY_SMPL, 0);
16 PyAubio_CFvecToArray (fvec_t * self)
18 npy_intp dims[] = { self->length, 1 };
19 return PyArray_SimpleNewFromData (1, dims, AUBIO_NPY_SMPL, self->data);
23 PyAubio_IsValidVector (PyObject * input) {
25 PyErr_SetString (PyExc_ValueError, "input array is not a python object");
28 // parsing input object into a Py_fvec
29 if (PyArray_Check(input)) {
31 // we got an array, convert it to an fvec
32 if (PyArray_NDIM ((PyArrayObject *)input) == 0) {
33 PyErr_SetString (PyExc_ValueError, "input array is a scalar");
35 } else if (PyArray_NDIM ((PyArrayObject *)input) > 1) {
36 PyErr_SetString (PyExc_ValueError,
37 "input array has more than one dimensions");
41 if (!PyArray_ISFLOAT ((PyArrayObject *)input)) {
42 PyErr_SetString (PyExc_ValueError, "input array should be float");
44 } else if (PyArray_TYPE ((PyArrayObject *)input) != AUBIO_NPY_SMPL) {
45 PyErr_SetString (PyExc_ValueError, "input array should be " AUBIO_NPY_SMPL_STR);
49 long length = PyArray_SIZE ((PyArrayObject *)input);
51 PyErr_SetString (PyExc_ValueError, "input array size should be greater than 0");
55 } else if (PyObject_TypeCheck (input, &PyList_Type)) {
56 PyErr_SetString (PyExc_ValueError, "does not convert from list yet");
59 PyErr_SetString (PyExc_ValueError, "can only accept vector of float as input");
66 PyAubio_ArrayToCFvec (PyObject *input, fvec_t *out) {
68 if (!PyAubio_IsValidVector(input)){
72 out->length = (uint_t) PyArray_SIZE ((PyArrayObject *)input);
73 out->data = (smpl_t *) PyArray_GETPTR1 ((PyArrayObject *)input, 0);
78 PyAubio_CFmatToArray (fmat_t * input)
80 PyObject *array = NULL;
82 npy_intp dims[] = { input->length, 1 };
83 PyObject *concat = PyList_New (0), *tmp = NULL;
84 for (i = 0; i < input->height; i++) {
85 tmp = PyArray_SimpleNewFromData (1, dims, AUBIO_NPY_SMPL, input->data[i]);
86 PyList_Append (concat, tmp);
89 array = PyArray_FromObject (concat, AUBIO_NPY_SMPL, 2, 2);
95 PyAubio_ArrayToCFmat (PyObject *input, fmat_t *mat) {
98 PyErr_SetString (PyExc_ValueError, "input array is not a python object");
101 // parsing input object into a Py_fvec
102 if (PyArray_Check(input)) {
104 // we got an array, convert it to an fvec
105 if (PyArray_NDIM ((PyArrayObject *)input) == 0) {
106 PyErr_SetString (PyExc_ValueError, "input array is a scalar");
108 } else if (PyArray_NDIM ((PyArrayObject *)input) > 2) {
109 PyErr_SetString (PyExc_ValueError,
110 "input array has more than two dimensions");
114 if (!PyArray_ISFLOAT ((PyArrayObject *)input)) {
115 PyErr_SetString (PyExc_ValueError, "input array should be float");
117 } else if (PyArray_TYPE ((PyArrayObject *)input) != AUBIO_NPY_SMPL) {
118 PyErr_SetString (PyExc_ValueError, "input array should be " AUBIO_NPY_SMPL_STR);
122 // no need to really allocate fvec, just its struct member
123 long length = PyArray_DIM ((PyArrayObject *)input, 1);
125 PyErr_SetString (PyExc_ValueError, "input array dimension 1 should be greater than 0");
128 long height = PyArray_DIM ((PyArrayObject *)input, 0);
130 PyErr_SetString (PyExc_ValueError, "input array dimension 0 should be greater than 0");
134 } else if (PyObject_TypeCheck (input, &PyList_Type)) {
135 PyErr_SetString (PyExc_ValueError, "can not convert list to fmat");
138 PyErr_SetString (PyExc_ValueError, "can only accept matrix of float as input");
142 uint_t new_height = (uint_t)PyArray_DIM ((PyArrayObject *)input, 0);
143 if (mat->height != new_height) {
147 mat->data = (smpl_t **)malloc(sizeof(smpl_t*) * new_height);
150 mat->height = new_height;
151 mat->length = (uint_t)PyArray_DIM ((PyArrayObject *)input, 1);
152 for (i=0; i< mat->height; i++) {
153 mat->data[i] = (smpl_t*)PyArray_GETPTR1 ((PyArrayObject *)input, i);