view src/testApp.cpp @ 40:0d66ecd1f4d3

added output file writing to export alignment data
author Andrew N Robertson <andrew.robertson@eecs.qmul.ac.uk>
date Wed, 25 Apr 2012 00:24:20 +0100
parents f5de07b4d733
children 6a7982661703
line wrap: on
line source
#include "testApp.h"
#include "stdio.h"
//#include "aubio.h"
#include <iostream>
#include <cstring>
#include <string>
#include <cstdlib> 


const double samplingFrequency = 44100.0;
	
//--------------------------------------------------------------
void testApp::setup(){

	// 2 output channels,
	// 0 input channels
	// 22050 samples per second
	// 256 samples per buffer
	// 4 num buffers (latency)
	
	//nb THIS CODE WOULD BE USEFUL IF WE EVER WANTED REAL-TIME INPUT - VIA ofSoundSteam
	
	receiver.setup( PORT );
	
	sampleRate 			= 44100;
	ofSoundStreamSetup(2,0,this, sampleRate,256, 4);

	ofSetFrameRate(20);

	
	eventMatcher.loadAudioFiles();
	
	eventMatcher.setWindowDimensions();
	//audioFilePlayer.loadAudioFile(infilename);
}


//--------------------------------------------------------------
void testApp::update(){
	eventMatcher.updatePosition();
	
	checkForOSCmessages();
	
	outputWriter.writeOutput(eventMatcher.synchroniser.recordedPositionTimeSent, eventMatcher.synchroniser.recordedPositionMillis, eventMatcher.synchroniser.playingPositionMillis);
	
}

void testApp::checkForOSCmessages(){
	// check for waiting messages
	while( receiver.hasWaitingMessages() )
	{
		// get the next message
		ofxOscMessage m;
		receiver.getNextMessage( &m );
		
		// check for mouse moved message
		if ( m.getAddress() == "/aubioPitch" ){
			int testChannel = m.getArgAsInt32(0);
			float pitchIn = m.getArgAsFloat(1); 
			int timeIn = m.getArgAsInt32(2); 
			printf("\nAUBIO PITCH RECEIVED %f at time %i\n", pitchIn, timeIn);
			eventMatcher.newPitchEvent(testChannel, pitchIn, timeIn);
		}
		
		if ( m.getAddress() == "/kick" ){
		//	float pitchIn = m.getArgAsFloat(0);
			int testChannel = m.getArgAsInt32(0);
			double timeIn = m.getArgAsInt32(1); 
			printf("\nKICK RECEIVED at time %f\n", timeIn);
		
			eventMatcher.newKickEvent(testChannel, timeIn);
			
		}
		
		if ( m.getAddress() == "/snare" ){
			int testChannel = m.getArgAsInt32(0);
			double timeIn = m.getArgAsInt32(1);
			printf("\nSNARE RECEIVED at time %f\n", timeIn);
			
			eventMatcher.newSnareEvent(testChannel, timeIn);
		}
		
		// check for mouse moved message
		if ( m.getAddress() == "/elec" ){
			int testChannel = m.getArgAsInt32(0);
			double timeIn = m.getArgAsFloat(1);
			float chromaIn[12];
			
			printf("CHROMA received at time %f\n", timeIn);
			for (int i = 0;i < 12;i++){
				chromaIn[i] = m.getArgAsFloat(i+2);
			//	printf("chroma[%i]: %f\n", i, chromaIn[i]);
			}
			eventMatcher.newChromaEvent(testChannel, chromaIn, timeIn);
		}
		
		
		if ( m.getAddress() == "/start" ){
			printf("start!\n");
			printf("STRART TIME IN %i\n", ofGetElapsedTimeMillis());
			eventMatcher.startPlaying();
			outputWriter.openFile();
			printf("TIME OUT %i\n", ofGetElapsedTimeMillis());
		}
		
		if ( m.getAddress() == "/stop" ){
			printf("stop!\n");
			eventMatcher.stopPlaying();
			outputWriter.closeFile();
		}
		
		if ( m.getAddress() == "/accompanimentRatio" ){
			double time = m.getArgAsFloat(0);
			double ratio = m.getArgAsFloat(1);
			eventMatcher.synchroniser.setPlayingRatio(ratio, time);
		}
		
		if ( m.getAddress() == "/rescue" ){
			printf("rescue!\n");
			eventMatcher.rescue();
		}
	
	}
}

//--------------------------------------------------------------
void testApp::draw(){
	
	eventMatcher.draw();
	
//	audioFilePlayer.draw();

}



//--------------------------------------------------------------
void testApp::keyPressed  (int key){
	if (key == '-'){
		volume -= 0.05;
		volume = MAX(volume, 0);
	} else if (key == '+'){
		volume += 0.05;
		volume = MIN(volume, 1);
	}

	if (key == 'q'){
		eventMatcher.recordedTracks.switchScreens();
	}
	
	if (key == OF_KEY_RIGHT){
//		audioFilePlayer.loadedAudio.setPosition(min(1.0, audioFilePlayer.loadedAudio.getPosition() + (audioFilePlayer.fileLoader.audioHolder.audioScaleSamples/(4.0*audioFilePlayer.fileLoader.audioHolder.audioVector.size()))) );

	}
	
	if (key == OF_KEY_LEFT){
//		audioFilePlayer.loadedAudio.setPosition(max(0.0, audioFilePlayer.loadedAudio.getPosition() - (audioFilePlayer.fileLoader.audioHolder.audioScaleSamples/(4.0*audioFilePlayer.fileLoader.audioHolder.audioVector.size()))));
		
	}
	
	if (key == 'd'){
		eventMatcher.useChromaDotProduct = !eventMatcher.useChromaDotProduct;
		printf("Use dot product is %i\n", eventMatcher.useChromaDotProduct);
	}
	
	if (key == ' '){

		eventMatcher.recordedTracks.togglePlay();
	}
	
	if (key == 'j'){
		printf("dynamic vector scalar is %f\n", eventMatcher.bayesianStruct.posterior.scalar);
	}

	if (key == OF_KEY_RETURN){
		
			
		eventMatcher.recordedTracks.stop();
	}
	
	
	if (key == 'o'){
		openNewAudioFileWithdialogBox();

	}

	if (key == 'p'){
		eventMatcher.bayesianStruct.posterior.printArray();
	}

	
	if (key == OF_KEY_UP){
		eventMatcher.recordedTracks.zoomOut();
	
	}
	
	if (key == OF_KEY_DOWN){
		eventMatcher.recordedTracks.zoomIn();
	}
	
}

//--------------------------------------------------------------
void testApp::keyReleased  (int key){

}


//--------------------------------------------------------------
void testApp::mouseMoved(int x, int y ){


}

//--------------------------------------------------------------
void testApp::mouseDragged(int x, int y, int button){

}

//--------------------------------------------------------------
void testApp::mousePressed(int x, int y, int button){

}


//--------------------------------------------------------------
void testApp::mouseReleased(int x, int y, int button){

}

//--------------------------------------------------------------
void testApp::windowResized(int w, int h){
	
	eventMatcher.windowResized(w, h);
	
	
}
//--------------------------------------------------------------
void testApp::audioRequested 	(float * output, int bufferSize, int nChannels){
	//pan = 0.5f;
	float leftScale = 1 - pan;
	float rightScale = pan;

}



//--------------------------------------------------------------
void testApp::openNewAudioFileWithdialogBox(){
	std::string filename;
	getFilenameFromDialogBox(&filename);
	loadNewAudio(filename);
	
}


void testApp::loadNewAudio(string soundFileName){
	
	eventMatcher.recordedTracks.loadedAudioFiles[0].loadAudioFile(soundFileName);
	
//	for (int i = 0;i < numberOfAudioTracks;i++)
//		loadedAudioFiles[i].loadAudioFile(soundFileName);
	
//	audioFilePlayer.loadAudioFile(soundFileName);

}


bool testApp::getFilenameFromDialogBox(std::string* fileNameToSave){
	//this uses a pointer structure within the loader and returns true if the dialogue box was used successfully
	// first, create a string that will hold the URL
	string URL;
	
	// openFile(string& URL) returns 1 if a file was picked
	// returns 0 when something went wrong or the user pressed 'cancel'
	int response = ofxFileDialogOSX::openFile(URL);
	if(response){
		// now you can use the URL 
		*fileNameToSave = URL;
		//printf("\n filename is %s \n", soundFileName.c_str());
		return true;
	}
	else {
	//	soundFileName = "OPEN canceled. ";
		printf("\n open file cancelled \n");
		return false;
	}
	
}