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