summaryrefslogtreecommitdiff
path: root/gui
diff options
context:
space:
mode:
authorTim Redfern <tim@getdrop.com>2018-05-31 18:49:38 +0100
committerTim Redfern <tim@getdrop.com>2018-05-31 18:49:38 +0100
commit31a9010253e555091992515c09760ff4118a224b (patch)
tree2d71c2a823c6c55870e7a1ef0b278a5d62b5d9ee /gui
parentc28bf33277ef6a7d9ac901f76f6c0e5c4fcbc83d (diff)
add audioplotter source
Diffstat (limited to 'gui')
-rw-r--r--gui/src/AudioPlotter.cpp86
-rw-r--r--gui/src/AudioPlotter.h53
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