adamstark@46: #include adamstark@46: #include adamstark@46: #include "../src/OnsetDetectionFunction.h" adamstark@46: #include "../src/BTrack.h" adamstark@46: #include adamstark@46: adamstark@46: static PyObject * btrack_onsetdf(PyObject *dummy, PyObject *args) adamstark@46: { adamstark@46: PyObject *arg1=NULL; adamstark@46: PyObject *arr1=NULL; adamstark@46: adamstark@46: if (!PyArg_ParseTuple(args, "O", &arg1)) adamstark@46: { adamstark@46: return NULL; adamstark@46: } adamstark@46: adamstark@46: arr1 = PyArray_FROM_OTF(arg1, NPY_DOUBLE, NPY_IN_ARRAY); adamstark@46: if (arr1 == NULL) adamstark@46: { adamstark@46: return NULL; adamstark@46: } adamstark@46: adamstark@46: adamstark@46: adamstark@46: ////////// GET INPUT DATA /////////////////// adamstark@46: adamstark@46: // get data as array adamstark@46: double* data = (double*) PyArray_DATA(arr1); adamstark@46: adamstark@46: // get array size adamstark@46: int signal_length = PyArray_Size((PyObject*)arr1); adamstark@46: //int k = (int) theSize; adamstark@46: adamstark@46: // get data type adamstark@46: char type = PyArray_DESCR(arr1)->type; adamstark@46: adamstark@46: ////////// BEGIN PROCESS /////////////////// adamstark@46: int hsize = 512; adamstark@46: int fsize = 1024; adamstark@46: int df_type = 6; adamstark@46: int numframes; adamstark@46: double buffer[hsize]; // buffer to hold one hopsize worth of audio samples adamstark@46: adamstark@46: adamstark@46: // get number of audio frames, given the hop size and signal length adamstark@46: numframes = (int) floor(((double) signal_length) / ((double) hsize)); adamstark@46: adamstark@46: OnsetDetectionFunction onset(hsize,fsize,df_type,1); adamstark@46: adamstark@46: double df[numframes]; adamstark@46: adamstark@46: adamstark@46: adamstark@46: /////////////////////////////////////////// adamstark@46: //////// Begin Processing Loop //////////// adamstark@46: adamstark@46: for (int i=0;i < numframes;i++) adamstark@46: { adamstark@46: // add new samples to frame adamstark@46: for (int n = 0;n < hsize;n++) adamstark@46: { adamstark@46: buffer[n] = data[(i*hsize)+n]; adamstark@46: } adamstark@46: adamstark@46: df[i] = onset.getDFsample(buffer); adamstark@46: adamstark@46: } adamstark@46: adamstark@46: ///////// End Processing Loop ///////////// adamstark@46: /////////////////////////////////////////// adamstark@46: adamstark@46: adamstark@46: ////////// END PROCESS /////////////////// adamstark@46: adamstark@46: adamstark@46: adamstark@46: ////////// CREATE ARRAY AND RETURN IT /////////////////// adamstark@46: int nd=1; adamstark@46: npy_intp m= numframes; adamstark@46: //double fArray[5] = {0,1,2,3,4}; adamstark@46: adamstark@46: PyObject* c=PyArray_SimpleNew(nd, &m, NPY_DOUBLE); adamstark@46: adamstark@46: void *arr_data = PyArray_DATA((PyArrayObject*)c); adamstark@46: adamstark@46: memcpy(arr_data, df, PyArray_ITEMSIZE((PyArrayObject*) c) * m); adamstark@46: adamstark@46: adamstark@46: Py_DECREF(arr1); adamstark@46: Py_INCREF(Py_None); adamstark@46: //return Py_None; adamstark@46: adamstark@46: return (PyObject *)c; adamstark@46: adamstark@46: //return Py_BuildValue("c", type); adamstark@46: //return Py_BuildValue("d", sum); adamstark@46: //return Py_BuildValue("i", k); adamstark@46: /* adamstark@46: fail: adamstark@46: Py_XDECREF(arr1); adamstark@46: Py_XDECREF(arr2); adamstark@46: PyArray_XDECREF_ERR(oarr); adamstark@46: return NULL;*/ adamstark@46: } adamstark@46: adamstark@46: adamstark@46: static PyObject * btrack_btrack(PyObject *dummy, PyObject *args) adamstark@46: { adamstark@46: PyObject *arg1=NULL; adamstark@46: PyObject *arr1=NULL; adamstark@46: adamstark@46: if (!PyArg_ParseTuple(args, "O", &arg1)) adamstark@46: { adamstark@46: return NULL; adamstark@46: } adamstark@46: adamstark@46: arr1 = PyArray_FROM_OTF(arg1, NPY_DOUBLE, NPY_IN_ARRAY); adamstark@46: if (arr1 == NULL) adamstark@46: { adamstark@46: return NULL; adamstark@46: } adamstark@46: adamstark@46: adamstark@46: adamstark@46: ////////// GET INPUT DATA /////////////////// adamstark@46: adamstark@46: // get data as array adamstark@46: double* data = (double*) PyArray_DATA(arr1); adamstark@46: adamstark@46: // get array size adamstark@46: int signal_length = PyArray_Size((PyObject*)arr1); adamstark@46: //int k = (int) theSize; adamstark@46: adamstark@46: // get data type adamstark@46: char type = PyArray_DESCR(arr1)->type; adamstark@46: adamstark@46: ////////// BEGIN PROCESS /////////////////// adamstark@46: int hsize = 512; adamstark@46: int fsize = 1024; adamstark@46: int df_type = 6; adamstark@46: int numframes; adamstark@46: double buffer[hsize]; // buffer to hold one hopsize worth of audio samples adamstark@46: adamstark@46: adamstark@46: // get number of audio frames, given the hop size and signal length adamstark@46: numframes = (int) floor(((double) signal_length) / ((double) hsize)); adamstark@46: adamstark@46: OnsetDetectionFunction onset(hsize,fsize,df_type,1); adamstark@46: BTrack b; adamstark@46: adamstark@46: b.initialise((int) hsize); // initialise beat tracker adamstark@46: adamstark@46: // set parameters adamstark@46: //b.setparams(0.9,5); adamstark@46: adamstark@46: double df[numframes]; adamstark@46: double beats[5000]; adamstark@46: int beatnum = 0; adamstark@46: float df_val; adamstark@46: adamstark@46: /////////////////////////////////////////// adamstark@46: //////// Begin Processing Loop //////////// adamstark@46: adamstark@46: for (int i=0;i < numframes;i++) adamstark@46: { adamstark@46: // add new samples to frame adamstark@46: for (int n = 0;n < hsize;n++) adamstark@46: { adamstark@46: buffer[n] = data[(i*hsize)+n]; adamstark@46: } adamstark@46: adamstark@46: df[i] = onset.getDFsample(buffer); adamstark@46: adamstark@46: df_val = (float) (df[i] + 0.0001); adamstark@46: adamstark@46: b.process(df_val); // process df sample in beat tracker adamstark@46: adamstark@46: if (b.playbeat == 1) adamstark@46: { adamstark@46: beats[beatnum] = (((double) hsize) / 44100) * ((double) i); adamstark@46: beatnum = beatnum + 1; adamstark@46: } adamstark@46: adamstark@46: } adamstark@46: adamstark@46: ///////// End Processing Loop ///////////// adamstark@46: /////////////////////////////////////////// adamstark@46: adamstark@46: adamstark@46: ////////// END PROCESS /////////////////// adamstark@46: adamstark@46: double beats_out[beatnum]; // create output array adamstark@46: adamstark@46: // copy beats into output array adamstark@46: for (int i = 0;i < beatnum;i++) adamstark@46: { adamstark@46: beats_out[i] = beats[i]; adamstark@46: } adamstark@46: adamstark@46: adamstark@46: adamstark@46: ////////// CREATE ARRAY AND RETURN IT /////////////////// adamstark@46: int nd=1; adamstark@46: npy_intp m= beatnum; adamstark@46: //double fArray[5] = {0,1,2,3,4}; adamstark@46: adamstark@46: PyObject* c=PyArray_SimpleNew(nd, &m, NPY_DOUBLE); adamstark@46: adamstark@46: void *arr_data = PyArray_DATA((PyArrayObject*)c); adamstark@46: adamstark@46: memcpy(arr_data, beats_out, PyArray_ITEMSIZE((PyArrayObject*) c) * m); adamstark@46: adamstark@46: adamstark@46: Py_DECREF(arr1); adamstark@46: Py_INCREF(Py_None); adamstark@46: //return Py_None; adamstark@46: adamstark@46: return (PyObject *)c; adamstark@46: adamstark@46: //return Py_BuildValue("c", type); adamstark@46: //return Py_BuildValue("d", sum); adamstark@46: //return Py_BuildValue("i", k); adamstark@46: /* adamstark@46: fail: adamstark@46: Py_XDECREF(arr1); adamstark@46: Py_XDECREF(arr2); adamstark@46: PyArray_XDECREF_ERR(oarr); adamstark@46: return NULL;*/ adamstark@46: } adamstark@46: adamstark@46: static PyObject * btrack_btrack_df(PyObject *dummy, PyObject *args) adamstark@46: { adamstark@46: PyObject *arg1=NULL; adamstark@46: PyObject *arr1=NULL; adamstark@46: adamstark@46: if (!PyArg_ParseTuple(args, "O", &arg1)) adamstark@46: { adamstark@46: return NULL; adamstark@46: } adamstark@46: adamstark@46: arr1 = PyArray_FROM_OTF(arg1, NPY_DOUBLE, NPY_IN_ARRAY); adamstark@46: if (arr1 == NULL) adamstark@46: { adamstark@46: return NULL; adamstark@46: } adamstark@46: adamstark@46: adamstark@46: adamstark@46: ////////// GET INPUT DATA /////////////////// adamstark@46: adamstark@46: // get data as array adamstark@46: double* data = (double*) PyArray_DATA(arr1); adamstark@46: adamstark@46: // get array size adamstark@46: int numframes = PyArray_Size((PyObject*)arr1); adamstark@46: //int k = (int) theSize; adamstark@46: adamstark@46: // get data type adamstark@46: char type = PyArray_DESCR(arr1)->type; adamstark@46: adamstark@46: ////////// BEGIN PROCESS /////////////////// adamstark@46: int hsize = 512; adamstark@46: adamstark@46: BTrack b; adamstark@46: adamstark@46: b.initialise((int) hsize); // initialise beat tracker adamstark@46: adamstark@46: // set parameters adamstark@46: //b.setparams(0.9,5); adamstark@46: adamstark@46: double beats[5000]; adamstark@46: int beatnum = 0; adamstark@46: float df_val; adamstark@46: adamstark@46: /////////////////////////////////////////// adamstark@46: //////// Begin Processing Loop //////////// adamstark@46: adamstark@46: for (int i=0;i < numframes;i++) adamstark@46: { adamstark@46: df_val = (float) (data[i] + 0.0001); adamstark@46: adamstark@46: b.process(df_val); // process df sample in beat tracker adamstark@46: adamstark@46: if (b.playbeat == 1) adamstark@46: { adamstark@46: beats[beatnum] = (((double) hsize) / 44100) * ((double) i); adamstark@46: beatnum = beatnum + 1; adamstark@46: } adamstark@46: adamstark@46: } adamstark@46: adamstark@46: ///////// End Processing Loop ///////////// adamstark@46: /////////////////////////////////////////// adamstark@46: adamstark@46: adamstark@46: ////////// END PROCESS /////////////////// adamstark@46: adamstark@46: double beats_out[beatnum]; // create output array adamstark@46: adamstark@46: adamstark@46: // copy beats into output array adamstark@46: for (int i = 0;i < beatnum;i++) adamstark@46: { adamstark@46: beats_out[i] = beats[i]; adamstark@46: } adamstark@46: adamstark@46: adamstark@46: ////////// CREATE ARRAY AND RETURN IT /////////////////// adamstark@46: int nd=1; adamstark@46: npy_intp m= beatnum; adamstark@46: //double fArray[5] = {0,1,2,3,4}; adamstark@46: adamstark@46: PyObject* c=PyArray_SimpleNew(nd, &m, NPY_DOUBLE); adamstark@46: adamstark@46: void *arr_data = PyArray_DATA((PyArrayObject*)c); adamstark@46: adamstark@46: memcpy(arr_data, beats_out, PyArray_ITEMSIZE((PyArrayObject*) c) * m); adamstark@46: adamstark@46: adamstark@46: Py_DECREF(arr1); adamstark@46: Py_INCREF(Py_None); adamstark@46: //return Py_None; adamstark@46: adamstark@46: return (PyObject *)c; adamstark@46: adamstark@46: //return Py_BuildValue("c", type); adamstark@46: //return Py_BuildValue("d", sum); adamstark@46: //return Py_BuildValue("i", k); adamstark@46: /* adamstark@46: fail: adamstark@46: Py_XDECREF(arr1); adamstark@46: Py_XDECREF(arr2); adamstark@46: PyArray_XDECREF_ERR(oarr); adamstark@46: return NULL;*/ adamstark@46: } adamstark@46: adamstark@46: adamstark@46: adamstark@46: static PyMethodDef btrack_methods[] = { adamstark@46: { "onsetdf",btrack_onsetdf,METH_VARARGS,"onset detection function"}, adamstark@46: { "btrack",btrack_btrack,METH_VARARGS,"beat tracker"}, adamstark@46: { "btrack_df",btrack_btrack_df,METH_VARARGS,"beat tracker with detection function input"}, adamstark@46: {NULL, NULL, 0, NULL} /* Sentinel */ adamstark@46: }; adamstark@46: adamstark@46: PyMODINIT_FUNC initbtrack(void) adamstark@46: { adamstark@46: (void)Py_InitModule("btrack", btrack_methods); adamstark@46: import_array(); adamstark@46: } adamstark@46: adamstark@46: int main(int argc, char *argv[]) adamstark@46: { adamstark@46: /* Pass argv[0] to the Python interpreter */ adamstark@46: Py_SetProgramName(argv[0]); adamstark@46: adamstark@46: /* Initialize the Python interpreter. Required. */ adamstark@46: Py_Initialize(); adamstark@46: adamstark@46: /* Add a static module */ adamstark@46: initbtrack(); adamstark@46: }