comparison src/AudioEventMatcher.cpp @ 11:9a2b008c4706

Priors for each channel and scrolling projection for new prior is added
author Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk>
date Sun, 05 Feb 2012 00:00:58 +0000
parents cbadb9d05d29
children 66783ace7506
comparison
equal deleted inserted replaced
10:cbadb9d05d29 11:9a2b008c4706
49 49
50 void AudioEventMatcher::startPlaying(){ 50 void AudioEventMatcher::startPlaying(){
51 bayesianStruct.setStartPlaying(); 51 bayesianStruct.setStartPlaying();
52 currentAlignmentPosition = 0; 52 currentAlignmentPosition = 0;
53 startTime = ofGetElapsedTimeMillis(); 53 startTime = ofGetElapsedTimeMillis();
54
55 projectedPrior = bayesianStruct.prior;
54 //bayesianStruct.posterior.printArray(); 56 //bayesianStruct.posterior.printArray();
55 } 57 }
56 58
57 59
58 void AudioEventMatcher::updatePosition(){ 60 void AudioEventMatcher::updatePosition(){
70 72
71 int newTime = ofGetElapsedTimeMillis() - startTime; 73 int newTime = ofGetElapsedTimeMillis() - startTime;
72 // double tmp = bayesianStruct.posterior.getIndexInRealTerms(bayesianStruct.posterior.MAPestimate);; 74 // double tmp = bayesianStruct.posterior.getIndexInRealTerms(bayesianStruct.posterior.MAPestimate);;
73 // double timetmp = (newTime - lastAlignmentTime); 75 // double timetmp = (newTime - lastAlignmentTime);
74 // double speedtmp = bayesianStruct.relativeSpeedPosterior.getIndexInRealTerms(bayesianStruct.relativeSpeedPosterior.MAPestimate); 76 // double speedtmp = bayesianStruct.relativeSpeedPosterior.getIndexInRealTerms(bayesianStruct.relativeSpeedPosterior.MAPestimate);
75 77 // currentAlignmentTime = newTime;
76 currentAlignmentPosition = bayesianStruct.posterior.getIndexInRealTerms(bayesianStruct.posterior.MAPestimate); 78 currentAlignmentPosition = bayesianStruct.posterior.getIndexInRealTerms(bayesianStruct.posterior.MAPestimate);
77 currentAlignmentPosition += (newTime - lastAlignmentTime) * bayesianStruct.relativeSpeedPosterior.getIndexInRealTerms(bayesianStruct.relativeSpeedPosterior.MAPestimate); 79 currentAlignmentPosition += (newTime - lastAlignmentTime) * bayesianStruct.relativeSpeedPosterior.getIndexInRealTerms(bayesianStruct.relativeSpeedPosterior.MAPestimate);
78 80
81 bayesianStruct.projectDistribution(newTime, currentAlignmentPosition, projectedPrior);//prior gets updated to where we are now
82
79 // printf("ALIGN pos %f time diff %f (now %f , last %f)speed %f :: ALIGN BEST %f\n", tmp, timetmp, (double)ofGetElapsedTimeMillis(), lastAlignmentTime, speedtmp, currentAlignmentPosition); 83 // printf("ALIGN pos %f time diff %f (now %f , last %f)speed %f :: ALIGN BEST %f\n", tmp, timetmp, (double)ofGetElapsedTimeMillis(), lastAlignmentTime, speedtmp, currentAlignmentPosition);
80 } 84 }
81 85
82 void AudioEventMatcher::draw(){ 86 void AudioEventMatcher::draw(){
83 //draw some outlines in blue 87 //draw some outlines in blue
86 bayesTempoWindow.drawOutline(); 90 bayesTempoWindow.drawOutline();
87 91
88 //draw the scrolling audio tracks 92 //draw the scrolling audio tracks
89 recordedTracks.drawTracks(); 93 recordedTracks.drawTracks();
90 94
91
92
93 ofSetColor(255); 95 ofSetColor(255);
94 // bayesianStruct.relativeSpeedPrior.drawVector(0, 200, bayesTempoWindow); 96 // bayesianStruct.relativeSpeedPrior.drawVector(0, 200, bayesTempoWindow);
95 97
96 setScreenDisplayTimes(); 98 setScreenDisplayTimes();
97 drawBayesianDistributions(); 99 drawBayesianDistributions();
98 100
99 // bayesianStruct.posterior.drawVector(0, bayesianStruct.posterior.getRealTermsAsIndex(screenWidthMillis), bayesPositionWindow); 101 //bayesianStruct.posterior.drawVector(0, bayesianStruct.posterior.getRealTermsAsIndex(screenWidthMillis), bayesPositionWindow);
100
101 //bayesianStruct.posterior.drawVector(bayesianStruct.posterior.getRealTermsAsIndex(0), bayesianStruct.posterior.getRealTermsAsIndex(screenWidthMillis), bayesPositionWindow); 102 //bayesianStruct.posterior.drawVector(bayesianStruct.posterior.getRealTermsAsIndex(0), bayesianStruct.posterior.getRealTermsAsIndex(screenWidthMillis), bayesPositionWindow);
102 103 //bayesianStruct.relativeSpeedPosterior.drawVector(0, bayesianStruct.relativeSpeedPosterior.getRealTermsAsIndex(2), bayesTempoWindow);
103 // bayesianStruct.relativeSpeedPosterior.drawVector(0, bayesianStruct.relativeSpeedPosterior.getRealTermsAsIndex(2), bayesTempoWindow);
104 104
105 ofDrawBitmapString("pitch "+ofToString(recentPitch, 2)+", Time "+ofToString(recentTime, 0), 20, 20); 105 ofDrawBitmapString("pitch "+ofToString(recentPitch, 2)+", Time "+ofToString(recentTime, 0), 20, 20);
106 106
107 ofDrawBitmapString("pos "+ofToString(recordedTracks.loadedAudioFiles[0].fileLoader.onsetDetect.playPosition), 200,600); 107 ofDrawBitmapString("pos "+ofToString(recordedTracks.loadedAudioFiles[0].fileLoader.onsetDetect.playPosition), 200,600);
108 } 108 }
155 155
156 //draw track by track likelihoods 156 //draw track by track likelihoods
157 for (int i = 0; i <recordedTracks.numberOfAudioTracks;i++){ 157 for (int i = 0; i <recordedTracks.numberOfAudioTracks;i++){
158 ofSetColor(200,255,50); 158 ofSetColor(200,255,50);
159 likelihoodVisualisation[i].drawConstrainedVector(likelihoodVisualisation[i].getRealTermsAsIndex(screenStartTimeMillis), likelihoodVisualisation[i].getRealTermsAsIndex(screenEndTimeMillis), 0, ofGetWidth(), recordedTracks.loadedAudioFiles[i].fileLoader.onsetDetect.window); 159 likelihoodVisualisation[i].drawConstrainedVector(likelihoodVisualisation[i].getRealTermsAsIndex(screenStartTimeMillis), likelihoodVisualisation[i].getRealTermsAsIndex(screenEndTimeMillis), 0, ofGetWidth(), recordedTracks.loadedAudioFiles[i].fileLoader.onsetDetect.window);
160
161 ofSetColor(0,255,150);
162 recentPriors[i].drawConstrainedVector(recentPriors[i].getRealTermsAsIndex(screenStartTimeMillis), recentPriors[i].getRealTermsAsIndex(screenEndTimeMillis), 0, ofGetWidth(), recordedTracks.loadedAudioFiles[i].fileLoader.onsetDetect.window);
163
164
160 ofSetColor(255); 165 ofSetColor(255);
161 ofDrawBitmapString("recent event "+ofToString(recentEventTime[i]), recordedTracks.loadedAudioFiles[i].fileLoader.onsetDetect.window.x + 20, recordedTracks.loadedAudioFiles[i].fileLoader.onsetDetect.window.y + recordedTracks.loadedAudioFiles[i].fileLoader.onsetDetect.window.height - 10); 166 ofDrawBitmapString("recent event "+ofToString(recentEventTime[i]), recordedTracks.loadedAudioFiles[i].fileLoader.onsetDetect.window.x + 20, recordedTracks.loadedAudioFiles[i].fileLoader.onsetDetect.window.y + recordedTracks.loadedAudioFiles[i].fileLoader.onsetDetect.window.height - 10);
162 } 167 }
163 168
164 int priorStartIndex = recentPrior.getRealTermsAsIndex(screenStartTimeMillis); 169 int priorStartIndex = recentPrior.getRealTermsAsIndex(screenStartTimeMillis);
165 int priorEndIndex = recentPrior.getRealTermsAsIndex(screenEndTimeMillis); 170 int priorEndIndex = recentPrior.getRealTermsAsIndex(screenEndTimeMillis);
166 ofSetColor(0,200,200);//recent prior 171 ofSetColor(0,200,200);//recent prior
167 recentPrior.drawConstrainedVector(priorStartIndex, priorEndIndex, 0, ofGetWidth(), bayesPositionWindow); 172 recentPrior.drawConstrainedVector(priorStartIndex, priorEndIndex, 0, ofGetWidth(), bayesPositionWindow);
168 173
169 ofSetColor(255,0,100);//purple prior 174 ofSetColor(255,0,100);//purple prior
170 bayesianStruct.prior.drawConstrainedVector(bayesianStruct.prior.getRealTermsAsIndex(screenStartTimeMillis), bayesianStruct.prior.getRealTermsAsIndex(screenEndTimeMillis), 0, ofGetWidth(), bayesLikelihoodWindow); 175 bayesianStruct.prior.drawConstrainedVector(bayesianStruct.prior.getRealTermsAsIndex(screenStartTimeMillis), bayesianStruct.prior.getRealTermsAsIndex(screenEndTimeMillis), 0, ofGetWidth(), bayesPositionWindow);
176
177 ofSetColor(255,0,0);
178 projectedPrior.drawConstrainedVector(bayesianStruct.prior.getRealTermsAsIndex(screenStartTimeMillis), bayesianStruct.prior.getRealTermsAsIndex(screenEndTimeMillis), 0, ofGetWidth(), bayesLikelihoodWindow);
171 179
172 } 180 }
173 181
174 void AudioEventMatcher::newPitchEvent(const int& channel, const double& pitchIn, const double& timeIn){ 182 void AudioEventMatcher::newPitchEvent(const int& channel, const double& pitchIn, const double& timeIn){
175 if (pitchIn > 0){ 183 if (pitchIn > 0){
176 liveInput.addPitchEvent(pitchIn, timeIn); 184 liveInput.addPitchEvent(pitchIn, timeIn);
177 185
178 //printPosteriorMAPinfo(); 186 //printPosteriorMAPinfo();
179 187
180 matchNewPitchEvent(channel, pitchIn, timeIn);//main pitch matching fn 188 matchNewPitchEvent(channel, pitchIn, timeIn);//main pitch matching fn
181 189
182 likelihoodVisualisation[1] = bayesianStruct.likelihood; 190 likelihoodVisualisation[1] = bayesianStruct.likelihood;
183 191
184 recentPitch = pitchIn;//for drawing 192 recentPitch = pitchIn;//for drawing
241 249
242 } 250 }
243 } 251 }
244 } 252 }
245 253
254 if (numberOfMatchesFound > 0){
246 // bayesianStruct.likelihood.addConstant((1-likelihoodToNoiseRatio)/bayesianStruct.likelihood.length); 255 // bayesianStruct.likelihood.addConstant((1-likelihoodToNoiseRatio)/bayesianStruct.likelihood.length);
247 bayesianStruct.likelihood.addConstant(numberOfMatchesFound*(1-onsetLikelihoodToNoise)/(onsetLikelihoodToNoise*bayesianStruct.likelihood.length)); 256 bayesianStruct.likelihood.addConstant(numberOfMatchesFound*(1-onsetLikelihoodToNoise)/(onsetLikelihoodToNoise*bayesianStruct.likelihood.length));
248 bayesianStruct.likelihood.renormalise(); 257 bayesianStruct.likelihood.renormalise();
249 258
250 bayesianStruct.calculatePosterior(); 259 bayesianStruct.calculatePosterior();
251
252 lastAlignmentTime = timeIn;//use TIMESTAMP 260 lastAlignmentTime = timeIn;//use TIMESTAMP
253 recentEventTime[channel] = timeIn;//ofGetElapsedTimeMillis() - startTime; 261 recentEventTime[channel] = timeIn;//ofGetElapsedTimeMillis() - startTime;
262
263 recentPriors[channel] = bayesianStruct.prior;
264
265 }
266
267
254 268
255 } 269 }
256 270
257 271
258 272
298 //tmp set likelihood constant and calculate using that 312 //tmp set likelihood constant and calculate using that
299 //bayesianStruct.likelihood.zero(); 313 //bayesianStruct.likelihood.zero();
300 //bayesianStruct.likelihood.addConstant(1); 314 //bayesianStruct.likelihood.addConstant(1);
301 315
302 bayesianStruct.calculatePosterior(); 316 bayesianStruct.calculatePosterior();
303 } 317 lastAlignmentTime = timeIn;//has to use the STAMPED time
304 318 recentEventTime[channel] = timeIn;
305 lastAlignmentTime = timeIn;//has to use the STAMPED time 319
306 recentEventTime[channel] = timeIn; 320 recentPriors[channel] = bayesianStruct.prior;
321 }
322
323
307 } 324 }
308 325
309 double AudioEventMatcher::getPitchDistance(const double& pitchOne, const double& pitchTwo, const double& scale){ 326 double AudioEventMatcher::getPitchDistance(const double& pitchOne, const double& pitchTwo, const double& scale){
310 327
311 double distance = abs(pitchOne - pitchTwo); 328 double distance = abs(pitchOne - pitchTwo);