andrew@0: /* andrew@0: * AudioEventMatcher.cpp andrew@0: * MultipleAudioMathcher andrew@0: * andrew@0: * Created by Andrew on 31/01/2012. andrew@0: * Copyright 2012 QMUL. All rights reserved. andrew@0: * andrew@0: */ andrew@0: andrew@0: #include "AudioEventMatcher.h" andrew@0: andrew@0: andrew@2: const int matchWindowWidth = 6000; andrew@0: andrew@0: AudioEventMatcher::AudioEventMatcher(){ andrew@0: andrew@0: bayesTempoWindow.setToRelativeSize(0, 0.6, 1, 0.2); andrew@0: bayesPositionWindow.setToRelativeSize(0, 0.8, 1, 0.2); andrew@0: andrew@0: setArraySizes(); andrew@0: } andrew@0: andrew@0: andrew@0: void AudioEventMatcher::setArraySizes(){ andrew@0: bayesianStruct.resetSpeedSize(200); andrew@0: bayesianStruct.setRelativeSpeedScalar(0.01); andrew@0: bayesianStruct.setSpeedPrior(1.0); andrew@0: bayesianStruct.relativeSpeedPrior.getMaximum(); andrew@0: andrew@0: bayesianStruct.resetSize(matchWindowWidth); andrew@0: bayesianStruct.setPositionDistributionScalar(1); andrew@0: andrew@0: } andrew@0: andrew@0: void AudioEventMatcher::draw(){ andrew@0: //ofRect(20, 20, 300, 200); andrew@0: andrew@1: recordedTracks.drawTracks(); andrew@2: andrew@2: ofSetColor(255); andrew@2: // bayesianStruct.relativeSpeedPrior.drawVector(0, 200, bayesTempoWindow); andrew@2: andrew@2: double screenWidthMillis = recordedTracks.loadedAudioFiles[0].fileLoader.onsetDetect.framesToMillis(recordedTracks.loadedAudioFiles[0].fileLoader.onsetDetect.amplitudeNumber); andrew@2: andrew@2: andrew@2: bayesianStruct.likelihood.drawVector(0, screenWidthMillis, bayesTempoWindow); andrew@0: andrew@1: } andrew@1: andrew@1: andrew@1: void AudioEventMatcher::newPitchEvent(const double& pitchIn, const double& timeIn){ andrew@1: liveInput.addPitchEvent(pitchIn, timeIn); andrew@2: recordedTracks.matchNewPitchEvent(0, pitchIn, timeIn); andrew@2: } andrew@2: andrew@2: void AudioEventMatcher::newKickEvent(const double& timeIn){ andrew@2: matchNewOnsetEvent(0, timeIn); andrew@2: } andrew@2: andrew@2: andrew@2: void AudioEventMatcher::newSnareEvent(const double& timeIn){ andrew@2: matchNewOnsetEvent(0, timeIn); andrew@2: } andrew@2: andrew@2: //Needs just to set bounds for the matching process, not have TimeIn andrew@2: void AudioEventMatcher::matchNewOnsetEvent(const int& channel, const double& timeIn){ andrew@2: //start at beginning but OPTIMISE later andrew@2: double likelihoodToNoise = 0.5; andrew@2: andrew@2: double likelihoodWidth = 40; andrew@2: andrew@2: bayesianStruct.likelihood.offset = bayesianStruct.prior.offset; andrew@2: bayesianStruct.likelihood.zero();//set to zero andrew@2: andrew@2: double quantity = 1;//likelihoodToNoiseRatio / numberOfMatches; andrew@2: int numberOfMatchesFound = 0; andrew@2: andrew@2: andrew@2: double startTime = bayesianStruct.likelihood.offset; andrew@2: double endTime = bayesianStruct.likelihood.offset + matchWindowWidth; andrew@2: andrew@2: if (channel <= recordedTracks.numberOfAudioTracks){ andrew@2: for (int i = 0;i < recordedTracks.loadedAudioFiles[channel].fileLoader.onsetDetect.chromaOnsets.size();i++){ andrew@2: double millisTime = recordedTracks.loadedAudioFiles[channel].fileLoader.onsetDetect.chromaOnsets[i].millisTime; andrew@2: if (millisTime >= startTime && millisTime <= endTime){ andrew@2: bayesianStruct.likelihood.addGaussianShapeFromRealTime(millisTime, likelihoodWidth, quantity); andrew@2: numberOfMatchesFound++; andrew@2: printf("Adding Gaussian for onset at time %f offset %f\n", millisTime, bayesianStruct.likelihood.offset); andrew@2: andrew@2: } andrew@2: } andrew@2: } andrew@2: andrew@2: bayesianStruct.likelihood.renormalise(); andrew@2: andrew@2: //bayesStruct.likelihood.addConstant((1-likelihoodToNoiseRatio)/bayesStruct.likelihood.length); andrew@2: andrew@2: andrew@1: } andrew@1: andrew@1: andrew@1: void AudioEventMatcher::windowResized(const int& w, const int& h){ andrew@1: recordedTracks.windowResized(w,h); andrew@0: }