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 );
	}
}