annotate jnmr/testApp.cpp @ 52:13194a9dca77 tip

Added exporting of image and text data
author Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk>
date Tue, 17 Jul 2012 22:13:10 +0100
parents 158f5f38e9d3
children
rev   line source
andrew@33 1 #include "testApp.h"
andrew@33 2
andrew@33 3
andrew@33 4 testApp::testApp(ofxArgs* args){
andrew@33 5 this->args = args;
andrew@33 6 }
andrew@33 7
andrew@52 8 #pragma mark -Initialise
andrew@48 9
andrew@33 10 //--------------------------------------------------------------
andrew@33 11 void testApp::setup(){
andrew@36 12
andrew@33 13
andrew@34 14
andrew@49 15 root = "/Users/andrew/Documents/work/Alignment/MuseScore/RWC/Classical_RWC_Groundtruth/RM-C0";
andrew@37 16 outputFileRoot = "../../../data/FilesOut/rwcOutputData_RM-C0";
andrew@49 17 annotationRoot = "/Users/andrew/Documents/work/Alignment/MuseScore/RWC/ANNOTATION/RM-C0";
andrew@50 18 //myfile.open("../../../data/FilesOut/exampletest2.txt");
andrew@45 19
andrew@45 20
andrew@45 21
andrew@49 22 //diffFile.open("../../../data/FilesOut/diffTest.txt");
andrew@34 23
andrew@50 24 // midiEvents.fileOutput = &myfile;
andrew@49 25
andrew@45 26
andrew@45 27
andrew@37 28 this->args->printArgs();
andrew@33 29 this->args->printOpts();
andrew@37 30
andrew@41 31 createRWCfilenameStrings();
andrew@41 32
andrew@37 33 loadRWCfileNumber(2);
andrew@38 34 openOutputFile(2);
andrew@38 35 loadAnnotation(2);
andrew@37 36
andrew@49 37 midiEvents.differenceOutput = &diffFile;
andrew@49 38
andrew@37 39 /* if (this->args->getCount() > 0){
andrew@33 40 museScoreFilename = this->args->getString(1);
andrew@33 41 //printf("MUSESCORE FILENAME IS %s\n", museScoreFilename);
andrew@33 42 cout << "running!! " << museScoreFilename << endl;
andrew@33 43 midiFileName = museScoreFilename;
andrew@33 44 }
andrew@37 45 */
andrew@33 46
andrew@33 47 int retVal = cannamMainFunction();
andrew@33 48
andrew@33 49 ofSetVerticalSync(true);
andrew@33 50 //ofBackground(255,255,255);
andrew@33 51 midiPort = 2;
andrew@33 52 midiIn.listPorts();
andrew@33 53 midiIn.openPort(midiPort);
andrew@33 54 midiPortName = "";
andrew@33 55 //midiPortName = midiIn.portNames(midiPort);
andrew@33 56
andrew@33 57 transpose = 0;
andrew@33 58 noteInStream.transposeVal = &transpose;
andrew@33 59
andrew@34 60 noteInStream.startTime = &midiEvents.startPlayingTime;//point start time of note in stream to the same time in MIDI events
andrew@33 61
andrew@33 62 noteInStream.factor = &midiEvents.ticksFactor;
andrew@33 63 printf("TICKS FACTOR %f \n", midiEvents.ticksFactor);//noteInStream->factor)
andrew@33 64
andrew@33 65 // portName = "hello";//midiIn.portNames[2];
andrew@33 66 // printf("MIDI PORT %c\n", portName);
andrew@33 67 cout << "MIDI PORT " << endl;//portName << endl;
andrew@33 68
andrew@33 69
andrew@33 70 //midiIn.addListener(this);
andrew@33 71 ofAddListener(midiIn.newMessageEvent, this, &testApp::newMessage);
andrew@33 72
andrew@33 73
andrew@33 74 verdana30.loadFont("verdana.ttf", 50, true, true);
andrew@33 75 verdana30.setLineHeight(48.0f);
andrew@33 76 verdana30.setLetterSpacing(1.035);
andrew@33 77
andrew@33 78 playing = false;
andrew@33 79 readyToStart = true;
andrew@33 80
andrew@33 81 receiver.setup( PORT );
andrew@33 82
andrew@33 83 sender.setup( HOST, SEND_PORT );
andrew@33 84
andrew@33 85 screenWidth = ofGetWidth();
andrew@33 86 screenHeight = ofGetHeight();
andrew@33 87 midiEvents.screenWidth = &screenWidth;
andrew@33 88 midiEvents.screenHeight = &screenHeight;
andrew@40 89 //midiEvents.drawTempoMode = true;
andrew@33 90 ofSetFrameRate(30);
andrew@33 91
andrew@33 92 midiEvents.ticksPerScreen += 4000;
andrew@33 93 lastScoreIndexSent = 0;
andrew@33 94 performanceRating = 0.0;
andrew@33 95
andrew@33 96 liveInputPlaying = false;
andrew@33 97 lastScoreIndexSent = 0;
andrew@33 98 midiEvents.bestMatchIndex = 0;
andrew@33 99
andrew@41 100
andrew@33 101 }
andrew@52 102 #pragma mark -Update
andrew@33 103 //--------------------------------------------------------------
andrew@33 104 void testApp::update(){
andrew@33 105 if (playing){
andrew@33 106 midiEvents.updatePlayPosition();//this fn calls midiEvents.bayesStruct.updateBestEstimate();
andrew@33 107 }
andrew@33 108 // drawer.tickLocation+=20;
andrew@48 109 checkOSCmessages();
andrew@48 110
andrew@48 111 if (midiEvents.recordedEventTimes.size() > 0)
andrew@48 112 checkNewScoreNote();
andrew@48 113
andrew@48 114 }
andrew@48 115
andrew@48 116 void testApp::checkOSCmessages(){
andrew@33 117
andrew@33 118 // check for waiting messages
andrew@33 119 while( receiver.hasWaitingMessages() )
andrew@33 120 {
andrew@33 121 ofxOscMessage m;
andrew@33 122 receiver.getNextMessage( &m );
andrew@33 123
andrew@33 124 if ( m.getAddress() == "/midinoteon" )
andrew@33 125 {
andrew@33 126 int newMidiOnPitch = m.getArgAsInt32(0) + transpose;
andrew@33 127 int velocity = m.getArgAsInt32(1);
andrew@33 128 double time = m.getArgAsFloat(2);
andrew@33 129
andrew@33 130 if (velocity != 0){
andrew@33 131 if (readyToStart){
andrew@33 132 startPlaying();
andrew@33 133 printf("starting to PLAY!!!");
andrew@33 134 }
andrew@48 135 // printf("MIDI NOTE %i \n", newMidiOnPitch);
andrew@33 136 midiEvents.newNoteOnEvent(newMidiOnPitch, velocity, time);
andrew@44 137 noteInStream.newNoteCounted(newMidiOnPitch);//counts notes for an overall score
andrew@33 138 }
andrew@48 139
andrew@33 140 }
andrew@33 141
andrew@33 142 if ( m.getAddress() == "/setSpeedPrior" )
andrew@33 143 {
andrew@33 144 float speedPrior = m.getArgAsFloat(0);
andrew@33 145 printf("speed prior set to %f\n", speedPrior);
andrew@33 146 midiEvents.speedPriorValue = speedPrior;
andrew@34 147 //midiEvents.bayesStruct.speedPriorValue = speedPrior;
andrew@33 148 }
andrew@33 149
andrew@33 150 if ( m.getAddress() == "/startplaying" )
andrew@33 151 {
andrew@48 152 // prepareToStartOnNextNote();
andrew@35 153 startPlaying();
andrew@33 154 }
andrew@33 155
andrew@33 156 if ( m.getAddress() == "/stopplaying" )
andrew@33 157 {
andrew@33 158 stopPlaying();
andrew@33 159 }
andrew@33 160
andrew@33 161
andrew@33 162 if ( m.getAddress() == "/integratedEstimate" )
andrew@33 163 {
andrew@33 164 midiEvents.bayesStruct.usingIntegratedTempoEstimate = true;
andrew@33 165 }
andrew@48 166
andrew@33 167 if ( m.getAddress() == "/MAPestimate" )
andrew@33 168 {
andrew@33 169 midiEvents.bayesStruct.usingIntegratedTempoEstimate = false;
andrew@33 170 }
andrew@33 171
andrew@33 172
andrew@33 173 if ( m.getAddress() == "/realtime" )
andrew@33 174 {
andrew@33 175 midiEvents.runningInRealTime = true;
andrew@33 176 }
andrew@33 177
andrew@33 178
andrew@33 179 if ( m.getAddress() == "/offline" )
andrew@33 180 {
andrew@33 181 midiEvents.runningInRealTime = false;
andrew@33 182 }
andrew@33 183
andrew@33 184 if ( m.getAddress() == "/minimumSpeedRatio" )
andrew@33 185 {
andrew@48 186
andrew@33 187 float minSpeed = m.getArgAsFloat(0);
andrew@33 188 //printf("minimum speed received is %f and max is %f\n", minSpeed, midiEvents.bayesStruct.relativeSpeedLikelihood.getIndexInRealTerms(midiEvents.bayesStruct.relativeSpeedLikelihood.length-1));
andrew@33 189 if (minSpeed > 0 && minSpeed < midiEvents.bayesStruct.relativeSpeedLikelihood.getIndexInRealTerms(midiEvents.bayesStruct.relativeSpeedLikelihood.length-1)){
andrew@48 190 printf("minimum speed accepted is %f\n", minSpeed);
andrew@33 191 midiEvents.minimumMatchSpeed = minSpeed;
andrew@33 192 }
andrew@33 193 }
andrew@48 194
andrew@33 195 if ( m.getAddress() == "/maximumSpeedRatio" )
andrew@33 196 {
andrew@33 197
andrew@33 198 float maxSpeed = m.getArgAsFloat(0);
andrew@33 199 //printf("minimum speed received is %f and max is %f\n", minSpeed, midiEvents.bayesStruct.relativeSpeedLikelihood.getIndexInRealTerms(midiEvents.bayesStruct.relativeSpeedLikelihood.length-1));
andrew@33 200 if (maxSpeed > midiEvents.minimumMatchSpeed && maxSpeed <= midiEvents.bayesStruct.relativeSpeedLikelihood.getIndexInRealTerms(midiEvents.bayesStruct.relativeSpeedLikelihood.length-1)){
andrew@33 201 printf("maximum speed accepted is %f\n", maxSpeed);
andrew@33 202 midiEvents.maximumMatchSpeed = maxSpeed;
andrew@33 203 }
andrew@33 204 }
andrew@33 205
andrew@33 206 if ( m.getAddress() == "/likelihoodToNoiseRatio" )
andrew@33 207 {
andrew@33 208
andrew@33 209 float ratio = m.getArgAsFloat(0);
andrew@33 210
andrew@33 211 if (ratio > 0.001 && ratio < 0.6){
andrew@33 212 midiEvents.likelihoodToNoiseRatio = ratio;
andrew@33 213 printf("likelihood for events relative to noise uses ratio %f\n", ratio);
andrew@33 214 }
andrew@48 215
andrew@33 216 }
andrew@33 217
andrew@34 218 if ( m.getAddress() == "/duration" )
andrew@34 219 {
andrew@34 220
andrew@34 221 float playedDuration = m.getArgAsFloat(0);
andrew@34 222 double recordedDuration = midiEvents.recordedEventTimes[midiEvents.recordedEventTimes.size()-1];
andrew@34 223 midiEvents.speedPriorValue = recordedDuration/playedDuration;
andrew@50 224 midiEvents.testSpeedPriorSetting();
andrew@34 225 printf("played duration %f, recorded %f\n", playedDuration, recordedDuration);
andrew@34 226 printf("speed prior set to %f\n", midiEvents.bayesStruct.speedPriorValue);
andrew@34 227
andrew@34 228 }
andrew@34 229
andrew@37 230 if ( m.getAddress() == "/RWCfile" ){
andrew@37 231 openOutputFile(m.getArgAsInt32(0));
andrew@37 232 loadRWCfileNumber(m.getArgAsInt32(0));
andrew@38 233 loadAnnotation(m.getArgAsInt32(0));
andrew@37 234 }
andrew@37 235
andrew@34 236
andrew@33 237 }//end while osc
andrew@41 238
andrew@33 239 }
andrew@33 240
andrew@33 241
andrew@33 242 void testApp::checkNewScoreNote(){
andrew@33 243 if (lastScoreIndexSent != midiEvents.bestMatchIndex){
andrew@33 244 //then we send out new note
andrew@33 245 sendNoteToMuseScore();
andrew@33 246 lastScoreIndexSent = midiEvents.bestMatchIndex;
andrew@33 247 findMeasure();
andrew@33 248 }
andrew@33 249 }
andrew@33 250
andrew@33 251 void testApp::findMeasure(){
andrew@33 252 int ticks = midiEvents.recordedNoteOnMatrix[midiEvents.bestMatchIndex][0];
andrew@33 253 int tmpMeasure = lastMeasureSent;
andrew@33 254
andrew@33 255 while (lastMeasureSent > 0 && midiEvents.measureVector[lastMeasureSent] > ticks) {
andrew@33 256 lastMeasureSent--;
andrew@33 257 }
andrew@33 258
andrew@33 259 while (lastMeasureSent < midiEvents.measureVector.size() && midiEvents.measureVector[lastMeasureSent] < ticks) {
andrew@33 260 lastMeasureSent++;
andrew@33 261 }
andrew@33 262 if (lastMeasureSent != tmpMeasure){
andrew@33 263 //sendMeasureToMuseScore();
andrew@33 264 performanceRating = noteInStream.calculateTotalScore(midiEvents);
andrew@33 265 }
andrew@33 266
andrew@33 267
andrew@33 268 }
andrew@33 269
andrew@33 270 void testApp::sendBlackNotes(){
andrew@33 271 ofxOscMessage m;
andrew@33 272 m.setAddress( "/plugin" );
andrew@33 273 string noteString;
andrew@33 274 noteString = "blacknotes.js";
andrew@33 275 m.addStringArg( noteString);
andrew@33 276 sender.sendMessage( m );
andrew@33 277 }
andrew@33 278
andrew@33 279 void testApp::sendNoteToMuseScore(){
andrew@40 280 int noteToSendIndex = lastScoreIndexSent;
andrew@40 281 while (noteToSendIndex < midiEvents.bestMatchIndex){
andrew@40 282 noteToSendIndex++;
andrew@40 283 if (midiEvents.recordedNoteOnMatrix.size() > 0 && noteToSendIndex < midiEvents.recordedNoteOnMatrix.size()){
andrew@40 284 int ticks = midiEvents.recordedNoteOnMatrix[noteToSendIndex][0];//midiEvents.bestMatchIndex
andrew@40 285 int pitch = midiEvents.recordedNoteOnMatrix[noteToSendIndex][1];
andrew@40 286 // printf("sending to muse score %i, %i \n", ticks, pitch);
andrew@40 287 sendNoteDataByOsc(pitch, ticks);
andrew@40 288 }
andrew@33 289 }
andrew@33 290 /*
andrew@33 291 ofxOscMessage m;
andrew@33 292 m.setAddress( "/plugin" );
andrew@33 293 string noteString;
andrew@33 294 noteString = "blackNotes.js";
andrew@33 295 m.addStringArg( noteString);
andrew@33 296 sender.sendMessage( m );
andrew@33 297 */
andrew@33 298
andrew@33 299
andrew@33 300 // /color-note 60,3440
andrew@33 301
andrew@33 302 //crappy javascript message
andrew@33 303 /*
andrew@33 304 ofxOscMessage m;
andrew@33 305 m.setAddress( "/plugin" );
andrew@33 306 string noteString;
andrew@33 307 noteString = "coloronenote.js";
andrew@33 308 noteString += ",myTick,"+ofToString(ticks)+",myPitch,"+ofToString(pitch);
andrew@33 309 // printf("%s\n", noteString);
andrew@33 310 m.addStringArg( noteString);
andrew@33 311 sender.sendMessage( m ); */
andrew@33 312
andrew@33 313
andrew@33 314 // /plugin coloronenote.js mytick 100 mypitch 56;
andrew@33 315 }
andrew@33 316
andrew@33 317 void testApp::sendNoteDataByOsc(const int& pitch, const int& ticks){
andrew@33 318 ofxOscMessage m;
andrew@33 319 m.setAddress( "/color-note" );
andrew@33 320 string noteString;
andrew@33 321 noteString = ofToString(ticks);
andrew@33 322 noteString += ","+ofToString(pitch);
andrew@33 323 m.addStringArg( noteString);
andrew@33 324 sender.sendMessage( m );
andrew@33 325 }
andrew@33 326
andrew@33 327 void testApp::sendMeasureToMuseScore(){
andrew@33 328
andrew@33 329 printf("sending measure to muse score %i \n", lastMeasureSent);
andrew@33 330
andrew@33 331 ofxOscMessage m;
andrew@33 332 m.setAddress( "/select-measure" );
andrew@33 333 m.addIntArg(lastMeasureSent);
andrew@33 334 sender.sendMessage( m );
andrew@33 335
andrew@33 336 // /select-measure 6
andrew@33 337 // /plugin coloronenote.js mytick 100 mypitch 56;
andrew@33 338 }
andrew@33 339
andrew@33 340
andrew@33 341 void testApp::newMessage(ofxMidiEventArgs &args){
andrew@33 342
andrew@33 343 int pitch;
andrew@33 344 if (noteInStream.noteInReceived(args)){
andrew@33 345 double timeNow = ofGetElapsedTimeMillis();
andrew@33 346
andrew@33 347 if (!liveInputPlaying){
andrew@33 348 firstNoteTime = timeNow;
andrew@33 349 liveInputPlaying = true;
andrew@33 350 startPlaying();
andrew@33 351 printf("FIRST LIVE NOTE IS NOW AT TIME %f\n", timeNow);
andrew@33 352 }
andrew@33 353
andrew@33 354 pitch = args.byteOne + transpose;
andrew@33 355
andrew@33 356 midiEvents.newNoteOnEvent(pitch, args.byteTwo, timeNow - firstNoteTime);
andrew@33 357
andrew@33 358
andrew@33 359 int tickTime = midiEvents.getEventTimeTicks(timeNow-firstNoteTime);
andrew@33 360 IntVector v;
andrew@33 361 v.push_back(tickTime);
andrew@33 362 v.push_back(pitch);
andrew@33 363 v.push_back(args.byteTwo);
andrew@33 364 v.push_back(200);//tmp time til note off happens
andrew@33 365 noteInStream.midiInputEvents.push_back(v);
andrew@33 366 noteInStream.midiInputTimes.push_back(timeNow - firstNoteTime);
andrew@33 367 //printf("NOTE %i at time %f at tick time %i\n", pitch, (timeNow - firstNoteTime), tickTime);
andrew@33 368 }
andrew@33 369
andrew@33 370 // cout << "MIDI message [port: " << args.port << ", channel: " << args.channel << ", status: " << args.status << ", byteOne: " << pitch << ", byteTwo: " << args.byteTwo << ", timestamp: " << args.timestamp << "]" << endl;
andrew@33 371 }
andrew@33 372
andrew@52 373 #pragma mark -Draw
andrew@52 374
andrew@33 375 //--------------------------------------------------------------
andrew@33 376 void testApp::draw(){
andrew@33 377
andrew@33 378 midiEvents.drawFile();
andrew@52 379 /*
andrew@33 380 string info = "Measure ";
andrew@33 381 info += ofToString(lastMeasureSent);
andrew@33 382 info += " Last note ";
andrew@52 383 info += ofToString(lastScoreIndexSent);
andrew@52 384 ofDrawBitmapString(info, 20, 20);
andrew@52 385 */
andrew@33 386 midiEvents.drawMidiFile(noteInStream.midiInputEvents);
andrew@33 387
andrew@40 388 //drawMuseScoreText();
andrew@33 389
andrew@33 390 ofSetHexColor(0x000000);
andrew@33 391 ofDrawBitmapString(midiPortName, 20, ofGetHeight() - 20);
andrew@33 392
andrew@33 393 }
andrew@33 394
andrew@34 395 void testApp::drawMuseScoreText(){
andrew@34 396 string ratingString = ofToString(performanceRating*100,0)+"%";
andrew@34 397 if (performanceRating > 0.84)
andrew@34 398 ratingString += "!* *";
andrew@34 399 string extraText = "";
andrew@34 400 if (performanceRating > 0.9){
andrew@34 401 extraText += " pretty good, huh?";
andrew@34 402 }
andrew@34 403 if (performanceRating > 0.95)
andrew@34 404 extraText = " blimey! ";
andrew@34 405 if (performanceRating > 0.97)
andrew@34 406 extraText = " maestro!";
andrew@34 407
andrew@34 408 ratingString += extraText;
andrew@34 409 verdana30.drawString(ratingString, 20, 60);
andrew@34 410 }
andrew@34 411
andrew@52 412 #pragma mark -keyInput
andrew@33 413 //--------------------------------------------------------------
andrew@33 414 void testApp::keyPressed(int key){
andrew@33 415
andrew@33 416 if (key == '.'){
andrew@33 417 midiPort++;
andrew@33 418 midiIn.openPort(midiPort);
andrew@33 419 }
andrew@33 420
andrew@33 421 if (key == ',' && midiPort > 0){
andrew@33 422 midiPort--;
andrew@33 423 midiIn.openPort(midiPort);
andrew@33 424 }
andrew@33 425
andrew@33 426 if (key == '-')
andrew@33 427 transpose -= 12;
andrew@33 428
andrew@33 429 if (key == '=')
andrew@33 430 transpose += 12;
andrew@33 431
andrew@33 432 if (key == 'c'){
andrew@33 433 double timenow = ofGetElapsedTimeMillis();
andrew@46 434 //midiEvents.exampleCrossUpdate();
andrew@33 435 timenow *= -1;
andrew@33 436 timenow += ofGetElapsedTimeMillis();
andrew@33 437 printf("CROSS UPDATE TOOK %f", timenow);
andrew@33 438 }
andrew@33 439
andrew@33 440
andrew@33 441 if (key == OF_KEY_LEFT){
andrew@33 442
andrew@33 443 }
andrew@33 444
andrew@33 445 if (key == OF_KEY_RIGHT)
andrew@33 446
andrew@33 447 if (key == OF_KEY_RETURN)
andrew@33 448 stopPlaying();
andrew@33 449
andrew@33 450 if (key == OF_KEY_UP){
andrew@33 451 if (midiEvents.ticksPerScreen >= 4000)
andrew@33 452 midiEvents.ticksPerScreen += 2000;
andrew@33 453 else
andrew@33 454 midiEvents.ticksPerScreen += 500;
andrew@33 455 }
andrew@33 456
andrew@33 457 if (key == 'm'){
andrew@33 458 // midiEvents.findMatch(84, 0, 10000);
andrew@33 459 }
andrew@33 460
andrew@33 461 if (key == 'b'){
andrew@33 462 sendBlackNotes();
andrew@33 463 }
andrew@33 464
andrew@33 465
andrew@33 466 if (key == 'n'){
andrew@33 467 midiEvents.printInterNoteIntervals();
andrew@33 468 }
andrew@33 469
andrew@33 470 if (key == OF_KEY_DOWN){
andrew@33 471 if (midiEvents.ticksPerScreen >= 4000)
andrew@33 472 midiEvents.ticksPerScreen -= 2000;
andrew@33 473 else if (midiEvents.ticksPerScreen > 500)
andrew@33 474 midiEvents.ticksPerScreen -= 500;
andrew@33 475 }
andrew@33 476
andrew@33 477 if (key == 'w')
andrew@33 478 midiEvents.printMatchMatrix();
andrew@33 479
andrew@33 480 if (key == 'k'){
andrew@33 481 noteInStream.printNotes();
andrew@33 482 }
andrew@33 483
andrew@33 484 if (key == 'p'){
andrew@46 485 //midiEvents.printNotes();
andrew@46 486 midiEvents.bayesStruct.posterior.printArray();
andrew@33 487 }
andrew@33 488
andrew@33 489 if (key == 'l')
andrew@40 490 midiEvents.bayesStruct.decaySpeedDistribution(100);
andrew@33 491
andrew@40 492 if (key == 'f'){
andrew@40 493 //flip
andrew@33 494 midiEvents.drawTempoMode = !midiEvents.drawTempoMode;
andrew@40 495 midiEvents.drawPhaseMode = !midiEvents.drawPhaseMode;
andrew@40 496 }
andrew@40 497
andrew@40 498
andrew@40 499 if (key == 't'){
andrew@40 500 midiEvents.drawTempoMode = !midiEvents.drawTempoMode;
andrew@40 501 }
andrew@33 502
andrew@33 503 if (key == 'y')
andrew@33 504 midiEvents.drawPhaseMode = !midiEvents.drawPhaseMode;
andrew@33 505
andrew@33 506 if (key == 'r'){
andrew@33 507 noteInStream.reset();
andrew@33 508 liveInputPlaying = false;
andrew@33 509 stopPlaying();
andrew@33 510 lastMeasureSent = 0;
andrew@33 511 sendMeasureToMuseScore();
andrew@33 512 sendBlackNotes();
andrew@33 513 lastScoreIndexSent = 0;
andrew@33 514 performanceRating = 0;
andrew@33 515
andrew@33 516 }
andrew@33 517
andrew@33 518 if (key == 'o' || key == 'O'){
andrew@33 519 loadRecordedMidiFile();
andrew@33 520 }
andrew@33 521
andrew@52 522 if (key == 'v'){
andrew@52 523 midiEvents.bayesStruct.drawPrior = midiEvents.bayesStruct.drawPosterior;
andrew@52 524 midiEvents.bayesStruct.drawLikelihood = !midiEvents.bayesStruct.drawLikelihood;
andrew@52 525 midiEvents.bayesStruct.drawPrior = !midiEvents.bayesStruct.drawPrior;
andrew@52 526 midiEvents.bayesStruct.drawPosterior = !midiEvents.bayesStruct.drawPosterior;
andrew@52 527 }
andrew@33 528
andrew@52 529 if (key == 'x'){
andrew@52 530 midiEvents.bayesStruct.drawPrior = !midiEvents.bayesStruct.drawPrior;
andrew@52 531 }
andrew@33 532
andrew@52 533 if (key == 'g'){
andrew@52 534 midiEvents.writeAllDistributions();
andrew@52 535 }
andrew@33 536 }
andrew@33 537
andrew@33 538 void testApp::loadRecordedMidiFile(){
andrew@33 539 //open audio file
andrew@33 540 string *filePtr;
andrew@33 541 filePtr = &midiFileName;
andrew@33 542
andrew@33 543 if (getFilenameFromDialogBox(filePtr)){
andrew@33 544 printf("Midifile: Loaded name okay :\n'%s' \n", midiFileName.c_str());
andrew@33 545 cannamMainFunction();
andrew@33 546 }
andrew@33 547 }
andrew@33 548
andrew@33 549 //--------------------------------------------------------------
andrew@33 550 void testApp::keyReleased(int key){
andrew@33 551
andrew@33 552 }
andrew@33 553
andrew@33 554 //--------------------------------------------------------------
andrew@33 555 void testApp::mouseMoved(int x, int y ){
andrew@33 556 midiEvents.mouseX = midiEvents.getEventTimeMillis((x * midiEvents.ticksPerScreen)/ screenWidth);
andrew@33 557 }
andrew@33 558
andrew@33 559 //--------------------------------------------------------------
andrew@33 560 void testApp::mouseDragged(int x, int y, int button){
andrew@33 561
andrew@33 562 }
andrew@33 563
andrew@33 564 //--------------------------------------------------------------
andrew@33 565 void testApp::mousePressed(int x, int y, int button){
andrew@33 566
andrew@33 567 }
andrew@33 568
andrew@33 569 //--------------------------------------------------------------
andrew@33 570 void testApp::mouseReleased(int x, int y, int button){
andrew@33 571
andrew@33 572 }
andrew@33 573
andrew@33 574 //--------------------------------------------------------------
andrew@33 575 void testApp::windowResized(int w, int h){
andrew@33 576 screenWidth = w;
andrew@33 577 screenHeight = h;
andrew@33 578 midiEvents.noteHeight = screenHeight / (float)(midiEvents.noteMaximum - midiEvents.noteMinimum);
andrew@33 579
andrew@33 580 }
andrew@33 581
andrew@33 582 void testApp::prepareToStartOnNextNote(){
andrew@33 583 readyToStart = true;
andrew@33 584 }
andrew@33 585
andrew@33 586
andrew@33 587 void testApp::startPlaying(){
andrew@33 588 playing = !playing;
andrew@33 589 midiEvents.reset();
andrew@33 590 noteInStream.reset();
andrew@33 591 midiEvents.setStartPlayingTimes();
andrew@33 592 sendBlackNotes();
andrew@33 593 readyToStart = false;
andrew@33 594 //this is where we stop and start playing
andrew@33 595 }
andrew@33 596
andrew@33 597 void testApp::stopPlaying(){
andrew@33 598 //midiEvents.printNoteCounter();
andrew@33 599 //noteInStream.printTotalCount();
andrew@33 600
andrew@33 601 noteInStream.calculateTotalScore(midiEvents);
andrew@33 602
andrew@33 603
andrew@33 604 playing = false;
andrew@33 605 liveInputPlaying = false;
andrew@33 606 lastScoreIndexSent = 0;
andrew@33 607 midiEvents.bestMatchIndex = 0;
andrew@33 608 sendNoteToMuseScore();
andrew@33 609
andrew@37 610 diffFile.close();
andrew@50 611 //myfile.close();
andrew@37 612
andrew@33 613 }
andrew@33 614
andrew@33 615 bool testApp::getFilenameFromDialogBox(string* fileNameToSave){
andrew@33 616 //this uses a pointer structure within the loader and returns true if the dialogue box was used successfully
andrew@33 617 // first, create a string that will hold the URL
andrew@33 618 string URL;
andrew@33 619
andrew@33 620 // openFile(string& URL) returns 1 if a file was picked
andrew@33 621 // returns 0 when something went wrong or the user pressed 'cancel'
andrew@33 622 int response = ofxFileDialogOSX::openFile(URL);
andrew@33 623 if(response){
andrew@33 624 // now you can use the URL
andrew@33 625 *fileNameToSave = URL;
andrew@33 626 //printf("\n filename is %s \n", soundFileName.c_str());
andrew@33 627 return true;
andrew@33 628 }
andrew@33 629 else {
andrew@33 630 // soundFileName = "OPEN canceled. ";
andrew@33 631 printf("\n open file cancelled \n");
andrew@33 632 return false;
andrew@33 633 }
andrew@33 634
andrew@33 635
andrew@33 636
andrew@33 637 }
andrew@33 638
andrew@37 639 void testApp::openOutputFile(const int& i){
andrew@37 640 if (diffFile.is_open())
andrew@37 641 diffFile.close();
andrew@38 642 string endBit = ".txt";
andrew@38 643 string outputFileName = makeRWCfilename(outputFileRoot, i, endBit);
andrew@38 644 /*
andrew@37 645 if (i >= 10)
andrew@37 646 outputFileName = outputFileRoot + ofToString(i)+".txt";
andrew@37 647 else
andrew@37 648 outputFileName = outputFileRoot + "0"+ofToString(i)+".txt";
andrew@38 649 */
andrew@37 650 diffFile.open(outputFileName.c_str());
andrew@37 651 }
andrew@33 652
andrew@37 653 void testApp::loadRWCfileNumber(const int& i){
andrew@41 654 if (i >= 0 && i <= 64){
andrew@41 655 /*midiFileNumber = i;
andrew@37 656 if (i >= 10)
andrew@37 657 midiFileName = root + ofToString(midiFileNumber)+".MID";
andrew@37 658 else
andrew@37 659 midiFileName = root + "0"+ofToString(midiFileNumber)+".MID";
andrew@41 660 */
andrew@41 661 midiFileName = root + rwcFileNameStrings[i]+".MID";
andrew@41 662 printf("MIDI FILE:%s\n", midiFileName.c_str());
andrew@37 663 cannamMainFunction();
andrew@37 664 }
andrew@37 665 }
andrew@33 666
andrew@38 667 std::string testApp::makeRWCfilename(std::string& root, const int& fileID, std::string& endPart){
andrew@38 668 std::string pathName;
andrew@41 669 if (fileID >= 0 && fileID <= 64){
andrew@41 670
andrew@41 671 pathName = root + rwcFileNameStrings[fileID]+endPart;
andrew@41 672 /*
andrew@38 673 if (fileID >= 10)
andrew@38 674 pathName = root + ofToString(fileID)+endPart;
andrew@38 675 else
andrew@38 676 pathName = root + "0"+ofToString(fileID)+endPart;
andrew@41 677 */
andrew@38 678 printf("MAKE FILE:%s\n", midiFileName.c_str());
andrew@38 679 }
andrew@38 680 return pathName;
andrew@38 681 }
andrew@38 682
andrew@41 683 void testApp::createRWCfilenameStrings(){
andrew@41 684 rwcFileNameStrings.clear();
andrew@41 685 for (int i = 1;i< 10;i++){
andrew@41 686 rwcFileNameStrings.push_back("0"+ofToString(i));
andrew@41 687 }
andrew@41 688 for (int i = 10;i< 23;i++){
andrew@41 689 rwcFileNameStrings.push_back(ofToString(i));
andrew@41 690 }
andrew@41 691 rwcFileNameStrings.push_back("23A");
andrew@41 692 rwcFileNameStrings.push_back("23B");
andrew@41 693 rwcFileNameStrings.push_back("23C");
andrew@41 694 rwcFileNameStrings.push_back("23D");
andrew@41 695 rwcFileNameStrings.push_back("23E");
andrew@41 696
andrew@41 697 rwcFileNameStrings.push_back("24A");
andrew@41 698 rwcFileNameStrings.push_back("24B");
andrew@41 699 rwcFileNameStrings.push_back("24C");
andrew@41 700
andrew@41 701 rwcFileNameStrings.push_back("25A");
andrew@41 702 rwcFileNameStrings.push_back("25B");
andrew@41 703 rwcFileNameStrings.push_back("25C");
andrew@41 704 rwcFileNameStrings.push_back("25D");
andrew@41 705
andrew@41 706 for (int i = 26;i< 35;i++){
andrew@41 707 rwcFileNameStrings.push_back(ofToString(i));
andrew@41 708 }
andrew@41 709 rwcFileNameStrings.push_back("35A");
andrew@41 710 rwcFileNameStrings.push_back("35B");
andrew@41 711 rwcFileNameStrings.push_back("35C");
andrew@41 712 for (int i = 36;i< 51;i++){
andrew@41 713 rwcFileNameStrings.push_back(ofToString(i));
andrew@41 714 }
andrew@41 715
andrew@41 716 // for (int i = 0;i < rwcFileNameStrings.size();i++) {
andrew@41 717 // printf("RWC{%i}:'%s'\n", i, rwcFileNameStrings[i].c_str());
andrew@41 718 // }
andrew@41 719
andrew@41 720 }
andrew@41 721
andrew@38 722 void testApp::loadAnnotation(const int& fileID){
andrew@49 723
andrew@38 724 string annotationEnding = "_annotation+WavPos.csv";
andrew@38 725 string path = makeRWCfilename(annotationRoot, fileID, annotationEnding );
andrew@38 726 midiEvents.myNotation.readInRWCfile(path);
andrew@38 727 }
andrew@33 728
andrew@33 729 int testApp::cannamMainFunction(){
andrew@33 730
andrew@33 731
andrew@33 732 midiEvents.clearAllEvents();
andrew@33 733
andrew@33 734 //int main(int argc, char **argv)
andrew@33 735 //{
andrew@33 736 // if (argc != 2) {
andrew@33 737 // cerr << "Usage: midifile <file.mid>" << endl;
andrew@33 738 // return 1;
andrew@33 739 // }
andrew@33 740
andrew@33 741 std::string filename = midiFileName;//argv[1];
andrew@37 742 printf("Loading'%s'\n", midiFileName.c_str());
andrew@44 743
andrew@33 744 fileLoader.loadFile(filename, midiEvents);
andrew@33 745
andrew@33 746 }//new end of load function
andrew@33 747
andrew@36 748 /*
andrew@36 749 void testApp::readInSomeValues(){
andrew@36 750
andrew@33 751
andrew@36 752 printf("READ FILE\n");
andrew@36 753 ifstream file ( "/Users/andrew/Documents/work/MuseScore/RWC/ANNOTATION/RM-C002_annotation+WavPos.csv" ); // declare file stream: http://www.cplusplus.com/reference/iostream/ifstream/
andrew@36 754 string value;
andrew@36 755 int count = 0;
andrew@36 756 while ( file.good() )
andrew@36 757 {
andrew@36 758 getline ( file, value, ',' ); // read a string until next comma: http://www.cplusplus.com/reference/string/getline/
andrew@36 759 cout << string( value, 1, value.length()-2 ); // display value removing the first and the last character from it
andrew@36 760
andrew@36 761 string::size_type start = value.find_first_not_of(" \t\v");
andrew@36 762 string part = value.substr(start, string::npos);
andrew@36 763 //printf("%s (%i)\n", part.c_str(), count);
andrew@36 764 float my_float;
andrew@36 765 int my_int;
andrew@36 766 switch (count%6) {
andrew@36 767 case 1:
andrew@36 768 printf("reading %s\n", part.c_str());
andrew@36 769 my_float = atof(part.c_str());
andrew@36 770 printf("float is %f\n", my_float);
andrew@36 771 break;
andrew@36 772 case 2:
andrew@36 773 printf("reading %s\n", part.c_str());
andrew@36 774 my_int = atoi(part.c_str());
andrew@36 775 printf("float is %i\n", i);
andrew@36 776 break;
andrew@36 777
andrew@36 778 default:
andrew@36 779 break;
andrew@36 780 }
andrew@36 781 count++;
andrew@36 782 }
andrew@36 783
andrew@36 784 }
andrew@33 785
andrew@36 786 */
andrew@33 787
andrew@36 788