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