annotate python-module/btrack_python_module.cpp @ 5:bd2c405d4a06 develop

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