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
|
#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);
line.mix(chaosline,chaosamount);
}
//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;
}
|