#include "testApp.h"

//--------------------------------------------------------------
void testApp::setup(){
	
	//X, X, X, frequency, buffersize, number of buffers
	ofSoundStreamSetup(2, 0, this, 44100, 256, 4);
	ofSetFrameRate(60);
	
	posX = 0;
	posY = 0;
	
	position = 0.0;
	positionTwo = 0.0;
	positionMarker = 0.0;
	
	frequencyF = 0.0;
	frequencyG = 0.0;
	frequencyA = 0.0;
	frequencyBFlat = 0.0;
	frequencyC = 0.0;
	frequencyD = 0.0;
	frequencyE = 0.0;		
	frequencyBSix = 0.0;		
	
	toggle = FALSE;
	
	positionAdderF = ( (float)frequencyF / 44100) * TWO_PI;
	positionAdderG = ( (float)frequencyG / 44100) * TWO_PI;
	positionAdderA = ( (float)frequencyA / 44100) * TWO_PI;
	positionAdderC = ( (float)frequencyC / 44100) * TWO_PI;
	positionAdderD = ( (float)frequencyD / 44100) * TWO_PI;
	positionAdderE = ( (float)frequencyE / 44100) * TWO_PI;
	positionAdderBSix = ( (float)frequencyBSix / 44100) * TWO_PI;
	
	positionAdderTwo = ( (float)modulator / 44100) * TWO_PI;
	
	status = 0;
	
	modulator = 0.0;
	modulatorMagnitude = 0.0;
	
//	position = 0;
//	volume = 0;
//	positionAdder = ( (float)frequency / 44100) * TWO_PI;
	//or just make the divider by a float
	//positionAdder = ( frequency / 44100.0) * TWO_PI;	
}

//--------------------------------------------------------------
void testApp::update(){

	posY = ofMap(sample, -1, 1, (ofGetHeight()/2)-100, (ofGetHeight()/2)+100);

	//sets the position of the circle activity
	if (position < positionMarker + 200) {
		posX = position - positionMarker + ofGetWidth()/2;
	} else {
		positionMarker = position;
	}
	
	
	if (toggle == TRUE) {
		frequencyF = 349.23;
		frequencyG = 392.00;
		frequencyA = 440.00;
		frequencyBFlat = 466.16;
		frequencyC = 523.25;
		frequencyD = 587.33;
		frequencyE = 659.26;		
		frequencyBSix = 1975.53;
	} if (toggle == FALSE) {
		frequencyF = 0.0;
		frequencyG = 0.0;
		frequencyA = 0.0;
		frequencyBFlat = 0.0;
		frequencyC = 0.0;
		frequencyD = 0.0;
		frequencyE = 0.0;
		frequencyBSix = 0.0;
		modulator = 0.0;
	}

	
	positionAdderF = ( (float)frequencyF / 44100) * TWO_PI;
	positionAdderG = ( (float)frequencyG / 44100) * TWO_PI;
	positionAdderA = ( (float)frequencyA / 44100) * TWO_PI;
	positionAdderC = ( (float)frequencyC / 44100) * TWO_PI;
	positionAdderD = ( (float)frequencyD / 44100) * TWO_PI;
	positionAdderE = ( (float)frequencyE / 44100) * TWO_PI;
	positionAdderBSix = ( (float)frequencyBSix / 44100) * TWO_PI;
	
	positionAdderTwo = ( (float)modulator / 44100) * TWO_PI;

	
//	positionAdder = ( (float)frequency / 44100) * TWO_PI;
	
	
}

//--------------------------------------------------------------
void testApp::draw(){
	ofSetColor(0, 0, 0);
	ofDrawBitmapString("dissonant harmony", 50, 30);
	ofDrawBitmapString("D-min with b6", 50, 50);
	ofDrawBitmapString("press enter to hear chord", 50, 90);
	ofDrawBitmapString("press 'delete' to stop chord", 50, 110);
	
	
	ofDrawBitmapString("x position -> unipolar modulator", 50, 150);
	ofDrawBitmapString("modulator value = " + ofToString(modulator), 50, 170);

	
	ofDrawBitmapString("arrow key up = increase modulatorMagnitude", 50, 210);
	ofDrawBitmapString("arrow key down = increase modulatorMagnitude", 50, 230);
	ofDrawBitmapString("modulatorMagnitude = " + ofToString(modulatorMagnitude), 50, 250);
	
	
	
	ofRect(ofGetWidth()/2-5, ofGetHeight()/2-100, 10, 200);

	ofSetColor(0, 255, 0);
	ofCircle(posX, posY, 10);
	
	
}

//--------------------------------------------------------------
void testApp::keyPressed(int key){
	
	if(key == OF_KEY_RETURN && toggle == FALSE) {
		toggle = TRUE;
		status = 1;
	}
	
	if(key == OF_KEY_BACKSPACE && toggle == TRUE) {
		toggle = FALSE;
		status = 0;
	}
	
	if(key == OF_KEY_UP) {
		modulatorMagnitude = modulatorMagnitude + 0.1;
	}
	
	if(key == OF_KEY_DOWN){
		modulatorMagnitude = modulatorMagnitude - 0.1;
	}
	

}

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

}

//--------------------------------------------------------------
void testApp::mouseMoved(int x, int y ){
	
	modulator = x;
	positionAdderTwo = ( (float)modulator / 44100.0) * TWO_PI;

	
}

//--------------------------------------------------------------
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){

}

//--------------------------------------------------------------
void testApp::audioRequested(float * output, int bufferSize, int nChannels){
	
	for(int i=0; i<bufferSize; i++) {

		// This chord is the "Schrecken Fanfaren" Chord from Beethoven's ninth
		// D-min with b6 

		positionTwo += positionAdderTwo;

		positionF += positionAdderF;
		positionG += positionAdderG;
		positionA += positionAdderA;
		positionC += positionAdderC;
		positionD += positionAdderD;
		positionE += positionAdderE;
		positionBSix += positionAdderBSix;
		
		
		// For additive synthesis, every time I add an additional wave, I need to adjust the mapping
		// right now, I am mapping for 5 waves
		sample = sin(positionF+(modulatorMagnitude*(sin(positionTwo)))) + sin(positionG+(modulatorMagnitude*(sin(positionTwo)))) + sin(positionA+(modulatorMagnitude*(sin(positionTwo)))) + sin(positionC+(modulatorMagnitude*(sin(positionTwo)))) + sin(positionD+(modulatorMagnitude*(sin(positionTwo)))) + sin(positionE+(modulatorMagnitude*(sin(positionTwo)))) + (sin(positionBSix+(modulatorMagnitude*(sin(positionTwo))))*0.2);

		sample = ofMap(sample, -7, 7, -1, 1);
		
		output[i*2  ] = sample*0.7;
		output[i*2+1] = sample*0.7;
		
	}
	
}