andrew@0: /* andrew@0: * BayesianArrayStructure.cpp andrew@0: * midiCannamReader andrew@0: * andrew@0: * Created by Andrew on 17/07/2011. andrew@0: * Copyright 2011 QMUL. All rights reserved. andrew@0: * andrew@0: */ andrew@0: andrew@3: //look at reset speed to one - what does this do? - get rid of? andrew@3: andrew@3: andrew@0: #include "BayesianArrayStructure.h" andrew@0: andrew@0: BayesianArrayStructure::BayesianArrayStructure(){ andrew@0: printf("Bayesian structure: DeFault constructor called"); andrew@0: andrew@22: relativeSpeedLikelihoodStdDev = 5.0; andrew@22: andrew@0: prior.createVector(1); andrew@0: likelihood.createVector(1); andrew@0: posterior.createVector(1); andrew@23: andrew@22: andrew@3: speedPriorValue = 1.0; andrew@9: speedEstimate = speedPriorValue; andrew@3: andrew@14: lastEventTime = 0;//ofGetElapsedTimeMillis(); andrew@14: andrew@2: tmpBestEstimate = 0; andrew@22: crossUpdateTimeThreshold = 60; andrew@18: priorWidth = 50; andrew@24: usingIntegratedTempoEstimate = true;//use max index andrew@0: } andrew@0: andrew@0: BayesianArrayStructure::BayesianArrayStructure(int length){ andrew@0: printf("BAYESIAN STURTUCRE CREATED LENGTH: %i\n", length); andrew@0: //this constructor isnt called it seems andrew@0: prior.createVector(length); andrew@0: likelihood.createVector(length); andrew@0: posterior.createVector(length); andrew@2: andrew@2: lastEventTime = 0; andrew@24: andrew@0: andrew@0: } andrew@0: andrew@0: andrew@0: andrew@0: void BayesianArrayStructure::resetSize(int length){ andrew@0: printf("BAYESIAN STRUCTURE size is : %i\n", length); andrew@0: andrew@0: prior.createVector(length); andrew@0: likelihood.createVector(length); andrew@0: posterior.createVector(length); andrew@0: andrew@0: acceleration.createVector(length); andrew@0: andrew@0: } andrew@0: andrew@0: andrew@0: andrew@0: void BayesianArrayStructure::resetSpeedToOne(){ andrew@0: relativeSpeedPrior.zero(); andrew@0: relativeSpeedPosterior.zero(); andrew@0: relativeSpeedLikelihood.zero(); andrew@0: andrew@0: andrew@2: relativeSpeedPosterior.addGaussianShape(100, 20, 0.8); andrew@0: relativeSpeedPosterior.renormalise(); andrew@0: relativeSpeedPosterior.getMaximum(); andrew@0: andrew@3: setSpeedPrior(speedPriorValue); andrew@9: speedEstimate = speedPriorValue; andrew@3: andrew@2: prior.zero(); andrew@2: posterior.zero(); andrew@18: andrew@2: posterior.addToIndex(0, 1); andrew@2: posterior.renormalise(); andrew@2: andrew@22: andrew@2: //acceleration.addGaussianShape(2000, 20, 0.8); andrew@0: andrew@0: } andrew@0: andrew@3: void BayesianArrayStructure::setSpeedPrior(double f){ andrew@3: speedPriorValue = f; andrew@3: int index = relativeSpeedPosterior.getRealTermsAsIndex(speedPriorValue); andrew@3: relativeSpeedPosterior.zero(); andrew@14: relativeSpeedPosterior.addGaussianShape(index, priorWidth, 0.8); andrew@3: relativeSpeedPosterior.renormalise(); andrew@3: relativeSpeedPosterior.getMaximum(); andrew@3: relativeSpeedPrior.copyFromDynamicVector(relativeSpeedPosterior); andrew@3: printf("BAYES STRUCTU ' SPEED PRIOR %f . index %i\n", speedPriorValue, index); andrew@3: andrew@3: } andrew@3: andrew@0: void BayesianArrayStructure::resetSpeedSize(int length){ andrew@0: printf("BAYESIAN SPEED size is : %i\n", length); andrew@0: andrew@0: relativeSpeedPrior.createVector(length); andrew@0: relativeSpeedLikelihood.createVector(length); andrew@0: relativeSpeedPosterior.createVector(length); andrew@2: tmpPosteriorForStorage.createVector(length); andrew@0: andrew@22: andrew@0: andrew@0: } andrew@2: andrew@0: void BayesianArrayStructure::setRelativeSpeedScalar(double f){ andrew@0: relativeSpeedPrior.scalar = f; andrew@0: relativeSpeedPosterior.scalar = f; andrew@0: relativeSpeedLikelihood.scalar = f; andrew@0: } andrew@0: andrew@2: andrew@2: void BayesianArrayStructure::setPositionDistributionScalar(double f){ andrew@2: if (f > 0){ andrew@2: prior.scalar = f; andrew@2: posterior.scalar = f; andrew@2: likelihood.scalar = f; andrew@2: } andrew@2: } andrew@2: andrew@0: void BayesianArrayStructure::simpleExample(){ andrew@0: relativeSpeedPosterior.getMaximum(); andrew@2: relativeSpeedPrior.copyFromDynamicVector(relativeSpeedPosterior); andrew@0: } andrew@0: andrew@0: void BayesianArrayStructure::copyPriorToPosterior(){ andrew@0: andrew@0: for (int i = 0;i < prior.arraySize;i++){ andrew@0: posterior.array[i] = prior.array[i]; andrew@0: } andrew@0: } andrew@0: andrew@2: void BayesianArrayStructure::setStartPlaying(){ andrew@19: andrew@19: lastEventTime = 0; andrew@2: bestEstimate = 0; andrew@19: lastBestEstimateUpdateTime = 0; andrew@19: if (*realTimeMode) andrew@19: lastBestEstimateUpdateTime = ofGetElapsedTimeMillis(); andrew@19: //cannot just be zero - offline bug andrew@14: printf("start playing - best estimate %f\n", lastBestEstimateUpdateTime); andrew@19: andrew@2: resetArrays(); andrew@2: } andrew@2: andrew@0: void BayesianArrayStructure::resetArrays(){ andrew@2: //called when we start playing andrew@2: andrew@0: prior.zero(); andrew@0: likelihood.zero(); andrew@2: posterior.zero(); andrew@2: andrew@2: updateCounter = 0; andrew@2: andrew@2: posterior.offset = 0; andrew@2: setNewDistributionOffsets(0); andrew@2: andrew@2: int zeroIndex = posterior.getRealTermsAsIndex(0); andrew@2: andrew@2: posterior.addGaussianShape(zeroIndex, 500, 1); andrew@2: // posterior.addToIndex(0, 1); andrew@0: likelihood.addConstant(1); andrew@2: andrew@2: updateCounter = 0; andrew@2: andrew@19: andrew@14: printf("bayes reset arrays - best estimate %f\n", lastBestEstimateUpdateTime); andrew@0: andrew@3: setSpeedPrior(speedPriorValue); andrew@0: } andrew@0: andrew@19: andrew@2: void BayesianArrayStructure::zeroArrays(){ andrew@2: prior.zero(); andrew@2: likelihood.zero(); andrew@2: posterior.zero(); andrew@2: andrew@2: relativeSpeedPrior.zero(); andrew@2: relativeSpeedPosterior.zero(); andrew@2: relativeSpeedLikelihood.zero(); andrew@2: andrew@2: } andrew@2: andrew@2: andrew@2: void BayesianArrayStructure::updateTmpBestEstimate(const double& timeDifference){ andrew@2: //input is the time since the start of playing andrew@2: andrew@2: // double timeDiff = ofGetElapsedTimeMillis() - lastEventTime;//lastBestEstimateUpdateTime; andrew@2: andrew@9: tmpBestEstimate = posterior.getIndexInRealTerms(posterior.MAPestimate) + timeDifference*relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.integratedEstimate); andrew@2: // andrew@9: //printf("tmp best %f and best %f time diff %f posterior MAP %f at speed %f\n", tmpBestEstimate, bestEstimate, timeDifference, posterior.getIndexInRealTerms(posterior.MAPestimate), relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.integratedEstimate)); andrew@2: //lastBestEstimateUpdateTime = ofGetElapsedTimeMillis(); andrew@2: } andrew@2: andrew@14: void BayesianArrayStructure::updateBestEstimate(const double& timeDifference){ andrew@2: // double timeDiff = ofGetElapsedTimeMillis() - lastEventTime;// andrew@14: andrew@14: double timeDiff = timeDifference; andrew@14: andrew@14: //Using timedifferencfe here will make it go wrong. Is time since beginning of playing andrew@14: andrew@19: if (*realTimeMode) andrew@14: timeDiff = ofGetElapsedTimeMillis() - lastBestEstimateUpdateTime; andrew@9: andrew@18: double speedEstimate; andrew@18: if (usingIntegratedTempoEstimate) andrew@18: speedEstimate = relativeSpeedPosterior.getIntegratedEstimate(); andrew@18: else andrew@18: speedEstimate = relativeSpeedPosterior.MAPestimate; andrew@18: andrew@18: andrew@9: speedEstimate = relativeSpeedPosterior.getIndexInRealTerms(speedEstimate); andrew@9: //relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.MAPestimate) andrew@9: bestEstimate = posterior.getIndexInRealTerms(posterior.MAPestimate) + timeDiff*speedEstimate; andrew@0: andrew@2: // bestEstimate = tmpBestEstimate; andrew@0: } andrew@0: andrew@0: void BayesianArrayStructure::calculatePosterior(){ andrew@2: //posterior.doProduct(prior, likelihood); andrew@2: andrew@2: int i; andrew@2: for (i = 0;i < posterior.length;i++){ andrew@2: posterior.array[i] = likelihood.array[i] * prior.array[i]; andrew@2: } andrew@2: andrew@2: andrew@0: posterior.renormalise(); andrew@0: andrew@2: andrew@0: andrew@0: andrew@0: } andrew@0: andrew@0: andrew@0: andrew@0: andrew@0: void BayesianArrayStructure::setNewDistributionOffsets(const double& newOffset){ andrew@0: prior.offset = newOffset; andrew@0: likelihood.offset = newOffset; andrew@2: //posterior.offset = newOffset; andrew@0: } andrew@0: andrew@0: andrew@0: void BayesianArrayStructure::crossUpdateArrays(DynamicVector& position, DynamicVector& speed, double timeDifference){ andrew@0: //set the cutoff for offset of position first! XXX andrew@0: andrew@0: // printf("time difference %f, ", timeDifference); andrew@0: andrew@0: double timeDifferenceInPositionVectorUnits = timeDifference / prior.scalar; andrew@0: andrew@4: andrew@0: prior.zero();//kill prior andrew@0: calculateNewPriorOffset(timeDifference);//set new prior offset here andrew@0: andrew@4: if (timeDifferenceInPositionVectorUnits > crossUpdateTimeThreshold) andrew@4: complexCrossUpdate(timeDifferenceInPositionVectorUnits); andrew@4: else andrew@4: translateByMaximumSpeed(timeDifferenceInPositionVectorUnits); andrew@4: andrew@0: andrew@2: updateCounter++; andrew@0: prior.renormalise(); andrew@0: andrew@0: } andrew@0: andrew@4: void BayesianArrayStructure::complexCrossUpdate(const double& timeDifferenceInPositionVectorUnits){ andrew@4: int distanceMoved, newPriorIndex; andrew@9: andrew@9: double speedValue = relativeSpeedPosterior.offset; andrew@9: andrew@4: for (int i = 0;i < relativeSpeedPosterior.arraySize;i++){ andrew@4: andrew@9: // double speedValue = relativeSpeedPosterior.getIndexInRealTerms(i);//so for scalar 0.01, 50 -> speed value of 0.5 andrew@4: andrew@4: //so we have moved andrew@4: distanceMoved = round(timeDifferenceInPositionVectorUnits * speedValue);//round the value andrew@4: andrew@4: if (relativeSpeedPosterior.array[i] != 0){ andrew@4: double speedContribution = relativeSpeedPosterior.array[i]; andrew@4: // printf("speed [%i] gives %f moved %i in %f units \n", i, speedValue, distanceMoved, timeDifferenceInPositionVectorUnits); andrew@4: andrew@9: newPriorIndex = posterior.offset - prior.offset + distanceMoved; andrew@9: andrew@4: for (int postIndex = 0;postIndex < posterior.arraySize;postIndex++){ andrew@4: //old posterior contributing to new prior andrew@9: // newPriorIndex = postIndex + posterior.offset - prior.offset + distanceMoved; andrew@9: andrew@4: if (newPriorIndex >= 0 && newPriorIndex < prior.arraySize){ andrew@4: prior.addToIndex(newPriorIndex, posterior.array[postIndex]*speedContribution); andrew@4: } andrew@4: andrew@9: newPriorIndex++;//optimised code - the commented line above explains how this works andrew@9: }//end for andrew@9: andrew@4: andrew@4: }//if not zero andrew@9: speedValue += relativeSpeedPosterior.scalar; andrew@9: //optimised line andrew@9: //as we wanted: andrew@9: // double speedValue = relativeSpeedPosterior.getIndexInRealTerms(i);//so for scalar 0.01, 50 -> speed value of 0.5 andrew@4: }//end speed andrew@4: } andrew@4: andrew@4: andrew@4: andrew@4: void BayesianArrayStructure::translateByMaximumSpeed(const double& timeDifferenceInPositionVectorUnits){ andrew@9: andrew@4: int distanceMoved, newPriorIndex; andrew@9: andrew@9: double speedValue = relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.integratedEstimate); andrew@4: //so for scalar 0.01, 50 -> speed value of 0.5 andrew@9: double speedContribution = relativeSpeedPosterior.array[relativeSpeedPosterior.integratedEstimate]; andrew@4: //so we have moved andrew@4: distanceMoved = round(timeDifferenceInPositionVectorUnits * speedValue);//round the value andrew@4: // printf("speed [%i] gives %f moved %i in %f units \n", i, speedValue, distanceMoved, timeDifferenceInPositionVectorUnits); andrew@4: andrew@4: for (int postIndex = 0;postIndex < posterior.arraySize;postIndex++){ andrew@4: //old posterior contributing to new prior andrew@4: newPriorIndex = postIndex + posterior.offset - prior.offset + distanceMoved; andrew@4: if (newPriorIndex >= 0 && newPriorIndex < prior.arraySize){ andrew@4: prior.addToIndex(newPriorIndex, posterior.array[postIndex]*speedContribution); andrew@4: } andrew@4: andrew@4: } andrew@4: andrew@4: } andrew@2: andrew@2: void BayesianArrayStructure::addGaussianNoiseToSpeedPosterior(const double& std_dev){ andrew@2: tmpPosteriorForStorage.copyFromDynamicVector(relativeSpeedPosterior); andrew@2: andrew@2: for (int i = 0;i < relativeSpeedPosterior.length;i++){ andrew@2: tmpPosteriorForStorage.addGaussianShape(i, std_dev, relativeSpeedPosterior.array[i]); andrew@2: } andrew@2: andrew@2: tmpPosteriorForStorage.renormalise(); andrew@2: andrew@2: relativeSpeedPosterior.copyFromDynamicVector(tmpPosteriorForStorage); andrew@2: } andrew@2: andrew@2: andrew@2: void BayesianArrayStructure::addTriangularNoiseToSpeedPosterior(const double& std_dev){ andrew@2: tmpPosteriorForStorage.copyFromDynamicVector(relativeSpeedPosterior); andrew@2: andrew@2: for (int i = 0;i < relativeSpeedPosterior.length;i++){ andrew@2: //adding a linear amount depending on distance andrew@2: tmpPosteriorForStorage.addTriangularShape(i, std_dev*2.0, relativeSpeedPosterior.array[i]); andrew@2: } andrew@2: andrew@2: tmpPosteriorForStorage.renormalise(); andrew@2: andrew@2: relativeSpeedPosterior.copyFromDynamicVector(tmpPosteriorForStorage); andrew@2: } andrew@2: andrew@0: void BayesianArrayStructure::calculateNewPriorOffset(const double& timeDifference){ andrew@0: andrew@9: double maxSpeed = relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.integratedEstimate); andrew@0: // printf("Maxspeed is %f\n", maxSpeed); andrew@0: andrew@0: double priorMax = posterior.getMaximum(); andrew@0: double distanceTravelled = maxSpeed * (timeDifference / prior.scalar); andrew@0: double newMaxLocation = posterior.MAPestimate + distanceTravelled; andrew@0: // printf("MAP: %i, tim df %f, distance %f, new location %f\n", posterior.MAPestimate, timeDifference, distanceTravelled, newMaxLocation); andrew@0: andrew@0: } andrew@0: andrew@0: andrew@0: void BayesianArrayStructure::decaySpeedDistribution(double timeDifference){ andrew@0: andrew@0: // commented for the moment andrew@0: double relativeAmount = max(1.0, timeDifference/1000.); andrew@0: // printf("decay %f around %i \n", timeDifference, relativeSpeedPosterior.MAPestimate); andrew@0: relativeAmount *= speedDecayAmount; andrew@0: relativeSpeedPosterior.renormalise(); andrew@9: relativeSpeedPosterior.addGaussianShape(relativeSpeedPosterior.integratedEstimate, speedDecayWidth, relativeAmount); andrew@0: andrew@0: relativeSpeedPosterior.renormalise(); andrew@0: double newMax = relativeSpeedPosterior.getMaximum(); andrew@0: andrew@0: //old code andrew@0: // relativeSpeedPosterior.addGaussianShape(relativeSpeedPosterior.MAPestimate, speedDecayWidth, 10); andrew@0: //relativeSpeedPosterior.addConstant(1); andrew@0: andrew@0: /* andrew@0: relativeSpeedPrior.copyFromDynamicVector(relativeSpeedPosterior); andrew@0: relativeSpeedLikelihood.zero(); andrew@0: relativeSpeedLikelihood.addConstant(0.2); andrew@0: relativeSpeedLikelihood.addGaussianShape(relativeSpeedPosterior.maximumValue, speedDecayWidth, relativeAmount); andrew@0: relativeSpeedPosterior.doProduct(relativeSpeedPrior, relativeSpeedLikelihood); andrew@0: relativeSpeedPosterior.renormalise(); andrew@0: */ andrew@0: andrew@0: andrew@0: andrew@0: } andrew@0: andrew@9: void BayesianArrayStructure::setLikelihoodToConstant(){ andrew@9: //set new likelihood andrew@9: relativeSpeedLikelihood.zero(); andrew@9: relativeSpeedLikelihood.addConstant(speedLikelihoodNoise); andrew@9: } andrew@9: andrew@9: andrew@9: void BayesianArrayStructure::updateTempoLikelihood(const double& speedRatio, const double& matchFactor){ andrew@9: andrew@0: //speedratio is speed of played relative to the recording andrew@0: andrew@0: double index = relativeSpeedLikelihood.getRealTermsAsIndex(speedRatio); andrew@9: // printf("index of likelihood would be %f for ratio %f\n", index, speedRatio); andrew@9: if (index >= 0 && index < relativeSpeedPrior.length){ andrew@22: relativeSpeedLikelihood.addGaussianShape(index , relativeSpeedLikelihoodStdDev, matchFactor); andrew@9: } andrew@9: } andrew@0: andrew@22: andrew@22: andrew@9: void BayesianArrayStructure::updateTempoDistribution(){ andrew@0: andrew@0: //copy posterior to prior andrew@0: relativeSpeedPrior.copyFromDynamicVector(relativeSpeedPosterior); andrew@0: andrew@0: //update andrew@0: relativeSpeedPosterior.doProduct(relativeSpeedPrior, relativeSpeedLikelihood); andrew@0: andrew@0: //normalise andrew@0: relativeSpeedPosterior.renormalise(); andrew@0: andrew@0: relativeSpeedPosterior.getMaximum(); andrew@0: andrew@9: relativeSpeedPosterior.updateIntegratedEstimate(); andrew@9: speedEstimate = relativeSpeedPosterior.getIndexInRealTerms(relativeSpeedPosterior.integratedEstimate); andrew@0: } andrew@0: andrew@0: andrew@0: void BayesianArrayStructure::calculateTempoUpdate(){ andrew@0: //copy posterior to prior andrew@0: relativeSpeedPrior.copyFromDynamicVector(relativeSpeedPosterior); andrew@0: andrew@0: //update andrew@0: relativeSpeedPosterior.doProduct(relativeSpeedPrior, relativeSpeedLikelihood); andrew@0: andrew@0: //normalise andrew@0: relativeSpeedPosterior.renormalise(); andrew@0: andrew@0: relativeSpeedPosterior.getMaximum(); andrew@0: andrew@0: } andrew@0: andrew@0: andrew@0: void BayesianArrayStructure::drawArrays(){ andrew@0: andrew@0: //bayesArray.drawFloatArray(&bayesArray.prior[0], 0, 200); andrew@0: //bayesArray.drawFloatArray(&bayesArray.prior[0], 0, 200); andrew@0: andrew@0: int displaySize = prior.arraySize; andrew@2: ofSetColor(0,0,255); andrew@0: prior.drawVector(0, displaySize); andrew@0: ofSetColor(0,255,0); andrew@0: likelihood.drawVector(0, displaySize); andrew@2: ofSetColor(255,0,255); andrew@0: posterior.drawVector(0, displaySize); andrew@2: andrew@0: andrew@0: andrew@0: } andrew@0: andrew@0: andrew@0: void BayesianArrayStructure::drawTempoArrays(){ andrew@9: ofSetColor(0,0,255); andrew@9: // relativeSpeedPrior.drawVector(0, relativeSpeedPrior.arraySize); andrew@0: andrew@22: ofSetColor(0,150,255); andrew@0: relativeSpeedLikelihood.drawVector(0, relativeSpeedLikelihood.arraySize); andrew@22: andrew@9: // relativeSpeedLikelihood.drawConstrainedVector(0, 199, 0, 1000);// relativeSpeedLikelihood.arraySize); andrew@9: ofSetColor(255,0,0); andrew@0: relativeSpeedPosterior.drawVector(0, relativeSpeedPosterior.arraySize); andrew@0: andrew@9: // ofSetColor(0,0,255); andrew@9: // tmpPosteriorForStorage.drawVector(0, tmpPosteriorForStorage.arraySize); andrew@2: andrew@0: ofSetColor(255,255, 255); andrew@0: ofLine(screenWidth/2, 0, screenWidth/2, ofGetHeight());//middle of screen andrew@0: andrew@22: ofSetColor(25, 0, 250); andrew@9: double fractionOfScreen = ((double)relativeSpeedPosterior.integratedEstimate / relativeSpeedPosterior.length); andrew@0: ofLine(screenWidth * fractionOfScreen, 0, screenWidth * fractionOfScreen, ofGetHeight()); andrew@18: andrew@22: ofSetColor(255, 0, 20); andrew@18: fractionOfScreen = ((double)relativeSpeedPosterior.MAPestimate / relativeSpeedPosterior.length); andrew@18: ofLine(screenWidth * fractionOfScreen, 0, screenWidth * fractionOfScreen, ofGetHeight()); andrew@22: andrew@18: andrew@0: } andrew@0: andrew@0: andrew@0: void BayesianArrayStructure::drawArraysRelativeToTimeframe(const double& startTimeMillis, const double& endTimeMillis){ andrew@0: andrew@0: screenWidth = ofGetWidth(); andrew@0: andrew@0: int startArrayIndex = 0; andrew@0: andrew@0: if (prior.getIndexInRealTerms(prior.arraySize-1) > startTimeMillis){ andrew@0: //i.e. the array is on the page andrew@0: andrew@0: while (prior.getIndexInRealTerms(startArrayIndex) < startTimeMillis){ andrew@0: startArrayIndex++; andrew@0: } andrew@0: int endArrayIndex = prior.arraySize-1; andrew@0: //could find constraints here andrew@0: if (prior.getIndexInRealTerms(prior.arraySize-1) > endTimeMillis) andrew@0: endArrayIndex = (floor)((endTimeMillis - prior.offset)/prior.scalar); andrew@0: andrew@0: //so we need to figure where start and end array are on screen andrew@0: int startScreenPosition, endScreenPosition; andrew@0: double screenWidthMillis = endTimeMillis - startTimeMillis; andrew@0: andrew@0: startScreenPosition = (prior.getIndexInRealTerms(startArrayIndex) - startTimeMillis)*screenWidth/screenWidthMillis; andrew@0: endScreenPosition = (double)(prior.getIndexInRealTerms(endArrayIndex) - startTimeMillis)*screenWidth/screenWidthMillis; andrew@0: andrew@0: ofSetColor(0,0,100); andrew@0: string relativeString = " offset "+ofToString(prior.offset, 1);//starttimes("+ofToString(startTimeMillis)+", "+ofToString(endTimeMillis); andrew@0: relativeString += ": index "+ofToString(startArrayIndex)+" , "+ofToString(endArrayIndex)+" ["; andrew@0: // relativeString += ofToString(prior.getIndexInRealTerms(endArrayIndex), 3)+"] (sc-width:"+ofToString(screenWidthMillis, 1)+") "; andrew@0: relativeString += " mapped to screen "+ofToString(startScreenPosition)+" , "+ofToString(endScreenPosition); andrew@21: // ofDrawBitmapString(relativeString, 100, 180); andrew@22: andrew@0: andrew@22: andrew@22: ofSetColor(100,100,100);//255, 255, 0); andrew@0: likelihood.drawConstrainedVector(startArrayIndex, endArrayIndex, startScreenPosition, endScreenPosition); andrew@0: andrew@22: // ofSetColor(0,0,200); andrew@22: ofSetColor(170,170,170);//00,200); andrew@0: prior.drawConstrainedVector(startArrayIndex, endArrayIndex, startScreenPosition, endScreenPosition); andrew@0: andrew@22: ofSetColor(0,0,150); andrew@22: // ofSetColor(200, 0, 0); andrew@0: posterior.drawConstrainedVector(startArrayIndex, endArrayIndex, startScreenPosition, endScreenPosition); andrew@0: andrew@1: andrew@0: // ofSetColor(0, 200, 255); andrew@0: // acceleration.drawConstrainedVector(startArrayIndex, endArrayIndex, startScreenPosition, endScreenPosition); andrew@0: andrew@0: andrew@0: } andrew@0: andrew@9: } andrew@9: andrew@9: andrew@9: /* andrew@9: andrew@9: void BayesianArrayStructure::updateTempoDistribution(const double& speedRatio, const double& matchFactor){ andrew@9: //speedratio is speed of played relative to the recording andrew@9: andrew@9: double index = relativeSpeedLikelihood.getRealTermsAsIndex(speedRatio); andrew@9: // printf("\nindex of likelihood would be %f\n", index); andrew@9: if (index >= 0 && index < relativeSpeedPrior.length){ andrew@9: //then we can do update andrew@9: andrew@9: //set new likelihood andrew@9: relativeSpeedLikelihood.zero(); andrew@9: relativeSpeedLikelihood.addConstant(speedLikelihoodNoise); andrew@9: andrew@9: relativeSpeedLikelihood.addGaussianShape(index , 5, 0.5*matchFactor); andrew@9: andrew@9: andrew@9: //copy posterior to prior andrew@9: relativeSpeedPrior.copyFromDynamicVector(relativeSpeedPosterior); andrew@9: andrew@9: //update andrew@9: relativeSpeedPosterior.doProduct(relativeSpeedPrior, relativeSpeedLikelihood); andrew@9: andrew@9: //normalise andrew@9: relativeSpeedPosterior.renormalise(); andrew@9: andrew@9: relativeSpeedPosterior.getMaximum(); andrew@9: }//end if within range andrew@9: andrew@9: andrew@9: } andrew@9: andrew@9: */