andrew@0: #include "testApp.h" andrew@0: andrew@0: //-------------------------------------------------------------- andrew@0: void testApp::setup(){ andrew@0: midiFileName = "../../../data/entertainer.mid"; andrew@0: int retVal = cannamMainFunction(); andrew@0: andrew@0: playing = false; andrew@0: /* andrew@0: bayesStruct.resetSize(1000); andrew@0: bayesStruct.resetSpeedSize(200); andrew@0: bayesStruct.setRelativeSpeedScalar(0.01); andrew@0: bayesStruct.simpleExample(); andrew@0: */ andrew@0: andrew@0: receiver.setup( PORT ); andrew@0: andrew@0: screenWidth = ofGetWidth(); andrew@0: screenHeight = ofGetHeight(); andrew@0: midiEvents.screenWidth = &screenWidth; andrew@0: midiEvents.screenHeight = &screenHeight; andrew@2: midiEvents.drawTempoMode = false; andrew@2: ofSetFrameRate(30); andrew@0: } andrew@0: andrew@0: //-------------------------------------------------------------- andrew@0: void testApp::update(){ andrew@0: if (playing){ andrew@0: midiEvents.updatePlayPosition(); andrew@14: // midiEvents.bayesStruct.updateBestEstimate(); andrew@0: } andrew@0: // drawer.tickLocation+=20; andrew@0: andrew@0: // check for waiting messages andrew@0: while( receiver.hasWaitingMessages() ) andrew@0: { andrew@0: ofxOscMessage m; andrew@0: receiver.getNextMessage( &m ); andrew@0: andrew@0: if ( m.getAddress() == "/midinoteon" ) andrew@0: { andrew@0: int newMidiOnPitch = m.getArgAsInt32(0); andrew@0: int velocity = m.getArgAsInt32(1); andrew@0: double time = m.getArgAsFloat(2); andrew@0: andrew@0: if (velocity != 0) andrew@0: midiEvents.newNoteOnEvent(newMidiOnPitch, velocity, time); andrew@0: andrew@0: } andrew@0: andrew@3: if ( m.getAddress() == "/setSpeedPrior" ) andrew@3: { andrew@3: float speedPrior = m.getArgAsFloat(0); andrew@3: printf("speed prior set to %f\n", speedPrior); andrew@3: midiEvents.speedPriorValue = speedPrior; andrew@3: midiEvents.bayesStruct.speedPriorValue = speedPrior; andrew@3: } andrew@3: andrew@0: if ( m.getAddress() == "/startplaying" ) andrew@0: { andrew@0: startPlaying(); andrew@0: } andrew@0: andrew@0: if ( m.getAddress() == "/stopplaying" ) andrew@0: { andrew@0: stopPlaying(); andrew@0: } andrew@15: andrew@15: 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@15: andrew@15: if ( m.getAddress() == "/realtime" ) andrew@15: { andrew@15: midiEvents.runningInRealTime = true; andrew@15: } andrew@15: andrew@15: andrew@15: if ( m.getAddress() == "/offline" ) andrew@15: { andrew@15: midiEvents.runningInRealTime = false; andrew@15: } andrew@15: 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@0: }//end while osc andrew@0: andrew@0: } andrew@0: andrew@0: //-------------------------------------------------------------- andrew@0: void testApp::draw(){ andrew@0: andrew@0: midiEvents.drawFile(); andrew@23: andrew@0: } andrew@0: andrew@0: //-------------------------------------------------------------- andrew@0: void testApp::keyPressed(int key){ andrew@0: andrew@0: andrew@22: // if (key == ' '){ andrew@22: // startPlaying(); andrew@22: // } andrew@0: andrew@0: if (key == 'c'){ andrew@0: double timenow = ofGetElapsedTimeMillis(); andrew@0: midiEvents.exampleCrossUpdate(); andrew@0: timenow *= -1; andrew@0: timenow += ofGetElapsedTimeMillis(); andrew@0: printf("CROSS UPDATE TOOK %f", timenow); andrew@0: } andrew@0: andrew@0: if (key == OF_KEY_RETURN) andrew@0: stopPlaying(); andrew@0: andrew@0: if (key == OF_KEY_UP){ andrew@0: if (midiEvents.ticksPerScreen >= 4000) andrew@0: midiEvents.ticksPerScreen += 2000; andrew@0: else andrew@0: midiEvents.ticksPerScreen += 500; andrew@0: } andrew@0: andrew@0: if (key == 'm'){ andrew@0: // midiEvents.findMatch(84, 0, 10000); andrew@0: } andrew@0: andrew@0: if (key == OF_KEY_DOWN){ andrew@0: if (midiEvents.ticksPerScreen >= 4000) andrew@0: midiEvents.ticksPerScreen -= 2000; andrew@0: else if (midiEvents.ticksPerScreen > 500) andrew@0: midiEvents.ticksPerScreen -= 500; andrew@0: } andrew@0: andrew@0: if (key == 'w') andrew@0: midiEvents.printMatchMatrix(); andrew@0: andrew@0: if (key == 'p'){ andrew@0: midiEvents.printNotes(); andrew@0: } andrew@0: andrew@0: if (key == 'l') andrew@0: midiEvents.bayesStruct.decaySpeedDistribution(100); andrew@0: andrew@1: if (key == 't') andrew@1: midiEvents.drawTempoMode = !midiEvents.drawTempoMode; andrew@1: andrew@9: if (key == 'r') andrew@9: midiEvents.drawPhaseMode = !midiEvents.drawPhaseMode; andrew@9: andrew@0: if (key == 'o'){ andrew@0: //open audio file andrew@0: string *filePtr; andrew@0: filePtr = &midiFileName; andrew@0: andrew@0: if (getFilenameFromDialogBox(filePtr)){ andrew@0: printf("Midifile: Loaded name okay :\n'%s' \n", midiFileName.c_str()); andrew@0: cannamMainFunction(); andrew@0: } andrew@22: } andrew@22: andrew@0: andrew@22: andrew@0: } andrew@0: andrew@0: //-------------------------------------------------------------- andrew@0: void testApp::keyReleased(int key){ andrew@0: andrew@0: } andrew@0: andrew@0: //-------------------------------------------------------------- andrew@0: void testApp::mouseMoved(int x, int y ){ andrew@1: midiEvents.mouseX = midiEvents.getEventTimeMillis((x * midiEvents.ticksPerScreen)/ screenWidth); andrew@0: } andrew@0: andrew@0: //-------------------------------------------------------------- andrew@0: void testApp::mouseDragged(int x, int y, int button){ andrew@0: andrew@0: } andrew@0: andrew@0: //-------------------------------------------------------------- andrew@0: void testApp::mousePressed(int x, int y, int button){ andrew@0: andrew@0: } andrew@0: andrew@0: //-------------------------------------------------------------- andrew@0: void testApp::mouseReleased(int x, int y, int button){ andrew@0: andrew@0: } andrew@0: andrew@0: //-------------------------------------------------------------- andrew@0: void testApp::windowResized(int w, int h){ andrew@0: screenWidth = w; andrew@0: screenHeight = h; andrew@0: midiEvents.noteHeight = screenHeight / (float)(midiEvents.noteMaximum - midiEvents.noteMinimum); andrew@0: andrew@0: } andrew@0: andrew@0: andrew@0: andrew@0: void testApp::startPlaying(){ andrew@0: playing = !playing; andrew@0: midiEvents.reset(); andrew@0: midiEvents.setStartPlayingTimes(); andrew@0: //this is where we stop and start playing andrew@0: } andrew@0: andrew@0: void testApp::stopPlaying(){ andrew@0: playing = false; andrew@0: } andrew@0: andrew@0: bool testApp::getFilenameFromDialogBox(string* fileNameToSave){ andrew@0: //this uses a pointer structure within the loader and returns true if the dialogue box was used successfully andrew@0: // first, create a string that will hold the URL andrew@0: string URL; andrew@0: andrew@0: // openFile(string& URL) returns 1 if a file was picked andrew@0: // returns 0 when something went wrong or the user pressed 'cancel' andrew@0: int response = ofxFileDialogOSX::openFile(URL); andrew@0: if(response){ andrew@0: // now you can use the URL andrew@0: *fileNameToSave = URL; andrew@0: //printf("\n filename is %s \n", soundFileName.c_str()); andrew@0: return true; andrew@0: } andrew@0: else { andrew@0: // soundFileName = "OPEN canceled. "; andrew@0: printf("\n open file cancelled \n"); andrew@0: return false; andrew@0: } andrew@0: andrew@0: andrew@0: andrew@0: } andrew@0: andrew@0: andrew@0: andrew@0: andrew@0: int testApp::cannamMainFunction(){ andrew@0: andrew@0: andrew@2: midiEvents.clearAllEvents(); andrew@0: andrew@0: //int main(int argc, char **argv) andrew@0: //{ andrew@0: // if (argc != 2) { andrew@0: // cerr << "Usage: midifile " << endl; andrew@0: // return 1; andrew@0: // } andrew@0: andrew@0: std::string filename = midiFileName;//argv[1]; andrew@2: andrew@3: // fileLoader.chopBeginning = true; andrew@2: fileLoader.loadFile(filename, midiEvents); andrew@2: andrew@2: }//new end of load function andrew@2: andrew@2: andrew@2: andrew@2: andrew@2: //trying to port to new class andrew@2: /* andrew@2: MIDIFileReader fr(filename); andrew@2: andrew@0: if (!fr.isOK()) { andrew@0: std::cerr << "Error: " << fr.getError().c_str() << std::endl; andrew@0: return 1; andrew@0: } andrew@0: andrew@0: MIDIComposition c = fr.load(); andrew@0: andrew@0: switch (fr.getFormat()) { andrew@0: case MIDI_SINGLE_TRACK_FILE: cout << "Format: MIDI Single Track File" << endl; break; andrew@0: case MIDI_SIMULTANEOUS_TRACK_FILE: cout << "Format: MIDI Simultaneous Track File" << endl; break; andrew@0: case MIDI_SEQUENTIAL_TRACK_FILE: cout << "Format: MIDI Sequential Track File" << endl; break; andrew@0: default: cout << "Format: Unknown MIDI file format?" << endl; break; andrew@0: } andrew@0: andrew@0: cout << "Tracks: " << c.size() << endl; andrew@0: andrew@0: int td = fr.getTimingDivision(); andrew@0: if (td < 32768) { andrew@0: cout << "Timing division: " << fr.getTimingDivision() << " ppq" << endl; andrew@0: andrew@0: midiEvents.pulsesPerQuarternote = fr.getTimingDivision(); andrew@0: } else { andrew@0: int frames = 256 - (td >> 8); andrew@0: int subframes = td & 0xff; andrew@0: cout << "SMPTE timing: " << frames << " fps, " << subframes << " subframes" << endl; andrew@0: } andrew@0: andrew@0: for (MIDIComposition::const_iterator i = c.begin(); i != c.end(); ++i) { andrew@0: andrew@0: cout << "Start of track: " << i->first+1 << endl; andrew@0: andrew@0: for (MIDITrack::const_iterator j = i->second.begin(); j != i->second.end(); ++j) { andrew@0: andrew@0: unsigned int t = j->getTime(); andrew@0: int ch = j->getChannelNumber(); andrew@0: andrew@0: if (j->isMeta()) { andrew@0: int code = j->getMetaEventCode(); andrew@0: string name; andrew@0: bool printable = true; andrew@0: switch (code) { andrew@0: andrew@0: case MIDI_END_OF_TRACK: andrew@0: cout << t << ": End of track" << endl; andrew@0: break; andrew@0: andrew@0: case MIDI_TEXT_EVENT: name = "Text"; break; andrew@0: case MIDI_COPYRIGHT_NOTICE: name = "Copyright"; break; andrew@0: case MIDI_TRACK_NAME: name = "Track name"; break; andrew@0: case MIDI_INSTRUMENT_NAME: name = "Instrument name"; break; andrew@0: case MIDI_LYRIC: name = "Lyric"; break; andrew@0: case MIDI_TEXT_MARKER: name = "Text marker"; break; andrew@0: case MIDI_SEQUENCE_NUMBER: name = "Sequence number"; printable = false; break; andrew@0: case MIDI_CHANNEL_PREFIX_OR_PORT: name = "Channel prefix or port"; printable = false; break; andrew@0: case MIDI_CUE_POINT: name = "Cue point"; break; andrew@0: case MIDI_CHANNEL_PREFIX: name = "Channel prefix"; printable = false; break; andrew@0: case MIDI_SEQUENCER_SPECIFIC: name = "Sequencer specific"; printable = false; break; andrew@0: case MIDI_SMPTE_OFFSET: name = "SMPTE offset"; printable = false; break; andrew@0: andrew@0: case MIDI_SET_TEMPO: andrew@0: { andrew@0: int m0 = j->getMetaMessage()[0]; andrew@0: int m1 = j->getMetaMessage()[1]; andrew@0: int m2 = j->getMetaMessage()[2]; andrew@0: long tempo = (((m0 << 8) + m1) << 8) + m2; andrew@0: andrew@0: cout << t << ": Tempo: " << 60000000.0 / double(tempo) << endl; andrew@0: midiEvents.tempo = 60000000.0 / double(tempo); andrew@0: midiEvents.period = double(tempo)/1000.0; andrew@0: andrew@0: printf("period double is %f\n", midiEvents.period); andrew@0: } andrew@0: break; andrew@0: andrew@0: case MIDI_TIME_SIGNATURE: andrew@0: { andrew@0: int numerator = j->getMetaMessage()[0]; andrew@0: int denominator = 1 << (int)j->getMetaMessage()[1]; andrew@0: andrew@0: cout << t << ": Time signature: " << numerator << "/" << denominator << endl; andrew@0: } andrew@0: andrew@0: case MIDI_KEY_SIGNATURE: andrew@0: { andrew@0: int accidentals = j->getMetaMessage()[0]; andrew@0: int isMinor = j->getMetaMessage()[1]; andrew@0: bool isSharp = accidentals < 0 ? false : true; andrew@0: accidentals = accidentals < 0 ? -accidentals : accidentals; andrew@0: cout << t << ": Key signature: " << accidentals << " " andrew@0: << (isSharp ? andrew@0: (accidentals > 1 ? "sharps" : "sharp") : andrew@0: (accidentals > 1 ? "flats" : "flat")) andrew@0: << (isMinor ? ", minor" : ", major") << endl; andrew@0: } andrew@0: andrew@0: } andrew@0: andrew@0: andrew@0: if (name != "") { andrew@0: if (printable) { andrew@0: cout << t << ": File meta event: code " << code andrew@0: << ": " << name << ": \"" << j->getMetaMessage() andrew@0: << "\"" << endl; andrew@0: } else { andrew@0: cout << t << ": File meta event: code " << code andrew@0: << ": " << name << ": "; andrew@0: for (int k = 0; k < j->getMetaMessage().length(); ++k) { andrew@0: cout << (int)j->getMetaMessage()[k] << " "; andrew@0: } andrew@0: } andrew@0: } andrew@0: continue; andrew@0: } andrew@0: andrew@0: switch (j->getMessageType()) { andrew@0: andrew@0: case MIDI_NOTE_ON: andrew@0: cout << t << ": Note: channel " << ch andrew@0: << " duration " << j->getDuration() andrew@0: << " pitch " << j->getPitch() andrew@0: << " velocity " << j->getVelocity() andrew@0: << "event time " << midiEvents.getEventTimeMillis(t) << endl; andrew@0: v.clear(); andrew@0: v.push_back(t); andrew@0: v.push_back(j->getPitch()); andrew@0: v.push_back(j->getVelocity()); andrew@0: v.push_back(j->getDuration()); andrew@0: midiEvents.recordedNoteOnMatrix.push_back(v); andrew@0: midiEvents.recordedEventTimes.push_back(midiEvents.getEventTimeMillis(t)); andrew@0: break; andrew@0: andrew@0: case MIDI_POLY_AFTERTOUCH: andrew@0: cout << t << ": Polyphonic aftertouch: channel " << ch andrew@0: << " pitch " << j->getPitch() andrew@0: << " pressure " << j->getData2() << endl; andrew@0: break; andrew@0: andrew@0: case MIDI_CTRL_CHANGE: andrew@0: { andrew@0: int controller = j->getData1(); andrew@0: string name; andrew@0: switch (controller) { andrew@0: case MIDI_CONTROLLER_BANK_MSB: name = "Bank select MSB"; break; andrew@0: case MIDI_CONTROLLER_VOLUME: name = "Volume"; break; andrew@0: case MIDI_CONTROLLER_BANK_LSB: name = "Bank select LSB"; break; andrew@0: case MIDI_CONTROLLER_MODULATION: name = "Modulation wheel"; break; andrew@0: case MIDI_CONTROLLER_PAN: name = "Pan"; break; andrew@0: case MIDI_CONTROLLER_SUSTAIN: name = "Sustain"; break; andrew@0: case MIDI_CONTROLLER_RESONANCE: name = "Resonance"; break; andrew@0: case MIDI_CONTROLLER_RELEASE: name = "Release"; break; andrew@0: case MIDI_CONTROLLER_ATTACK: name = "Attack"; break; andrew@0: case MIDI_CONTROLLER_FILTER: name = "Filter"; break; andrew@0: case MIDI_CONTROLLER_REVERB: name = "Reverb"; break; andrew@0: case MIDI_CONTROLLER_CHORUS: name = "Chorus"; break; andrew@0: case MIDI_CONTROLLER_NRPN_1: name = "NRPN 1"; break; andrew@0: case MIDI_CONTROLLER_NRPN_2: name = "NRPN 2"; break; andrew@0: case MIDI_CONTROLLER_RPN_1: name = "RPN 1"; break; andrew@0: case MIDI_CONTROLLER_RPN_2: name = "RPN 2"; break; andrew@0: case MIDI_CONTROLLER_SOUNDS_OFF: name = "All sounds off"; break; andrew@0: case MIDI_CONTROLLER_RESET: name = "Reset"; break; andrew@0: case MIDI_CONTROLLER_LOCAL: name = "Local"; break; andrew@0: case MIDI_CONTROLLER_ALL_NOTES_OFF: name = "All notes off"; break; andrew@0: } andrew@0: cout << t << ": Controller change: channel " << ch andrew@0: << " controller " << j->getData1(); andrew@0: if (name != "") cout << " (" << name << ")"; andrew@0: cout << " value " << j->getData2() << endl; andrew@0: } andrew@0: break; andrew@0: andrew@0: case MIDI_PROG_CHANGE: andrew@0: cout << t << ": Program change: channel " << ch andrew@0: << " program " << j->getData1() << endl; andrew@0: break; andrew@0: andrew@0: case MIDI_CHNL_AFTERTOUCH: andrew@0: cout << t << ": Channel aftertouch: channel " << ch andrew@0: << " pressure " << j->getData1() << endl; andrew@0: break; andrew@0: andrew@0: case MIDI_PITCH_BEND: andrew@0: cout << t << ": Pitch bend: channel " << ch andrew@0: << " value " << (int)j->getData2() * 128 + (int)j->getData1() << endl; andrew@0: break; andrew@0: andrew@0: case MIDI_SYSTEM_EXCLUSIVE: andrew@0: cout << t << ": System exclusive: code " andrew@0: << (int)j->getMessageType() << " message length " << andrew@0: j->getMetaMessage().length() << endl; andrew@0: break; andrew@0: andrew@0: andrew@0: } andrew@0: andrew@0: andrew@0: } andrew@0: andrew@0: andrew@0: } andrew@0: andrew@2: }//end cannam midi main andrew@0: andrew@2: */ andrew@0: andrew@0: