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 } |