diff options
Diffstat (limited to 'ofxMaxim/openFrameworksExamples/iOS/maximFeatureExtractor0.8.4/src/ofApp.mm')
| -rwxr-xr-x | ofxMaxim/openFrameworksExamples/iOS/maximFeatureExtractor0.8.4/src/ofApp.mm | 458 |
1 files changed, 458 insertions, 0 deletions
diff --git a/ofxMaxim/openFrameworksExamples/iOS/maximFeatureExtractor0.8.4/src/ofApp.mm b/ofxMaxim/openFrameworksExamples/iOS/maximFeatureExtractor0.8.4/src/ofApp.mm new file mode 100755 index 0000000..84cc5f4 --- /dev/null +++ b/ofxMaxim/openFrameworksExamples/iOS/maximFeatureExtractor0.8.4/src/ofApp.mm @@ -0,0 +1,458 @@ +#include "ofApp.h" +#include "ofxMaxim.h" + + + +//-------------------------------------------------------------- +void ofApp::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", 10); + + ofSetVerticalSync(true); + +} + +//-------------------------------------------------------------- +void ofApp::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 ofApp::draw(){ + + float horizWidth = ofGetWidth() * 0.8; + float horizOffset = ofGetWidth()/10.; + float fftTop = 50; + float mfccTop = 220; + float chromagramTop = 320; + + 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] * 5; + 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] * 30; + 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 * 30; + 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); + + char centroidString[255]; // an array of chars + sprintf(centroidString, "Spectral Centroid: %f", centroid); + myfont.drawString(centroidString, horizOffset, chromagramTop + 35); + + char rmsString[255]; // an array of chars + sprintf(rmsString, "RMS: %.2f", RMS); + myfont.drawString(rmsString, horizOffset, chromagramTop + 70); + + + + 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 = horizWidth / 42.0; + for(int i=0; i < 42; i++) { + // cout << mfcc.melBands[i] << ","; + float height = mfcc.melBands[i] * 5.0; + ofRect(10 + (i*xinc),400 - height,10, height); + } + // cout << endl; + + + // cout << "\n-------" << endl; + + // cout << callTime << endl; + + if( bHide ){ + gui.draw(); + } + + +} + +//-------------------------------------------------------------- +void ofApp::exit(){ + +} + + +//-------------------------------------------------------------- +void ofApp::audioOut(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 = osc.sinebuf(20+mouseX*7); + //wave = samp.play(1.); + //get fft + //wave=lAudioIn[i]; + 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; + + output[i*nChannels ] = wave; + output[i*nChannels + 1] = wave; + } + + +} + +//-------------------------------------------------------------- +void ofApp::audioIn(float * input, int bufferSize, int nChannels){ + + for (int i = 0; i < bufferSize; i++){ + + lAudioIn[i]=input[i*nChannels]; + rAudioIn[i]=input[i*nChannels +1]; + + +// // 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 ofApp::touchDown(ofTouchEventArgs &touch){ + +} + +//-------------------------------------------------------------- +void ofApp::touchMoved(ofTouchEventArgs &touch){ + +} + +//-------------------------------------------------------------- +void ofApp::touchUp(ofTouchEventArgs &touch){ + +} + +//-------------------------------------------------------------- +void ofApp::touchDoubleTap(ofTouchEventArgs &touch){ + +} + +//-------------------------------------------------------------- +void ofApp::touchCancelled(ofTouchEventArgs & touch){ + +} + +//-------------------------------------------------------------- +void ofApp::lostFocus(){ + +} + +//-------------------------------------------------------------- +void ofApp::gotFocus(){ + +} + +//-------------------------------------------------------------- +void ofApp::gotMemoryWarning(){ + +} + +//-------------------------------------------------------------- +void ofApp::deviceOrientationChanged(int newOrientation){ + +} + |
