Mercurial > hg > drum-timing-analyser
diff DrumTimingLoader_OF/ofxAubioOnsetDetection/ChromaOnset.cpp @ 0:82352cfc0b23
Added files from ISMIR groove drum timing work
author | Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk> |
---|---|
date | Mon, 01 Oct 2012 22:24:32 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DrumTimingLoader_OF/ofxAubioOnsetDetection/ChromaOnset.cpp Mon Oct 01 22:24:32 2012 +0100 @@ -0,0 +1,146 @@ +/* + * ChromaOnset.cpp + * fileLoaderAndOnsetDetection + * + * Created by Andrew on 17/01/2012. + * Copyright 2012 QMUL. All rights reserved. + * + */ + +#include "ChromaOnset.h" + +//stores the information about our onset event +//when it happened +//what the chromagram was immeditaely after +//what the pitch was using AubioPitch class + +//FrameHolder holds the audio samples needed to do the harmonic analysis after the fact + +ChromaOnset::ChromaOnset(){ + frameTime = 0; + millisTime = 0; + chromaCalculated = false; + chromaSize = 2048; + + cgramPtr = new Chromagram(); + cgramPtr->initialise(512, chromaSize); + + onsetIndex = 0; + + matched = false; + //we also store an aubio pitch result - using a Frameholder to hold the frames we need to calculate this on + aubioPitch = 0; + aubioPitchFound = false; + + pitchFrameCounter = 0;//counts til time to do pitch detection + + +// aubioPitchDetector = new AubioPitch(); + +} + +void ChromaOnset::deleteChromagram(){ + delete cgramPtr; + //printf("chromagram deleted\n"); +} + + +bool ChromaOnset::processFrame(float* frame, const int& length){ + bool newlyCalculated = false; + if (chromaCalculated == false){ + + cgramPtr->processframe(frame); + + if (cgramPtr->chromaready){ + + float tmpMax = max(cgramPtr->maximumChromaValue, 1.0f); + + for (int i = 0;i < 12;i++){ + chromaValues.push_back(cgramPtr->rawChroma[i]/tmpMax); + quantisedChromaValues.push_back(cgramPtr->quantisedChromagram[i]); + // printf("chroma [%i] %f max %f quantised %i\n", i, cgramPtr->rawChroma[i], cgramPtr->chroma[i], cgramPtr->quantisedChromagram[i] ); + } + chromaCalculated = true; + newlyCalculated = true; + //this would do chord detection + // chord.C_Detect(chromoGramm.chroma,chromoGramm.chroma_low); + // rootChord[chromaIndex] = chord.root; + + } + + } + + return newlyCalculated; +} + +double ChromaOnset::timeDistanceMillis(const ChromaOnset& secondChromaOnset){ + + return (abs(secondChromaOnset.millisTime - millisTime)); +} + +double ChromaOnset::pitchDistance(const ChromaOnset& secondChromaOnset){ + + return (abs(secondChromaOnset.aubioPitch - aubioPitch)); +} + +double ChromaOnset::getQuantisedDistance(ChromaOnset& secondChromaOnset){ + + return getChromaQuantisedDistance(&secondChromaOnset.quantisedChromaValues[0]); + +} + +double ChromaOnset::getChromaQuantisedDistance(float* quantisedChromagramTwo){ + + double cosineDistance = 0; + double quantLengthOne = 0; + double quantLengthTwo = 0; + for (int i = 0;i < 12;i++){ + + cosineDistance += quantisedChromaValues[i] * quantisedChromagramTwo[i]; + + quantLengthOne += quantisedChromaValues[i] * quantisedChromaValues[i]; + quantLengthTwo += quantisedChromagramTwo[i] * quantisedChromagramTwo[i]; + + } + + if (quantLengthOne > 0 && quantLengthTwo > 0) + cosineDistance /= sqrt(quantLengthOne * quantLengthTwo); + else + cosineDistance = 0; + + return cosineDistance; + + +} + +double ChromaOnset::chromaDotProductDistance(const ChromaOnset& secondChromaOnset){ + double dotProductSum = 0; + double chromaOneSum = 0; + double chromaTwoSum = 0; + if (chromaValues.size() == 12 && secondChromaOnset.chromaValues.size() == 12){ + for (int i = 0;i < 12;i++){ + dotProductSum += chromaValues[i]*secondChromaOnset.chromaValues[i]; + chromaOneSum += chromaValues[i]*chromaValues[i]; + chromaTwoSum += secondChromaOnset.chromaValues[i]*secondChromaOnset.chromaValues[i]; + } + chromaOneSum = sqrt(chromaOneSum); + chromaTwoSum = sqrt(chromaTwoSum); + if (chromaOneSum > 0 && chromaTwoSum > 0) + dotProductSum /= (chromaOneSum*chromaTwoSum); + else + dotProductSum = 0; + } + return (dotProductSum); +} + +void ChromaOnset::printInfo(){ + + printf("ONSET : frametime %i, millis %f pitch %f\n", frameTime, millisTime, aubioPitch); + printf("chroma: "); + + for(int i = 0;i < chromaValues.size();i++) + printf("[%i] %1.3f, ", i, chromaValues[i]); + + printf(".\n"); + +} \ No newline at end of file