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