From 086644237c0ed96383be68d4772623332d860473 Mon Sep 17 00:00:00 2001 From: Mick Grierson Date: Mon, 31 Oct 2011 17:10:28 +0000 Subject: ofxMaxim Examples updated. Tested on XCode 4 with ofxiPhone 007 and iOS 5 - everything works. --- .../ofMaxim_example_fft/src/main.cpp | 16 ++ .../ofMaxim_example_fft/src/testApp.cpp | 192 +++++++++++++++++++++ .../ofMaxim_example_fft/src/testApp.h | 62 +++++++ 3 files changed, 270 insertions(+) create mode 100644 ofxMaxim/ofxMaximExamples0062OSX/ofMaxim_example_fft/src/main.cpp create mode 100644 ofxMaxim/ofxMaximExamples0062OSX/ofMaxim_example_fft/src/testApp.cpp create mode 100644 ofxMaxim/ofxMaximExamples0062OSX/ofMaxim_example_fft/src/testApp.h (limited to 'ofxMaxim/ofxMaximExamples0062OSX/ofMaxim_example_fft/src') diff --git a/ofxMaxim/ofxMaximExamples0062OSX/ofMaxim_example_fft/src/main.cpp b/ofxMaxim/ofxMaximExamples0062OSX/ofMaxim_example_fft/src/main.cpp new file mode 100644 index 0000000..6a32c6a --- /dev/null +++ b/ofxMaxim/ofxMaximExamples0062OSX/ofMaxim_example_fft/src/main.cpp @@ -0,0 +1,16 @@ +#include "ofMain.h" +#include "testApp.h" +#include "ofAppGlutWindow.h" + +//======================================================================== +int main( ){ + + ofAppGlutWindow window; + ofSetupOpenGL(&window, 1024,768, OF_WINDOW); // <-------- setup the GL context + + // this kicks off the running of my app + // can be OF_WINDOW or OF_FULLSCREEN + // pass in width and height too: + ofRunApp( new testApp()); + +} diff --git a/ofxMaxim/ofxMaximExamples0062OSX/ofMaxim_example_fft/src/testApp.cpp b/ofxMaxim/ofxMaximExamples0062OSX/ofMaxim_example_fft/src/testApp.cpp new file mode 100644 index 0000000..c688655 --- /dev/null +++ b/ofxMaxim/ofxMaximExamples0062OSX/ofMaxim_example_fft/src/testApp.cpp @@ -0,0 +1,192 @@ +/* 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 "testApp.h" +#include "maximilian.h"/* include the lib */ +#include "time.h" + + + +//------------------------------------------------------------- +testApp::~testApp() { + +} + + +//-------------------------------------------------------------- +void testApp::setup(){ + /* some standard setup stuff*/ + + ofEnableAlphaBlending(); + ofSetupScreen(); + ofBackground(0, 0, 0); + ofSetFrameRate(60); + + /* This is stuff you always need.*/ + + sampleRate = 44100; /* Sampling Rate */ + initialBufferSize = 512; /* Buffer Size. you have to fill this buffer with sound*/ + lAudioOut = new float[initialBufferSize];/* outputs */ + rAudioOut = new float[initialBufferSize]; + lAudioIn = new float[initialBufferSize];/* inputs */ + rAudioIn = new float[initialBufferSize]; + + + /* This is a nice safe piece of code */ + memset(lAudioOut, 0, initialBufferSize * sizeof(float)); + memset(rAudioOut, 0, initialBufferSize * sizeof(float)); + + memset(lAudioIn, 0, initialBufferSize * sizeof(float)); + memset(rAudioIn, 0, initialBufferSize * sizeof(float)); + + /* Now you can put anything you would normally put in maximilian's 'setup' method in here. */ + + + + fftSize = 1024; + mfft.setup(fftSize, 1024, 256); + ifft.setup(fftSize, 1024, 256); + + + + nAverages = 12; + oct.setup(sampleRate, fftSize/2, nAverages); + + ofxMaxiSettings::setup(sampleRate, 2, initialBufferSize); + ofSoundStreamSetup(2,0, this, sampleRate, initialBufferSize, 4);/* Call this last ! */ + + ofSetVerticalSync(true); + +} + +//-------------------------------------------------------------- +void testApp::update(){ +} + +//-------------------------------------------------------------- +void testApp::draw(){ + + ofSetColor(255, 255, 255,255); + + //draw fft output + float xinc = 900.0 / fftSize * 2.0; + for(int i=0; i < fftSize / 2; i++) { + float height = mfft.magnitudesDB[i] / 50.0 * 400; + ofRect(100 + (i*xinc),450 - height,2, height); + } + //draw phases + ofSetColor(0, 255, 0,100); + for(int i=0; i < fftSize / 2; i++) { + float height = mfft.phases[i] / 50.0 * 400; + ofRect(100 + (i*xinc),500 - height,2, height); + } + + //octave analyser + ofSetColor(255, 0, 0,100); + xinc = 900.0 / oct.nAverages; + for(int i=0; i < oct.nAverages; i++) { + float height = oct.averages[i] / 50.0 * 100; + ofRect(100 + (i*xinc),700 - height,2, height); + } + +// cout << callTime << endl; + +} + +//-------------------------------------------------------------- +void testApp::audioRequested (float * output, int bufferSize, int nChannels){ +// static double tm; + for (int i = 0; i < bufferSize; i++){ + wave = osc.saw(maxiMap::linexp(mouseY + ofGetWindowPositionY(), 0, ofGetScreenHeight(), 200, 8000)); + //get fft + if (mfft.process(wave)) { + int bins = fftSize / 2.0; + //do some manipulation + int hpCutoff = floor(((mouseX + ofGetWindowPositionX()) / (float) ofGetScreenWidth()) * fftSize / 2.0); +//highpass + memset(mfft.magnitudes, 0, sizeof(float) * hpCutoff); + memset(mfft.phases, 0, sizeof(float) * hpCutoff); +//lowpass +// memset(mfft.magnitudes + hpCutoff, 0, sizeof(float) * (bins - hpCutoff)); +// memset(mfft.phases + hpCutoff, 0, sizeof(float) * (bins - hpCutoff)); + mfft.magsToDB(); + oct.calculate(mfft.magnitudesDB); + cout << mfft.spectralFlatness() << ", " << mfft.spectralCentroid() << endl; + } + //inverse fft + gettimeofday(&callTS,NULL); + ifftVal = ifft.process(mfft.magnitudes, mfft.phases); + gettimeofday(&callEndTS,NULL); + callTime = (float)(callEndTS.tv_usec - callTS.tv_usec) / 1000000.0; + callTime += (float)(callEndTS.tv_sec - callTS.tv_sec); + //play result + mymix.stereo(ifftVal, outputs, 0.5); +// float mix = ((mouseX + ofGetWindowPositionX()) / (float) ofGetScreenWidth()); +// mymix.stereo((wave * mix) + ((1.0-mix) * ifftVal), outputs, 0.5); + lAudioOut[i] = output[i*nChannels ] = outputs[0]; /* You may end up with lots of outputs. add them here */ + rAudioOut[i] = output[i*nChannels + 1] = outputs[1]; + } + + + +} + +//-------------------------------------------------------------- +void testApp::audioReceived (float * input, int bufferSize, int nChannels){ + + + /* You can just grab this input and stick it in a double, then use it above to create output*/ + + for (int i = 0; i < bufferSize; i++){ + + /* you can also grab the data out of the arrays*/ + + lAudioIn[i] = input[i*2]; + rAudioIn[i] = input[i*2+1]; + } + +} + +//-------------------------------------------------------------- +void testApp::keyPressed(int key){ + +} + +//-------------------------------------------------------------- +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){ + +} + diff --git a/ofxMaxim/ofxMaximExamples0062OSX/ofMaxim_example_fft/src/testApp.h b/ofxMaxim/ofxMaximExamples0062OSX/ofMaxim_example_fft/src/testApp.h new file mode 100644 index 0000000..ff8a65f --- /dev/null +++ b/ofxMaxim/ofxMaximExamples0062OSX/ofMaxim_example_fft/src/testApp.h @@ -0,0 +1,62 @@ +#ifndef _TEST_APP +#define _TEST_APP + + +#include "ofMain.h" +#include "ofxMaxim.h" +#include + +class testApp : public ofBaseApp{ + + public: + ~testApp();/* deconsructor is very useful */ + void setup(); + void update(); + void draw(); + + void keyPressed (int key); + void keyReleased(int key); + void mouseMoved(int x, int y ); + void mouseDragged(int x, int y, int button); + void mousePressed(int x, int y, int button); + void mouseReleased(int x, int y, int button); + void windowResized(int w, int h); + + void audioRequested (float * input, int bufferSize, int nChannels); /* output method */ + void audioReceived (float * input, int bufferSize, int nChannels); /* input method */ + + float * lAudioOut; /* outputs */ + float * rAudioOut; + + float * lAudioIn; /* inputs */ + float * rAudioIn; + + int initialBufferSize; /* buffer size */ + int sampleRate; + + + /* stick you maximilian stuff below */ + + double wave,sample,outputs[2], ifftVal; + maxiMix mymix; + maxiOsc osc; + + ofxMaxiFFTOctaveAnalyzer oct; + int nAverages; + float *ifftOutput; + int ifftSize; + + ofxMaxiIFFT ifft; + ofxMaxiFFT mfft; + int fftSize; + int bins, dataSize; + + float callTime; + timeval callTS, callEndTS; + + + + +}; + +#endif -- cgit v1.3