summaryrefslogtreecommitdiff
path: root/gui/src/AudioPlotter.cpp
blob: 3c43a5db8fe122334d972262a27a4a9dd9a349db (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#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-(ofGetWidth()/2))/chaosscale,(poly[i].y-(ofGetHeight()/2))/chaosscale,chaos_a,chaos_b,chaos_k,chaos_p};
            //ofLog() << i<<": calculating chaos with: "<<poly[i].x<<"->"<<((poly[i].x-(ofGetWidth()/2))/chaosscale)<<" "<<poly[i].y<<"->"<<((poly[i].y-(ofGetHeight()/2))/chaosscale)<<" "<<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*chaosscale)+(ofGetWidth()/2),(attractor.ny*chaosscale)+(ofGetHeight()/2)),poly.getColourAt(i)*colourFade);
    }
    return tempPoly;
}
vector <colourPolyline> Audioplotter::output(float plotscale,float plotdecay){

        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);


        ofMatrix4x4 flip = ofMatrix4x4::newIdentityMatrix();
        flip.translate((-ofGetWidth()/2),(-ofGetHeight()/2),0);
        flip.scale(-1.0f,1.0f,1.0f);
        flip.translate((ofGetWidth()/2),(ofGetHeight()/2),0);
    //destructive or non?
            float fadefactor=plotdecay<0.0f?1.0f-(1.0f/history_size):plotdecay;

            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);
                                    ofLog() << "computing chaos at "<<chaosamount<<" in: "<<line.size()<<" out: "<<chaosline.size()<<" point 0:"<<line[0].x<<","<<line[0].y;
                                    line.mix(chaosline,chaosamount); //chaos

                            }

                            
                            //ofLog() << "set colour to "<<col;
                            newdata.push_back(line);
                            outdata.push_back(line);

                    }
                    data[i]=newdata;
                    if (mirror){
                        for (int j=0;j<data[i].size();j++){
                            outdata.push_back(lineTransformer::polyLineTransform(flip,data[i][j]));
                        }
                    }
            }
            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&&num>1){
                    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;
                if (random){
                    float in=ofRandom(0.0f,audio.size());
                    line.addVertex(((in*ofGetWidth())/audio.size())-(width/2),(0.5f+audio[in])*ofGetHeight(),startColour);
                    line.addVertex(((in*ofGetWidth())/audio.size())+(width/2),(0.5f+audio[in])*ofGetHeight(),startColour);
                }
                else {
                    line.addVertex(((step*(i+1))*ofGetWidth())/audio.size()-(width/2),(0.5f+audio[step*(i+1)])*ofGetHeight(),startColour);
                    line.addVertex(((step*(i+1))*ofGetWidth())/audio.size()+(width/2),(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();
    }
}
void Audioplotter::blankframe(){
    vector <colourPolyline> newdata;
    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;
}