andrew@0: /* andrew@0: * AudioEventMatcher.h 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: andrew@0: andrew@0: #ifndef AUDIO_EVENT_MATCHER_H andrew@0: #define AUDIO_EVENT_MATCHER_H andrew@0: andrew@32: andrew@0: andrew@0: #include "ofMain.h" andrew@0: #include "ChromaOnset.h" andrew@0: #include "LiveAudioInput.h" andrew@0: #include "ofxWindowRegion.h" andrew@0: #include "BayesianArrayStructure.h" andrew@1: #include "RecordedMultitrackAudio.h" andrew@7: #include "DynamicVector.h" andrew@16: #include "AccompanimentSynchroniser.h" andrew@19: #include "TempoFollower.h" andrew@50: #include "MatchMarkers.h" andrew@0: andrew@52: #include "OutputDataWriter.h" andrew@52: andrew@32: static const int numberOfChannels = 4; andrew@32: andrew@0: class AudioEventMatcher{ andrew@0: andrew@0: public: andrew@0: AudioEventMatcher(); andrew@0: andrew@0: void setArraySizes(); andrew@0: andrew@9: void updatePosition(); andrew@8: void updateBestAlignmentPosition(); andrew@8: andrew@50: andrew@0: void draw(); andrew@32: void drawBayesianDistributions(); andrew@32: void drawPositionWindow(); andrew@32: void drawTrackLikelihoods(); andrew@32: void drawInfo(); andrew@45: void drawAlignmentTimes(); andrew@50: void drawMarkers(); andrew@32: andrew@7: void setWindowDimensions(); andrew@37: int getScreenWidthIndexOfEventTime(const double& time); andrew@45: int getTimeNow(); andrew@0: andrew@50: void addMarkerNow(); andrew@50: void deleteMarkers(); andrew@50: void deleteNearestMarker(); andrew@50: void moveToNextMarker(); andrew@50: void moveToPreviousMarker(); andrew@50: void goToMarker(const int& markerID); andrew@50: void setToPosition(const double& position);//for Bayesian distbn andrew@50: void setPlaybackPosition(const double& millis); andrew@50: void mousePressed(const int& x); andrew@50: andrew@6: void newPitchEvent(const int& channel, const double& pitchIn, const double& timeIn); andrew@2: void newKickEvent(const double& timeIn); andrew@6: void newKickEvent(const int& channel, const double& timeIn); andrew@2: void newSnareEvent(const double& timeIn); andrew@7: void newSnareEvent(const int& channel, const double& timeIn); andrew@2: andrew@32: void newChromaEvent(const int& channel, float* chromaIn, const double& timeIn); andrew@32: andrew@32: andrew@2: void matchNewPitchEvent(const int& channel, const double& pitchIn, const double& timeIn); andrew@2: void matchNewOnsetEvent(const int& channel, const double& timeIn); andrew@32: void matchNewChromaEvent(const int& channel, float* chroma, const double& timeIn); andrew@35: andrew@35: double getChromaDotProductDistance(float* chromaOne, float* chromaTwo); andrew@35: double getChromaEuclideanDistance(float* chromaOne, float* chromaTwo); andrew@35: bool useChromaDotProduct; andrew@52: float quantisedChromagramReceived[12]; andrew@52: void makeQuantisedChroma(float* chromaIn); andrew@1: andrew@0: BayesianArrayStructure bayesianStruct;//hold the probability distriubtions andrew@0: andrew@0: LiveAudioInput liveInput;//hold the new events that come in andrew@1: RecordedMultitrackAudio recordedTracks; andrew@1: andrew@16: void loadAudioFiles(); andrew@22: void rescue();//flat prior andrew@1: void windowResized(const int& w, const int& h); andrew@0: andrew@0: ofxWindowRegion bayesTempoWindow; andrew@3: ofxWindowRegion bayesPositionWindow; andrew@3: ofxWindowRegion bayesLikelihoodWindow; andrew@0: andrew@3: bool checkMatch(const double& recordedPitch, const double& livePitch); andrew@3: double getPitchDistance(const double& pitchOne, const double& pitchTwo, const double& scale); andrew@3: andrew@3: void startPlaying(); andrew@15: void stopPlaying(); andrew@15: bool startedPlaying; andrew@3: andrew@3: bool usingRealTime; andrew@37: double recentPitch, recentPitchEventTime; andrew@7: andrew@32: DynamicVector likelihoodVisualisation[numberOfChannels]; andrew@32: DynamicVector recentPriors[numberOfChannels]; andrew@13: //DynamicVector recentPrior; andrew@10: DynamicVector projectedPrior; andrew@8: andrew@8: double currentAlignmentPosition; andrew@8: double lastAlignmentTime; andrew@8: andrew@32: double recentEventTime[numberOfChannels]; andrew@10: int startTime; andrew@11: int currentAlignmentTime; andrew@9: andrew@9: double screenStartTimeMillis, screenEndTimeMillis, screenWidthMillis; andrew@9: bool followingLiveInput; andrew@9: void setScreenDisplayTimes(); andrew@14: andrew@16: AccompanimentSynchroniser synchroniser; andrew@16: andrew@14: //params andrew@14: double onsetLikelihoodWidth; andrew@56: double pitchLikelihoodWidth; andrew@56: //double onsetLikelihoodToNoise; andrew@53: double kickLikelihoodToNoise, snareLikelihoodToNoise; andrew@15: double pitchLikelihoodToNoise;//more noise andrew@32: double chromaLikelihoodToNoise; andrew@18: andrew@18: double pitchOfNearestMatch;//for viz purposes andrew@18: double distanceOfNearestMatch; andrew@19: andrew@32: double chromaLikelihoodWidth; andrew@19: andrew@19: TempoFollower temporal; andrew@20: TempoFollower recordedTempoData; andrew@20: void calculateRecordedTempoData(); andrew@56: andrew@20: void setTempoPrior(double tempo); andrew@20: andrew@20: void setNextOnsetTime(const int&channel, int& time, int* indexForOnsets); andrew@20: int recordedTempoIndex; andrew@20: double recordedTempo; andrew@20: void updateRecordedTempo(); andrew@56: double getRecordedTempoAtMillis(const double& millisPosition); andrew@56: andrew@20: void drawRecordedTempo(); andrew@20: double currentSpeedRatio; andrew@20: void drawPlayingTempo(); andrew@20: void setSpeedRatioDistribution(const double& speedRatio); andrew@37: andrew@55: void setNewLimits(const double& position); andrew@55: andrew@37: double euclideanMaximumDistance; andrew@37: bool printingData; andrew@50: andrew@50: bool drawLikelihoods; andrew@50: bool drawPosterior; andrew@50: andrew@50: MatchMarkers markedPoints; andrew@50: double markerPlaybackPosition; andrew@52: andrew@52: OutputDataWriter testDistributionOutput; andrew@52: void writeAllDistributions(); andrew@52: void writeDistribution(DynamicVector& distribution, std::string filename); andrew@55: void writeKickEvent(const int& startMatchingTime, const int& endMatchingTime, std::string filepath); andrew@52: ofImage img; andrew@53: andrew@53: void checkTempo(); andrew@53: double relativeTempo; andrew@56: andrew@56: bool updateTempoMethodOn; andrew@0: }; andrew@0: #endif