annotate modules-and-plug-ins/python-module/btrack_python_module.cpp @ 51:68d01fea1e8d

Added a unit testing project, and did some commenting. Also moved python-module into a modules-and-plug-ins folder
author Adam Stark <adamstark@users.noreply.github.com>
date Tue, 21 Jan 2014 10:24:33 +0000
parents
children 2b94d3d2fb9d
rev   line source
adamstark@51 1 #include <iostream>
adamstark@51 2 #include <Python.h>
adamstark@51 3 #include "../../src/OnsetDetectionFunction.h"
adamstark@51 4 #include "../../src/BTrack.h"
adamstark@51 5 #include <numpy/arrayobject.h>
adamstark@51 6
adamstark@51 7 static PyObject * btrack_onsetdf(PyObject *dummy, PyObject *args)
adamstark@51 8 {
adamstark@51 9 PyObject *arg1=NULL;
adamstark@51 10 PyObject *arr1=NULL;
adamstark@51 11
adamstark@51 12 if (!PyArg_ParseTuple(args, "O", &arg1))
adamstark@51 13 {
adamstark@51 14 return NULL;
adamstark@51 15 }
adamstark@51 16
adamstark@51 17 arr1 = PyArray_FROM_OTF(arg1, NPY_DOUBLE, NPY_IN_ARRAY);
adamstark@51 18 if (arr1 == NULL)
adamstark@51 19 {
adamstark@51 20 return NULL;
adamstark@51 21 }
adamstark@51 22
adamstark@51 23
adamstark@51 24
adamstark@51 25 ////////// GET INPUT DATA ///////////////////
adamstark@51 26
adamstark@51 27 // get data as array
adamstark@51 28 double* data = (double*) PyArray_DATA(arr1);
adamstark@51 29
adamstark@51 30 // get array size
adamstark@51 31 int signal_length = PyArray_Size((PyObject*)arr1);
adamstark@51 32 //int k = (int) theSize;
adamstark@51 33
adamstark@51 34 // get data type
adamstark@51 35 char type = PyArray_DESCR(arr1)->type;
adamstark@51 36
adamstark@51 37 ////////// BEGIN PROCESS ///////////////////
adamstark@51 38 int hsize = 512;
adamstark@51 39 int fsize = 1024;
adamstark@51 40 int df_type = 6;
adamstark@51 41 int numframes;
adamstark@51 42 double buffer[hsize]; // buffer to hold one hopsize worth of audio samples
adamstark@51 43
adamstark@51 44
adamstark@51 45 // get number of audio frames, given the hop size and signal length
adamstark@51 46 numframes = (int) floor(((double) signal_length) / ((double) hsize));
adamstark@51 47
adamstark@51 48 OnsetDetectionFunction onset(hsize,fsize,df_type,1);
adamstark@51 49
adamstark@51 50 double df[numframes];
adamstark@51 51
adamstark@51 52
adamstark@51 53
adamstark@51 54 ///////////////////////////////////////////
adamstark@51 55 //////// Begin Processing Loop ////////////
adamstark@51 56
adamstark@51 57 for (int i=0;i < numframes;i++)
adamstark@51 58 {
adamstark@51 59 // add new samples to frame
adamstark@51 60 for (int n = 0;n < hsize;n++)
adamstark@51 61 {
adamstark@51 62 buffer[n] = data[(i*hsize)+n];
adamstark@51 63 }
adamstark@51 64
adamstark@51 65 df[i] = onset.getDFsample(buffer);
adamstark@51 66
adamstark@51 67 }
adamstark@51 68
adamstark@51 69 ///////// End Processing Loop /////////////
adamstark@51 70 ///////////////////////////////////////////
adamstark@51 71
adamstark@51 72
adamstark@51 73 ////////// END PROCESS ///////////////////
adamstark@51 74
adamstark@51 75
adamstark@51 76
adamstark@51 77 ////////// CREATE ARRAY AND RETURN IT ///////////////////
adamstark@51 78 int nd=1;
adamstark@51 79 npy_intp m= numframes;
adamstark@51 80 //double fArray[5] = {0,1,2,3,4};
adamstark@51 81
adamstark@51 82 PyObject* c=PyArray_SimpleNew(nd, &m, NPY_DOUBLE);
adamstark@51 83
adamstark@51 84 void *arr_data = PyArray_DATA((PyArrayObject*)c);
adamstark@51 85
adamstark@51 86 memcpy(arr_data, df, PyArray_ITEMSIZE((PyArrayObject*) c) * m);
adamstark@51 87
adamstark@51 88
adamstark@51 89 Py_DECREF(arr1);
adamstark@51 90 Py_INCREF(Py_None);
adamstark@51 91 //return Py_None;
adamstark@51 92
adamstark@51 93 return (PyObject *)c;
adamstark@51 94
adamstark@51 95 //return Py_BuildValue("c", type);
adamstark@51 96 //return Py_BuildValue("d", sum);
adamstark@51 97 //return Py_BuildValue("i", k);
adamstark@51 98 /*
adamstark@51 99 fail:
adamstark@51 100 Py_XDECREF(arr1);
adamstark@51 101 Py_XDECREF(arr2);
adamstark@51 102 PyArray_XDECREF_ERR(oarr);
adamstark@51 103 return NULL;*/
adamstark@51 104 }
adamstark@51 105
adamstark@51 106
adamstark@51 107 static PyObject * btrack_btrack(PyObject *dummy, PyObject *args)
adamstark@51 108 {
adamstark@51 109 PyObject *arg1=NULL;
adamstark@51 110 PyObject *arr1=NULL;
adamstark@51 111
adamstark@51 112 if (!PyArg_ParseTuple(args, "O", &arg1))
adamstark@51 113 {
adamstark@51 114 return NULL;
adamstark@51 115 }
adamstark@51 116
adamstark@51 117 arr1 = PyArray_FROM_OTF(arg1, NPY_DOUBLE, NPY_IN_ARRAY);
adamstark@51 118 if (arr1 == NULL)
adamstark@51 119 {
adamstark@51 120 return NULL;
adamstark@51 121 }
adamstark@51 122
adamstark@51 123
adamstark@51 124
adamstark@51 125 ////////// GET INPUT DATA ///////////////////
adamstark@51 126
adamstark@51 127 // get data as array
adamstark@51 128 double* data = (double*) PyArray_DATA(arr1);
adamstark@51 129
adamstark@51 130 // get array size
adamstark@51 131 int signal_length = PyArray_Size((PyObject*)arr1);
adamstark@51 132 //int k = (int) theSize;
adamstark@51 133
adamstark@51 134 // get data type
adamstark@51 135 char type = PyArray_DESCR(arr1)->type;
adamstark@51 136
adamstark@51 137 ////////// BEGIN PROCESS ///////////////////
adamstark@51 138 int hsize = 512;
adamstark@51 139 int fsize = 1024;
adamstark@51 140 int df_type = 6;
adamstark@51 141 int numframes;
adamstark@51 142 double buffer[hsize]; // buffer to hold one hopsize worth of audio samples
adamstark@51 143
adamstark@51 144
adamstark@51 145 // get number of audio frames, given the hop size and signal length
adamstark@51 146 numframes = (int) floor(((double) signal_length) / ((double) hsize));
adamstark@51 147
adamstark@51 148 OnsetDetectionFunction onset(hsize,fsize,df_type,1);
adamstark@51 149 BTrack b;
adamstark@51 150
adamstark@51 151 b.initialise((int) hsize); // initialise beat tracker
adamstark@51 152
adamstark@51 153 // set parameters
adamstark@51 154 //b.setparams(0.9,5);
adamstark@51 155
adamstark@51 156 double df[numframes];
adamstark@51 157 double beats[5000];
adamstark@51 158 int beatnum = 0;
adamstark@51 159 float df_val;
adamstark@51 160
adamstark@51 161 ///////////////////////////////////////////
adamstark@51 162 //////// Begin Processing Loop ////////////
adamstark@51 163
adamstark@51 164 for (int i=0;i < numframes;i++)
adamstark@51 165 {
adamstark@51 166 // add new samples to frame
adamstark@51 167 for (int n = 0;n < hsize;n++)
adamstark@51 168 {
adamstark@51 169 buffer[n] = data[(i*hsize)+n];
adamstark@51 170 }
adamstark@51 171
adamstark@51 172 df[i] = onset.getDFsample(buffer);
adamstark@51 173
adamstark@51 174 df_val = (float) (df[i] + 0.0001);
adamstark@51 175
adamstark@51 176 b.process(df_val); // process df sample in beat tracker
adamstark@51 177
adamstark@51 178 if (b.playbeat == 1)
adamstark@51 179 {
adamstark@51 180 beats[beatnum] = (((double) hsize) / 44100) * ((double) i);
adamstark@51 181 beatnum = beatnum + 1;
adamstark@51 182 }
adamstark@51 183
adamstark@51 184 }
adamstark@51 185
adamstark@51 186 ///////// End Processing Loop /////////////
adamstark@51 187 ///////////////////////////////////////////
adamstark@51 188
adamstark@51 189
adamstark@51 190 ////////// END PROCESS ///////////////////
adamstark@51 191
adamstark@51 192 double beats_out[beatnum]; // create output array
adamstark@51 193
adamstark@51 194 // copy beats into output array
adamstark@51 195 for (int i = 0;i < beatnum;i++)
adamstark@51 196 {
adamstark@51 197 beats_out[i] = beats[i];
adamstark@51 198 }
adamstark@51 199
adamstark@51 200
adamstark@51 201
adamstark@51 202 ////////// CREATE ARRAY AND RETURN IT ///////////////////
adamstark@51 203 int nd=1;
adamstark@51 204 npy_intp m= beatnum;
adamstark@51 205 //double fArray[5] = {0,1,2,3,4};
adamstark@51 206
adamstark@51 207 PyObject* c=PyArray_SimpleNew(nd, &m, NPY_DOUBLE);
adamstark@51 208
adamstark@51 209 void *arr_data = PyArray_DATA((PyArrayObject*)c);
adamstark@51 210
adamstark@51 211 memcpy(arr_data, beats_out, PyArray_ITEMSIZE((PyArrayObject*) c) * m);
adamstark@51 212
adamstark@51 213
adamstark@51 214 Py_DECREF(arr1);
adamstark@51 215 Py_INCREF(Py_None);
adamstark@51 216 //return Py_None;
adamstark@51 217
adamstark@51 218 return (PyObject *)c;
adamstark@51 219
adamstark@51 220 //return Py_BuildValue("c", type);
adamstark@51 221 //return Py_BuildValue("d", sum);
adamstark@51 222 //return Py_BuildValue("i", k);
adamstark@51 223 /*
adamstark@51 224 fail:
adamstark@51 225 Py_XDECREF(arr1);
adamstark@51 226 Py_XDECREF(arr2);
adamstark@51 227 PyArray_XDECREF_ERR(oarr);
adamstark@51 228 return NULL;*/
adamstark@51 229 }
adamstark@51 230
adamstark@51 231 static PyObject * btrack_btrack_df(PyObject *dummy, PyObject *args)
adamstark@51 232 {
adamstark@51 233 PyObject *arg1=NULL;
adamstark@51 234 PyObject *arr1=NULL;
adamstark@51 235
adamstark@51 236 if (!PyArg_ParseTuple(args, "O", &arg1))
adamstark@51 237 {
adamstark@51 238 return NULL;
adamstark@51 239 }
adamstark@51 240
adamstark@51 241 arr1 = PyArray_FROM_OTF(arg1, NPY_DOUBLE, NPY_IN_ARRAY);
adamstark@51 242 if (arr1 == NULL)
adamstark@51 243 {
adamstark@51 244 return NULL;
adamstark@51 245 }
adamstark@51 246
adamstark@51 247
adamstark@51 248
adamstark@51 249 ////////// GET INPUT DATA ///////////////////
adamstark@51 250
adamstark@51 251 // get data as array
adamstark@51 252 double* data = (double*) PyArray_DATA(arr1);
adamstark@51 253
adamstark@51 254 // get array size
adamstark@51 255 int numframes = PyArray_Size((PyObject*)arr1);
adamstark@51 256 //int k = (int) theSize;
adamstark@51 257
adamstark@51 258 // get data type
adamstark@51 259 char type = PyArray_DESCR(arr1)->type;
adamstark@51 260
adamstark@51 261 ////////// BEGIN PROCESS ///////////////////
adamstark@51 262 int hsize = 512;
adamstark@51 263
adamstark@51 264 BTrack b;
adamstark@51 265
adamstark@51 266 b.initialise((int) hsize); // initialise beat tracker
adamstark@51 267
adamstark@51 268 // set parameters
adamstark@51 269 //b.setparams(0.9,5);
adamstark@51 270
adamstark@51 271 double beats[5000];
adamstark@51 272 int beatnum = 0;
adamstark@51 273 float df_val;
adamstark@51 274
adamstark@51 275 ///////////////////////////////////////////
adamstark@51 276 //////// Begin Processing Loop ////////////
adamstark@51 277
adamstark@51 278 for (int i=0;i < numframes;i++)
adamstark@51 279 {
adamstark@51 280 df_val = (float) (data[i] + 0.0001);
adamstark@51 281
adamstark@51 282 b.process(df_val); // process df sample in beat tracker
adamstark@51 283
adamstark@51 284 if (b.playbeat == 1)
adamstark@51 285 {
adamstark@51 286 beats[beatnum] = (((double) hsize) / 44100) * ((double) i);
adamstark@51 287 beatnum = beatnum + 1;
adamstark@51 288 }
adamstark@51 289
adamstark@51 290 }
adamstark@51 291
adamstark@51 292 ///////// End Processing Loop /////////////
adamstark@51 293 ///////////////////////////////////////////
adamstark@51 294
adamstark@51 295
adamstark@51 296 ////////// END PROCESS ///////////////////
adamstark@51 297
adamstark@51 298 double beats_out[beatnum]; // create output array
adamstark@51 299
adamstark@51 300
adamstark@51 301 // copy beats into output array
adamstark@51 302 for (int i = 0;i < beatnum;i++)
adamstark@51 303 {
adamstark@51 304 beats_out[i] = beats[i];
adamstark@51 305 }
adamstark@51 306
adamstark@51 307
adamstark@51 308 ////////// CREATE ARRAY AND RETURN IT ///////////////////
adamstark@51 309 int nd=1;
adamstark@51 310 npy_intp m= beatnum;
adamstark@51 311 //double fArray[5] = {0,1,2,3,4};
adamstark@51 312
adamstark@51 313 PyObject* c=PyArray_SimpleNew(nd, &m, NPY_DOUBLE);
adamstark@51 314
adamstark@51 315 void *arr_data = PyArray_DATA((PyArrayObject*)c);
adamstark@51 316
adamstark@51 317 memcpy(arr_data, beats_out, PyArray_ITEMSIZE((PyArrayObject*) c) * m);
adamstark@51 318
adamstark@51 319
adamstark@51 320 Py_DECREF(arr1);
adamstark@51 321 Py_INCREF(Py_None);
adamstark@51 322 //return Py_None;
adamstark@51 323
adamstark@51 324 return (PyObject *)c;
adamstark@51 325
adamstark@51 326 //return Py_BuildValue("c", type);
adamstark@51 327 //return Py_BuildValue("d", sum);
adamstark@51 328 //return Py_BuildValue("i", k);
adamstark@51 329 /*
adamstark@51 330 fail:
adamstark@51 331 Py_XDECREF(arr1);
adamstark@51 332 Py_XDECREF(arr2);
adamstark@51 333 PyArray_XDECREF_ERR(oarr);
adamstark@51 334 return NULL;*/
adamstark@51 335 }
adamstark@51 336
adamstark@51 337
adamstark@51 338
adamstark@51 339 static PyMethodDef btrack_methods[] = {
adamstark@51 340 { "onsetdf",btrack_onsetdf,METH_VARARGS,"onset detection function"},
adamstark@51 341 { "btrack",btrack_btrack,METH_VARARGS,"beat tracker"},
adamstark@51 342 { "btrack_df",btrack_btrack_df,METH_VARARGS,"beat tracker with detection function input"},
adamstark@51 343 {NULL, NULL, 0, NULL} /* Sentinel */
adamstark@51 344 };
adamstark@51 345
adamstark@51 346 PyMODINIT_FUNC initbtrack(void)
adamstark@51 347 {
adamstark@51 348 (void)Py_InitModule("btrack", btrack_methods);
adamstark@51 349 import_array();
adamstark@51 350 }
adamstark@51 351
adamstark@51 352 int main(int argc, char *argv[])
adamstark@51 353 {
adamstark@51 354 /* Pass argv[0] to the Python interpreter */
adamstark@51 355 Py_SetProgramName(argv[0]);
adamstark@51 356
adamstark@51 357 /* Initialize the Python interpreter. Required. */
adamstark@51 358 Py_Initialize();
adamstark@51 359
adamstark@51 360 /* Add a static module */
adamstark@51 361 initbtrack();
adamstark@51 362 }