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@15
|
31 long signal_length = PyArray_Size((PyObject*)arr1);
|
adamstark@14
|
32 //int k = (int) theSize;
|
adamstark@14
|
33
|
adamstark@14
|
34 // get data type
|
adamstark@15
|
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@15
|
131 long signal_length = PyArray_Size((PyObject*)arr1);
|
adamstark@14
|
132 //int k = (int) theSize;
|
adamstark@14
|
133
|
adamstark@14
|
134 // get data type
|
adamstark@15
|
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@17
|
159
|
adamstark@17
|
160 double df_val;
|
adamstark@14
|
161
|
adamstark@14
|
162 ///////////////////////////////////////////
|
adamstark@14
|
163 //////// Begin Processing Loop ////////////
|
adamstark@14
|
164
|
adamstark@14
|
165 for (int i=0;i < numframes;i++)
|
adamstark@14
|
166 {
|
adamstark@14
|
167 // add new samples to frame
|
adamstark@14
|
168 for (int n = 0;n < hsize;n++)
|
adamstark@14
|
169 {
|
adamstark@14
|
170 buffer[n] = data[(i*hsize)+n];
|
adamstark@14
|
171 }
|
adamstark@14
|
172
|
adamstark@14
|
173 df[i] = onset.getDFsample(buffer);
|
adamstark@14
|
174
|
adamstark@17
|
175 df_val = df[i] + 0.0001;
|
adamstark@14
|
176
|
adamstark@14
|
177 b.process(df_val); // process df sample in beat tracker
|
adamstark@14
|
178
|
adamstark@14
|
179 if (b.playbeat == 1)
|
adamstark@14
|
180 {
|
adamstark@14
|
181 beats[beatnum] = (((double) hsize) / 44100) * ((double) i);
|
adamstark@14
|
182 beatnum = beatnum + 1;
|
adamstark@14
|
183 }
|
adamstark@14
|
184
|
adamstark@14
|
185 }
|
adamstark@14
|
186
|
adamstark@14
|
187 ///////// End Processing Loop /////////////
|
adamstark@14
|
188 ///////////////////////////////////////////
|
adamstark@14
|
189
|
adamstark@14
|
190
|
adamstark@14
|
191 ////////// END PROCESS ///////////////////
|
adamstark@14
|
192
|
adamstark@14
|
193 double beats_out[beatnum]; // create output array
|
adamstark@14
|
194
|
adamstark@14
|
195 // copy beats into output array
|
adamstark@14
|
196 for (int i = 0;i < beatnum;i++)
|
adamstark@14
|
197 {
|
adamstark@14
|
198 beats_out[i] = beats[i];
|
adamstark@14
|
199 }
|
adamstark@14
|
200
|
adamstark@14
|
201
|
adamstark@14
|
202
|
adamstark@14
|
203 ////////// CREATE ARRAY AND RETURN IT ///////////////////
|
adamstark@14
|
204 int nd=1;
|
adamstark@14
|
205 npy_intp m= beatnum;
|
adamstark@14
|
206 //double fArray[5] = {0,1,2,3,4};
|
adamstark@14
|
207
|
adamstark@14
|
208 PyObject* c=PyArray_SimpleNew(nd, &m, NPY_DOUBLE);
|
adamstark@14
|
209
|
adamstark@14
|
210 void *arr_data = PyArray_DATA((PyArrayObject*)c);
|
adamstark@14
|
211
|
adamstark@14
|
212 memcpy(arr_data, beats_out, PyArray_ITEMSIZE((PyArrayObject*) c) * m);
|
adamstark@14
|
213
|
adamstark@14
|
214
|
adamstark@14
|
215 Py_DECREF(arr1);
|
adamstark@14
|
216 Py_INCREF(Py_None);
|
adamstark@14
|
217 //return Py_None;
|
adamstark@14
|
218
|
adamstark@14
|
219 return (PyObject *)c;
|
adamstark@14
|
220
|
adamstark@14
|
221 //return Py_BuildValue("c", type);
|
adamstark@14
|
222 //return Py_BuildValue("d", sum);
|
adamstark@14
|
223 //return Py_BuildValue("i", k);
|
adamstark@14
|
224 /*
|
adamstark@14
|
225 fail:
|
adamstark@14
|
226 Py_XDECREF(arr1);
|
adamstark@14
|
227 Py_XDECREF(arr2);
|
adamstark@14
|
228 PyArray_XDECREF_ERR(oarr);
|
adamstark@14
|
229 return NULL;*/
|
adamstark@14
|
230 }
|
adamstark@14
|
231
|
adamstark@14
|
232 static PyObject * btrack_btrack_df(PyObject *dummy, PyObject *args)
|
adamstark@14
|
233 {
|
adamstark@14
|
234 PyObject *arg1=NULL;
|
adamstark@14
|
235 PyObject *arr1=NULL;
|
adamstark@14
|
236
|
adamstark@14
|
237 if (!PyArg_ParseTuple(args, "O", &arg1))
|
adamstark@14
|
238 {
|
adamstark@14
|
239 return NULL;
|
adamstark@14
|
240 }
|
adamstark@14
|
241
|
adamstark@14
|
242 arr1 = PyArray_FROM_OTF(arg1, NPY_DOUBLE, NPY_IN_ARRAY);
|
adamstark@14
|
243 if (arr1 == NULL)
|
adamstark@14
|
244 {
|
adamstark@14
|
245 return NULL;
|
adamstark@14
|
246 }
|
adamstark@14
|
247
|
adamstark@14
|
248
|
adamstark@14
|
249
|
adamstark@14
|
250 ////////// GET INPUT DATA ///////////////////
|
adamstark@14
|
251
|
adamstark@14
|
252 // get data as array
|
adamstark@14
|
253 double* data = (double*) PyArray_DATA(arr1);
|
adamstark@14
|
254
|
adamstark@14
|
255 // get array size
|
adamstark@15
|
256 long numframes = PyArray_Size((PyObject*)arr1);
|
adamstark@14
|
257 //int k = (int) theSize;
|
adamstark@14
|
258
|
adamstark@14
|
259 // get data type
|
adamstark@15
|
260 //char type = PyArray_DESCR(arr1)->type;
|
adamstark@14
|
261
|
adamstark@14
|
262 ////////// BEGIN PROCESS ///////////////////
|
adamstark@14
|
263 int hsize = 512;
|
adamstark@14
|
264
|
adamstark@14
|
265 BTrack b;
|
adamstark@14
|
266
|
adamstark@14
|
267 b.initialise((int) hsize); // initialise beat tracker
|
adamstark@14
|
268
|
adamstark@14
|
269 // set parameters
|
adamstark@14
|
270 //b.setparams(0.9,5);
|
adamstark@14
|
271
|
adamstark@14
|
272 double beats[5000];
|
adamstark@14
|
273 int beatnum = 0;
|
adamstark@17
|
274 double df_val;
|
adamstark@14
|
275
|
adamstark@14
|
276 ///////////////////////////////////////////
|
adamstark@14
|
277 //////// Begin Processing Loop ////////////
|
adamstark@14
|
278
|
adamstark@15
|
279 for (long i=0;i < numframes;i++)
|
adamstark@14
|
280 {
|
adamstark@17
|
281 df_val = data[i] + 0.0001;
|
adamstark@14
|
282
|
adamstark@14
|
283 b.process(df_val); // process df sample in beat tracker
|
adamstark@14
|
284
|
adamstark@14
|
285 if (b.playbeat == 1)
|
adamstark@14
|
286 {
|
adamstark@14
|
287 beats[beatnum] = (((double) hsize) / 44100) * ((double) i);
|
adamstark@14
|
288 beatnum = beatnum + 1;
|
adamstark@14
|
289 }
|
adamstark@14
|
290
|
adamstark@14
|
291 }
|
adamstark@14
|
292
|
adamstark@14
|
293 ///////// End Processing Loop /////////////
|
adamstark@14
|
294 ///////////////////////////////////////////
|
adamstark@14
|
295
|
adamstark@14
|
296
|
adamstark@14
|
297 ////////// END PROCESS ///////////////////
|
adamstark@14
|
298
|
adamstark@14
|
299 double beats_out[beatnum]; // create output array
|
adamstark@14
|
300
|
adamstark@14
|
301
|
adamstark@14
|
302 // copy beats into output array
|
adamstark@14
|
303 for (int i = 0;i < beatnum;i++)
|
adamstark@14
|
304 {
|
adamstark@14
|
305 beats_out[i] = beats[i];
|
adamstark@14
|
306 }
|
adamstark@14
|
307
|
adamstark@14
|
308
|
adamstark@14
|
309 ////////// CREATE ARRAY AND RETURN IT ///////////////////
|
adamstark@14
|
310 int nd=1;
|
adamstark@14
|
311 npy_intp m= beatnum;
|
adamstark@14
|
312 //double fArray[5] = {0,1,2,3,4};
|
adamstark@14
|
313
|
adamstark@14
|
314 PyObject* c=PyArray_SimpleNew(nd, &m, NPY_DOUBLE);
|
adamstark@14
|
315
|
adamstark@14
|
316 void *arr_data = PyArray_DATA((PyArrayObject*)c);
|
adamstark@14
|
317
|
adamstark@14
|
318 memcpy(arr_data, beats_out, PyArray_ITEMSIZE((PyArrayObject*) c) * m);
|
adamstark@14
|
319
|
adamstark@14
|
320
|
adamstark@14
|
321 Py_DECREF(arr1);
|
adamstark@14
|
322 Py_INCREF(Py_None);
|
adamstark@14
|
323 //return Py_None;
|
adamstark@14
|
324
|
adamstark@14
|
325 return (PyObject *)c;
|
adamstark@14
|
326
|
adamstark@14
|
327 //return Py_BuildValue("c", type);
|
adamstark@14
|
328 //return Py_BuildValue("d", sum);
|
adamstark@14
|
329 //return Py_BuildValue("i", k);
|
adamstark@14
|
330 /*
|
adamstark@14
|
331 fail:
|
adamstark@14
|
332 Py_XDECREF(arr1);
|
adamstark@14
|
333 Py_XDECREF(arr2);
|
adamstark@14
|
334 PyArray_XDECREF_ERR(oarr);
|
adamstark@14
|
335 return NULL;*/
|
adamstark@14
|
336 }
|
adamstark@14
|
337
|
adamstark@14
|
338
|
adamstark@14
|
339
|
adamstark@14
|
340 static PyMethodDef btrack_methods[] = {
|
adamstark@14
|
341 { "onsetdf",btrack_onsetdf,METH_VARARGS,"onset detection function"},
|
adamstark@14
|
342 { "btrack",btrack_btrack,METH_VARARGS,"beat tracker"},
|
adamstark@14
|
343 { "btrack_df",btrack_btrack_df,METH_VARARGS,"beat tracker with detection function input"},
|
adamstark@14
|
344 {NULL, NULL, 0, NULL} /* Sentinel */
|
adamstark@14
|
345 };
|
adamstark@14
|
346
|
adamstark@14
|
347 PyMODINIT_FUNC initbtrack(void)
|
adamstark@14
|
348 {
|
adamstark@14
|
349 (void)Py_InitModule("btrack", btrack_methods);
|
adamstark@14
|
350 import_array();
|
adamstark@14
|
351 }
|
adamstark@14
|
352
|
adamstark@14
|
353 int main(int argc, char *argv[])
|
adamstark@14
|
354 {
|
adamstark@14
|
355 /* Pass argv[0] to the Python interpreter */
|
adamstark@14
|
356 Py_SetProgramName(argv[0]);
|
adamstark@14
|
357
|
adamstark@14
|
358 /* Initialize the Python interpreter. Required. */
|
adamstark@14
|
359 Py_Initialize();
|
adamstark@14
|
360
|
adamstark@14
|
361 /* Add a static module */
|
adamstark@14
|
362 initbtrack();
|
adamstark@14
|
363 } |