Mercurial > hg > multitrack-audio-matcher
view src/AccompanimentSynchroniser.cpp @ 45:d23685b9e766
Fixed the alignment error caluculations and added histogram plotting
author | Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk> |
---|---|
date | Tue, 08 May 2012 21:53:11 +0100 |
parents | c96b18dd0f48 |
children | 5274e3b5479d |
line wrap: on
line source
/* * AccompanimentSynchroniser.cpp * MultipleAudioMathcher * * Created by Andrew on 06/02/2012. * Copyright 2012 QMUL. All rights reserved. * */ #include "AccompanimentSynchroniser.h" //recorded position millis is the current alignment position, sent from updateAlignment in event matcher //time sent is the live time since start of play AccompanimentSynchroniser::AccompanimentSynchroniser(){ sender.setup(HOST, SENDER_PORT); counter = 0; reset(); } void AccompanimentSynchroniser::reset(){ playingPositionRatio = 0; playingPositionSamples = 0; playingPositionMillis = 0; playingPositionTimeSent = 0; recordedPositionMillis = 0; recordedPositionTimeSent = 0; speed = 1; } void AccompanimentSynchroniser::setPlayingRatio(const double& ratio, const double& timePlayed){ playingPositionRatio = ratio; playingPositionSamples = ratio * fileLengthSamples; playingPositionMillis = playingPositionSamples * 1000.0/44100.0; playingPositionTimeSent = timePlayed; } void AccompanimentSynchroniser::updateRecordedPosition(const double& currentAlignmentPosition, const double& timeSent){ recordedPositionMillis = currentAlignmentPosition; recordedPositionTimeSent = timeSent; } void AccompanimentSynchroniser::updateOutputSpeed(){ //we want the playing position to more closely align with the recordedPosition double difference = recordedPositionMillis - playingPositionMillis; // difference -= (recordedPositionTimeSent - playingPositionTimeSent); //suppose we project that we will align in 1 seconds time double projectedAlignmentTime = 1000; //then our current speed projects forward double predictedPlayingTimeIncrease = projectedAlignmentTime*speed; difference += (projectedAlignmentTime - predictedPlayingTimeIncrease); double tmpSpeed = speed; speed += difference/projectedAlignmentTime; sendSpeed(speed); if (counter % 10 == 0){ printf("SYNC: rec pos %f play pos %f, diff %f\n", recordedPositionMillis, playingPositionMillis, recordedPositionMillis - playingPositionMillis); printf("projected align diff %f at speed %f\n", (projectedAlignmentTime - predictedPlayingTimeIncrease), tmpSpeed); printf("Final difference %f and speed output %f\n\n", difference, speed); } counter++; } void AccompanimentSynchroniser::sendSpeed(double const& val){ if (val > -3 && val < 4){ ofxOscMessage m; m.setAddress( "/setSpeed" ); m.addFloatArg( val ); sender.sendMessage( m ); } }