aboutsummaryrefslogtreecommitdiffstats
path: root/openFrameworks/openFrameworksExamples/iOS/maximFeatureExtractor0.8.4/src
diff options
context:
space:
mode:
Diffstat (limited to 'openFrameworks/openFrameworksExamples/iOS/maximFeatureExtractor0.8.4/src')
-rwxr-xr-xopenFrameworks/openFrameworksExamples/iOS/maximFeatureExtractor0.8.4/src/main.mm29
-rwxr-xr-xopenFrameworks/openFrameworksExamples/iOS/maximFeatureExtractor0.8.4/src/ofApp.h99
-rwxr-xr-xopenFrameworks/openFrameworksExamples/iOS/maximFeatureExtractor0.8.4/src/ofApp.mm458
3 files changed, 586 insertions, 0 deletions
diff --git a/openFrameworks/openFrameworksExamples/iOS/maximFeatureExtractor0.8.4/src/main.mm b/openFrameworks/openFrameworksExamples/iOS/maximFeatureExtractor0.8.4/src/main.mm
new file mode 100755
index 0000000..a02b813
--- /dev/null
+++ b/openFrameworks/openFrameworksExamples/iOS/maximFeatureExtractor0.8.4/src/main.mm
@@ -0,0 +1,29 @@
+#include "ofMain.h"
+#include "ofApp.h"
+
+
+// use the below code to allow deployment on the iOS simulator because OF 0.8.4 is broken
+extern "C"{
+ size_t fwrite$UNIX2003( const void *a, size_t b, size_t c, FILE *d )
+ {
+ return fwrite(a, b, c, d);
+ }
+ char* strerror$UNIX2003( int errnum )
+ {
+ return strerror(errnum);
+ }
+ time_t mktime$UNIX2003(struct tm * a)
+ {
+ return mktime(a);
+ }
+ double strtod$UNIX2003(const char * a, char ** b) {
+ return strtod(a, b);
+ }
+}
+
+
+int main(){
+ ofSetupOpenGL(1024,768, OF_FULLSCREEN); // <-------- setup the GL context
+
+ ofRunApp(new ofApp);
+}
diff --git a/openFrameworks/openFrameworksExamples/iOS/maximFeatureExtractor0.8.4/src/ofApp.h b/openFrameworks/openFrameworksExamples/iOS/maximFeatureExtractor0.8.4/src/ofApp.h
new file mode 100755
index 0000000..5756aa3
--- /dev/null
+++ b/openFrameworks/openFrameworksExamples/iOS/maximFeatureExtractor0.8.4/src/ofApp.h
@@ -0,0 +1,99 @@
+#pragma once
+
+#include "ofMain.h"
+#include "ofxiOS.h"
+#include "ofxiOSExtras.h"
+#include "ofxMaxim.h"
+#include "ofxGui.h"
+#include "ofxOsc.h"
+
+#include <sys/time.h>
+
+#include "maxiMFCC.h"
+#define HOST "localhost"
+#define PORT 6448
+
+
+class ofApp : public ofxiOSApp{
+
+public:
+ void setup();
+ void update();
+ void draw();
+ void exit();
+
+ void touchDown(ofTouchEventArgs & touch);
+ void touchMoved(ofTouchEventArgs & touch);
+ void touchUp(ofTouchEventArgs & touch);
+ void touchDoubleTap(ofTouchEventArgs & touch);
+ void touchCancelled(ofTouchEventArgs & touch);
+
+ void lostFocus();
+ void gotFocus();
+ void gotMemoryWarning();
+ void deviceOrientationChanged(int newOrientation);
+ void audioIn(float * input, int bufferSize, int nChannels);
+ void audioOut(float * output, int bufferSize, int nChannels);
+
+ float * lAudioOut; /* outputs */
+ float * rAudioOut;
+
+ float * lAudioIn; /* inputs */
+ float * rAudioIn;
+
+ int initialBufferSize; /* buffer size */
+
+
+ //MAXIMILIAN STUFF:
+
+ int sampleRate;
+ int bufferSize;
+
+ maxiMix channel1;
+
+ 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;
+
+
+};
+
+
diff --git a/openFrameworks/openFrameworksExamples/iOS/maximFeatureExtractor0.8.4/src/ofApp.mm b/openFrameworks/openFrameworksExamples/iOS/maximFeatureExtractor0.8.4/src/ofApp.mm
new file mode 100755
index 0000000..84cc5f4
--- /dev/null
+++ b/openFrameworks/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){
+
+}
+