annotate jnmr/testApp.cpp @ 34:9d2a651a87b2

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