annotate aubioOnsetDetectorOFvisualiser/src/testApp.cpp @ 4:fb106f14e0a4

Streamlined the object, getting rid of sigmal outlet, adding in buffer and hopsize changes - needs to be fixed for slope onset - but median working, added the max external
author Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk>
date Thu, 18 Oct 2012 17:12:05 +0100
parents 979125db34ab
children eba88b84b5ca
rev   line source
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