diff options
| author | Tim Redfern <tim@getdrop.com> | 2018-05-31 18:49:38 +0100 |
|---|---|---|
| committer | Tim Redfern <tim@getdrop.com> | 2018-05-31 18:49:38 +0100 |
| commit | 31a9010253e555091992515c09760ff4118a224b (patch) | |
| tree | 2d71c2a823c6c55870e7a1ef0b278a5d62b5d9ee /gui/src | |
| parent | c28bf33277ef6a7d9ac901f76f6c0e5c4fcbc83d (diff) | |
add audioplotter source
Diffstat (limited to 'gui/src')
| -rw-r--r-- | gui/src/AudioPlotter.cpp | 86 | ||||
| -rw-r--r-- | gui/src/AudioPlotter.h | 53 |
2 files changed, 139 insertions, 0 deletions
diff --git a/gui/src/AudioPlotter.cpp b/gui/src/AudioPlotter.cpp new file mode 100644 index 0000000..dba6765 --- /dev/null +++ b/gui/src/AudioPlotter.cpp @@ -0,0 +1,86 @@ +#include "Audioplotter.h" + +colourPolyline Audioplotter::compute_chaos(colourPolyline& poly,float colourFade){ + colourPolyline tempPoly; + for (int i=0;i<poly.size();i++){ + REAL iv[6]={poly[i].x,poly[i].y,chaos_a,chaos_b,chaos_k,chaos_p}; + //ofLog() << i<<": calculating chaos with: "<<poly[i].x<<" "<<poly[i].y<<" "<<attractor.a<<" "<<attractor.b<<" "<<attractor.k<<" "<<attractor.p; + attractor.set(iv); + attractor.calc(); + //ofLog() << i<<": got points: "<<attractor.nx<<" "<<attractor.ny; + tempPoly.addVertex(ofPoint(attractor.nx,attractor.ny),poly.getColourAt(i)*colourFade); + } + return tempPoly; +} +vector <colourPolyline> Audioplotter::output(float scale,float decay){ + + ofMatrix4x4 x = ofMatrix4x4::newIdentityMatrix(); + x.translate((-ofGetWidth()/2)+((ofVec2f)translate).x,(-ofGetHeight()/2)+((ofVec2f)translate).y,0); + x.rotate(rotate,0,0,1); + //x.scale(((ofVec2f)scale).x,((ofVec2f)scale).y,1.0f); + x.translate((ofGetWidth()/2),(ofGetHeight()/2),0); + //destructive or non? + float fadefactor=decay<0.0f?1.0f-(1.0f/history_size):decay; + + vector <colourPolyline> outdata; + + for (int i=0;i<data.size();i++){ + vector <colourPolyline> newdata; + for (int j=0;j<data[i].size();j++){ + colourPolyline line=lineTransformer::polyLineTransform(x,data[i][j]); //,fadefactor); + line.setColour((line.getColourAt(0)*fadefactor)+(((ofColor)endColour)*(1.0f-fadefactor))); + + if (usechaos) { + colourPolyline chaosline=compute_chaos(line); //,fadefactor); + line.mix(chaosline,chaosamount); + } + + + //ofLog() << "set colour to "<<col; + newdata.push_back(line); + outdata.push_back(line); + } + data[i]=newdata; + } + return outdata; +} +void Audioplotter::addpoints(vector <float> &audio){ + int num=min((int)num_points,(int)audio.size()); + float step=((float)audio.size())/(num+1); + vector <colourPolyline> newdata; + if (joined){ + colourPolyline line; + if (bars){ + for (int i=0;i<num-1;i++){ + line.addVertex(((step*(i+1))*ofGetWidth())/audio.size(),(0.5f+audio[step*(i+1)])*ofGetHeight(),startColour); + line.addVertex(((step*(i+2))*ofGetWidth())/audio.size(),(0.5f+audio[step*(i+1)])*ofGetHeight(),startColour); + line.addVertex(((step*(i+2))*ofGetWidth())/audio.size(),(0.5f+audio[step*(i+2)])*ofGetHeight(),startColour); + } + } + else { + for (int i=0;i<num;i++){ + line.addVertex(((step*(i+1))*ofGetWidth())/audio.size(),(0.5f+audio[step*(i+1)])*ofGetHeight(),startColour); + } + } + newdata.push_back(line); + } + else{ + for (int i=0;i<num;i++){ + colourPolyline line; + line.addVertex(((step*(i+1))*ofGetWidth())/audio.size(),(0.5f+audio[step*(i+1)])*ofGetHeight(),startColour); + line.addVertex(((step*(i+1))*ofGetWidth())/audio.size()+width,(0.5f+audio[step*(i+1)])*ofGetHeight(),startColour); + newdata.push_back(line); + } + } + data.insert(data.begin(),newdata); + while (data.size()>history_size) { + data.pop_back(); + } +} +int Audioplotter::numpoints(){ + int num=0; + for (auto d=data.begin();d!=data.end();d++){ + num+=d->size(); + } + return num; +}
\ No newline at end of file diff --git a/gui/src/AudioPlotter.h b/gui/src/AudioPlotter.h new file mode 100644 index 0000000..a1495c3 --- /dev/null +++ b/gui/src/AudioPlotter.h @@ -0,0 +1,53 @@ +#include "ofMain.h" +#include "ofxAChaoslib.h" + +#include "lineTransformer.h" + +class Audioplotter{ + //store and draw a numbr of audio samples + //how best to handle transforms - maybe pass in a transform to be added to 2nd and subsequent + //how best to handle length of history data - fixed number that can be set, or line budget? +public: + Audioplotter(int _size=1,bool _joined=true,bool _bars=false,int _width=2){ + setup(_size,_joined,_bars,_width); + } + void setup(int _size=1,bool _joined=true,bool _bars=false,int _width=2){ + history_size=_size; + joined=_joined; + bars=_bars; + width=_width; + startColour=ofColor(255,255,255); + endColour=ofColor(0,0,0); + attractor.setup(); + } + colourPolyline compute_chaos(colourPolyline& poly,float colourFade=1.0f); + vector <colourPolyline> output(float scale=1.0f,float decay=-1.0f); + void addpoints(vector <float> &audio); + int numpoints(); + + ofParameter<bool> joined; + ofParameter<bool> bars; + ofParameter<int> width; + ofParameter<int> history_size; + ofParameter<int> num_points; + +//feedback transformation + ofParameter<ofVec2f> translate; + ofParameter<float> rotate; + ofParameter<ofVec2f> scale; + + ofParameter<ofColor> startColour; + ofParameter<ofColor> endColour; + + ofParameter<bool> usechaos; + ofParameter<float> chaosamount; + ofParameter<float> chaos_a; + ofParameter<float> chaos_b; + ofParameter<float> chaos_k; + ofParameter<float> chaos_p; + +private: + vector < vector<colourPolyline>> data; + AChaosIkeda attractor; + +};
\ No newline at end of file |
