diff options
| author | mick grierson <mickgrierson@gmail.com> | 2015-10-01 09:54:19 +0100 |
|---|---|---|
| committer | mick grierson <mickgrierson@gmail.com> | 2015-10-01 09:54:19 +0100 |
| commit | e4eb667af04304cbe9c0be5997ebea2049178590 (patch) | |
| tree | 5630e70df8199c9f53170c9ef4da1e4dac59e69c /ofxMaxim/openFrameworksExamples/OSX/OF0.8.4MaximExtractorExample/src | |
| parent | 537a5a959f8ec9c4fcb5fd016f2a6be65ca99f3c (diff) | |
| parent | dfa3efd8495628d55f55ee8c8c8576095c2089e4 (diff) | |
resolving merge conflict
Diffstat (limited to 'ofxMaxim/openFrameworksExamples/OSX/OF0.8.4MaximExtractorExample/src')
3 files changed, 507 insertions, 0 deletions
diff --git a/ofxMaxim/openFrameworksExamples/OSX/OF0.8.4MaximExtractorExample/src/main.cpp b/ofxMaxim/openFrameworksExamples/OSX/OF0.8.4MaximExtractorExample/src/main.cpp new file mode 100644 index 0000000..eca7e09 --- /dev/null +++ b/ofxMaxim/openFrameworksExamples/OSX/OF0.8.4MaximExtractorExample/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/openFrameworksExamples/OSX/OF0.8.4MaximExtractorExample/src/testApp.cpp b/ofxMaxim/openFrameworksExamples/OSX/OF0.8.4MaximExtractorExample/src/testApp.cpp new file mode 100644 index 0000000..6c0ccf4 --- /dev/null +++ b/ofxMaxim/openFrameworksExamples/OSX/OF0.8.4MaximExtractorExample/src/testApp.cpp @@ -0,0 +1,398 @@ +/* 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(){ + + sender.setup(HOST, PORT); + /* 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. */ + + // samp.load(ofToDataPath("sinetest_stepping2.wav")); + // samp.load(ofToDataPath("whitenoise2.wav")); + // samp.load(ofToDataPath("additive22.wav")); + //samp.load(ofToDataPath("pinknoise2.wav")); + //samp.load(ofToDataPath("filtersweep2.wav")); + //samp.getLength(); + + + fftSize = 1024; + mfft.setup(fftSize, 512, 256); + ifft.setup(fftSize, 512, 256); + + + nAverages = 12; + oct.setup(sampleRate, fftSize/2, nAverages); + + mfccs = (double*) malloc(sizeof(double) * 13); + mfcc.setup(512, 42, 13, 20, 20000, sampleRate); + + ofxMaxiSettings::setup(sampleRate, 2, initialBufferSize); + ofSoundStreamSetup(2,2, this, sampleRate, initialBufferSize, 4);/* Call this last ! */ + + + //GUI STUFF + gui.setup(); // most of the time you don't need a name + + /* mfccToggle.setBackgroundColor(ofColor(191,72,250)); + fftToggle.setBackgroundColor(ofColor(191,72,250)); + chromagramToggle.setBackgroundColor(ofColor(191,72,250)); + peakFrequencyToggle.setBackgroundColor(ofColor(191,72,250)); + centroidToggle.setBackgroundColor(ofColor(191,72,250)); + rmsToggle.setBackgroundColor(ofColor(191,72,250)); */ + + + gui.add(fftToggle.setup("FFT bin magnitudes (pitch/timbre/volume) (512)", true)); + gui.add(mfccToggle.setup("MFCCs (timbre/vocal) (13)", true)); + gui.add(chromagramToggle.setup("Octave analyser (pitch) (12)", true)); + gui.add(peakFrequencyToggle.setup("Peak frequency (pitch) (1)", true)); + gui.add(centroidToggle.setup("Spectral centroid (timbre) (1)", true)); + gui.add(rmsToggle.setup("RMS (volume) (1)", true)); + + //gui.setSize(600, 500); + + bHide = true; + + myfont.loadFont("arial.ttf", 18); + + ofSetVerticalSync(true); + + +} + +//-------------------------------------------------------------- +void testApp::update(){ + + if (fftToggle) { + ofxOscMessage m; + m.setAddress("/fft"); + for (int i = 0; i < fftSize; i++) { + m.addFloatArg(mfft.magnitudes[i]); + + } + sender.sendMessage(m); + } + + if (mfccToggle) { + ofxOscMessage m; + m.setAddress("/mfccs"); + for (int i = 0; i < 13; i++) { + m.addFloatArg(mfccs[i]); + } + sender.sendMessage(m); + } + + if (chromagramToggle) { + ofxOscMessage m; + m.setAddress("/octaveBins"); + for (int i = 0; i < oct.nAverages; i++) { + m.addFloatArg(oct.averages[i]); + } + sender.sendMessage(m); + } + + if (peakFrequencyToggle) { + ofxOscMessage m; + m.setAddress("/peakFrequency"); + m.addFloatArg(peakFreq); + sender.sendMessage(m); + } + + if (centroidToggle) { + ofxOscMessage m; + m.setAddress("/centroid"); + m.addFloatArg(centroid); + sender.sendMessage(m); + } + if (rmsToggle) { + ofxOscMessage m; + m.setAddress("/rms"); + m.addFloatArg(RMS); + sender.sendMessage(m); + } + + + +} + + + +//-------------------------------------------------------------- +void testApp::draw(){ + + float horizWidth = 500.; + float horizOffset = 100; + float fftTop = 250; + float mfccTop = 350; + float chromagramTop = 450; + + ofSetColor(255, 0, 0,255); + + //draw fft output + float xinc = horizWidth / fftSize * 2.0; + for(int i=0; i < fftSize / 2; i++) { + //magnitudesDB took out + float height = mfft.magnitudes[i] * 100; + ofRect(horizOffset + (i*xinc),250 - height,2, height); + } + + // cout << "\nMFCCS: "; + ofSetColor(0, 255, 0,200); + xinc = horizWidth / 13; + for(int i=0; i < 13; i++) { + float height = mfccs[i] * 100.0; + ofRect(horizOffset + (i*xinc),mfccTop - height,40, height); + // cout << mfccs[i] << ","; + } + + + + + //octave analyser + ofSetColor(255, 0, 255,200); + xinc = horizWidth / oct.nAverages; + for(int i=0; i < oct.nAverages; i++) { + float height = oct.averages[i] / 20.0 * 100; + ofRect(horizOffset + (i*xinc),chromagramTop - height,2, height); + } + + ofSetColor(255, 255, 255,255); + + char peakString[255]; // an array of chars + sprintf(peakString, "Peak Frequency: %.2f", peakFreq); + myfont.drawString(peakString, horizOffset, chromagramTop + 50); + + char centroidString[255]; // an array of chars + sprintf(centroidString, "Spectral Centroid: %f", centroid); + myfont.drawString(centroidString, horizOffset, chromagramTop + 100); + + char rmsString[255]; // an array of chars + sprintf(rmsString, "RMS: %.2f", RMS); + myfont.drawString(rmsString, horizOffset, chromagramTop + 150); + + + /* + ofSetColor(255, 0, 255, 200); + //myfont.drawString("Pitch histogram", 50, 650); + xinc = horizWidth / 12.0; + int j = 0; + float pitchHist[12]; + for (int i = 0; i < oct.nAverages; i++) { + pitchHist[j] += oct.averages[i]; + j++; + j = j % 12; + } + for(int i=0; i < 12; i++) { + float height = pitchHist[i] /40. * 100; + ofRect(100 + (i*xinc),chromagramTop - height,50, height); + } + */ + + /* ofSetColor(255, 0, 255,200); + xinc = horizWidth /12; + for(int i=0; i < 12; i++) { + float height = chromagram[i] / 50.0 * 100; + ofRect(100 + (i*xinc),chromagramTop - height,2, height); + } */ + + // chromagram + + //Mel bands + // cout << "\nMel bands: "; + /* ofSetColor(255, 0, 255,100); + xinc = 900.0 / 42.0; + for(int i=0; i < 42; i++) { + // cout << mfcc.melBands[i] << ","; + float height = mfcc.melBands[i] * 5.0; + ofRect(100 + (i*xinc),400 - height,10, height); + } */ + // cout << endl; + + + // cout << "\n-------" << endl; + + // cout << callTime << endl; + + if( bHide ){ + gui.draw(); + } + +} + +//-------------------------------------------------------------- +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)); + wave = lAudioIn[i]; + //wave = samp.play(1.); + //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(); + // for(int z=0; z < 512; z++) cout << mfft.magnitudesDB[z] << ","; + // cout << "---------\n"; + oct.calculate(mfft.magnitudesDB); + + + /* for (int j = 0; j < 12; j++) { + chromagram[j] = 0; + } + int j = 0; + for (int i = 0; i < oct.nAverages; i++) { + chromagram[j] += oct.averages[i]; + j++; + j = j % 12; + } */ + + float sum = 0; + float maxFreq = 0; + int maxBin = 0; + + for (int i = 0; i < fftSize/2; i++) { + sum += mfft.magnitudes[i]; + if (mfft.magnitudes[i] > maxFreq) { + maxFreq=mfft.magnitudes[i]; + maxBin = i; + } + } + centroid = sum / (fftSize / 2); + peakFreq = (float)maxBin/fftSize * 44100; + + + mfcc.mfcc(mfft.magnitudes, mfccs); + //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(wave, 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]; + lAudioOut[i] = 0; + rAudioOut[i] = 0; + + } + + + +} + +//-------------------------------------------------------------- +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*/ + + float sum = 0; + 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]; + + sum += input[i*2] * input[i*2]; + + } + RMS = sqrt(sum); + +} + +//-------------------------------------------------------------- +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/openFrameworksExamples/OSX/OF0.8.4MaximExtractorExample/src/testApp.h b/ofxMaxim/openFrameworksExamples/OSX/OF0.8.4MaximExtractorExample/src/testApp.h new file mode 100644 index 0000000..689b3f3 --- /dev/null +++ b/ofxMaxim/openFrameworksExamples/OSX/OF0.8.4MaximExtractorExample/src/testApp.h @@ -0,0 +1,93 @@ +#ifndef _TEST_APP +#define _TEST_APP + + +#include "ofMain.h" +#include "ofxMaxim.h" +#include "ofxGui.h" +#include "ofxOsc.h" + +#include <sys/time.h> + +#include "maxiMFCC.h" +#define HOST "localhost" +#define PORT 12345 + +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; + + + //MAXIMILIAN STUFF: + double wave,sample,outputs[2], ifftVal; + maxiMix mymix; + maxiOsc osc; + + ofxMaxiFFTOctaveAnalyzer oct; + int nAverages; + float *ifftOutput; + int ifftSize; + + float peakFreq = 0; + float centroid = 0; + float RMS = 0; + + ofxMaxiIFFT ifft; + ofxMaxiFFT mfft; + int fftSize; + int bins, dataSize; + + float callTime; + timeval callTS, callEndTS; + + maxiMFCC mfcc; + double *mfccs; + + maxiSample samp; + + //GUI STUFF + bool bHide; + + ofxToggle mfccToggle; + ofxToggle fftToggle; + ofxToggle chromagramToggle; + ofxToggle peakFrequencyToggle; + ofxToggle centroidToggle; + ofxToggle rmsToggle; + + + + ofxPanel gui; + + ofTrueTypeFont myfont; + + ofxOscSender sender; + + +}; + +#endif |
