Mercurial > hg > midi-score-follower
changeset 3:de86d77f2612
added speed prior setting. needs some cleaning
author | Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk> |
---|---|
date | Fri, 19 Aug 2011 02:36:34 +0100 |
parents | 5581023e0de4 |
children | 4a8e6a6cd224 |
files | src/BayesianArrayStructure.cpp src/BayesianArrayStructure.h src/CannamMidiFileLoader.cpp src/CannamMidiFileLoader.h src/midiEventHolder.cpp src/midiEventHolder.h src/testApp.cpp |
diffstat | 7 files changed, 73 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/src/BayesianArrayStructure.cpp Fri Aug 19 01:26:40 2011 +0100 +++ b/src/BayesianArrayStructure.cpp Fri Aug 19 02:36:34 2011 +0100 @@ -7,6 +7,9 @@ * */ +//look at reset speed to one - what does this do? - get rid of? + + #include "BayesianArrayStructure.h" BayesianArrayStructure::BayesianArrayStructure(){ @@ -16,7 +19,8 @@ likelihood.createVector(1); posterior.createVector(1); - + speedPriorValue = 1.0; + lastEventTime = ofGetElapsedTimeMillis(); /* @@ -70,6 +74,8 @@ relativeSpeedPosterior.renormalise(); relativeSpeedPosterior.getMaximum(); + setSpeedPrior(speedPriorValue); + prior.zero(); posterior.zero(); // posterior.offset = - 200; @@ -81,6 +87,18 @@ } +void BayesianArrayStructure::setSpeedPrior(double f){ + speedPriorValue = f; + int index = relativeSpeedPosterior.getRealTermsAsIndex(speedPriorValue); + relativeSpeedPosterior.zero(); + relativeSpeedPosterior.addGaussianShape(index, 20, 0.8); + relativeSpeedPosterior.renormalise(); + relativeSpeedPosterior.getMaximum(); + relativeSpeedPrior.copyFromDynamicVector(relativeSpeedPosterior); + printf("BAYES STRUCTU ' SPEED PRIOR %f . index %i\n", speedPriorValue, index); + +} + void BayesianArrayStructure::resetSpeedSize(int length){ printf("BAYESIAN SPEED size is : %i\n", length); @@ -165,6 +183,7 @@ bestEstimate = 0; // lastBestEstimateUpdateTime = ofGetElapsedTimeMillis(); + setSpeedPrior(speedPriorValue); } void BayesianArrayStructure::zeroArrays(){ @@ -186,7 +205,7 @@ tmpBestEstimate = posterior.getIndexInRealTerms(posterior.MAPestimate) + timeDifference*relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.MAPestimate); // - printf("tmp best %f and best %f time diff %f posterior MAP %f\n", tmpBestEstimate, bestEstimate, timeDifference, posterior.getIndexInRealTerms(posterior.MAPestimate)); + printf("tmp best %f and best %f time diff %f posterior MAP %f at speed %f\n", tmpBestEstimate, bestEstimate, timeDifference, posterior.getIndexInRealTerms(posterior.MAPestimate), relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.MAPestimate)); //lastBestEstimateUpdateTime = ofGetElapsedTimeMillis(); }
--- a/src/BayesianArrayStructure.h Fri Aug 19 01:26:40 2011 +0100 +++ b/src/BayesianArrayStructure.h Fri Aug 19 02:36:34 2011 +0100 @@ -73,6 +73,7 @@ void resetSpeedSize(int length); void setRelativeSpeedScalar(double f); + void setSpeedPrior(double f); void calculateNewPriorOffset(const double& timeDifference); void setNewDistributionOffsets(const double& newOffset); @@ -84,5 +85,7 @@ void crossUpdateArrays(DynamicVector& position, DynamicVector& speed, double timeDifference); + double speedPriorValue; + }; #endif
--- a/src/CannamMidiFileLoader.cpp Fri Aug 19 01:26:40 2011 +0100 +++ b/src/CannamMidiFileLoader.cpp Fri Aug 19 02:36:34 2011 +0100 @@ -10,9 +10,13 @@ #include "MIDIFileReader.h" #include "CannamMidiFileLoader.h" +CannamMidiFileLoader::CannamMidiFileLoader(){ + chopBeginning = true; +} + int CannamMidiFileLoader::loadFile(std::string& filename, midiEventHolder& myMidiEvents){ - + noteOnIndex = 0; myMidiEvents.clearAllEvents(); //int main(int argc, char **argv) @@ -148,13 +152,34 @@ << " pitch " << j->getPitch() << " velocity " << j->getVelocity() << "event time " << myMidiEvents.getEventTimeMillis(t) << endl; + + + if (noteOnIndex == 0){ + firstNoteTime = myMidiEvents.getEventTimeMillis(t); + firstTickTime = t; + } + + noteOnIndex++; + v.clear(); - v.push_back(t); + + if (!chopBeginning) + v.push_back(t); + else + v.push_back(t - firstTickTime); + v.push_back(j->getPitch()); v.push_back(j->getVelocity()); v.push_back(j->getDuration()); myMidiEvents.recordedNoteOnMatrix.push_back(v); + + if (!chopBeginning) myMidiEvents.recordedEventTimes.push_back(myMidiEvents.getEventTimeMillis(t)); + else { + myMidiEvents.recordedEventTimes.push_back(myMidiEvents.getEventTimeMillis(t) - firstNoteTime); + printf("chopping beginning %f \n", myMidiEvents.getEventTimeMillis(t) - firstNoteTime); + } + break; case MIDI_POLY_AFTERTOUCH:
--- a/src/CannamMidiFileLoader.h Fri Aug 19 01:26:40 2011 +0100 +++ b/src/CannamMidiFileLoader.h Fri Aug 19 02:36:34 2011 +0100 @@ -18,10 +18,17 @@ class CannamMidiFileLoader{ public: + CannamMidiFileLoader(); + int loadFile(std::string& filename, midiEventHolder& myMidiEvents); + double firstNoteTime; + int firstTickTime; + bool chopBeginning; + typedef std::vector<int> IntVector; IntVector v; + int noteOnIndex; }; #endif \ No newline at end of file
--- a/src/midiEventHolder.cpp Fri Aug 19 01:26:40 2011 +0100 +++ b/src/midiEventHolder.cpp Fri Aug 19 02:36:34 2011 +0100 @@ -35,6 +35,7 @@ bayesStruct.speedDecayWidth = 20; bayesStruct.speedDecayAmount = 10; + speedPriorValue = 1.0; matchWindowWidth = 8000;//window size for matching in ms @@ -46,7 +47,7 @@ bayesStruct.relativeSpeedPrior.getMaximum(); //bayesStruct.simpleExample(); - + speedPriorValue = 1.0; noteHeight = (*screenHeight) / (float)(noteMaximum - noteMinimum); } @@ -69,6 +70,7 @@ matchMatrix.clear(); bayesStruct.resetSpeedToOne(); + bayesStruct.setSpeedPrior(speedPriorValue); }
--- a/src/midiEventHolder.h Fri Aug 19 01:26:40 2011 +0100 +++ b/src/midiEventHolder.h Fri Aug 19 02:36:34 2011 +0100 @@ -78,6 +78,7 @@ void setMatchLikelihoods(int numberOfMatches); void setStartPlayingTimes(); + void setSpeedPrior(double speedPriorValue); int width, height; ///// @@ -112,6 +113,8 @@ void exampleCrossUpdate(); BayesianArrayStructure bayesStruct; + double speedPriorValue; + string timeString; double startTime;
--- a/src/testApp.cpp Fri Aug 19 01:26:40 2011 +0100 +++ b/src/testApp.cpp Fri Aug 19 02:36:34 2011 +0100 @@ -48,6 +48,14 @@ } + if ( m.getAddress() == "/setSpeedPrior" ) + { + float speedPrior = m.getArgAsFloat(0); + printf("speed prior set to %f\n", speedPrior); + midiEvents.speedPriorValue = speedPrior; + midiEvents.bayesStruct.speedPriorValue = speedPrior; + } + if ( m.getAddress() == "/startplaying" ) { startPlaying(); @@ -218,6 +226,7 @@ std::string filename = midiFileName;//argv[1]; +// fileLoader.chopBeginning = true; fileLoader.loadFile(filename, midiEvents); }//new end of load function