annotate modules-and-plug-ins/python-module/btrack_python_module.cpp @ 52:45231107c9d6

Reformatted comments, removed the OnsetDetectionFunction constructor with no arguments, removed a number of unused variables and made changes to the python module to fix some casting problems and removed some unused variables there also. Still getting the same results, so no overall changes to the algorithm.
author Adam Stark <adamstark@users.noreply.github.com>
date Wed, 22 Jan 2014 01:13:45 +0000
parents 68d01fea1e8d
children a31841af2bbc
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@52 31 long signal_length = PyArray_Size((PyObject*)arr1);
adamstark@51 32 //int k = (int) theSize;
adamstark@51 33
adamstark@51 34 // get data type
adamstark@52 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@52 131 long signal_length = PyArray_Size((PyObject*)arr1);
adamstark@51 132 //int k = (int) theSize;
adamstark@51 133
adamstark@51 134 // get data type
adamstark@52 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@52 255 long numframes = PyArray_Size((PyObject*)arr1);
adamstark@51 256 //int k = (int) theSize;
adamstark@51 257
adamstark@51 258 // get data type
adamstark@52 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@52 278 for (long 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 }