annotate python-module/btrack_python_module.cpp @ 46:af7739411685

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