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