annotate modules-and-plug-ins/python-module/btrack_python_module.cpp @ 14:18fc3c248436 develop

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