view ofxPreciseOnsetDetectorOffline/PreciseOnsetVisualiser.cpp @ 6:eb29c6b6dff8

added pointer version of visualiser
author Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk>
date Sun, 19 Jan 2014 23:07:13 +0000
parents 93b9a9471011
children b1c13e8bec26
line wrap: on
line source
/*
 *  PreciseOnsetVisualiser.cpp
 *  ofxPreciseOnsetDetectionOffline
 *
 *  Created by Andrew Robertson on 28/12/2013.
 *  Copyright 2013 QMUL. All rights reserved.
 *
 */

#include "PreciseOnsetVisualiser.h"

PreciseOnsetVisualiser::PreciseOnsetVisualiser(){

}

PreciseOnsetVisualiser::~PreciseOnsetVisualiser(){
	printf("deleting pointer in visualiser\n");
	pod = NULL;
	delete pod;

}

void PreciseOnsetVisualiser::newFile(){
	resetWindow();
	windowPress = 0;
	
	soundPlay.loadSound(pod->loadedFilename, false);
	stop();
//	paused = true;
//	soundPlay.play();
//	soundPlay.setPaused(true);
}

double PreciseOnsetVisualiser::windowWidth(){
	return windowEnd - windowStart;
}

void PreciseOnsetVisualiser::update(){
	currentPlayPosition = positionSeconds();
	if (currentPlayPosition > windowEnd){
		double tmp = windowWidth();
		windowEnd += tmp;
		windowStart += tmp;
		//printf("Scrolling\n");
	}

}


void PreciseOnsetVisualiser::draw(){
	//if plotting use this, else comment out

	ofSetColor(ofColor::white);
	window.drawBackground();
	ofSetColor(ofColor::black);
	window.drawOutline();
	
	//draw df function
/*
	int startIndex = 0;
	while (startIndex < (int)pod->dfValues.size() && pod->frameIndexToSeconds(startIndex) < windowStart)
		startIndex++;
	
	int endIndex = 0;
	while (endIndex < (int)pod->dfValues.size()-1  && pod->frameIndexToSeconds(endIndex) < windowEnd)
		endIndex++;
*/	
	ofSetColor(ofColor::tan);
//	plotter.drawVector(pod->dfValues, startIndex, endIndex, window);
	plotter.drawVector(pod->dfValues, round(pod->secondsToFrameIndex(windowStart)), round(pod->secondsToFrameIndex(windowEnd)), window);
	ofSetColor(ofColor::black);
	ofDrawBitmapString(ofToString(round(pod->secondsToFrameIndex(windowStart)), 1), window.x, window.y-10);
	ofDrawBitmapString(ofToString(round(pod->secondsToFrameIndex(windowEnd)), 1), window.x+window.width, window.y-10);
	
	ofSetColor(ofColor::blue);
	plotter.drawBeatStripes(pod->onsetLocations, window, windowStart, windowEnd);
	
	//play position
	ofSetColor(ofColor::red);
	plotter.drawStripe(positionSeconds(), window, windowStart, windowEnd);
	
	ofSetColor(ofColor::black);
	ofDrawBitmapString(ofToString(windowStart, 1), window.x, window.y+window.height+10);
	ofDrawBitmapString(ofToString(windowEnd, 1), window.x+window.width, window.y+window.height+10);
	
}

double PreciseOnsetVisualiser::positionSeconds(){
	return soundPlay.getPosition()*pod->samples/44100.;
}

//void PreciseOnsetVisualiser::drawOnsets(DoubleVector& onsetTimesSeconds, ofxWindowregion& window, double startTime, double endTime){
//}

void PreciseOnsetVisualiser::resetWindow(){
	windowStart = 0;
	windowEnd = 8;
//	while (windowEnd < pod->samples/44100.)
//		windowEnd *= 2;
	
	windowEnd = pod->samples/44100.;
		
	printf("reset: start %.1f end %.1f\n", windowStart, windowEnd);
}

void PreciseOnsetVisualiser::cropStart(){
	if (soundPlay.getPositionMS()/1000. < windowEnd){
		windowStart = soundPlay.getPositionMS()/1000.;
		printf("s: start %.1f end %.1f\n", windowStart, windowEnd);
	}
}

void PreciseOnsetVisualiser::cropStartSeconds(double& val){
	if (val < windowEnd)
		windowStart = val;
}

void PreciseOnsetVisualiser::cropEnd(){//crops to play position
	
	if (soundPlay.getPositionMS()/1000. > windowStart){
		windowEnd = soundPlay.getPositionMS()/1000.;
		printf("crop end: start %.1f end %.1f\n", windowStart, windowEnd);
	}
}


void PreciseOnsetVisualiser::cropEndSeconds(double& val){
	if (val > windowStart)
		windowEnd = val;
	
	printf("crop end: start %.1f end %.1f\n", windowStart, windowEnd);
}


void PreciseOnsetVisualiser::mousePressed(int& x, int& y){
	if (window.tapped(x, y)){
		windowPress = windowStart + (windowEnd-windowStart)*(x - window.x)/window.width;
		double newPos = windowPress/(double)(pod->samples/44100.);
		printf("window position is %.1f new pos %f\n", windowPress, newPos);
		soundPlay.setPositionMS(windowPress*1000.0);
	}
}

void PreciseOnsetVisualiser::togglePlay(){
	if (!paused ){
		soundPlay.setPaused(true);
		paused = true;
		printf("was playing\n");
	}
	else {
		soundPlay.setPaused(false);//
		paused = false;
		printf("was not playing\n");
	}
}

void PreciseOnsetVisualiser::stop(){
	soundPlay.stop();
	//then get set to be played
	soundPlay.play();
	soundPlay.setPaused(true);
	soundPlay.setPositionMS(windowStart*1000.0);
	paused = true;
}

void PreciseOnsetVisualiser::zoomIn(){
	double positionNow = positionSeconds();
	if (positionNow > windowEnd){
		double tmp = windowWidth();
		windowEnd += windowWidth();
		windowStart += tmp;
	}
	
	windowStart = positionNow - (windowEnd-windowStart)/4;
	if (windowStart < 0)
		windowStart = 0;
	windowEnd = positionNow + (windowEnd-windowStart)/4;
}


void PreciseOnsetVisualiser::zoomOut(){
	double positionNow = positionSeconds();
	if (positionNow > windowEnd){
		double tmp = windowWidth();
		windowEnd += tmp;
		windowStart += tmp;
	}

	windowStart = positionNow - (windowEnd-windowStart);
	windowEnd = positionNow + (windowEnd-windowStart);
	if (windowStart < 0)
		windowStart = 0;
}

void PreciseOnsetVisualiser::scrollLeft(){
	double tmp = windowWidth();
	windowStart = max(0., windowStart - windowWidth()/2.);
	windowEnd = windowStart + tmp;
	checkPosition();
}


void PreciseOnsetVisualiser::scrollRight(){
	double tmp = windowWidth();
	windowStart = min( windowStart+tmp/2., pod->samples/44100.);
	windowEnd = windowStart + tmp;
	checkPosition();
}

void PreciseOnsetVisualiser::scrollRightSecs(double secs){
	double positionNow = positionSeconds();
	double newPosition = min(positionNow+secs, pod->samples/44100.);
	soundPlay.setPositionMS(newPosition*1000.);
	double tmp = windowWidth()/2.;
	while (windowEnd < newPosition){
		windowEnd += tmp;
		windowStart += tmp;
	}
}


void PreciseOnsetVisualiser::scrollLeftSecs(double secs){
	double positionNow = positionSeconds();
	double newPosition = max(positionNow-secs, 0.);
	soundPlay.setPositionMS(newPosition*1000.);
	double tmp = windowWidth()/2.;
	while (windowStart > newPosition){
		windowEnd -= tmp;
		windowStart -= tmp;
	}
}


void PreciseOnsetVisualiser::checkPosition(){
double positionNow = positionSeconds();
	if (positionNow < windowStart || positionNow > windowEnd)
		soundPlay.setPositionMS(windowStart*1000.);
}


void PreciseOnsetVisualiser::setPositionSeconds(double secs){
	soundPlay.setPositionMS(secs*1000.);
	double tmp = windowEnd - windowStart;
	while (windowStart > max(0. , secs)){
		windowStart -= tmp;
		windowEnd -= tmp;
	}
	while (windowEnd < min(pod->samples/44100. , secs)){
		windowStart += tmp;
		windowEnd += tmp;
	}
}

double PreciseOnsetVisualiser::lengthSeconds(){
	return pod->samples/44100.;
}