annotate hackday/testApp.cpp @ 25:2a025ea7c793

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