andrew@3
|
1 #include "testApp.h"
|
andrew@3
|
2 //#include "math.h"
|
andrew@3
|
3
|
andrew@3
|
4 #define SAMPLING_FREQUENCY 44100
|
andrew@3
|
5 #define FOURIER_LENGTH 2048
|
andrew@3
|
6 #define TEXT_HEIGHT 10
|
andrew@3
|
7 //--------------------------------------------------------------
|
andrew@3
|
8 void testApp::setup(){
|
andrew@3
|
9 // listen on the given port
|
andrew@3
|
10 // cout << "listening for osc messages on port " << PORT << "\n";
|
andrew@3
|
11 receiver.setup( PORT );
|
andrew@3
|
12
|
andrew@3
|
13 current_msg_string = 0;
|
andrew@3
|
14 mouseX = 0;
|
andrew@3
|
15 mouseY = 0;
|
andrew@3
|
16 mouseButtonState = "";
|
andrew@3
|
17
|
andrew@3
|
18 ofBackground( 30, 30, 130 );
|
andrew@3
|
19
|
andrew@3
|
20
|
andrew@3
|
21 outputGraphics = false;
|
andrew@3
|
22
|
andrew@3
|
23 maximumDetectionFunction = 20;
|
andrew@3
|
24 minimumDetectionFunction = -20;
|
andrew@3
|
25
|
andrew@3
|
26 screenWidth = (float) ofGetWidth();
|
andrew@3
|
27 screenHeight = (float) ofGetHeight();
|
andrew@3
|
28
|
andrew@3
|
29 mouseDownX = 0;
|
andrew@3
|
30 mouseDownY = 0;
|
andrew@3
|
31
|
andrew@3
|
32 amplitudeNumber = 256;//number of amplitudes shown on screen
|
andrew@3
|
33
|
andrew@3
|
34 maxValue = 1.0;
|
andrew@3
|
35
|
andrew@3
|
36 detectionType = "complex";
|
andrew@3
|
37 lastOnsetDetectionValue;
|
andrew@3
|
38
|
andrew@3
|
39 logMode = false;
|
andrew@3
|
40
|
andrew@3
|
41 midiMode = true;
|
andrew@3
|
42
|
andrew@3
|
43 resetMaxima = false;
|
andrew@3
|
44
|
andrew@3
|
45 reIndexFlag = false;
|
andrew@3
|
46
|
andrew@3
|
47 ofBackground(0,0,0);
|
andrew@3
|
48
|
andrew@3
|
49 rawOnsetIndex = 0;
|
andrew@3
|
50 }
|
andrew@3
|
51
|
andrew@3
|
52 //--------------------------------------------------------------
|
andrew@3
|
53 void testApp::update(){
|
andrew@3
|
54 maxValue *= 0.995;
|
andrew@3
|
55 // hide old messages
|
andrew@3
|
56
|
andrew@3
|
57 // check for waiting messages
|
andrew@3
|
58 while( receiver.hasWaitingMessages() )
|
andrew@3
|
59 {
|
andrew@3
|
60 // get the next message
|
andrew@3
|
61 ofxOscMessage m;
|
andrew@3
|
62 receiver.getNextMessage( &m );
|
andrew@3
|
63
|
andrew@3
|
64 // unrecognized message: display on the bottom of the screen
|
andrew@3
|
65 // string msg_string;
|
andrew@3
|
66 // msg_string = m.getAddress();
|
andrew@3
|
67 if (m.getAddress() == "/aubioData" ){
|
andrew@3
|
68
|
andrew@3
|
69 if( m.getArgType( 0 ) == OFXOSC_TYPE_FLOAT ){
|
andrew@3
|
70
|
andrew@3
|
71 onsetIndex++;
|
andrew@3
|
72 onsetRecorded[onsetIndex] = false;
|
andrew@3
|
73
|
andrew@3
|
74 if (onsetIndex >= NUM_DETECTION_SAMPLES)
|
andrew@3
|
75 onsetIndex = 0;
|
andrew@3
|
76
|
andrew@3
|
77 onsetFunction[onsetIndex] = m.getArgAsFloat(0);
|
andrew@3
|
78
|
andrew@3
|
79 checkMaxima(m.getArgAsFloat(0));
|
andrew@3
|
80
|
andrew@3
|
81 }//end if type FLOAT
|
andrew@3
|
82 }//end if aubioData
|
andrew@3
|
83
|
andrew@3
|
84
|
andrew@3
|
85 if (m.getAddress() == "/rawAubioData" ){
|
andrew@3
|
86
|
andrew@3
|
87 if( m.getArgType( 0 ) == OFXOSC_TYPE_FLOAT ){
|
andrew@3
|
88
|
andrew@3
|
89 rawOnsetIndex++;
|
andrew@3
|
90
|
andrew@3
|
91 if (rawOnsetIndex >= NUM_DETECTION_SAMPLES)
|
andrew@3
|
92 rawOnsetIndex = 0;
|
andrew@3
|
93
|
andrew@3
|
94 rawOnsetFunction[rawOnsetIndex] = m.getArgAsFloat(0);
|
andrew@3
|
95 checkRawMaxima(m.getArgAsFloat(0));
|
andrew@3
|
96
|
andrew@3
|
97 }//end if type FLOAT
|
andrew@3
|
98 }//end spec diff message
|
andrew@3
|
99
|
andrew@3
|
100
|
andrew@3
|
101 if (m.getAddress() == "/medianAubioData" ){
|
andrew@3
|
102
|
andrew@3
|
103 if( m.getArgType( 0 ) == OFXOSC_TYPE_FLOAT ){
|
andrew@3
|
104
|
andrew@3
|
105 medianOnsetIndex++;
|
andrew@3
|
106
|
andrew@3
|
107 if (medianOnsetIndex >= NUM_DETECTION_SAMPLES){
|
andrew@3
|
108 medianOnsetIndex = 0;
|
andrew@3
|
109 }
|
andrew@3
|
110
|
andrew@3
|
111 if(medianOnsetIndex > 0)
|
andrew@3
|
112 medianOnsetRecorded[medianOnsetIndex] = false;//but how do we know this happens first!
|
andrew@3
|
113
|
andrew@3
|
114 medianOnsetFunction[medianOnsetIndex] = m.getArgAsFloat(0);
|
andrew@3
|
115
|
andrew@3
|
116 }//end if type FLOAT
|
andrew@3
|
117 }//end spec diff message
|
andrew@3
|
118
|
andrew@3
|
119
|
andrew@3
|
120
|
andrew@3
|
121
|
andrew@3
|
122 if (m.getAddress() == "/onset" ){
|
andrew@3
|
123 onsetRecorded[onsetIndex] = true;
|
andrew@3
|
124 lastOnsetDetectionValue = onsetFunction[onsetIndex];
|
andrew@3
|
125 }
|
andrew@3
|
126
|
andrew@3
|
127 if (m.getAddress() == "/medianOnset" ){
|
andrew@3
|
128 medianOnsetRecorded[onsetIndex] = true;
|
andrew@3
|
129 }
|
andrew@3
|
130
|
andrew@3
|
131
|
andrew@3
|
132
|
andrew@3
|
133 if (m.getAddress() == "/rawOnset" ){
|
andrew@3
|
134 rawOnsetRecorded[rawOnsetIndex] = true;
|
andrew@3
|
135
|
andrew@3
|
136 }
|
andrew@3
|
137
|
andrew@3
|
138 if (m.getAddress() == "/mode" ){
|
andrew@3
|
139 resetMaxima = true;
|
andrew@3
|
140 detectionType = m.getArgAsString(0);
|
andrew@3
|
141 }
|
andrew@3
|
142
|
andrew@3
|
143 }//end while
|
andrew@3
|
144
|
andrew@3
|
145 }
|
andrew@3
|
146
|
andrew@3
|
147
|
andrew@3
|
148 void testApp::checkMaxima(float f){
|
andrew@3
|
149
|
andrew@3
|
150 //maximumDetectionFunction *= 0.99999;
|
andrew@3
|
151 //minimumDetectionFunction += (maximumDetectionFunction - minimumDetectionFunction)*0.00001;
|
andrew@3
|
152
|
andrew@3
|
153 if (maximumDetectionFunction * 1.08 < f){
|
andrew@3
|
154 maximumDetectionFunction = 1.08*f;
|
andrew@3
|
155 }
|
andrew@3
|
156
|
andrew@3
|
157 if (minimumDetectionFunction + (fabs(minimumDetectionFunction * 0.08)) > f){
|
andrew@3
|
158 minimumDetectionFunction = f - (0.08 * fabs(f));
|
andrew@3
|
159 }
|
andrew@3
|
160
|
andrew@3
|
161 if (resetMaxima == true){
|
andrew@3
|
162 maximumDetectionFunction = 30;
|
andrew@3
|
163 minimumDetectionFunction = 0;
|
andrew@3
|
164 resetMaxima = false;
|
andrew@3
|
165 }
|
andrew@3
|
166
|
andrew@3
|
167 }
|
andrew@3
|
168
|
andrew@3
|
169
|
andrew@3
|
170 void testApp::checkRawMaxima(float f){
|
andrew@3
|
171
|
andrew@3
|
172 //maximumDetectionFunction *= 0.99999;
|
andrew@3
|
173 //minimumDetectionFunction += (maximumDetectionFunction - minimumDetectionFunction)*0.00001;
|
andrew@3
|
174
|
andrew@3
|
175 if (maximumDetectionFunction * 1.08 < f){
|
andrew@3
|
176 maximumDetectionFunction = 1.08*f;
|
andrew@3
|
177 }
|
andrew@3
|
178
|
andrew@3
|
179 if (minimumDetectionFunction + (fabs(minimumDetectionFunction * 0.08)) > f){
|
andrew@3
|
180 minimumDetectionFunction = f - (0.08 * fabs(f));
|
andrew@3
|
181 }
|
andrew@3
|
182
|
andrew@3
|
183 }
|
andrew@3
|
184
|
andrew@3
|
185
|
andrew@3
|
186
|
andrew@3
|
187 //--------------------------------------------------------------
|
andrew@3
|
188 void testApp::draw(){
|
andrew@3
|
189
|
andrew@3
|
190 drawOnsetFunction();
|
andrew@3
|
191 printInfo();
|
andrew@3
|
192
|
andrew@3
|
193 }
|
andrew@3
|
194
|
andrew@3
|
195 void testApp::printMessages(){
|
andrew@3
|
196 string buf;
|
andrew@3
|
197 buf = "listening for osc messages on port" + ofToString( PORT );
|
andrew@3
|
198 ofDrawBitmapString( buf, 10, 20 );
|
andrew@3
|
199
|
andrew@3
|
200 for ( int i=0; i<NUM_MSG_STRINGS; i++ )
|
andrew@3
|
201 {
|
andrew@3
|
202 ofDrawBitmapString( msg_strings[i], 10, 40+15*i );
|
andrew@3
|
203 }
|
andrew@3
|
204
|
andrew@3
|
205 }
|
andrew@3
|
206
|
andrew@3
|
207 void testApp::printInfo(){
|
andrew@3
|
208 ofSetColor(255,255,255);
|
andrew@3
|
209 string printString;
|
andrew@3
|
210
|
andrew@3
|
211 /* printString = "Max ";
|
andrew@3
|
212 printString += ofToString(maximumDetectionFunction);
|
andrew@3
|
213 printString += " Min ";
|
andrew@3
|
214 printString += ofToString(minimumDetectionFunction);
|
andrew@3
|
215 */
|
andrew@3
|
216
|
andrew@3
|
217 printString += detectionType;
|
andrew@3
|
218 printString +=" ";
|
andrew@3
|
219 printString += ofToString(lastOnsetDetectionValue, 1);
|
andrew@3
|
220 ofDrawBitmapString( printString , 10, ofGetHeight() - 20);
|
andrew@3
|
221 }
|
andrew@3
|
222
|
andrew@3
|
223 //--------------------------------------------------------------
|
andrew@3
|
224 void testApp::keyPressed (int key){
|
andrew@3
|
225
|
andrew@3
|
226 if (key == OF_KEY_UP){
|
andrew@3
|
227
|
andrew@3
|
228 }
|
andrew@3
|
229
|
andrew@3
|
230 if (key == OF_KEY_DOWN ){
|
andrew@3
|
231
|
andrew@3
|
232 }
|
andrew@3
|
233
|
andrew@3
|
234
|
andrew@3
|
235 if (key == OF_KEY_RIGHT ){
|
andrew@3
|
236
|
andrew@3
|
237 }
|
andrew@3
|
238
|
andrew@3
|
239 if (key == OF_KEY_LEFT ){
|
andrew@3
|
240
|
andrew@3
|
241 }
|
andrew@3
|
242
|
andrew@3
|
243 if (key == 'L' || key == 'l'){
|
andrew@3
|
244 logMode = !logMode;
|
andrew@3
|
245 }
|
andrew@3
|
246
|
andrew@3
|
247 if (key == 'p' || key == 'P'){
|
andrew@3
|
248
|
andrew@3
|
249 }
|
andrew@3
|
250
|
andrew@3
|
251 if (key == 'm' || key == 'M'){
|
andrew@3
|
252 midiMode = !midiMode;
|
andrew@3
|
253 }
|
andrew@3
|
254
|
andrew@3
|
255 if (key == 'x' || key == 'X'){
|
andrew@3
|
256 amplitudeNumber *= 2;
|
andrew@3
|
257 }
|
andrew@3
|
258
|
andrew@3
|
259 if (key == 'z' || key == 'Z'){
|
andrew@3
|
260 amplitudeNumber /= 2;
|
andrew@3
|
261 }
|
andrew@3
|
262
|
andrew@3
|
263 if ((key == '=' || key == '+') && amplitudeNumber < 120){
|
andrew@3
|
264 amplitudeNumber += 8;
|
andrew@3
|
265 }
|
andrew@3
|
266
|
andrew@3
|
267 if ((key == '-' || key == '_') && amplitudeNumber > 12){
|
andrew@3
|
268 amplitudeNumber -= 8;
|
andrew@3
|
269 }
|
andrew@3
|
270
|
andrew@3
|
271 }
|
andrew@3
|
272
|
andrew@3
|
273
|
andrew@3
|
274
|
andrew@3
|
275 void testApp::drawOnsetFunction(){
|
andrew@3
|
276 int tmpIndex = onsetIndex;
|
andrew@3
|
277 float width = screenWidth / (float) amplitudeNumber;
|
andrew@3
|
278 float maximumValue = maximumDetectionFunction ;
|
andrew@3
|
279 float minimumValue = minimumDetectionFunction ;
|
andrew@3
|
280 float difference = maximumValue - minimumValue;
|
andrew@3
|
281 float scale_factor = screenHeight/ difference;
|
andrew@3
|
282
|
andrew@3
|
283 //draw axis
|
andrew@3
|
284 ofSetColor(255,255,255);
|
andrew@3
|
285 ofLine(0, screenHeight - (scale_factor*(0 - minimumValue)),
|
andrew@3
|
286 (int) (width*(amplitudeNumber)), screenHeight - (scale_factor*(0 - minimumValue)) );
|
andrew@3
|
287
|
andrew@3
|
288
|
andrew@3
|
289 for (int Xvalue = 0;Xvalue < amplitudeNumber; Xvalue++){
|
andrew@3
|
290
|
andrew@3
|
291 int Xindex = (onsetIndex-Xvalue) ;
|
andrew@3
|
292 int previousIndex = (Xindex-1);
|
andrew@3
|
293
|
andrew@4
|
294 //below - Paule's processed onsets
|
andrew@3
|
295 ofSetColor(55,100,255);
|
andrew@3
|
296
|
andrew@3
|
297 ofLine((int) (width*(amplitudeNumber - Xvalue - 1)), screenHeight - (scale_factor*(onsetFunction[previousIndex]- minimumValue)),
|
andrew@3
|
298 (int) (width*(amplitudeNumber - Xvalue)), screenHeight - (scale_factor*(onsetFunction[Xindex]- minimumValue)) );
|
andrew@3
|
299
|
andrew@3
|
300 if (onsetRecorded[Xindex] == true){
|
andrew@3
|
301 ofSetColor(255,100,255);
|
andrew@3
|
302 ofCircle(width*(amplitudeNumber - Xvalue), screenHeight - (scale_factor*(onsetFunction[Xindex]- minimumValue)) , 3);
|
andrew@3
|
303 }
|
andrew@3
|
304
|
andrew@3
|
305 //specDiffOnsets
|
andrew@3
|
306 ofSetColor(55,100,55);
|
andrew@3
|
307 Xindex = (rawOnsetIndex-Xvalue) ;
|
andrew@3
|
308 previousIndex = (Xindex-1);
|
andrew@3
|
309
|
andrew@3
|
310 ofLine((int) (width*(amplitudeNumber - Xvalue - 1)), screenHeight - (scale_factor*(rawOnsetFunction[previousIndex]- minimumValue)),
|
andrew@3
|
311 (int) (width*(amplitudeNumber - Xvalue)), screenHeight - (scale_factor*(rawOnsetFunction[Xindex]- minimumValue)) );
|
andrew@3
|
312
|
andrew@3
|
313 //median of Onset fn
|
andrew@3
|
314 ofSetColor(205,0,0);
|
andrew@3
|
315 Xindex = (medianOnsetIndex-Xvalue) ;
|
andrew@3
|
316 previousIndex = (Xindex-1);
|
andrew@3
|
317
|
andrew@3
|
318 ofLine((int) (width*(amplitudeNumber - Xvalue - 1)), screenHeight - (scale_factor*(medianOnsetFunction[previousIndex]- minimumValue)),
|
andrew@3
|
319 (int) (width*(amplitudeNumber - Xvalue)), screenHeight - (scale_factor*(medianOnsetFunction[Xindex]- minimumValue)) );
|
andrew@3
|
320
|
andrew@3
|
321
|
andrew@4
|
322
|
andrew@3
|
323 if (rawOnsetRecorded[Xindex] == true){
|
andrew@3
|
324 ofSetColor(255,100,0);
|
andrew@3
|
325 ofCircle(width*(amplitudeNumber - Xvalue), screenHeight - (scale_factor*(rawOnsetFunction[Xindex]- minimumValue)) , 3);
|
andrew@3
|
326 }
|
andrew@3
|
327
|
andrew@4
|
328 //median onsets in red
|
andrew@3
|
329 if (medianOnsetRecorded[Xindex] == true){
|
andrew@3
|
330 ofSetColor(255,0,0);
|
andrew@3
|
331 ofCircle(width*(amplitudeNumber - Xvalue), screenHeight - (scale_factor*(medianOnsetFunction[Xindex]- minimumValue)) , 3);
|
andrew@3
|
332 }
|
andrew@3
|
333
|
andrew@3
|
334
|
andrew@3
|
335 /*
|
andrew@3
|
336 if (medianOnsetRecorded[Xindex] == true){
|
andrew@3
|
337 ofSetColor(255,0,0);
|
andrew@3
|
338 ofCircle(width*(amplitudeNumber - Xvalue), screenHeight - (scale_factor*(medianOnsetFunction[Xindex]- minimumValue)) , 3);
|
andrew@3
|
339 }
|
andrew@3
|
340 */
|
andrew@3
|
341 ofSetColor(255,100,0);
|
andrew@3
|
342
|
andrew@3
|
343 }//end for Xvalue (across the recent observations of osc data)
|
andrew@3
|
344
|
andrew@3
|
345
|
andrew@3
|
346 //label y axis
|
andrew@3
|
347 int axisHeight, stepSize;
|
andrew@3
|
348 ofSetColor(255,255,255);
|
andrew@3
|
349 stepSize = 1000;
|
andrew@3
|
350
|
andrew@3
|
351 while((difference / stepSize) < 3)
|
andrew@3
|
352 stepSize /= 2;
|
andrew@3
|
353
|
andrew@3
|
354 while ((difference / stepSize) > 7)// maximum 6 numbers to display
|
andrew@3
|
355 stepSize *= 2;
|
andrew@3
|
356
|
andrew@3
|
357
|
andrew@3
|
358 for (axisHeight = 0; axisHeight < maximumDetectionFunction; axisHeight += stepSize){
|
andrew@3
|
359 ofDrawBitmapString( ofToString((int)axisHeight), ofGetWidth()-50,
|
andrew@3
|
360 (int) ((TEXT_HEIGHT/2) +(screenHeight - (scale_factor*(axisHeight- minimumValue)))) );
|
andrew@3
|
361 }
|
andrew@3
|
362
|
andrew@3
|
363 for (axisHeight = max(0, (int)minimumDetectionFunction); axisHeight > min(0, (int)minimumDetectionFunction); axisHeight -= stepSize){
|
andrew@3
|
364 ofDrawBitmapString( ofToString((int)axisHeight), ofGetWidth()-50,
|
andrew@3
|
365 (int) ((TEXT_HEIGHT/2) +(screenHeight - (scale_factor*(axisHeight- minimumValue)))) );
|
andrew@3
|
366 }
|
andrew@3
|
367
|
andrew@3
|
368 //label x axis
|
andrew@3
|
369 stepSize = 20;//need to make sure not too many of these:
|
andrew@3
|
370
|
andrew@3
|
371 while((amplitudeNumber / stepSize) < 4)
|
andrew@3
|
372 stepSize /= 2;
|
andrew@3
|
373
|
andrew@3
|
374 while ((amplitudeNumber / stepSize) > 8)
|
andrew@3
|
375 stepSize *= 2;
|
andrew@3
|
376
|
andrew@3
|
377 int labelIndex = onsetIndex - (onsetIndex % stepSize);
|
andrew@3
|
378 for (int y = labelIndex; y > onsetIndex - amplitudeNumber; y -= stepSize){
|
andrew@3
|
379 ofDrawBitmapString( ofToString((int)y), (int) (width*(amplitudeNumber - (onsetIndex - y))),
|
andrew@3
|
380 (int) ((TEXT_HEIGHT+2) + (screenHeight - (scale_factor*(0 - minimumValue)))) );
|
andrew@3
|
381 }
|
andrew@3
|
382
|
andrew@3
|
383 }//end label
|
andrew@3
|
384 //--------------------------------------------------------------
|
andrew@3
|
385 void testApp::mouseMoved(int x, int y ){
|
andrew@3
|
386
|
andrew@3
|
387
|
andrew@3
|
388
|
andrew@3
|
389 }
|
andrew@3
|
390
|
andrew@3
|
391 //--------------------------------------------------------------
|
andrew@3
|
392 void testApp::mouseDragged(int x, int y, int button){
|
andrew@3
|
393 if ((x - mouseDownX) > 50 ){
|
andrew@3
|
394 mouseDownX = x;
|
andrew@3
|
395 }
|
andrew@3
|
396
|
andrew@3
|
397 if ((x - mouseDownX) < -50){
|
andrew@3
|
398
|
andrew@3
|
399 mouseDownX = x;
|
andrew@3
|
400 }
|
andrew@3
|
401
|
andrew@3
|
402
|
andrew@3
|
403 }
|
andrew@3
|
404
|
andrew@3
|
405 //--------------------------------------------------------------
|
andrew@3
|
406 void testApp::mousePressed(int x, int y, int button){
|
andrew@3
|
407
|
andrew@3
|
408 mouseDownX = x;
|
andrew@3
|
409 mouseDownY = y;
|
andrew@3
|
410
|
andrew@3
|
411 }
|
andrew@3
|
412
|
andrew@3
|
413 //--------------------------------------------------------------
|
andrew@3
|
414 void testApp::mouseReleased(int x, int y, int button){
|
andrew@3
|
415
|
andrew@3
|
416 }
|
andrew@3
|
417
|
andrew@3
|
418 //--------------------------------------------------------------
|
andrew@3
|
419 void testApp::windowResized(int w, int h){
|
andrew@3
|
420
|
andrew@3
|
421 screenWidth = (float) ofGetWidth();
|
andrew@3
|
422 screenHeight = (float) ofGetHeight();
|
andrew@3
|
423
|
andrew@3
|
424 }
|
andrew@3
|
425
|