annotate hackday/testApp.cpp @ 24:5a11b19906c7

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