annotate jnmr/testApp.cpp @ 40:776694bcbd02

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