annotate src/AudioEventMatcher.cpp @ 18:4ded82fe318d

added pitch info at top of page
author Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk>
date Tue, 07 Feb 2012 02:37:04 +0000
parents c96b18dd0f48
children 1a62561bd72d
rev   line source
andrew@0 1 /*
andrew@0 2 * AudioEventMatcher.cpp
andrew@0 3 * MultipleAudioMathcher
andrew@0 4 *
andrew@0 5 * Created by Andrew on 31/01/2012.
andrew@0 6 * Copyright 2012 QMUL. All rights reserved.
andrew@0 7 *
andrew@0 8 */
andrew@0 9
andrew@0 10 #include "AudioEventMatcher.h"
andrew@0 11
andrew@0 12
andrew@2 13 const int matchWindowWidth = 6000;
andrew@0 14
andrew@0 15 AudioEventMatcher::AudioEventMatcher(){
andrew@7 16
andrew@15 17
andrew@17 18 pitchLikelihoodToNoise = 0.7;//more noise
andrew@16 19
andrew@17 20 onsetLikelihoodToNoise = 0.5;
andrew@17 21 onsetLikelihoodWidth = 10;//in ms
andrew@15 22
andrew@0 23 setArraySizes();
andrew@3 24
andrew@3 25 usingRealTime = false;
andrew@3 26 bayesianStruct.realTimeMode = &usingRealTime;
andrew@7 27 recentPitch = 0;
andrew@8 28 currentAlignmentPosition = 0;
andrew@14 29
andrew@15 30
andrew@9 31
andrew@9 32 followingLiveInput = true;
andrew@15 33 startedPlaying = false;
andrew@0 34 }
andrew@0 35
andrew@14 36
andrew@7 37 void AudioEventMatcher::setWindowDimensions(){
andrew@7 38 double startHeight = recordedTracks.numberOfAudioTracks * recordedTracks.trackScreenHeight;
andrew@7 39 double heightAvailable = 1 - startHeight;
andrew@7 40 heightAvailable /= 3.0;
andrew@7 41
andrew@7 42 bayesPositionWindow.setToRelativeSize(0, startHeight, 1, heightAvailable);
andrew@7 43 bayesLikelihoodWindow.setToRelativeSize(0, startHeight + 1*heightAvailable, 1, heightAvailable);
andrew@7 44 bayesTempoWindow.setToRelativeSize(0, startHeight + 2*heightAvailable, 1, heightAvailable);
andrew@7 45
andrew@7 46
andrew@7 47 }
andrew@0 48
andrew@0 49 void AudioEventMatcher::setArraySizes(){
andrew@0 50 bayesianStruct.resetSpeedSize(200);
andrew@0 51 bayesianStruct.setRelativeSpeedScalar(0.01);
andrew@0 52 bayesianStruct.setSpeedPrior(1.0);
andrew@0 53 bayesianStruct.relativeSpeedPrior.getMaximum();
andrew@0 54
andrew@0 55 bayesianStruct.resetSize(matchWindowWidth);
andrew@0 56 bayesianStruct.setPositionDistributionScalar(1);
andrew@0 57
andrew@0 58 }
andrew@0 59
andrew@16 60 void AudioEventMatcher::loadAudioFiles(){
andrew@16 61 recordedTracks.loadTestAudio();
andrew@16 62 synchroniser.fileLengthSamples = recordedTracks.loadedAudioFiles[0].fileLoader.totalNumberOfSamples;
andrew@16 63 printf("synchroniser has %f samples\n", synchroniser.fileLengthSamples);
andrew@16 64 }
andrew@16 65
andrew@9 66 void AudioEventMatcher::startPlaying(){
andrew@3 67 bayesianStruct.setStartPlaying();
andrew@8 68 currentAlignmentPosition = 0;
andrew@8 69 startTime = ofGetElapsedTimeMillis();
andrew@11 70
andrew@11 71 projectedPrior = bayesianStruct.prior;
andrew@15 72 startedPlaying = true;
andrew@17 73 synchroniser.reset();
andrew@17 74
andrew@3 75 //bayesianStruct.posterior.printArray();
andrew@3 76 }
andrew@3 77
andrew@9 78
andrew@15 79 void AudioEventMatcher::stopPlaying(){
andrew@15 80 startedPlaying = false;
andrew@15 81 }
andrew@15 82
andrew@9 83 void AudioEventMatcher::updatePosition(){
andrew@9 84 if (!followingLiveInput)
andrew@9 85 recordedTracks.updatePosition();
andrew@15 86 else if (startedPlaying)
andrew@9 87 recordedTracks.updatePositionToMillis(currentAlignmentPosition);
andrew@9 88
andrew@9 89 updateBestAlignmentPosition();
andrew@9 90 }
andrew@9 91
andrew@8 92 void AudioEventMatcher::updateBestAlignmentPosition(){
andrew@10 93 //THIS DEALS WITH WHERE WE ARE NOW! ON THE SCREEN
andrew@10 94 //DIFFERENT TO WHEN EVENTS COME IN AS THEY ARE TIMESTAMPED - SO EG A PITCH EVENT MAY ARRIVE 16 CHROMA FRAMES LATER - BIG DIFFERENCE
andrew@10 95
andrew@10 96 int newTime = ofGetElapsedTimeMillis() - startTime;
andrew@10 97 // double tmp = bayesianStruct.posterior.getIndexInRealTerms(bayesianStruct.posterior.MAPestimate);;
andrew@10 98 // double timetmp = (newTime - lastAlignmentTime);
andrew@10 99 // double speedtmp = bayesianStruct.relativeSpeedPosterior.getIndexInRealTerms(bayesianStruct.relativeSpeedPosterior.MAPestimate);
andrew@11 100 // currentAlignmentTime = newTime;
andrew@9 101 currentAlignmentPosition = bayesianStruct.posterior.getIndexInRealTerms(bayesianStruct.posterior.MAPestimate);
andrew@10 102 currentAlignmentPosition += (newTime - lastAlignmentTime) * bayesianStruct.relativeSpeedPosterior.getIndexInRealTerms(bayesianStruct.relativeSpeedPosterior.MAPestimate);
andrew@10 103
andrew@16 104
andrew@17 105 synchroniser.updateRecordedPosition(currentAlignmentPosition, newTime);
andrew@16 106
andrew@16 107 synchroniser.updateOutputSpeed();
andrew@16 108
andrew@11 109 bayesianStruct.projectDistribution(newTime, currentAlignmentPosition, projectedPrior);//prior gets updated to where we are now
andrew@11 110
andrew@10 111 // printf("ALIGN pos %f time diff %f (now %f , last %f)speed %f :: ALIGN BEST %f\n", tmp, timetmp, (double)ofGetElapsedTimeMillis(), lastAlignmentTime, speedtmp, currentAlignmentPosition);
andrew@8 112 }
andrew@8 113
andrew@0 114 void AudioEventMatcher::draw(){
andrew@6 115 //draw some outlines in blue
andrew@3 116 ofSetColor(20,200,200);
andrew@3 117 bayesPositionWindow.drawOutline();
andrew@3 118 bayesTempoWindow.drawOutline();
andrew@0 119
andrew@6 120 //draw the scrolling audio tracks
andrew@1 121 recordedTracks.drawTracks();
andrew@7 122
andrew@2 123 ofSetColor(255);
andrew@2 124 // bayesianStruct.relativeSpeedPrior.drawVector(0, 200, bayesTempoWindow);
andrew@9 125
andrew@9 126 setScreenDisplayTimes();
andrew@6 127 drawBayesianDistributions();
andrew@8 128
andrew@11 129 //bayesianStruct.posterior.drawVector(0, bayesianStruct.posterior.getRealTermsAsIndex(screenWidthMillis), bayesPositionWindow);
andrew@6 130 //bayesianStruct.posterior.drawVector(bayesianStruct.posterior.getRealTermsAsIndex(0), bayesianStruct.posterior.getRealTermsAsIndex(screenWidthMillis), bayesPositionWindow);
andrew@11 131 //bayesianStruct.relativeSpeedPosterior.drawVector(0, bayesianStruct.relativeSpeedPosterior.getRealTermsAsIndex(2), bayesTempoWindow);
andrew@18 132 string tmpStr = "pitch "+ofToString(recentPitch, 2);
andrew@18 133 tmpStr += " Nearest "+ofToString(pitchOfNearestMatch,2);
andrew@18 134 tmpStr += " dist "+ofToString(distanceOfNearestMatch, 2);
andrew@18 135 tmpStr += ", Time "+ofToString(recentTime, 0);
andrew@18 136 ofDrawBitmapString(tmpStr, 20, 20);
andrew@18 137
andrew@18 138
andrew@9 139
andrew@16 140 string alignString = " align "+ofToString(currentAlignmentPosition, 2);
andrew@16 141 alignString += " playing "+ofToString(synchroniser.playingPositionRatio, 5);
andrew@17 142 alignString += " pos "+ofToString(synchroniser.playingPositionMillis,0)+" ms";
andrew@17 143 alignString += " rec pos "+ofToString(synchroniser.recordedPositionMillis,0)+" ms";
andrew@16 144 ofDrawBitmapString(alignString, 20, 50);
andrew@16 145
andrew@9 146 ofDrawBitmapString("pos "+ofToString(recordedTracks.loadedAudioFiles[0].fileLoader.onsetDetect.playPosition), 200,600);
andrew@6 147 }
andrew@6 148
andrew@9 149 void AudioEventMatcher::setScreenDisplayTimes(){
andrew@9 150 screenWidthMillis = recordedTracks.loadedAudioFiles[0].fileLoader.onsetDetect.framesToMillis(recordedTracks.loadedAudioFiles[0].fileLoader.onsetDetect.amplitudeNumber);
andrew@9 151 // if (!followingLiveInput){
andrew@9 152
andrew@9 153 screenStartTimeMillis = recordedTracks.loadedAudioFiles[0].fileLoader.onsetDetect.framesToMillis(recordedTracks.loadedAudioFiles[0].fileLoader.onsetDetect.drawParams.windowStartFrame);
andrew@9 154 screenEndTimeMillis = screenStartTimeMillis + screenWidthMillis;
andrew@9 155
andrew@9 156 //need PRECISION in this alignment
andrew@9 157
andrew@9 158
andrew@9 159 /*}else{
andrew@9 160
andrew@9 161 screenStartTimeMillis = (int)(currentAlignmentPosition/screenWidthMillis) * screenWidthMillis;
andrew@9 162 screenEndTimeMillis = screenStartTimeMillis + screenWidthMillis;
andrew@9 163 }*/
andrew@9 164 }
andrew@9 165
andrew@6 166 void AudioEventMatcher::drawBayesianDistributions(){
andrew@6 167
andrew@6 168
andrew@6 169 int startIndex = bayesianStruct.posterior.getRealTermsAsIndex(screenStartTimeMillis);
andrew@6 170 int endIndex = bayesianStruct.posterior.getRealTermsAsIndex(screenEndTimeMillis);
andrew@4 171
andrew@6 172 bayesianStruct.posterior.drawConstrainedVector(startIndex, endIndex, 0, ofGetWidth(), bayesPositionWindow);
andrew@6 173
andrew@6 174 string tmpString = "start "+ofToString(screenStartTimeMillis)+" (index "+ofToString(startIndex)+"), end "+ofToString(screenEndTimeMillis);
andrew@6 175 ofDrawBitmapString(tmpString, bayesPositionWindow.x+20, bayesPositionWindow.y+20);
andrew@4 176
andrew@8 177 // bayesianStruct.likelihood.drawConstrainedVector(startIndex, endIndex, 0, ofGetWidth(), bayesLikelihoodWindow);
andrew@2 178
andrew@6 179 bayesianStruct.relativeSpeedPosterior.drawConstrainedVector(0, bayesianStruct.relativeSpeedPosterior.arraySize, 0, ofGetWidth(), bayesTempoWindow);
andrew@6 180
andrew@3 181 string tmpStr = "zero is "+ofToString(bayesianStruct.posterior.getRealTermsAsIndex(0));
andrew@3 182 tmpStr += " offsetis "+ofToString(bayesianStruct.posterior.offset);
andrew@3 183 tmpStr += " screenWidth = "+ofToString(bayesianStruct.posterior.getRealTermsAsIndex(screenWidthMillis));
andrew@3 184 ofDrawBitmapString(tmpStr, 20,140);
andrew@3 185 tmpStr = "best est "+ofToString(bayesianStruct.bestEstimate);
andrew@3 186 ofDrawBitmapString(tmpStr, 20, 180);
andrew@3 187
andrew@8 188 ofDrawBitmapString("screenwidth "+ofToString(screenWidthMillis), 20, 800);
andrew@3 189
andrew@9 190 //green line at current best estimate
andrew@13 191 ofSetColor(0,255,0);//green scrolling line best position
andrew@8 192 double currentEstimateIndex = (currentAlignmentPosition - screenStartTimeMillis)*ofGetWidth()/screenWidthMillis;
andrew@8 193 ofLine(currentEstimateIndex, bayesPositionWindow.y, currentEstimateIndex, bayesPositionWindow.y + bayesPositionWindow.height);
andrew@7 194
andrew@16 195
andrew@16 196 ofSetColor(0,255,255);//synchroniser position
andrew@16 197 currentEstimateIndex = (synchroniser.playingPositionMillis - screenStartTimeMillis)*ofGetWidth()/screenWidthMillis;
andrew@16 198 ofLine(currentEstimateIndex, bayesLikelihoodWindow.y, currentEstimateIndex, bayesLikelihoodWindow.y + bayesPositionWindow.height);
andrew@16 199
andrew@16 200
andrew@16 201
andrew@7 202 //draw track by track likelihoods
andrew@7 203 for (int i = 0; i <recordedTracks.numberOfAudioTracks;i++){
andrew@13 204 ofSetColor(200,255,50);//channel likelihoods in yellow
andrew@8 205 likelihoodVisualisation[i].drawConstrainedVector(likelihoodVisualisation[i].getRealTermsAsIndex(screenStartTimeMillis), likelihoodVisualisation[i].getRealTermsAsIndex(screenEndTimeMillis), 0, ofGetWidth(), recordedTracks.loadedAudioFiles[i].fileLoader.onsetDetect.window);
andrew@11 206
andrew@13 207 ofSetColor(0,255,150);//channel priors
andrew@11 208 recentPriors[i].drawConstrainedVector(recentPriors[i].getRealTermsAsIndex(screenStartTimeMillis), recentPriors[i].getRealTermsAsIndex(screenEndTimeMillis), 0, ofGetWidth(), recordedTracks.loadedAudioFiles[i].fileLoader.onsetDetect.window);
andrew@11 209
andrew@11 210
andrew@8 211 ofSetColor(255);
andrew@8 212 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);
andrew@7 213 }
andrew@8 214
andrew@13 215 int priorStartIndex = bayesianStruct.prior.getRealTermsAsIndex(screenStartTimeMillis);
andrew@13 216 int priorEndIndex = bayesianStruct.prior.getRealTermsAsIndex(screenEndTimeMillis);
andrew@13 217 // ofSetColor(0,200,200);//recent prior
andrew@13 218 // recentPrior.drawConstrainedVector(priorStartIndex, priorEndIndex, 0, ofGetWidth(), bayesPositionWindow);
andrew@8 219
andrew@10 220 ofSetColor(255,0,100);//purple prior
andrew@11 221 bayesianStruct.prior.drawConstrainedVector(bayesianStruct.prior.getRealTermsAsIndex(screenStartTimeMillis), bayesianStruct.prior.getRealTermsAsIndex(screenEndTimeMillis), 0, ofGetWidth(), bayesPositionWindow);
andrew@11 222
andrew@11 223 ofSetColor(255,0,0);
andrew@13 224 projectedPrior.drawConstrainedVector(bayesianStruct.prior.getRealTermsAsIndex(screenStartTimeMillis), bayesianStruct.prior.getRealTermsAsIndex(screenEndTimeMillis), 0, ofGetWidth(), bayesPositionWindow);
andrew@7 225
andrew@1 226 }
andrew@1 227
andrew@6 228 void AudioEventMatcher::newPitchEvent(const int& channel, const double& pitchIn, const double& timeIn){
andrew@7 229 if (pitchIn > 0){
andrew@1 230 liveInput.addPitchEvent(pitchIn, timeIn);
andrew@4 231
andrew@10 232 //printPosteriorMAPinfo();
andrew@11 233
andrew@7 234 matchNewPitchEvent(channel, pitchIn, timeIn);//main pitch matching fn
andrew@7 235
andrew@7 236 likelihoodVisualisation[1] = bayesianStruct.likelihood;
andrew@7 237
andrew@7 238 recentPitch = pitchIn;//for drawing
andrew@7 239 recentTime = timeIn;
andrew@7 240 }
andrew@8 241
andrew@2 242 }
andrew@2 243
andrew@6 244 void AudioEventMatcher::newKickEvent(const double& timeIn){
andrew@6 245 // liveInput.addKickEvent(timeIn);
andrew@2 246 matchNewOnsetEvent(0, timeIn);
andrew@7 247 likelihoodVisualisation[0] = bayesianStruct.likelihood;
andrew@2 248 }
andrew@2 249
andrew@6 250 void AudioEventMatcher::newKickEvent(const int& channel, const double& timeIn){
andrew@6 251 // liveInput.addKickEvent(timeIn);
andrew@6 252 matchNewOnsetEvent(channel, timeIn);
andrew@7 253 likelihoodVisualisation[0] = bayesianStruct.likelihood;
andrew@6 254 }
andrew@6 255
andrew@2 256
andrew@2 257 void AudioEventMatcher::newSnareEvent(const double& timeIn){
andrew@6 258 matchNewOnsetEvent(2, timeIn);
andrew@7 259 likelihoodVisualisation[2] = bayesianStruct.likelihood;
andrew@7 260 }
andrew@7 261
andrew@7 262
andrew@7 263 void AudioEventMatcher::newSnareEvent(const int& channel, const double& timeIn){
andrew@7 264 matchNewOnsetEvent(channel, timeIn);
andrew@7 265 likelihoodVisualisation[2] = bayesianStruct.likelihood;
andrew@2 266 }
andrew@2 267
andrew@2 268 //Needs just to set bounds for the matching process, not have TimeIn
andrew@2 269 void AudioEventMatcher::matchNewOnsetEvent(const int& channel, const double& timeIn){
andrew@3 270
andrew@6 271 bayesianStruct.updateBayesianDistributions(timeIn);//moves the posterior up into prior given the time interval and calculates new offsets
andrew@10 272
andrew@2 273 //start at beginning but OPTIMISE later
andrew@15 274
andrew@2 275
andrew@2 276 bayesianStruct.likelihood.offset = bayesianStruct.prior.offset;
andrew@2 277 bayesianStruct.likelihood.zero();//set to zero
andrew@2 278
andrew@2 279 double quantity = 1;//likelihoodToNoiseRatio / numberOfMatches;
andrew@2 280 int numberOfMatchesFound = 0;
andrew@2 281
andrew@2 282
andrew@10 283 double startMatchingTime = bayesianStruct.likelihood.offset;
andrew@10 284 double endMatchingTime = bayesianStruct.likelihood.offset + matchWindowWidth;
andrew@2 285
andrew@2 286 if (channel <= recordedTracks.numberOfAudioTracks){
andrew@2 287 for (int i = 0;i < recordedTracks.loadedAudioFiles[channel].fileLoader.onsetDetect.chromaOnsets.size();i++){
andrew@2 288 double millisTime = recordedTracks.loadedAudioFiles[channel].fileLoader.onsetDetect.chromaOnsets[i].millisTime;
andrew@10 289 if (millisTime >= startMatchingTime && millisTime <= endMatchingTime){
andrew@14 290 bayesianStruct.likelihood.addGaussianShapeFromRealTime(millisTime, onsetLikelihoodWidth, quantity);
andrew@2 291 numberOfMatchesFound++;
andrew@6 292 // printf("Adding Gaussian for onset at time %f offset %f\n", millisTime, bayesianStruct.likelihood.offset);
andrew@2 293
andrew@2 294 }
andrew@2 295 }
andrew@2 296 }
andrew@2 297
andrew@11 298 if (numberOfMatchesFound > 0){
andrew@3 299 // bayesianStruct.likelihood.addConstant((1-likelihoodToNoiseRatio)/bayesianStruct.likelihood.length);
andrew@3 300 bayesianStruct.likelihood.addConstant(numberOfMatchesFound*(1-onsetLikelihoodToNoise)/(onsetLikelihoodToNoise*bayesianStruct.likelihood.length));
andrew@2 301 bayesianStruct.likelihood.renormalise();
andrew@2 302
andrew@8 303 bayesianStruct.calculatePosterior();
andrew@10 304 lastAlignmentTime = timeIn;//use TIMESTAMP
andrew@10 305 recentEventTime[channel] = timeIn;//ofGetElapsedTimeMillis() - startTime;
andrew@11 306
andrew@11 307 recentPriors[channel] = bayesianStruct.prior;
andrew@13 308 projectedPrior = bayesianStruct.prior;
andrew@11 309 }
andrew@11 310
andrew@11 311
andrew@6 312
andrew@3 313 }
andrew@3 314
andrew@3 315
andrew@3 316
andrew@3 317 void AudioEventMatcher::matchNewPitchEvent(const int& channel, const double& pitchIn, const double& timeIn){
andrew@3 318 //start at beginning but OPTIMISE later
andrew@10 319 /*printf("TIME %i\n", ofGetElapsedTimeMillis());
andrew@10 320 //tmp debug
andrew@10 321 updateBestAlignmentPosition();
andrew@10 322 printf("current alignment best estimate %f\n", currentAlignmentPosition);
andrew@10 323 */
andrew@6 324 bayesianStruct.updateBayesianDistributions(timeIn);//moves the posterior up into prior given the time interval and calculates new offsets
andrew@8 325
andrew@7 326 //set the lielihoods by matching the pitched note
andrew@7 327
andrew@15 328
andrew@3 329 int numberOfMatches = 0;
andrew@3 330 bayesianStruct.likelihood.zero();//set to zero
andrew@18 331 double newOnsetTime;
andrew@18 332 double closestDistance = INFINITY;
andrew@3 333
andrew@3 334 double quantity = 0;
andrew@3 335 if (channel <= recordedTracks.numberOfAudioTracks){
andrew@3 336 for (int i = 0;i < recordedTracks.loadedAudioFiles[channel].fileLoader.onsetDetect.chromaOnsets.size();i++){
andrew@3 337
andrew@3 338 if (checkMatch(recordedTracks.loadedAudioFiles[channel].fileLoader.onsetDetect.chromaOnsets[i].aubioPitch, pitchIn)) {
andrew@18 339 quantity = getPitchDistance(recordedTracks.loadedAudioFiles[channel].fileLoader.onsetDetect.chromaOnsets[i].aubioPitch, pitchIn, 8);
andrew@18 340
andrew@3 341 bayesianStruct.likelihood.addGaussianShapeFromRealTime(recordedTracks.loadedAudioFiles[channel].fileLoader.onsetDetect.chromaOnsets[i].millisTime, 30, quantity);
andrew@3 342 recordedTracks.loadedAudioFiles[channel].fileLoader.onsetDetect.chromaOnsets[i].matched = true;
andrew@3 343 numberOfMatches++;
andrew@3 344 }
andrew@3 345 else{
andrew@3 346 recordedTracks.loadedAudioFiles[channel].fileLoader.onsetDetect.chromaOnsets[i].matched = false;
andrew@3 347 }
andrew@18 348 //checking nearest pitch
andrew@18 349 newOnsetTime = recordedTracks.loadedAudioFiles[channel].fileLoader.onsetDetect.chromaOnsets[i].millisTime;
andrew@18 350 if (abs(newOnsetTime - currentAlignmentPosition) < closestDistance){
andrew@18 351 closestDistance = abs(newOnsetTime - currentAlignmentPosition);
andrew@18 352 pitchOfNearestMatch = recordedTracks.loadedAudioFiles[channel].fileLoader.onsetDetect.chromaOnsets[i].aubioPitch;
andrew@18 353 distanceOfNearestMatch = quantity;
andrew@18 354 }
andrew@3 355
andrew@3 356 }
andrew@3 357 }
andrew@6 358
andrew@8 359
andrew@8 360
andrew@6 361 if (numberOfMatches > 0){//no point updating unless there is a match
andrew@7 362
andrew@6 363 bayesianStruct.likelihood.addConstant(numberOfMatches*(1-pitchLikelihoodToNoise)/(pitchLikelihoodToNoise*bayesianStruct.likelihood.length));
andrew@4 364
andrew@4 365 //tmp set likelihood constant and calculate using that
andrew@6 366 //bayesianStruct.likelihood.zero();
andrew@6 367 //bayesianStruct.likelihood.addConstant(1);
andrew@7 368
andrew@6 369 bayesianStruct.calculatePosterior();
andrew@11 370 lastAlignmentTime = timeIn;//has to use the STAMPED time
andrew@11 371 recentEventTime[channel] = timeIn;
andrew@11 372
andrew@11 373 recentPriors[channel] = bayesianStruct.prior;
andrew@13 374 projectedPrior = bayesianStruct.prior;
andrew@6 375 }
andrew@4 376
andrew@11 377
andrew@1 378 }
andrew@1 379
andrew@3 380 double AudioEventMatcher::getPitchDistance(const double& pitchOne, const double& pitchTwo, const double& scale){
andrew@3 381
andrew@18 382 double scaleFactor = scale * pitchOne / 110.0;
andrew@16 383
andrew@18 384 int multiplicationFactor = 1;
andrew@18 385 if (pitchTwo > 0){
andrew@18 386 int multiplicationFactor = round(pitchOne/pitchTwo);
andrew@18 387 }
andrew@16 388
andrew@18 389 double distance = abs(pitchOne - pitchTwo*multiplicationFactor);
andrew@16 390 if (distance < scaleFactor)
andrew@16 391 distance = 1 - (distance/scaleFactor);
andrew@3 392 else
andrew@3 393 distance = 0;
andrew@3 394
andrew@3 395 // printf("[pitch distance %f vs %f = %f\n", pitchOne, pitchTwo, distance);
andrew@3 396 return distance;
andrew@3 397
andrew@3 398 }
andrew@3 399
andrew@3 400
andrew@3 401 bool AudioEventMatcher::checkMatch(const double& recordedPitch, const double& livePitch){
andrew@18 402
andrew@18 403 if (livePitch > 0){
andrew@18 404 int multiplicationFactor = (int)(round(recordedPitch/livePitch));
andrew@18 405
andrew@18 406 if (abs(recordedPitch - livePitch * multiplicationFactor) < 16)
andrew@3 407 return true;
andrew@3 408 else
andrew@3 409 return false;
andrew@18 410 }else {
andrew@18 411 return false;
andrew@18 412 }
andrew@18 413
andrew@3 414 }
andrew@3 415
andrew@3 416
andrew@1 417
andrew@1 418 void AudioEventMatcher::windowResized(const int& w, const int& h){
andrew@1 419 recordedTracks.windowResized(w,h);
andrew@3 420 bayesTempoWindow.resized(w,h);
andrew@3 421 bayesPositionWindow.resized(w,h);
andrew@3 422 }
andrew@3 423
andrew@10 424 /*
andrew@10 425
andrew@10 426 void printPosteriorMAPinfo(){ //tmp print stuff
andrew@10 427 printf("New pitch MAP post estimate now %i, ", bayesianStruct.posterior.MAPestimate);
andrew@10 428 double tmp = bayesianStruct.posterior.getMAPestimate();
andrew@10 429 printf(" getting it %f and offset %f == %f ms\n", tmp, bayesianStruct.posterior.offset, bayesianStruct.posterior.getIndexInRealTerms(tmp));
andrew@10 430
andrew@10 431 }
andrew@10 432 */
andrew@3 433