annotate python-module/btrack_python_module.cpp @ 50:bb3803edaa17

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