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) {
26 PyErr_SetString (PyExc_ValueError, "input array is not a python object");
29 // parsing input object into a Py_fvec
30 if (PyArray_Check(input)) {
32 // we got an array, convert it to an fvec
33 if (PyArray_NDIM ((PyArrayObject *)input) == 0) {
34 PyErr_SetString (PyExc_ValueError, "input array is a scalar");
36 } else if (PyArray_NDIM ((PyArrayObject *)input) > 1) {
37 PyErr_SetString (PyExc_ValueError,
38 "input array has more than one dimensions");
42 if (!PyArray_ISFLOAT ((PyArrayObject *)input)) {
43 PyErr_SetString (PyExc_ValueError, "input array should be float");
45 } else if (PyArray_TYPE ((PyArrayObject *)input) != AUBIO_NPY_SMPL) {
46 PyErr_SetString (PyExc_ValueError, "input array should be " AUBIO_NPY_SMPL_STR);
50 length = PyArray_SIZE ((PyArrayObject *)input);
52 PyErr_SetString (PyExc_ValueError, "input array size should be greater than 0");
56 } else if (PyObject_TypeCheck (input, &PyList_Type)) {
57 PyErr_SetString (PyExc_ValueError, "does not convert from list yet");
60 PyErr_SetString (PyExc_ValueError, "can only accept vector of float as input");
67 PyAubio_ArrayToCFvec (PyObject *input, fvec_t *out) {
69 if (!PyAubio_IsValidVector(input)){
73 out->length = (uint_t) PyArray_SIZE ((PyArrayObject *)input);
74 out->data = (smpl_t *) PyArray_GETPTR1 ((PyArrayObject *)input, 0);
79 PyAubio_CFmatToArray (fmat_t * input)
81 PyObject *array = NULL;
83 npy_intp dims[] = { input->length, 1 };
84 PyObject *concat = PyList_New (0), *tmp = NULL;
85 for (i = 0; i < input->height; i++) {
86 tmp = PyArray_SimpleNewFromData (1, dims, AUBIO_NPY_SMPL, input->data[i]);
87 PyList_Append (concat, tmp);
90 array = PyArray_FromObject (concat, AUBIO_NPY_SMPL, 2, 2);
96 PyAubio_ArrayToCFmat (PyObject *input, fmat_t *mat) {
98 npy_intp length, height;
100 PyErr_SetString (PyExc_ValueError, "input array is not a python object");
103 // parsing input object into a Py_fvec
104 if (PyArray_Check(input)) {
106 // we got an array, convert it to an fvec
107 if (PyArray_NDIM ((PyArrayObject *)input) == 0) {
108 PyErr_SetString (PyExc_ValueError, "input array is a scalar");
110 } else if (PyArray_NDIM ((PyArrayObject *)input) > 2) {
111 PyErr_SetString (PyExc_ValueError,
112 "input array has more than two dimensions");
116 if (!PyArray_ISFLOAT ((PyArrayObject *)input)) {
117 PyErr_SetString (PyExc_ValueError, "input array should be float");
119 } else if (PyArray_TYPE ((PyArrayObject *)input) != AUBIO_NPY_SMPL) {
120 PyErr_SetString (PyExc_ValueError, "input array should be " AUBIO_NPY_SMPL_STR);
124 // no need to really allocate fvec, just its struct member
125 length = PyArray_DIM ((PyArrayObject *)input, 1);
127 PyErr_SetString (PyExc_ValueError, "input array dimension 1 should be greater than 0");
130 height = PyArray_DIM ((PyArrayObject *)input, 0);
132 PyErr_SetString (PyExc_ValueError, "input array dimension 0 should be greater than 0");
136 } else if (PyObject_TypeCheck (input, &PyList_Type)) {
137 PyErr_SetString (PyExc_ValueError, "can not convert list to fmat");
140 PyErr_SetString (PyExc_ValueError, "can only accept matrix of float as input");
144 new_height = (uint_t)PyArray_DIM ((PyArrayObject *)input, 0);
145 if (mat->height != new_height) {
149 mat->data = (smpl_t **)malloc(sizeof(smpl_t*) * new_height);
152 mat->height = new_height;
153 mat->length = (uint_t)PyArray_DIM ((PyArrayObject *)input, 1);
154 for (i=0; i< mat->height; i++) {
155 mat->data[i] = (smpl_t*)PyArray_GETPTR1 ((PyArrayObject *)input, i);