andrew@24: #include "testApp.h" andrew@24: andrew@24: //-------------------------------------------------------------- andrew@24: void testApp::setup(){ andrew@24: midiFileName = "../../../data/frerejacques.mid"; andrew@24: int retVal = cannamMainFunction(); andrew@24: andrew@24: cout << "MIDI INPUT EXAMPLE" << endl; andrew@24: printf("midi in in in"); andrew@24: ofSetVerticalSync(true); andrew@24: //ofBackground(255,255,255); andrew@24: andrew@24: midiIn.listPorts(); andrew@24: midiIn.openPort(2); andrew@24: andrew@26: transpose = 12; andrew@24: noteInStream.transposeVal = &transpose; andrew@24: andrew@24: noteInStream.startTime = &midiEvents.startTime;//point start time of note in stream to the same time in MIDI events andrew@24: andrew@24: noteInStream.factor = &midiEvents.ticksFactor; andrew@24: printf("TICKS FACTOR %f \n", midiEvents.ticksFactor);//noteInStream->factor) andrew@24: andrew@24: // portName = "hello";//midiIn.portNames[2]; andrew@24: // printf("MIDI PORT %c\n", portName); andrew@24: cout << "MIDI PORT " << endl;//portName << endl; andrew@24: andrew@24: andrew@24: //midiIn.addListener(this); andrew@24: ofAddListener(midiIn.newMessageEvent, this, &testApp::newMessage); andrew@24: andrew@24: andrew@24: andrew@24: playing = false; andrew@24: andrew@24: andrew@24: receiver.setup( PORT ); andrew@25: andrew@25: sender.setup( HOST, SEND_PORT ); andrew@24: andrew@24: screenWidth = ofGetWidth(); andrew@24: screenHeight = ofGetHeight(); andrew@24: midiEvents.screenWidth = &screenWidth; andrew@24: midiEvents.screenHeight = &screenHeight; andrew@24: midiEvents.drawTempoMode = false; andrew@24: ofSetFrameRate(30); andrew@25: andrew@25: midiEvents.ticksPerScreen += 4000; andrew@25: lastScoreIndexSent = 0; andrew@26: performanceRating = 1.0; andrew@25: andrew@24: } andrew@24: andrew@24: //-------------------------------------------------------------- andrew@24: void testApp::update(){ andrew@24: if (playing){ andrew@25: midiEvents.updatePlayPosition();//this fn calls midiEvents.bayesStruct.updateBestEstimate(); andrew@24: } andrew@24: // drawer.tickLocation+=20; andrew@24: andrew@24: // check for waiting messages andrew@24: while( receiver.hasWaitingMessages() ) andrew@24: { andrew@24: ofxOscMessage m; andrew@24: receiver.getNextMessage( &m ); andrew@24: andrew@24: if ( m.getAddress() == "/midinoteon" ) andrew@24: { andrew@26: int newMidiOnPitch = m.getArgAsInt32(0) + transpose; andrew@24: int velocity = m.getArgAsInt32(1); andrew@24: double time = m.getArgAsFloat(2); andrew@24: andrew@26: if (velocity != 0){ andrew@26: midiEvents.newNoteOnEvent(newMidiOnPitch, velocity, time); andrew@26: noteInStream.newNoteCounted(newMidiOnPitch); andrew@26: } andrew@24: andrew@24: } andrew@24: andrew@24: if ( m.getAddress() == "/setSpeedPrior" ) andrew@24: { andrew@24: float speedPrior = m.getArgAsFloat(0); andrew@24: printf("speed prior set to %f\n", speedPrior); andrew@24: midiEvents.speedPriorValue = speedPrior; andrew@24: midiEvents.bayesStruct.speedPriorValue = speedPrior; andrew@24: } andrew@24: andrew@24: if ( m.getAddress() == "/startplaying" ) andrew@24: { andrew@24: startPlaying(); andrew@24: } andrew@24: andrew@24: if ( m.getAddress() == "/stopplaying" ) andrew@24: { andrew@24: stopPlaying(); andrew@24: } andrew@24: andrew@24: andrew@24: if ( m.getAddress() == "/integratedEstimate" ) andrew@24: { andrew@24: midiEvents.bayesStruct.usingIntegratedTempoEstimate = true; andrew@24: } andrew@24: andrew@24: if ( m.getAddress() == "/MAPestimate" ) andrew@24: { andrew@24: midiEvents.bayesStruct.usingIntegratedTempoEstimate = false; andrew@24: } andrew@24: andrew@24: andrew@24: if ( m.getAddress() == "/realtime" ) andrew@24: { andrew@24: midiEvents.runningInRealTime = true; andrew@24: } andrew@24: andrew@24: andrew@24: if ( m.getAddress() == "/offline" ) andrew@24: { andrew@24: midiEvents.runningInRealTime = false; andrew@24: } andrew@24: andrew@24: if ( m.getAddress() == "/minimumSpeedRatio" ) andrew@24: { andrew@24: andrew@24: float minSpeed = m.getArgAsFloat(0); andrew@24: //printf("minimum speed received is %f and max is %f\n", minSpeed, midiEvents.bayesStruct.relativeSpeedLikelihood.getIndexInRealTerms(midiEvents.bayesStruct.relativeSpeedLikelihood.length-1)); andrew@24: if (minSpeed > 0 && minSpeed < midiEvents.bayesStruct.relativeSpeedLikelihood.getIndexInRealTerms(midiEvents.bayesStruct.relativeSpeedLikelihood.length-1)){ andrew@24: printf("minimum speed accepted is %f\n", minSpeed); andrew@24: midiEvents.minimumMatchSpeed = minSpeed; andrew@24: } andrew@24: } andrew@24: andrew@24: }//end while osc andrew@25: andrew@25: checkNewScoreNote(); andrew@24: andrew@24: } andrew@24: andrew@25: andrew@25: void testApp::checkNewScoreNote(){ andrew@25: if (lastScoreIndexSent != midiEvents.bestMatchIndex){ andrew@25: //then we send out new note andrew@25: sendNoteToMuseScore(); andrew@25: lastScoreIndexSent = midiEvents.bestMatchIndex; andrew@25: findMeasure(); andrew@25: } andrew@25: } andrew@25: andrew@25: void testApp::findMeasure(){ andrew@25: int ticks = midiEvents.recordedNoteOnMatrix[midiEvents.bestMatchIndex][0]; andrew@25: int tmpMeasure = lastMeasureSent; andrew@25: andrew@25: while (lastMeasureSent > 0 && midiEvents.measureVector[lastMeasureSent] > ticks) { andrew@25: lastMeasureSent--; andrew@25: } andrew@25: andrew@25: while (lastMeasureSent < midiEvents.measureVector.size() && midiEvents.measureVector[lastMeasureSent] < ticks) { andrew@25: lastMeasureSent++; andrew@25: } andrew@25: if (lastMeasureSent != tmpMeasure){ andrew@25: sendMeasureToMuseScore(); andrew@26: performanceRating = noteInStream.calculateTotalScore(midiEvents); andrew@25: } andrew@25: andrew@25: andrew@25: } andrew@25: andrew@26: void testApp::sendBlackNotes(){ andrew@26: ofxOscMessage m; andrew@26: m.setAddress( "/plugin" ); andrew@26: string noteString; andrew@26: noteString = "blacknotes.js"; andrew@26: m.addStringArg( noteString); andrew@26: sender.sendMessage( m ); andrew@26: } andrew@26: andrew@25: void testApp::sendNoteToMuseScore(){ andrew@25: int ticks = midiEvents.recordedNoteOnMatrix[midiEvents.bestMatchIndex][0]; andrew@25: int pitch = midiEvents.recordedNoteOnMatrix[midiEvents.bestMatchIndex][1]; andrew@25: printf("sending to muse score %i, %i \n", ticks, pitch); andrew@25: andrew@26: /* andrew@26: ofxOscMessage m; andrew@26: m.setAddress( "/plugin" ); andrew@26: string noteString; andrew@26: noteString = "blackNotes.js"; andrew@26: m.addStringArg( noteString); andrew@26: sender.sendMessage( m ); andrew@26: */ andrew@26: andrew@26: ofxOscMessage m; andrew@26: m.setAddress( "/plugin" ); andrew@26: string noteString; andrew@26: noteString = "coloronenote.js"; andrew@26: noteString += ",myTick,"+ofToString(ticks)+",myPitch,"+ofToString(pitch); andrew@26: // printf("%s\n", noteString); andrew@26: m.addStringArg( noteString); andrew@26: sender.sendMessage( m ); andrew@26: /* andrew@25: m.addStringArg( "coloronenote.js" ); andrew@25: m.addStringArg("mytick"); andrew@25: m.addIntArg( ticks ); andrew@25: m.addStringArg("mypitch"); andrew@25: m.addIntArg( pitch); andrew@26: */ andrew@25: andrew@25: // /plugin coloronenote.js mytick 100 mypitch 56; andrew@25: } andrew@25: andrew@25: andrew@25: andrew@25: void testApp::sendMeasureToMuseScore(){ andrew@25: andrew@25: printf("sending measure to muse score %i \n", lastMeasureSent); andrew@25: andrew@25: ofxOscMessage m; andrew@25: m.setAddress( "/select-measure" ); andrew@25: m.addIntArg(lastMeasureSent); andrew@25: sender.sendMessage( m ); andrew@25: andrew@25: // /select-measure 6 andrew@25: // /plugin coloronenote.js mytick 100 mypitch 56; andrew@25: } andrew@25: andrew@25: andrew@24: void testApp::newMessage(ofxMidiEventArgs &args){ andrew@24: andrew@24: int pitch; andrew@24: if (noteInStream.noteInReceived(args)){ andrew@24: double timeNow = ofGetElapsedTimeMillis(); andrew@24: andrew@24: if (!liveInputPlaying){ andrew@24: firstNoteTime = timeNow; andrew@24: liveInputPlaying = true; andrew@24: startPlaying(); andrew@24: printf("FIRST LIVE NOTE IS NOW AT TIME %f\n", timeNow); andrew@24: } andrew@24: andrew@24: pitch = args.byteOne + transpose; andrew@24: andrew@24: midiEvents.newNoteOnEvent(pitch, args.byteTwo, timeNow - firstNoteTime); andrew@24: andrew@24: andrew@24: int tickTime = midiEvents.getEventTimeTicks(timeNow-firstNoteTime); andrew@24: IntVector v; andrew@24: v.push_back(tickTime); andrew@24: v.push_back(pitch); andrew@24: v.push_back(args.byteTwo); andrew@25: v.push_back(200);//tmp time til note off happens andrew@24: noteInStream.midiInputEvents.push_back(v); andrew@24: noteInStream.midiInputTimes.push_back(timeNow - firstNoteTime); andrew@25: //printf("NOTE %i at time %f at tick time %i\n", pitch, (timeNow - firstNoteTime), tickTime); andrew@24: } andrew@24: andrew@24: // cout << "MIDI message [port: " << args.port << ", channel: " << args.channel << ", status: " << args.status << ", byteOne: " << pitch << ", byteTwo: " << args.byteTwo << ", timestamp: " << args.timestamp << "]" << endl; andrew@24: } andrew@24: andrew@24: //-------------------------------------------------------------- andrew@24: void testApp::draw(){ andrew@24: andrew@24: midiEvents.drawFile(); andrew@24: andrew@25: string info = "Measure "; andrew@25: info += ofToString(lastMeasureSent); andrew@25: info += " Last note "; andrew@25: info += ofToString(lastScoreIndexSent); andrew@25: andrew@25: ofSetHexColor(0x000000); andrew@25: ofDrawBitmapString(info, 20, 20); andrew@24: midiEvents.drawMidiFile(noteInStream.midiInputEvents); andrew@24: andrew@26: ofDrawBitmapString("Rating "+ofToString(performanceRating*100), 20, 50); andrew@24: } andrew@24: andrew@24: //-------------------------------------------------------------- andrew@24: void testApp::keyPressed(int key){ andrew@24: andrew@24: andrew@24: // if (key == ' '){ andrew@24: // startPlaying(); andrew@24: // } andrew@24: if (key == '-') andrew@24: transpose -= 12; andrew@24: andrew@24: if (key == '=') andrew@24: transpose += 12; andrew@24: andrew@24: if (key == 'c'){ andrew@24: double timenow = ofGetElapsedTimeMillis(); andrew@24: midiEvents.exampleCrossUpdate(); andrew@24: timenow *= -1; andrew@24: timenow += ofGetElapsedTimeMillis(); andrew@24: printf("CROSS UPDATE TOOK %f", timenow); andrew@24: } andrew@26: andrew@26: if (key == OF_KEY_LEFT){ andrew@26: andrew@26: } andrew@26: andrew@26: if (key == OF_KEY_RIGHT) andrew@24: andrew@24: if (key == OF_KEY_RETURN) andrew@24: stopPlaying(); andrew@24: andrew@24: if (key == OF_KEY_UP){ andrew@24: if (midiEvents.ticksPerScreen >= 4000) andrew@24: midiEvents.ticksPerScreen += 2000; andrew@24: else andrew@24: midiEvents.ticksPerScreen += 500; andrew@24: } andrew@24: andrew@24: if (key == 'm'){ andrew@24: // midiEvents.findMatch(84, 0, 10000); andrew@24: } andrew@24: andrew@26: if (key == 'b'){ andrew@26: sendBlackNotes(); andrew@26: } andrew@26: andrew@24: if (key == OF_KEY_DOWN){ andrew@24: if (midiEvents.ticksPerScreen >= 4000) andrew@24: midiEvents.ticksPerScreen -= 2000; andrew@24: else if (midiEvents.ticksPerScreen > 500) andrew@24: midiEvents.ticksPerScreen -= 500; andrew@24: } andrew@24: andrew@24: if (key == 'w') andrew@24: midiEvents.printMatchMatrix(); andrew@24: andrew@24: if (key == 'k'){ andrew@24: noteInStream.printNotes(); andrew@24: } andrew@24: andrew@24: if (key == 'p'){ andrew@24: midiEvents.printNotes(); andrew@24: } andrew@24: andrew@24: if (key == 'l') andrew@24: midiEvents.bayesStruct.decaySpeedDistribution(100); andrew@24: andrew@24: if (key == 't') andrew@24: midiEvents.drawTempoMode = !midiEvents.drawTempoMode; andrew@24: andrew@24: if (key == 'y') andrew@24: midiEvents.drawPhaseMode = !midiEvents.drawPhaseMode; andrew@24: andrew@24: if (key == 'r'){ andrew@24: noteInStream.reset(); andrew@24: liveInputPlaying = false; andrew@24: stopPlaying(); andrew@26: lastMeasureSent = 0; andrew@26: sendMeasureToMuseScore(); andrew@26: sendBlackNotes(); andrew@26: lastScoreIndexSent = 0; andrew@26: andrew@24: } andrew@24: andrew@24: if (key == 'o'){ andrew@24: //open audio file andrew@24: string *filePtr; andrew@24: filePtr = &midiFileName; andrew@24: andrew@24: if (getFilenameFromDialogBox(filePtr)){ andrew@24: printf("Midifile: Loaded name okay :\n'%s' \n", midiFileName.c_str()); andrew@24: cannamMainFunction(); andrew@24: } andrew@24: } andrew@24: andrew@24: andrew@24: andrew@24: } andrew@24: andrew@24: //-------------------------------------------------------------- andrew@24: void testApp::keyReleased(int key){ andrew@24: andrew@24: } andrew@24: andrew@24: //-------------------------------------------------------------- andrew@24: void testApp::mouseMoved(int x, int y ){ andrew@24: midiEvents.mouseX = midiEvents.getEventTimeMillis((x * midiEvents.ticksPerScreen)/ screenWidth); andrew@24: } andrew@24: andrew@24: //-------------------------------------------------------------- andrew@24: void testApp::mouseDragged(int x, int y, int button){ andrew@24: andrew@24: } andrew@24: andrew@24: //-------------------------------------------------------------- andrew@24: void testApp::mousePressed(int x, int y, int button){ andrew@24: andrew@24: } andrew@24: andrew@24: //-------------------------------------------------------------- andrew@24: void testApp::mouseReleased(int x, int y, int button){ andrew@24: andrew@24: } andrew@24: andrew@24: //-------------------------------------------------------------- andrew@24: void testApp::windowResized(int w, int h){ andrew@24: screenWidth = w; andrew@24: screenHeight = h; andrew@24: midiEvents.noteHeight = screenHeight / (float)(midiEvents.noteMaximum - midiEvents.noteMinimum); andrew@24: andrew@24: } andrew@24: andrew@24: andrew@24: andrew@24: void testApp::startPlaying(){ andrew@24: playing = !playing; andrew@24: midiEvents.reset(); andrew@26: noteInStream.reset(); andrew@24: midiEvents.setStartPlayingTimes(); andrew@26: sendBlackNotes(); andrew@24: //this is where we stop and start playing andrew@24: } andrew@24: andrew@24: void testApp::stopPlaying(){ andrew@26: midiEvents.printNoteCounter(); andrew@26: noteInStream.printTotalCount(); andrew@26: noteInStream.calculateTotalScore(midiEvents); andrew@26: andrew@26: andrew@24: playing = false; andrew@24: liveInputPlaying = false; andrew@25: lastScoreIndexSent = 0; andrew@25: midiEvents.bestMatchIndex = 0; andrew@25: sendNoteToMuseScore(); andrew@26: andrew@24: } andrew@24: andrew@24: bool testApp::getFilenameFromDialogBox(string* fileNameToSave){ andrew@24: //this uses a pointer structure within the loader and returns true if the dialogue box was used successfully andrew@24: // first, create a string that will hold the URL andrew@24: string URL; andrew@24: andrew@24: // openFile(string& URL) returns 1 if a file was picked andrew@24: // returns 0 when something went wrong or the user pressed 'cancel' andrew@24: int response = ofxFileDialogOSX::openFile(URL); andrew@24: if(response){ andrew@24: // now you can use the URL andrew@24: *fileNameToSave = URL; andrew@24: //printf("\n filename is %s \n", soundFileName.c_str()); andrew@24: return true; andrew@24: } andrew@24: else { andrew@24: // soundFileName = "OPEN canceled. "; andrew@24: printf("\n open file cancelled \n"); andrew@24: return false; andrew@24: } andrew@24: andrew@24: andrew@24: andrew@24: } andrew@24: andrew@24: andrew@24: andrew@24: andrew@24: int testApp::cannamMainFunction(){ andrew@24: andrew@24: andrew@24: midiEvents.clearAllEvents(); andrew@24: andrew@24: //int main(int argc, char **argv) andrew@24: //{ andrew@24: // if (argc != 2) { andrew@24: // cerr << "Usage: midifile " << endl; andrew@24: // return 1; andrew@24: // } andrew@24: andrew@24: std::string filename = midiFileName;//argv[1]; andrew@24: andrew@24: // fileLoader.chopBeginning = true; andrew@24: fileLoader.loadFile(filename, midiEvents); andrew@24: andrew@24: }//new end of load function andrew@24: andrew@24: andrew@24: andrew@24: andrew@24: //trying to port to new class andrew@24: /* andrew@24: MIDIFileReader fr(filename); andrew@24: andrew@24: if (!fr.isOK()) { andrew@24: std::cerr << "Error: " << fr.getError().c_str() << std::endl; andrew@24: return 1; andrew@24: } andrew@24: andrew@24: MIDIComposition c = fr.load(); andrew@24: andrew@24: switch (fr.getFormat()) { andrew@24: case MIDI_SINGLE_TRACK_FILE: cout << "Format: MIDI Single Track File" << endl; break; andrew@24: case MIDI_SIMULTANEOUS_TRACK_FILE: cout << "Format: MIDI Simultaneous Track File" << endl; break; andrew@24: case MIDI_SEQUENTIAL_TRACK_FILE: cout << "Format: MIDI Sequential Track File" << endl; break; andrew@24: default: cout << "Format: Unknown MIDI file format?" << endl; break; andrew@24: } andrew@24: andrew@24: cout << "Tracks: " << c.size() << endl; andrew@24: andrew@24: int td = fr.getTimingDivision(); andrew@24: if (td < 32768) { andrew@24: cout << "Timing division: " << fr.getTimingDivision() << " ppq" << endl; andrew@24: andrew@24: midiEvents.pulsesPerQuarternote = fr.getTimingDivision(); andrew@24: } else { andrew@24: int frames = 256 - (td >> 8); andrew@24: int subframes = td & 0xff; andrew@24: cout << "SMPTE timing: " << frames << " fps, " << subframes << " subframes" << endl; andrew@24: } andrew@24: andrew@24: for (MIDIComposition::const_iterator i = c.begin(); i != c.end(); ++i) { andrew@24: andrew@24: cout << "Start of track: " << i->first+1 << endl; andrew@24: andrew@24: for (MIDITrack::const_iterator j = i->second.begin(); j != i->second.end(); ++j) { andrew@24: andrew@24: unsigned int t = j->getTime(); andrew@24: int ch = j->getChannelNumber(); andrew@24: andrew@24: if (j->isMeta()) { andrew@24: int code = j->getMetaEventCode(); andrew@24: string name; andrew@24: bool printable = true; andrew@24: switch (code) { andrew@24: andrew@24: case MIDI_END_OF_TRACK: andrew@24: cout << t << ": End of track" << endl; andrew@24: break; andrew@24: andrew@24: case MIDI_TEXT_EVENT: name = "Text"; break; andrew@24: case MIDI_COPYRIGHT_NOTICE: name = "Copyright"; break; andrew@24: case MIDI_TRACK_NAME: name = "Track name"; break; andrew@24: case MIDI_INSTRUMENT_NAME: name = "Instrument name"; break; andrew@24: case MIDI_LYRIC: name = "Lyric"; break; andrew@24: case MIDI_TEXT_MARKER: name = "Text marker"; break; andrew@24: case MIDI_SEQUENCE_NUMBER: name = "Sequence number"; printable = false; break; andrew@24: case MIDI_CHANNEL_PREFIX_OR_PORT: name = "Channel prefix or port"; printable = false; break; andrew@24: case MIDI_CUE_POINT: name = "Cue point"; break; andrew@24: case MIDI_CHANNEL_PREFIX: name = "Channel prefix"; printable = false; break; andrew@24: case MIDI_SEQUENCER_SPECIFIC: name = "Sequencer specific"; printable = false; break; andrew@24: case MIDI_SMPTE_OFFSET: name = "SMPTE offset"; printable = false; break; andrew@24: andrew@24: case MIDI_SET_TEMPO: andrew@24: { andrew@24: int m0 = j->getMetaMessage()[0]; andrew@24: int m1 = j->getMetaMessage()[1]; andrew@24: int m2 = j->getMetaMessage()[2]; andrew@24: long tempo = (((m0 << 8) + m1) << 8) + m2; andrew@24: andrew@24: cout << t << ": Tempo: " << 60000000.0 / double(tempo) << endl; andrew@24: midiEvents.tempo = 60000000.0 / double(tempo); andrew@24: midiEvents.period = double(tempo)/1000.0; andrew@24: andrew@24: printf("period double is %f\n", midiEvents.period); andrew@24: } andrew@24: break; andrew@24: andrew@24: case MIDI_TIME_SIGNATURE: andrew@24: { andrew@24: int numerator = j->getMetaMessage()[0]; andrew@24: int denominator = 1 << (int)j->getMetaMessage()[1]; andrew@24: andrew@24: cout << t << ": Time signature: " << numerator << "/" << denominator << endl; andrew@24: } andrew@24: andrew@24: case MIDI_KEY_SIGNATURE: andrew@24: { andrew@24: int accidentals = j->getMetaMessage()[0]; andrew@24: int isMinor = j->getMetaMessage()[1]; andrew@24: bool isSharp = accidentals < 0 ? false : true; andrew@24: accidentals = accidentals < 0 ? -accidentals : accidentals; andrew@24: cout << t << ": Key signature: " << accidentals << " " andrew@24: << (isSharp ? andrew@24: (accidentals > 1 ? "sharps" : "sharp") : andrew@24: (accidentals > 1 ? "flats" : "flat")) andrew@24: << (isMinor ? ", minor" : ", major") << endl; andrew@24: } andrew@24: andrew@24: } andrew@24: andrew@24: andrew@24: if (name != "") { andrew@24: if (printable) { andrew@24: cout << t << ": File meta event: code " << code andrew@24: << ": " << name << ": \"" << j->getMetaMessage() andrew@24: << "\"" << endl; andrew@24: } else { andrew@24: cout << t << ": File meta event: code " << code andrew@24: << ": " << name << ": "; andrew@24: for (int k = 0; k < j->getMetaMessage().length(); ++k) { andrew@24: cout << (int)j->getMetaMessage()[k] << " "; andrew@24: } andrew@24: } andrew@24: } andrew@24: continue; andrew@24: } andrew@24: andrew@24: switch (j->getMessageType()) { andrew@24: andrew@24: case MIDI_NOTE_ON: andrew@24: cout << t << ": Note: channel " << ch andrew@24: << " duration " << j->getDuration() andrew@24: << " pitch " << j->getPitch() andrew@24: << " velocity " << j->getVelocity() andrew@24: << "event time " << midiEvents.getEventTimeMillis(t) << endl; andrew@24: v.clear(); andrew@24: v.push_back(t); andrew@24: v.push_back(j->getPitch()); andrew@24: v.push_back(j->getVelocity()); andrew@24: v.push_back(j->getDuration()); andrew@24: midiEvents.recordedNoteOnMatrix.push_back(v); andrew@24: midiEvents.recordedEventTimes.push_back(midiEvents.getEventTimeMillis(t)); andrew@24: break; andrew@24: andrew@24: case MIDI_POLY_AFTERTOUCH: andrew@24: cout << t << ": Polyphonic aftertouch: channel " << ch andrew@24: << " pitch " << j->getPitch() andrew@24: << " pressure " << j->getData2() << endl; andrew@24: break; andrew@24: andrew@24: case MIDI_CTRL_CHANGE: andrew@24: { andrew@24: int controller = j->getData1(); andrew@24: string name; andrew@24: switch (controller) { andrew@24: case MIDI_CONTROLLER_BANK_MSB: name = "Bank select MSB"; break; andrew@24: case MIDI_CONTROLLER_VOLUME: name = "Volume"; break; andrew@24: case MIDI_CONTROLLER_BANK_LSB: name = "Bank select LSB"; break; andrew@24: case MIDI_CONTROLLER_MODULATION: name = "Modulation wheel"; break; andrew@24: case MIDI_CONTROLLER_PAN: name = "Pan"; break; andrew@24: case MIDI_CONTROLLER_SUSTAIN: name = "Sustain"; break; andrew@24: case MIDI_CONTROLLER_RESONANCE: name = "Resonance"; break; andrew@24: case MIDI_CONTROLLER_RELEASE: name = "Release"; break; andrew@24: case MIDI_CONTROLLER_ATTACK: name = "Attack"; break; andrew@24: case MIDI_CONTROLLER_FILTER: name = "Filter"; break; andrew@24: case MIDI_CONTROLLER_REVERB: name = "Reverb"; break; andrew@24: case MIDI_CONTROLLER_CHORUS: name = "Chorus"; break; andrew@24: case MIDI_CONTROLLER_NRPN_1: name = "NRPN 1"; break; andrew@24: case MIDI_CONTROLLER_NRPN_2: name = "NRPN 2"; break; andrew@24: case MIDI_CONTROLLER_RPN_1: name = "RPN 1"; break; andrew@24: case MIDI_CONTROLLER_RPN_2: name = "RPN 2"; break; andrew@24: case MIDI_CONTROLLER_SOUNDS_OFF: name = "All sounds off"; break; andrew@24: case MIDI_CONTROLLER_RESET: name = "Reset"; break; andrew@24: case MIDI_CONTROLLER_LOCAL: name = "Local"; break; andrew@24: case MIDI_CONTROLLER_ALL_NOTES_OFF: name = "All notes off"; break; andrew@24: } andrew@24: cout << t << ": Controller change: channel " << ch andrew@24: << " controller " << j->getData1(); andrew@24: if (name != "") cout << " (" << name << ")"; andrew@24: cout << " value " << j->getData2() << endl; andrew@24: } andrew@24: break; andrew@24: andrew@24: case MIDI_PROG_CHANGE: andrew@24: cout << t << ": Program change: channel " << ch andrew@24: << " program " << j->getData1() << endl; andrew@24: break; andrew@24: andrew@24: case MIDI_CHNL_AFTERTOUCH: andrew@24: cout << t << ": Channel aftertouch: channel " << ch andrew@24: << " pressure " << j->getData1() << endl; andrew@24: break; andrew@24: andrew@24: case MIDI_PITCH_BEND: andrew@24: cout << t << ": Pitch bend: channel " << ch andrew@24: << " value " << (int)j->getData2() * 128 + (int)j->getData1() << endl; andrew@24: break; andrew@24: andrew@24: case MIDI_SYSTEM_EXCLUSIVE: andrew@24: cout << t << ": System exclusive: code " andrew@24: << (int)j->getMessageType() << " message length " << andrew@24: j->getMetaMessage().length() << endl; andrew@24: break; andrew@24: andrew@24: andrew@24: } andrew@24: andrew@24: andrew@24: } andrew@24: andrew@24: andrew@24: } andrew@24: andrew@24: }//end cannam midi main andrew@24: andrew@24: */ andrew@24: andrew@24: