aboutsummaryrefslogtreecommitdiffstats
path: root/ofxMaxim/ofxMaximExample_0.8.4_OSX_Granular/src/ofApp.cpp
diff options
context:
space:
mode:
authormick grierson <mickgrierson@gmail.com>2015-06-29 15:57:31 +0100
committermick grierson <mickgrierson@gmail.com>2015-06-29 15:57:31 +0100
commitb86dfa8f6f99713ee4605c30ebb1a58309aaeb8a (patch)
tree519c6acfe487d3d2f844b21c4d1d062670c57ee3 /ofxMaxim/ofxMaximExample_0.8.4_OSX_Granular/src/ofApp.cpp
parent440498446db27a6883de668ebf407f489c979016 (diff)
Updating post-hackday
Diffstat (limited to 'ofxMaxim/ofxMaximExample_0.8.4_OSX_Granular/src/ofApp.cpp')
-rwxr-xr-xofxMaxim/ofxMaximExample_0.8.4_OSX_Granular/src/ofApp.cpp266
1 files changed, 266 insertions, 0 deletions
diff --git a/ofxMaxim/ofxMaximExample_0.8.4_OSX_Granular/src/ofApp.cpp b/ofxMaxim/ofxMaximExample_0.8.4_OSX_Granular/src/ofApp.cpp
new file mode 100755
index 0000000..76fe32c
--- /dev/null
+++ b/ofxMaxim/ofxMaximExample_0.8.4_OSX_Granular/src/ofApp.cpp
@@ -0,0 +1,266 @@
+/* This is an example of how to integrate maximilain into openFrameworks,
+ including using audio received for input and audio requested for output.
+
+
+ You can copy and paste this and use it as a starting example.
+
+ */
+
+#include "ofApp.h"
+//#include "maximilian.h"/* include the lib */
+#include "time.h"
+
+
+//--------------------------------------------------------------
+void ofApp::setup(){
+
+ /* This is stuff you always need.*/
+
+ sender.setup(HOST, SENDPORT);
+ receiver.setup(RECEIVEPORT);
+
+
+ //samples from http://freesound.org
+ samp.load(ofToDataPath("2630__Jovica__133_bpm_ATTACK_LOOP_04_electrified_analog_kit_variation_16_mono.wav"));
+ samp2.load(ofToDataPath("24620__anamorphosis__GMB_Kantilan_1.wav"));
+ samp3.load(ofToDataPath("26393__brfindla__Calango1berimbau.wav"));
+ samp4.load(ofToDataPath("68373__juskiddink__Cello_open_string_bowed.wav"));
+ samp5.load(ofToDataPath("71515__Microscopia__Wilhelm_Bruder_Sohne_Organ.wav"));
+ // samp5.load(ofToDataPath("sine1sec.wav"));
+
+
+ ofEnableAlphaBlending();
+ ofSetupScreen();
+ ofBackground(0, 0, 0);
+ ofSetFrameRate(60);
+
+ sampleRate = 44100; /* Sampling Rate */
+ bufferSize = 512; /* Buffer Size. you have to fill this buffer with sound using the for loop in the audioOut method */
+
+
+
+ ts = new maxiTimestretch<grainPlayerWin>(&samp);
+ ts2 = new maxiTimestretch<grainPlayerWin>(&samp2);
+ ts3 = new maxiTimestretch<grainPlayerWin>(&samp3);
+ ts4 = new maxiTimestretch<grainPlayerWin>(&samp4);
+ ts5 = new maxiTimestretch<grainPlayerWin>(&samp5);
+ stretches.push_back(ts);
+ stretches.push_back(ts2);
+ stretches.push_back(ts3);
+ stretches.push_back(ts4);
+ stretches.push_back(ts5);
+ speed = 1;
+ grainLength = 0.05;
+ current=0;
+
+ fft.setup(1024, 512, 256);
+ oct.setup(44100, 1024, 10);
+
+ int current = 0;
+ ofxMaxiSettings::setup(sampleRate, 2, initialBufferSize);
+
+ ofSetVerticalSync(true);
+ ofEnableAlphaBlending();
+ ofEnableSmoothing();
+
+ /* Anything that you would normally find/put in maximilian's setup() method needs to go here. For example, Sample loading.
+
+ */
+
+ isTraining=true;
+
+ ofBackground(255,255,255);
+
+ ofSetSphereResolution(5);
+
+ ofSoundStreamSetup(2,2,this, sampleRate, bufferSize, 4); /* this has to happen at the end of setup - it switches on the DAC */
+
+
+}
+
+//--------------------------------------------------------------
+void ofApp::update(){
+
+ //WEKINATOR
+ if (!isTraining) {
+
+
+ while(receiver.hasWaitingMessages()){
+ // get the next message
+ ofxOscMessage m;
+ receiver.getNextMessage(&m);
+
+ // check for mouse moved message
+ if(m.getAddress() == "/wek/outputs"){
+
+ cout << m.getArgAsFloat(0);
+ speed = ((double ) m.getArgAsFloat(0) * 4.0) - 2.0;
+ grainLength = (m.getArgAsFloat(1) * 0.1) + 0.001;
+ pos = ((double) m.getArgAsFloat(0) * 2.0);
+
+ }
+ }
+
+ }
+
+
+}
+
+//--------------------------------------------------------------
+void ofApp::draw(){
+
+ /* You can use any of the data from audio received and audiorequested to draw stuff here.
+ Importantly, most people just use the input and output arrays defined above.
+ Clever people don't do this. This bit of code shows that by default, each signal is going to flip
+ between -1 and 1. You need to account for this somehow. Get the absolute value for example.
+ */
+
+ ofSetColor(160,32,240, 150);
+ ofDrawBitmapString(":: ofxMaxim Granular Timestretching Example ::", 10,20);
+ ofDrawBitmapString("Move the mouse left to right to change playback speed and direction.", 10,40);
+ ofDrawBitmapString("Move the mouse up and down to change the grain length.", 10,60);
+ ofDrawBitmapString("Click to cycle through samples.", 10,80);
+
+ stringstream s;
+ s << "Speed: " << speed;
+ ofDrawBitmapString(s.str(), 10,750);
+ s.str("");
+ s << "Grain length: " << round(grainLength*1000.0) << " ms";
+ ofDrawBitmapString(s.str(), 180,750);
+
+ ofNoFill();
+ for(int i=0; i < oct.nAverages; i++) {
+ ofSetColor(200 + ((int)(ofGetFrameNum() * 0.8) % 255),
+ 100 + ((int)(ofGetFrameNum() * 1.4) % 255),
+ ofGetFrameNum() % 255,
+ oct.averages[i] / 20.0 * 255.0);
+ // ofCircle(ofGetWidth() / 2, ofGetHeight()/2, i * 5);
+ glPushMatrix();
+ glTranslatef(ofGetWidth()/2,ofGetHeight()/2, 0);
+ glRotatef(0.01 * ofGetFrameNum() * speed * i, 1, 0.1, 0);
+ // glutWireSphere(i * 5, 2 + (10 - (fabs(speed) * 10)), 2 + (fabs(speed) * 10));
+ ofDrawSphere(0, 0, i * 5);
+ glPopMatrix();
+ }
+
+
+
+
+}
+
+//--------------------------------------------------------------
+void ofApp::audioOut(float * output, int bufferSize, int nChannels) {
+
+
+ for (int i = 0; i < bufferSize; i++){
+
+ /* Stick your maximilian 'play()' code in here ! Declare your objects in testApp.h.
+
+ For information on how maximilian works, take a look at the example code at
+
+ http://www.maximilian.strangeloop.co.uk
+
+ under 'Tutorials'.
+
+ */
+
+
+ // wave = stretches[current]->play(speed, grainLength, 5, 0);
+ wave = stretches[current]->play(speed, 0.1, 4, 0);
+ // wave = stretches[current]->play2(pos, 0.1, 4);
+ if (fft.process(wave)) {
+ oct.calculate(fft.magnitudes);
+ }
+
+ //play result
+ mymix.stereo(wave, outputs, 0.5);
+ output[i*nChannels ] = outputs[0]; /* You may end up with lots of outputs. add them here */
+ output[i*nChannels + 1] = outputs[1];
+
+
+
+ /* You may end up with lots of outputs. add them here */
+
+
+ }
+
+}
+
+//--------------------------------------------------------------
+void ofApp::audioIn(float * input, int bufferSize, int nChannels){
+
+ // samples are "interleaved"
+ for(int i = 0; i < bufferSize; i++){
+ /* you can also grab the data out of the arrays*/
+
+ }
+
+}
+
+
+//--------------------------------------------------------------
+void ofApp::keyPressed(int key){
+
+ isTraining=!isTraining;
+
+ cout << isTraining;
+
+}
+
+//--------------------------------------------------------------
+void ofApp::keyReleased(int key){
+
+}
+
+//--------------------------------------------------------------
+void ofApp::mouseMoved(int x, int y){
+
+ if (isTraining) {
+
+ speed = ((double ) x / ofGetWidth() * 4.0) - 2.0;
+ grainLength = ((double) y / ofGetHeight() * 0.1) + 0.001;
+ pos = ((double) x / ofGetWidth() * 2.0);
+ // cout << pos << endl;
+
+ ofxOscMessage m;
+ m.setAddress("/wekinator/control/outputs");
+ m.addFloatArg((float)x/ofGetWidth());
+ m.addFloatArg((float)y/ofGetHeight());
+ m.addFloatArg((float)current/stretches.size()-1);
+ sender.sendMessage(m);
+ cout << "messageSent" << "\n";
+ }
+
+
+}
+
+//--------------------------------------------------------------
+void ofApp::mouseDragged(int x, int y, int button){
+
+}
+
+//--------------------------------------------------------------
+void ofApp::mousePressed(int x, int y, int button){
+ if (++current > stretches.size()-1) current = 0;
+
+}
+
+//--------------------------------------------------------------
+void ofApp::mouseReleased(int x, int y, int button){
+
+}
+
+//--------------------------------------------------------------
+void ofApp::windowResized(int w, int h){
+
+}
+
+//--------------------------------------------------------------
+void ofApp::gotMessage(ofMessage msg){
+
+}
+
+//--------------------------------------------------------------
+void ofApp::dragEvent(ofDragInfo dragInfo){
+
+}