annotate hackday/testApp.cpp @ 26:179365726f07

live input, calculates score rating
author Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk>
date Sun, 04 Dec 2011 00:02:26 +0000
parents 2a025ea7c793
children fa1890efa044
rev   line source
andrew@24 1 #include "testApp.h"
andrew@24 2
andrew@24 3 //--------------------------------------------------------------
andrew@24 4 void testApp::setup(){
andrew@24 5 midiFileName = "../../../data/frerejacques.mid";
andrew@24 6 int retVal = cannamMainFunction();
andrew@24 7
andrew@24 8 cout << "MIDI INPUT EXAMPLE" << endl;
andrew@24 9 printf("midi in in in");
andrew@24 10 ofSetVerticalSync(true);
andrew@24 11 //ofBackground(255,255,255);
andrew@24 12
andrew@24 13 midiIn.listPorts();
andrew@24 14 midiIn.openPort(2);
andrew@24 15
andrew@26 16 transpose = 12;
andrew@24 17 noteInStream.transposeVal = &transpose;
andrew@24 18
andrew@24 19 noteInStream.startTime = &midiEvents.startTime;//point start time of note in stream to the same time in MIDI events
andrew@24 20
andrew@24 21 noteInStream.factor = &midiEvents.ticksFactor;
andrew@24 22 printf("TICKS FACTOR %f \n", midiEvents.ticksFactor);//noteInStream->factor)
andrew@24 23
andrew@24 24 // portName = "hello";//midiIn.portNames[2];
andrew@24 25 // printf("MIDI PORT %c\n", portName);
andrew@24 26 cout << "MIDI PORT " << endl;//portName << endl;
andrew@24 27
andrew@24 28
andrew@24 29 //midiIn.addListener(this);
andrew@24 30 ofAddListener(midiIn.newMessageEvent, this, &testApp::newMessage);
andrew@24 31
andrew@24 32
andrew@24 33
andrew@24 34 playing = false;
andrew@24 35
andrew@24 36
andrew@24 37 receiver.setup( PORT );
andrew@25 38
andrew@25 39 sender.setup( HOST, SEND_PORT );
andrew@24 40
andrew@24 41 screenWidth = ofGetWidth();
andrew@24 42 screenHeight = ofGetHeight();
andrew@24 43 midiEvents.screenWidth = &screenWidth;
andrew@24 44 midiEvents.screenHeight = &screenHeight;
andrew@24 45 midiEvents.drawTempoMode = false;
andrew@24 46 ofSetFrameRate(30);
andrew@25 47
andrew@25 48 midiEvents.ticksPerScreen += 4000;
andrew@25 49 lastScoreIndexSent = 0;
andrew@26 50 performanceRating = 1.0;
andrew@25 51
andrew@24 52 }
andrew@24 53
andrew@24 54 //--------------------------------------------------------------
andrew@24 55 void testApp::update(){
andrew@24 56 if (playing){
andrew@25 57 midiEvents.updatePlayPosition();//this fn calls midiEvents.bayesStruct.updateBestEstimate();
andrew@24 58 }
andrew@24 59 // drawer.tickLocation+=20;
andrew@24 60
andrew@24 61 // check for waiting messages
andrew@24 62 while( receiver.hasWaitingMessages() )
andrew@24 63 {
andrew@24 64 ofxOscMessage m;
andrew@24 65 receiver.getNextMessage( &m );
andrew@24 66
andrew@24 67 if ( m.getAddress() == "/midinoteon" )
andrew@24 68 {
andrew@26 69 int newMidiOnPitch = m.getArgAsInt32(0) + transpose;
andrew@24 70 int velocity = m.getArgAsInt32(1);
andrew@24 71 double time = m.getArgAsFloat(2);
andrew@24 72
andrew@26 73 if (velocity != 0){
andrew@26 74 midiEvents.newNoteOnEvent(newMidiOnPitch, velocity, time);
andrew@26 75 noteInStream.newNoteCounted(newMidiOnPitch);
andrew@26 76 }
andrew@24 77
andrew@24 78 }
andrew@24 79
andrew@24 80 if ( m.getAddress() == "/setSpeedPrior" )
andrew@24 81 {
andrew@24 82 float speedPrior = m.getArgAsFloat(0);
andrew@24 83 printf("speed prior set to %f\n", speedPrior);
andrew@24 84 midiEvents.speedPriorValue = speedPrior;
andrew@24 85 midiEvents.bayesStruct.speedPriorValue = speedPrior;
andrew@24 86 }
andrew@24 87
andrew@24 88 if ( m.getAddress() == "/startplaying" )
andrew@24 89 {
andrew@24 90 startPlaying();
andrew@24 91 }
andrew@24 92
andrew@24 93 if ( m.getAddress() == "/stopplaying" )
andrew@24 94 {
andrew@24 95 stopPlaying();
andrew@24 96 }
andrew@24 97
andrew@24 98
andrew@24 99 if ( m.getAddress() == "/integratedEstimate" )
andrew@24 100 {
andrew@24 101 midiEvents.bayesStruct.usingIntegratedTempoEstimate = true;
andrew@24 102 }
andrew@24 103
andrew@24 104 if ( m.getAddress() == "/MAPestimate" )
andrew@24 105 {
andrew@24 106 midiEvents.bayesStruct.usingIntegratedTempoEstimate = false;
andrew@24 107 }
andrew@24 108
andrew@24 109
andrew@24 110 if ( m.getAddress() == "/realtime" )
andrew@24 111 {
andrew@24 112 midiEvents.runningInRealTime = true;
andrew@24 113 }
andrew@24 114
andrew@24 115
andrew@24 116 if ( m.getAddress() == "/offline" )
andrew@24 117 {
andrew@24 118 midiEvents.runningInRealTime = false;
andrew@24 119 }
andrew@24 120
andrew@24 121 if ( m.getAddress() == "/minimumSpeedRatio" )
andrew@24 122 {
andrew@24 123
andrew@24 124 float minSpeed = m.getArgAsFloat(0);
andrew@24 125 //printf("minimum speed received is %f and max is %f\n", minSpeed, midiEvents.bayesStruct.relativeSpeedLikelihood.getIndexInRealTerms(midiEvents.bayesStruct.relativeSpeedLikelihood.length-1));
andrew@24 126 if (minSpeed > 0 && minSpeed < midiEvents.bayesStruct.relativeSpeedLikelihood.getIndexInRealTerms(midiEvents.bayesStruct.relativeSpeedLikelihood.length-1)){
andrew@24 127 printf("minimum speed accepted is %f\n", minSpeed);
andrew@24 128 midiEvents.minimumMatchSpeed = minSpeed;
andrew@24 129 }
andrew@24 130 }
andrew@24 131
andrew@24 132 }//end while osc
andrew@25 133
andrew@25 134 checkNewScoreNote();
andrew@24 135
andrew@24 136 }
andrew@24 137
andrew@25 138
andrew@25 139 void testApp::checkNewScoreNote(){
andrew@25 140 if (lastScoreIndexSent != midiEvents.bestMatchIndex){
andrew@25 141 //then we send out new note
andrew@25 142 sendNoteToMuseScore();
andrew@25 143 lastScoreIndexSent = midiEvents.bestMatchIndex;
andrew@25 144 findMeasure();
andrew@25 145 }
andrew@25 146 }
andrew@25 147
andrew@25 148 void testApp::findMeasure(){
andrew@25 149 int ticks = midiEvents.recordedNoteOnMatrix[midiEvents.bestMatchIndex][0];
andrew@25 150 int tmpMeasure = lastMeasureSent;
andrew@25 151
andrew@25 152 while (lastMeasureSent > 0 && midiEvents.measureVector[lastMeasureSent] > ticks) {
andrew@25 153 lastMeasureSent--;
andrew@25 154 }
andrew@25 155
andrew@25 156 while (lastMeasureSent < midiEvents.measureVector.size() && midiEvents.measureVector[lastMeasureSent] < ticks) {
andrew@25 157 lastMeasureSent++;
andrew@25 158 }
andrew@25 159 if (lastMeasureSent != tmpMeasure){
andrew@25 160 sendMeasureToMuseScore();
andrew@26 161 performanceRating = noteInStream.calculateTotalScore(midiEvents);
andrew@25 162 }
andrew@25 163
andrew@25 164
andrew@25 165 }
andrew@25 166
andrew@26 167 void testApp::sendBlackNotes(){
andrew@26 168 ofxOscMessage m;
andrew@26 169 m.setAddress( "/plugin" );
andrew@26 170 string noteString;
andrew@26 171 noteString = "blacknotes.js";
andrew@26 172 m.addStringArg( noteString);
andrew@26 173 sender.sendMessage( m );
andrew@26 174 }
andrew@26 175
andrew@25 176 void testApp::sendNoteToMuseScore(){
andrew@25 177 int ticks = midiEvents.recordedNoteOnMatrix[midiEvents.bestMatchIndex][0];
andrew@25 178 int pitch = midiEvents.recordedNoteOnMatrix[midiEvents.bestMatchIndex][1];
andrew@25 179 printf("sending to muse score %i, %i \n", ticks, pitch);
andrew@25 180
andrew@26 181 /*
andrew@26 182 ofxOscMessage m;
andrew@26 183 m.setAddress( "/plugin" );
andrew@26 184 string noteString;
andrew@26 185 noteString = "blackNotes.js";
andrew@26 186 m.addStringArg( noteString);
andrew@26 187 sender.sendMessage( m );
andrew@26 188 */
andrew@26 189
andrew@26 190 ofxOscMessage m;
andrew@26 191 m.setAddress( "/plugin" );
andrew@26 192 string noteString;
andrew@26 193 noteString = "coloronenote.js";
andrew@26 194 noteString += ",myTick,"+ofToString(ticks)+",myPitch,"+ofToString(pitch);
andrew@26 195 // printf("%s\n", noteString);
andrew@26 196 m.addStringArg( noteString);
andrew@26 197 sender.sendMessage( m );
andrew@26 198 /*
andrew@25 199 m.addStringArg( "coloronenote.js" );
andrew@25 200 m.addStringArg("mytick");
andrew@25 201 m.addIntArg( ticks );
andrew@25 202 m.addStringArg("mypitch");
andrew@25 203 m.addIntArg( pitch);
andrew@26 204 */
andrew@25 205
andrew@25 206 // /plugin coloronenote.js mytick 100 mypitch 56;
andrew@25 207 }
andrew@25 208
andrew@25 209
andrew@25 210
andrew@25 211 void testApp::sendMeasureToMuseScore(){
andrew@25 212
andrew@25 213 printf("sending measure to muse score %i \n", lastMeasureSent);
andrew@25 214
andrew@25 215 ofxOscMessage m;
andrew@25 216 m.setAddress( "/select-measure" );
andrew@25 217 m.addIntArg(lastMeasureSent);
andrew@25 218 sender.sendMessage( m );
andrew@25 219
andrew@25 220 // /select-measure 6
andrew@25 221 // /plugin coloronenote.js mytick 100 mypitch 56;
andrew@25 222 }
andrew@25 223
andrew@25 224
andrew@24 225 void testApp::newMessage(ofxMidiEventArgs &args){
andrew@24 226
andrew@24 227 int pitch;
andrew@24 228 if (noteInStream.noteInReceived(args)){
andrew@24 229 double timeNow = ofGetElapsedTimeMillis();
andrew@24 230
andrew@24 231 if (!liveInputPlaying){
andrew@24 232 firstNoteTime = timeNow;
andrew@24 233 liveInputPlaying = true;
andrew@24 234 startPlaying();
andrew@24 235 printf("FIRST LIVE NOTE IS NOW AT TIME %f\n", timeNow);
andrew@24 236 }
andrew@24 237
andrew@24 238 pitch = args.byteOne + transpose;
andrew@24 239
andrew@24 240 midiEvents.newNoteOnEvent(pitch, args.byteTwo, timeNow - firstNoteTime);
andrew@24 241
andrew@24 242
andrew@24 243 int tickTime = midiEvents.getEventTimeTicks(timeNow-firstNoteTime);
andrew@24 244 IntVector v;
andrew@24 245 v.push_back(tickTime);
andrew@24 246 v.push_back(pitch);
andrew@24 247 v.push_back(args.byteTwo);
andrew@25 248 v.push_back(200);//tmp time til note off happens
andrew@24 249 noteInStream.midiInputEvents.push_back(v);
andrew@24 250 noteInStream.midiInputTimes.push_back(timeNow - firstNoteTime);
andrew@25 251 //printf("NOTE %i at time %f at tick time %i\n", pitch, (timeNow - firstNoteTime), tickTime);
andrew@24 252 }
andrew@24 253
andrew@24 254 // cout << "MIDI message [port: " << args.port << ", channel: " << args.channel << ", status: " << args.status << ", byteOne: " << pitch << ", byteTwo: " << args.byteTwo << ", timestamp: " << args.timestamp << "]" << endl;
andrew@24 255 }
andrew@24 256
andrew@24 257 //--------------------------------------------------------------
andrew@24 258 void testApp::draw(){
andrew@24 259
andrew@24 260 midiEvents.drawFile();
andrew@24 261
andrew@25 262 string info = "Measure ";
andrew@25 263 info += ofToString(lastMeasureSent);
andrew@25 264 info += " Last note ";
andrew@25 265 info += ofToString(lastScoreIndexSent);
andrew@25 266
andrew@25 267 ofSetHexColor(0x000000);
andrew@25 268 ofDrawBitmapString(info, 20, 20);
andrew@24 269 midiEvents.drawMidiFile(noteInStream.midiInputEvents);
andrew@24 270
andrew@26 271 ofDrawBitmapString("Rating "+ofToString(performanceRating*100), 20, 50);
andrew@24 272 }
andrew@24 273
andrew@24 274 //--------------------------------------------------------------
andrew@24 275 void testApp::keyPressed(int key){
andrew@24 276
andrew@24 277
andrew@24 278 // if (key == ' '){
andrew@24 279 // startPlaying();
andrew@24 280 // }
andrew@24 281 if (key == '-')
andrew@24 282 transpose -= 12;
andrew@24 283
andrew@24 284 if (key == '=')
andrew@24 285 transpose += 12;
andrew@24 286
andrew@24 287 if (key == 'c'){
andrew@24 288 double timenow = ofGetElapsedTimeMillis();
andrew@24 289 midiEvents.exampleCrossUpdate();
andrew@24 290 timenow *= -1;
andrew@24 291 timenow += ofGetElapsedTimeMillis();
andrew@24 292 printf("CROSS UPDATE TOOK %f", timenow);
andrew@24 293 }
andrew@26 294
andrew@26 295 if (key == OF_KEY_LEFT){
andrew@26 296
andrew@26 297 }
andrew@26 298
andrew@26 299 if (key == OF_KEY_RIGHT)
andrew@24 300
andrew@24 301 if (key == OF_KEY_RETURN)
andrew@24 302 stopPlaying();
andrew@24 303
andrew@24 304 if (key == OF_KEY_UP){
andrew@24 305 if (midiEvents.ticksPerScreen >= 4000)
andrew@24 306 midiEvents.ticksPerScreen += 2000;
andrew@24 307 else
andrew@24 308 midiEvents.ticksPerScreen += 500;
andrew@24 309 }
andrew@24 310
andrew@24 311 if (key == 'm'){
andrew@24 312 // midiEvents.findMatch(84, 0, 10000);
andrew@24 313 }
andrew@24 314
andrew@26 315 if (key == 'b'){
andrew@26 316 sendBlackNotes();
andrew@26 317 }
andrew@26 318
andrew@24 319 if (key == OF_KEY_DOWN){
andrew@24 320 if (midiEvents.ticksPerScreen >= 4000)
andrew@24 321 midiEvents.ticksPerScreen -= 2000;
andrew@24 322 else if (midiEvents.ticksPerScreen > 500)
andrew@24 323 midiEvents.ticksPerScreen -= 500;
andrew@24 324 }
andrew@24 325
andrew@24 326 if (key == 'w')
andrew@24 327 midiEvents.printMatchMatrix();
andrew@24 328
andrew@24 329 if (key == 'k'){
andrew@24 330 noteInStream.printNotes();
andrew@24 331 }
andrew@24 332
andrew@24 333 if (key == 'p'){
andrew@24 334 midiEvents.printNotes();
andrew@24 335 }
andrew@24 336
andrew@24 337 if (key == 'l')
andrew@24 338 midiEvents.bayesStruct.decaySpeedDistribution(100);
andrew@24 339
andrew@24 340 if (key == 't')
andrew@24 341 midiEvents.drawTempoMode = !midiEvents.drawTempoMode;
andrew@24 342
andrew@24 343 if (key == 'y')
andrew@24 344 midiEvents.drawPhaseMode = !midiEvents.drawPhaseMode;
andrew@24 345
andrew@24 346 if (key == 'r'){
andrew@24 347 noteInStream.reset();
andrew@24 348 liveInputPlaying = false;
andrew@24 349 stopPlaying();
andrew@26 350 lastMeasureSent = 0;
andrew@26 351 sendMeasureToMuseScore();
andrew@26 352 sendBlackNotes();
andrew@26 353 lastScoreIndexSent = 0;
andrew@26 354
andrew@24 355 }
andrew@24 356
andrew@24 357 if (key == 'o'){
andrew@24 358 //open audio file
andrew@24 359 string *filePtr;
andrew@24 360 filePtr = &midiFileName;
andrew@24 361
andrew@24 362 if (getFilenameFromDialogBox(filePtr)){
andrew@24 363 printf("Midifile: Loaded name okay :\n'%s' \n", midiFileName.c_str());
andrew@24 364 cannamMainFunction();
andrew@24 365 }
andrew@24 366 }
andrew@24 367
andrew@24 368
andrew@24 369
andrew@24 370 }
andrew@24 371
andrew@24 372 //--------------------------------------------------------------
andrew@24 373 void testApp::keyReleased(int key){
andrew@24 374
andrew@24 375 }
andrew@24 376
andrew@24 377 //--------------------------------------------------------------
andrew@24 378 void testApp::mouseMoved(int x, int y ){
andrew@24 379 midiEvents.mouseX = midiEvents.getEventTimeMillis((x * midiEvents.ticksPerScreen)/ screenWidth);
andrew@24 380 }
andrew@24 381
andrew@24 382 //--------------------------------------------------------------
andrew@24 383 void testApp::mouseDragged(int x, int y, int button){
andrew@24 384
andrew@24 385 }
andrew@24 386
andrew@24 387 //--------------------------------------------------------------
andrew@24 388 void testApp::mousePressed(int x, int y, int button){
andrew@24 389
andrew@24 390 }
andrew@24 391
andrew@24 392 //--------------------------------------------------------------
andrew@24 393 void testApp::mouseReleased(int x, int y, int button){
andrew@24 394
andrew@24 395 }
andrew@24 396
andrew@24 397 //--------------------------------------------------------------
andrew@24 398 void testApp::windowResized(int w, int h){
andrew@24 399 screenWidth = w;
andrew@24 400 screenHeight = h;
andrew@24 401 midiEvents.noteHeight = screenHeight / (float)(midiEvents.noteMaximum - midiEvents.noteMinimum);
andrew@24 402
andrew@24 403 }
andrew@24 404
andrew@24 405
andrew@24 406
andrew@24 407 void testApp::startPlaying(){
andrew@24 408 playing = !playing;
andrew@24 409 midiEvents.reset();
andrew@26 410 noteInStream.reset();
andrew@24 411 midiEvents.setStartPlayingTimes();
andrew@26 412 sendBlackNotes();
andrew@24 413 //this is where we stop and start playing
andrew@24 414 }
andrew@24 415
andrew@24 416 void testApp::stopPlaying(){
andrew@26 417 midiEvents.printNoteCounter();
andrew@26 418 noteInStream.printTotalCount();
andrew@26 419 noteInStream.calculateTotalScore(midiEvents);
andrew@26 420
andrew@26 421
andrew@24 422 playing = false;
andrew@24 423 liveInputPlaying = false;
andrew@25 424 lastScoreIndexSent = 0;
andrew@25 425 midiEvents.bestMatchIndex = 0;
andrew@25 426 sendNoteToMuseScore();
andrew@26 427
andrew@24 428 }
andrew@24 429
andrew@24 430 bool testApp::getFilenameFromDialogBox(string* fileNameToSave){
andrew@24 431 //this uses a pointer structure within the loader and returns true if the dialogue box was used successfully
andrew@24 432 // first, create a string that will hold the URL
andrew@24 433 string URL;
andrew@24 434
andrew@24 435 // openFile(string& URL) returns 1 if a file was picked
andrew@24 436 // returns 0 when something went wrong or the user pressed 'cancel'
andrew@24 437 int response = ofxFileDialogOSX::openFile(URL);
andrew@24 438 if(response){
andrew@24 439 // now you can use the URL
andrew@24 440 *fileNameToSave = URL;
andrew@24 441 //printf("\n filename is %s \n", soundFileName.c_str());
andrew@24 442 return true;
andrew@24 443 }
andrew@24 444 else {
andrew@24 445 // soundFileName = "OPEN canceled. ";
andrew@24 446 printf("\n open file cancelled \n");
andrew@24 447 return false;
andrew@24 448 }
andrew@24 449
andrew@24 450
andrew@24 451
andrew@24 452 }
andrew@24 453
andrew@24 454
andrew@24 455
andrew@24 456
andrew@24 457 int testApp::cannamMainFunction(){
andrew@24 458
andrew@24 459
andrew@24 460 midiEvents.clearAllEvents();
andrew@24 461
andrew@24 462 //int main(int argc, char **argv)
andrew@24 463 //{
andrew@24 464 // if (argc != 2) {
andrew@24 465 // cerr << "Usage: midifile <file.mid>" << endl;
andrew@24 466 // return 1;
andrew@24 467 // }
andrew@24 468
andrew@24 469 std::string filename = midiFileName;//argv[1];
andrew@24 470
andrew@24 471 // fileLoader.chopBeginning = true;
andrew@24 472 fileLoader.loadFile(filename, midiEvents);
andrew@24 473
andrew@24 474 }//new end of load function
andrew@24 475
andrew@24 476
andrew@24 477
andrew@24 478
andrew@24 479 //trying to port to new class
andrew@24 480 /*
andrew@24 481 MIDIFileReader fr(filename);
andrew@24 482
andrew@24 483 if (!fr.isOK()) {
andrew@24 484 std::cerr << "Error: " << fr.getError().c_str() << std::endl;
andrew@24 485 return 1;
andrew@24 486 }
andrew@24 487
andrew@24 488 MIDIComposition c = fr.load();
andrew@24 489
andrew@24 490 switch (fr.getFormat()) {
andrew@24 491 case MIDI_SINGLE_TRACK_FILE: cout << "Format: MIDI Single Track File" << endl; break;
andrew@24 492 case MIDI_SIMULTANEOUS_TRACK_FILE: cout << "Format: MIDI Simultaneous Track File" << endl; break;
andrew@24 493 case MIDI_SEQUENTIAL_TRACK_FILE: cout << "Format: MIDI Sequential Track File" << endl; break;
andrew@24 494 default: cout << "Format: Unknown MIDI file format?" << endl; break;
andrew@24 495 }
andrew@24 496
andrew@24 497 cout << "Tracks: " << c.size() << endl;
andrew@24 498
andrew@24 499 int td = fr.getTimingDivision();
andrew@24 500 if (td < 32768) {
andrew@24 501 cout << "Timing division: " << fr.getTimingDivision() << " ppq" << endl;
andrew@24 502
andrew@24 503 midiEvents.pulsesPerQuarternote = fr.getTimingDivision();
andrew@24 504 } else {
andrew@24 505 int frames = 256 - (td >> 8);
andrew@24 506 int subframes = td & 0xff;
andrew@24 507 cout << "SMPTE timing: " << frames << " fps, " << subframes << " subframes" << endl;
andrew@24 508 }
andrew@24 509
andrew@24 510 for (MIDIComposition::const_iterator i = c.begin(); i != c.end(); ++i) {
andrew@24 511
andrew@24 512 cout << "Start of track: " << i->first+1 << endl;
andrew@24 513
andrew@24 514 for (MIDITrack::const_iterator j = i->second.begin(); j != i->second.end(); ++j) {
andrew@24 515
andrew@24 516 unsigned int t = j->getTime();
andrew@24 517 int ch = j->getChannelNumber();
andrew@24 518
andrew@24 519 if (j->isMeta()) {
andrew@24 520 int code = j->getMetaEventCode();
andrew@24 521 string name;
andrew@24 522 bool printable = true;
andrew@24 523 switch (code) {
andrew@24 524
andrew@24 525 case MIDI_END_OF_TRACK:
andrew@24 526 cout << t << ": End of track" << endl;
andrew@24 527 break;
andrew@24 528
andrew@24 529 case MIDI_TEXT_EVENT: name = "Text"; break;
andrew@24 530 case MIDI_COPYRIGHT_NOTICE: name = "Copyright"; break;
andrew@24 531 case MIDI_TRACK_NAME: name = "Track name"; break;
andrew@24 532 case MIDI_INSTRUMENT_NAME: name = "Instrument name"; break;
andrew@24 533 case MIDI_LYRIC: name = "Lyric"; break;
andrew@24 534 case MIDI_TEXT_MARKER: name = "Text marker"; break;
andrew@24 535 case MIDI_SEQUENCE_NUMBER: name = "Sequence number"; printable = false; break;
andrew@24 536 case MIDI_CHANNEL_PREFIX_OR_PORT: name = "Channel prefix or port"; printable = false; break;
andrew@24 537 case MIDI_CUE_POINT: name = "Cue point"; break;
andrew@24 538 case MIDI_CHANNEL_PREFIX: name = "Channel prefix"; printable = false; break;
andrew@24 539 case MIDI_SEQUENCER_SPECIFIC: name = "Sequencer specific"; printable = false; break;
andrew@24 540 case MIDI_SMPTE_OFFSET: name = "SMPTE offset"; printable = false; break;
andrew@24 541
andrew@24 542 case MIDI_SET_TEMPO:
andrew@24 543 {
andrew@24 544 int m0 = j->getMetaMessage()[0];
andrew@24 545 int m1 = j->getMetaMessage()[1];
andrew@24 546 int m2 = j->getMetaMessage()[2];
andrew@24 547 long tempo = (((m0 << 8) + m1) << 8) + m2;
andrew@24 548
andrew@24 549 cout << t << ": Tempo: " << 60000000.0 / double(tempo) << endl;
andrew@24 550 midiEvents.tempo = 60000000.0 / double(tempo);
andrew@24 551 midiEvents.period = double(tempo)/1000.0;
andrew@24 552
andrew@24 553 printf("period double is %f\n", midiEvents.period);
andrew@24 554 }
andrew@24 555 break;
andrew@24 556
andrew@24 557 case MIDI_TIME_SIGNATURE:
andrew@24 558 {
andrew@24 559 int numerator = j->getMetaMessage()[0];
andrew@24 560 int denominator = 1 << (int)j->getMetaMessage()[1];
andrew@24 561
andrew@24 562 cout << t << ": Time signature: " << numerator << "/" << denominator << endl;
andrew@24 563 }
andrew@24 564
andrew@24 565 case MIDI_KEY_SIGNATURE:
andrew@24 566 {
andrew@24 567 int accidentals = j->getMetaMessage()[0];
andrew@24 568 int isMinor = j->getMetaMessage()[1];
andrew@24 569 bool isSharp = accidentals < 0 ? false : true;
andrew@24 570 accidentals = accidentals < 0 ? -accidentals : accidentals;
andrew@24 571 cout << t << ": Key signature: " << accidentals << " "
andrew@24 572 << (isSharp ?
andrew@24 573 (accidentals > 1 ? "sharps" : "sharp") :
andrew@24 574 (accidentals > 1 ? "flats" : "flat"))
andrew@24 575 << (isMinor ? ", minor" : ", major") << endl;
andrew@24 576 }
andrew@24 577
andrew@24 578 }
andrew@24 579
andrew@24 580
andrew@24 581 if (name != "") {
andrew@24 582 if (printable) {
andrew@24 583 cout << t << ": File meta event: code " << code
andrew@24 584 << ": " << name << ": \"" << j->getMetaMessage()
andrew@24 585 << "\"" << endl;
andrew@24 586 } else {
andrew@24 587 cout << t << ": File meta event: code " << code
andrew@24 588 << ": " << name << ": ";
andrew@24 589 for (int k = 0; k < j->getMetaMessage().length(); ++k) {
andrew@24 590 cout << (int)j->getMetaMessage()[k] << " ";
andrew@24 591 }
andrew@24 592 }
andrew@24 593 }
andrew@24 594 continue;
andrew@24 595 }
andrew@24 596
andrew@24 597 switch (j->getMessageType()) {
andrew@24 598
andrew@24 599 case MIDI_NOTE_ON:
andrew@24 600 cout << t << ": Note: channel " << ch
andrew@24 601 << " duration " << j->getDuration()
andrew@24 602 << " pitch " << j->getPitch()
andrew@24 603 << " velocity " << j->getVelocity()
andrew@24 604 << "event time " << midiEvents.getEventTimeMillis(t) << endl;
andrew@24 605 v.clear();
andrew@24 606 v.push_back(t);
andrew@24 607 v.push_back(j->getPitch());
andrew@24 608 v.push_back(j->getVelocity());
andrew@24 609 v.push_back(j->getDuration());
andrew@24 610 midiEvents.recordedNoteOnMatrix.push_back(v);
andrew@24 611 midiEvents.recordedEventTimes.push_back(midiEvents.getEventTimeMillis(t));
andrew@24 612 break;
andrew@24 613
andrew@24 614 case MIDI_POLY_AFTERTOUCH:
andrew@24 615 cout << t << ": Polyphonic aftertouch: channel " << ch
andrew@24 616 << " pitch " << j->getPitch()
andrew@24 617 << " pressure " << j->getData2() << endl;
andrew@24 618 break;
andrew@24 619
andrew@24 620 case MIDI_CTRL_CHANGE:
andrew@24 621 {
andrew@24 622 int controller = j->getData1();
andrew@24 623 string name;
andrew@24 624 switch (controller) {
andrew@24 625 case MIDI_CONTROLLER_BANK_MSB: name = "Bank select MSB"; break;
andrew@24 626 case MIDI_CONTROLLER_VOLUME: name = "Volume"; break;
andrew@24 627 case MIDI_CONTROLLER_BANK_LSB: name = "Bank select LSB"; break;
andrew@24 628 case MIDI_CONTROLLER_MODULATION: name = "Modulation wheel"; break;
andrew@24 629 case MIDI_CONTROLLER_PAN: name = "Pan"; break;
andrew@24 630 case MIDI_CONTROLLER_SUSTAIN: name = "Sustain"; break;
andrew@24 631 case MIDI_CONTROLLER_RESONANCE: name = "Resonance"; break;
andrew@24 632 case MIDI_CONTROLLER_RELEASE: name = "Release"; break;
andrew@24 633 case MIDI_CONTROLLER_ATTACK: name = "Attack"; break;
andrew@24 634 case MIDI_CONTROLLER_FILTER: name = "Filter"; break;
andrew@24 635 case MIDI_CONTROLLER_REVERB: name = "Reverb"; break;
andrew@24 636 case MIDI_CONTROLLER_CHORUS: name = "Chorus"; break;
andrew@24 637 case MIDI_CONTROLLER_NRPN_1: name = "NRPN 1"; break;
andrew@24 638 case MIDI_CONTROLLER_NRPN_2: name = "NRPN 2"; break;
andrew@24 639 case MIDI_CONTROLLER_RPN_1: name = "RPN 1"; break;
andrew@24 640 case MIDI_CONTROLLER_RPN_2: name = "RPN 2"; break;
andrew@24 641 case MIDI_CONTROLLER_SOUNDS_OFF: name = "All sounds off"; break;
andrew@24 642 case MIDI_CONTROLLER_RESET: name = "Reset"; break;
andrew@24 643 case MIDI_CONTROLLER_LOCAL: name = "Local"; break;
andrew@24 644 case MIDI_CONTROLLER_ALL_NOTES_OFF: name = "All notes off"; break;
andrew@24 645 }
andrew@24 646 cout << t << ": Controller change: channel " << ch
andrew@24 647 << " controller " << j->getData1();
andrew@24 648 if (name != "") cout << " (" << name << ")";
andrew@24 649 cout << " value " << j->getData2() << endl;
andrew@24 650 }
andrew@24 651 break;
andrew@24 652
andrew@24 653 case MIDI_PROG_CHANGE:
andrew@24 654 cout << t << ": Program change: channel " << ch
andrew@24 655 << " program " << j->getData1() << endl;
andrew@24 656 break;
andrew@24 657
andrew@24 658 case MIDI_CHNL_AFTERTOUCH:
andrew@24 659 cout << t << ": Channel aftertouch: channel " << ch
andrew@24 660 << " pressure " << j->getData1() << endl;
andrew@24 661 break;
andrew@24 662
andrew@24 663 case MIDI_PITCH_BEND:
andrew@24 664 cout << t << ": Pitch bend: channel " << ch
andrew@24 665 << " value " << (int)j->getData2() * 128 + (int)j->getData1() << endl;
andrew@24 666 break;
andrew@24 667
andrew@24 668 case MIDI_SYSTEM_EXCLUSIVE:
andrew@24 669 cout << t << ": System exclusive: code "
andrew@24 670 << (int)j->getMessageType() << " message length " <<
andrew@24 671 j->getMetaMessage().length() << endl;
andrew@24 672 break;
andrew@24 673
andrew@24 674
andrew@24 675 }
andrew@24 676
andrew@24 677
andrew@24 678 }
andrew@24 679
andrew@24 680
andrew@24 681 }
andrew@24 682
andrew@24 683 }//end cannam midi main
andrew@24 684
andrew@24 685 */
andrew@24 686
andrew@24 687