From d6a8d1d93c6b5abd8b69985f182667c2994f13fd Mon Sep 17 00:00:00 2001 From: Comment Date: Wed, 29 May 2013 00:28:36 +0100 Subject: nearly ready --- src/main.cpp | 2 +- src/testApp.cpp | 128 +++++++++++++++++++++++++++++++++++++++++-------------- src/testApp.h | 21 ++++++--- src/viewport.cpp | 44 ++++++++++++++++--- src/viewport.h | 120 ++++++++++++++++++++++++++++++++++++++++++--------- 5 files changed, 248 insertions(+), 67 deletions(-) (limited to 'src') diff --git a/src/main.cpp b/src/main.cpp index f0c0c0f..941033b 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -7,7 +7,7 @@ int main( ){ ofAppGlutWindow window; - ofSetupOpenGL(ofxFensterManager::get(),1024,768, OF_WINDOW); //2048,768 + ofSetupOpenGL(ofxFensterManager::get(),128,64, OF_WINDOW); //2048,768 //ofSetupOpenGL(&window, 1024,768, OF_WINDOW); // <-------- setup the GL context //ofSetupOpenGL(&window, 1024,768, OF_WINDOW); diff --git a/src/testApp.cpp b/src/testApp.cpp index c7bf35a..967d2d1 100755 --- a/src/testApp.cpp +++ b/src/testApp.cpp @@ -8,10 +8,11 @@ void previewWindow::setParent(testApp *p){ } void previewWindow::draw(){ - for (auto i:parent->viewports) i.draw(parent->brightSlider); + for (auto i:parent->viewports) i.draw(parent->brightSlider,parent->previewscale); } void previewWindow::dragEvent(ofDragInfo dragInfo, ofxFenster* win){ + parent->dragEvent(dragInfo); } //-------------------------------------------------------------- @@ -28,43 +29,57 @@ void guiWindow::draw(){ } void guiWindow::dragEvent(ofDragInfo dragInfo, ofxFenster* win){ + int sta=dragInfo.files[0].find_last_of("\\/")+1; + int len=(dragInfo.files[0].find_last_of(".")+4)-sta; + string filename=dragInfo.files[0].substr(sta,len); + + if (filename.length()) { + palette p; + if (p.load(filename)) { + printf("loaded %s\n",filename.c_str()); + for (int i=0;iviewports.size();i++) { + parent->viewports[i].Palette=p; + } + } + else printf("could not load %s\n",filename.c_str()); + } parent->dragEvent(dragInfo); } //-------------------------------------------------------------- void testApp::create1port(bool & pressed){ if (!pressed) return; viewports.clear(); - viewports.push_back(viewport(4*windowsize,2*windowsize,0,0)); + viewports.push_back(viewport(4*windowsize,2*windowsize,0,0,0)); createports(1); } void testApp::create2port(bool & pressed){ if (!pressed) return; viewports.clear(); - viewports.push_back(viewport(2*windowsize,2*windowsize,0,0)); - viewports.push_back(viewport(2*windowsize,2*windowsize,2*windowsize,0)); + viewports.push_back(viewport(2*windowsize,2*windowsize,0,0,0)); + viewports.push_back(viewport(2*windowsize,2*windowsize,2*windowsize,0,1)); createports(2); } void testApp::create4port(bool & pressed){ if (!pressed) return; viewports.clear(); - viewports.push_back(viewport(windowsize,2*windowsize,0,0)); - viewports.push_back(viewport(windowsize,2*windowsize,windowsize,0)); - viewports.push_back(viewport(windowsize,2*windowsize,2*windowsize,0)); - viewports.push_back(viewport(windowsize,2*windowsize,3*windowsize,0)); + viewports.push_back(viewport(windowsize,2*windowsize,0,0,0)); + viewports.push_back(viewport(windowsize,2*windowsize,windowsize,0,1)); + viewports.push_back(viewport(windowsize,2*windowsize,2*windowsize,0,2)); + viewports.push_back(viewport(windowsize,2*windowsize,3*windowsize,0,3)); createports(4); } void testApp::create8port(bool & pressed){ if (!pressed) return; viewports.clear(); - viewports.push_back(viewport(windowsize,windowsize,0,0)); - viewports.push_back(viewport(windowsize,windowsize,(1*windowsize),0)); - viewports.push_back(viewport(windowsize,windowsize,(2*windowsize),0)); - viewports.push_back(viewport(windowsize,windowsize,(3*windowsize),0)); - viewports.push_back(viewport(windowsize,windowsize,0,windowsize)); - viewports.push_back(viewport(windowsize,windowsize,(1*windowsize),windowsize)); - viewports.push_back(viewport(windowsize,windowsize,(2*windowsize),windowsize)); - viewports.push_back(viewport(windowsize,windowsize,(3*windowsize),windowsize)); + viewports.push_back(viewport(windowsize,windowsize,0,0,0)); + viewports.push_back(viewport(windowsize,windowsize,(1*windowsize),0,1)); + viewports.push_back(viewport(windowsize,windowsize,(2*windowsize),0,2)); + viewports.push_back(viewport(windowsize,windowsize,(3*windowsize),0,3)); + viewports.push_back(viewport(windowsize,windowsize,0,windowsize,4)); + viewports.push_back(viewport(windowsize,windowsize,(1*windowsize),windowsize,5)); + viewports.push_back(viewport(windowsize,windowsize,(2*windowsize),windowsize,6)); + viewports.push_back(viewport(windowsize,windowsize,(3*windowsize),windowsize,7)); createports(8); } void testApp::createports(int num){ @@ -73,8 +88,8 @@ void testApp::createports(int num){ //-------------------------------------------------------------- void testApp::setup(){ - windowsize=100; - + windowsize=32; + previewscale=5; showFPS=false; ofBackground(0,0,0); @@ -83,7 +98,7 @@ void testApp::setup(){ //preview window stuff prevWin=new previewWindow(); - win=ofxFensterManager::get()->createFenster(0, 0, windowsize*4, windowsize*2, OF_WINDOW); + win=ofxFensterManager::get()->createFenster(0, 0, windowsize*4*previewscale, windowsize*2*previewscale, OF_WINDOW); ofAddListener(win->events.keyPressed, this, &testApp::keyPressedEvent); win->setWindowTitle("preview"); win->addListener(prevWin); @@ -107,10 +122,13 @@ void testApp::setup(){ gui.add(create_8.setup("8")); create_8.addListener(this,&testApp::create8port); - gui.add(fillgrey.setup("fill grey", false)); - greyFreq=1.0f; - gui.add(gF.setup("grey freq",greyFreq,0,2.0,255)); + gui.add(fill.setup("fill", false)); + slidFreq=1.0f; + gui.add(sF.setup("freq",slidFreq,0,1.0,255)); + gui.add(wave.setup("wave", false)); + slidThickness=1.0f; + gui.add(sT.setup("thickness",slidThickness,0,10.0,255)); /* gui.setup("","panel.xml",0,0); @@ -145,23 +163,66 @@ void testApp::setup(){ guiWin->setup(); guiWin->setParent(this); + + soundStream.listDevices(); + + //if you want to set a different device id + //soundStream.setDeviceID(0); //bear in mind the device id corresponds to all audio devices, including input-only and output-only devices. + + + + + soundStream.setup(this, 0, 2, 44100, bufferSize, 4); } +//-------------------------------------------------------------- +void testApp::audioIn(float * input, int bufferSize, int nChannels){ + + float curVol = 0.0; + + // samples are "interleaved" + int numCounted = 0; + + //lets go through each sample and calculate the root mean square which is a rough way to calculate volume + for (int i = 0; i < bufferSize; i++){ + control.left[i] = input[i*2]*0.5; + control.right[i] = input[i*2+1]*0.5; + + curVol += control.left[i] * control.left[i]; + curVol += control.right[i] * control.right[i]; + numCounted+=2; + } + + //this is how we get the mean of rms :) + curVol /= (float)numCounted; + + // this is how we get the root of rms :) + curVol = sqrt( curVol ); + + control.smoothedVol *= 0.93; + control.smoothedVol += 0.07 * curVol; + + control.bufferCounter++; + +} + //-------------------------------------------------------------- void testApp::update(){ - //for (int i=0;iupdate(); + control.update(); + control.fill=fill; + control.freq=slidFreq; + control.wave=wave; + control.thickness=slidThickness; } //-------------------------------------------------------------- void testApp::draw(){ - control.fillgrey=fillgrey; - control.fillgreyfreq=greyFreq; for (auto i:viewports) i.drawport(control); @@ -189,6 +250,12 @@ void testApp::keyPressed(int key){ if(key == 'f'){ toggleFPS(); } + if(key == OF_KEY_UP){ + control.yshift--; + } + if(key == OF_KEY_DOWN){ + control.yshift++; + } } @@ -227,19 +294,16 @@ void testApp::gotMessage(ofMessage msg){ //-------------------------------------------------------------- void testApp::dragEvent(ofDragInfo dragInfo, ofxFenster* win){ + + dragEvent(dragInfo); } void testApp::dragEvent(ofDragInfo dragInfo){ - printf("got draginfo: %s\n",dragInfo.files[0].c_str()); - int sta=dragInfo.files[0].find_last_of("\\/")+1; - int len=(dragInfo.files[0].find_last_of(".")+4)-sta; - string filename=dragInfo.files[0].substr(sta,len); - printf("loading %s\n",filename.c_str()); - - if (filename.length()) control.loadpalette(filename); + } + void testApp::mousePressedEvent(ofMouseEventArgs &args) { //printf("mouse: %i,%i %i of %ix%i\n",args.x,args.y,args.button,win->getWidth(),win->getHeight()); //0-2 diff --git a/src/testApp.h b/src/testApp.h index 376cdee..3148eb2 100755 --- a/src/testApp.h +++ b/src/testApp.h @@ -63,10 +63,16 @@ class testApp : public ofxFensterListener { ofxIntSlider bS; ofxParameter brightSlider; - ofxToggle fillgrey; + ofxToggle fill; + + ofxFloatSlider sF; + ofxParameter slidFreq; + + ofxToggle wave; + + ofxFloatSlider sT; + ofxParameter slidThickness; - ofxFloatSlider gF; - ofxParameter greyFreq; void create1port(bool & pressed); void create2port(bool & pressed); @@ -76,11 +82,14 @@ class testApp : public ofxFensterListener { vector viewports; vpcontrol control; - int windowsize; + int windowsize,previewscale; - vector palette; + // - void loadfilepalette(string &palette); + void audioIn(float * input, int bufferSize, int nChannels); + + + ofSoundStream soundStream; }; diff --git a/src/viewport.cpp b/src/viewport.cpp index 875b439..c660ede 100755 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -1,18 +1,21 @@ #include "viewport.h" +//make viewport oversample + viewport::viewport() { //ctor } -viewport::viewport(int _w,int _h,int _ox,int _oy) { - setup(_w,_h,_ox,_oy); +viewport::viewport(int _w,int _h,int _ox,int _oy,int _num) { + setup(_w,_h,_ox,_oy,_num); } -void viewport::setup(int _w,int _h,int _ox,int _oy) { +void viewport::setup(int _w,int _h,int _ox,int _oy,int _num) { w=_w; h=_h; ox=_ox; oy=_oy; + num=_num; rb1.allocate(w,h,GL_RGB); rb2.allocate(w,h,GL_RGB); seed=ofRandom(1.0f); @@ -37,11 +40,38 @@ void viewport::drawport(vpcontrol &control){ //do whatever with feedback - if (control.fillgrey){ - uint8_t f=(uint8_t)((sin((ofGetElapsedTimef()*control.fillgreyfreq)/seed)+1.0f)*127.50f); + //set draw colour from palette + + if (Palette.isLoaded()){ + ofSetColor(Palette.getBlend((ofGetElapsedTimef()*control.freq*0.0318)/seed)); + } + else { + uint8_t f=(uint8_t)((sin((ofGetElapsedTimef()*control.freq)/seed)+1.0f)*127.50f); ofSetColor(f,f,f); + } + + if (control.fill){ ofRect(0,0,w,h); } + + ofSetLineWidth(3); //control.thickness); + + if(control.wave){ + if (h>w){ + ofBeginShape(); + for (int i = 0; i < h; i++){ + ofVertex((w/2) -(control.right[i+(num*h)]*w),i); + } + ofEndShape(false); + } + else { + ofBeginShape(); + for (int i = 0; i < w; i++){ + ofVertex(i, (h/2) -(control.right[i+(num*w)]*h) ); + } + ofEndShape(false); + } + } rb1.end(); @@ -52,10 +82,10 @@ void viewport::drawport(vpcontrol &control){ rb2.end(); } -void viewport::draw(uint8_t b){ +void viewport::draw(uint8_t b,float s){ ofSetColor(b,b,b); - rb2.draw(ox,oy); + rb2.draw(ox*s,oy*s,w*s,h*s); } diff --git a/src/viewport.h b/src/viewport.h index 7ab1477..b786fe9 100755 --- a/src/viewport.h +++ b/src/viewport.h @@ -4,51 +4,129 @@ #include "ofMain.h" #include "ofxXmlSettings.h" -class vpcontrol { +static int bufferSize = 1024; +static int bufferscale = 4; + +class palette { public: - vpcontrol(){ - fillgrey=false; - fillgreyfreq=1.0f; - xshift=0; - yshift=0; - fscale=1.0f; - } - void loadpalette(string &filename){ + bool load(string &filename){ ofxXmlSettings XML; if( !XML.loadFile(filename) ){ printf("unable to load palette file\n"); }else{ - palette.clear(); - palettename=XML.getAttribute("palette","name","",0); + colours.clear(); + name=XML.getAttribute("palette","name","",0); if(XML.pushTag("palette")) { int numCols=XML.getNumTags("colour"); - for (int i=0;i0; + } + ofColor getBlend(float phase){ + if (colours.size()){ + float scaled=fmod(phase,1.0f)*colours.size(); + int first=(int)scaled; + int second=(first+1)%colours.size(); + float frac=scaled-first; + return colours[first].getLerped(colours[second],frac); + } + else return ofColor(0,0,0); + } + void print(){ + cerr<<"printing palette: "< colours; + string name; + +}; + +class vpcontrol { + public: + vpcontrol(){ + fill=false; + freq=1.0f; + xshift=0; + yshift=0; + fscale=1.0f; + wave=false; + thickness=1.0f; + + left.assign(bufferSize, 0.0); + right.assign(bufferSize, 0.0); + volHistory.assign(400, 0.0); + + bufferCounter = 0; + drawCounter = 0; + smoothedVol = 0.0; + scaledVol = 0.0; + } + void update(){ + //lets scale the vol up to a 0-1 range + scaledVol = ofMap(smoothedVol, 0.0, 0.17, 0.0, 1.0, true); + + //lets record the volume into an array + volHistory.push_back( scaledVol ); + + //if we are bigger the the size we want to record - lets drop the oldest value + if( volHistory.size() >= 400 ){ + volHistory.erase(volHistory.begin(), volHistory.begin()+1); } + } - bool fillgrey; - float fillgreyfreq; + bool fill; + float freq; int xshift,yshift; float fscale,scale; - vector palette; - string palettename; + bool wave; + float thickness; + + vector left; + vector right; + vector volHistory; + + int bufferCounter; + int drawCounter; + + float smoothedVol; + float scaledVol; }; class viewport { public: viewport(); - viewport(int _w,int _h,int _ox,int _oy); + viewport(int _w,int _h,int _ox,int _oy,int _num); virtual ~viewport(); - void setup(int _w,int _h,int _ox,int _oy); + void setup(int _w,int _h,int _ox,int _oy,int _num); void drawport(vpcontrol &control); - void draw(uint8_t brightness); + void draw(uint8_t brightness,float scale=1.0f); ofFbo rb1,rb2; + palette Palette; protected: private: - int x,y,w,h,ox,oy; + int x,y,w,h,ox,oy,num; float seed; }; -- cgit v1.2.3