Commit | Line | Data |
---|---|---|
a673599f | 1 | class GlitchPlasma extends SCPattern { |
4ad0649d TS |
2 | private int pos = 0; |
3 | private float satu = 100; | |
4 | private float speed = 1; | |
64d16e07 | 5 | private float glitch = 0; |
4ad0649d TS |
6 | BasicParameter saturationParameter = new BasicParameter("SATU", 1.0); |
7 | BasicParameter speedParameter = new BasicParameter("SPEED", 0.1); | |
64d16e07 | 8 | BasicParameter glitchParameter = new BasicParameter("GLITCH", 0.0); |
4ad0649d | 9 | |
dde75983 MS |
10 | public GlitchPlasma(LX lx) { |
11 | super(lx); | |
4ad0649d TS |
12 | addParameter(saturationParameter); |
13 | addParameter(speedParameter); | |
64d16e07 | 14 | addParameter(glitchParameter); |
4ad0649d TS |
15 | } |
16 | public void onParameterChanged(LXParameter parameter) { | |
17 | if (parameter == saturationParameter) { | |
18 | satu = 100*parameter.getValuef(); | |
19 | } else if (parameter == speedParameter) { | |
a673599f | 20 | speed = 8*parameter.getValuef(); |
64d16e07 TS |
21 | } else if (parameter == glitchParameter) { |
22 | glitch = parameter.getValuef(); | |
4ad0649d TS |
23 | } |
24 | } | |
25 | ||
34327c96 | 26 | public void run(double deltaMs) { |
2bb56822 | 27 | for (LXPoint p : model.points) { |
190d91c2 MS |
28 | float hv = sin(dist(p.x + pos, p.y, 128.0, 128.0) / 8.0) |
29 | + sin(dist(p.x, p.y, 64.0, 64.0) / 8.0) | |
30 | + sin(dist(p.x, p.y + pos / 7, 192.0, 64.0) / 7.0) | |
31 | + sin(dist(p.x, p.z + pos, 192.0, 100.0) / 8.0); | |
4ad0649d | 32 | float bv = 100; |
a41f334c | 33 | colors[p.index] = lx.hsb((hv+2)*50, satu, bv); |
4ad0649d | 34 | } |
a673599f TS |
35 | if (random(1.0)<glitch/20) { |
36 | pos=pos-int(random(10,30)); | |
64d16e07 | 37 | } |
4ad0649d | 38 | pos+=speed; |
64d16e07 | 39 | if (pos >= MAX_INT-1) pos=0; |
4ad0649d TS |
40 | } |
41 | } | |
42 | ||
99c99d34 | 43 | // This is very much a work in progress. Trying to get a flame effect. |
64d16e07 | 44 | class FireEffect extends SCPattern { |
4ad0649d TS |
45 | private float[][] intensity; |
46 | private float hotspot; | |
47 | private float decay = 0.3; | |
48 | private int xm; | |
49 | private int ym; | |
50 | BasicParameter decayParameter = new BasicParameter("DECAY", 0.3); | |
51 | ||
dde75983 MS |
52 | public FireEffect(LX lx) { |
53 | super(lx); | |
4ad0649d TS |
54 | xm = int(model.xMax); |
55 | ym = int(model.yMax); | |
56 | ||
57 | intensity = new float[xm][ym]; | |
58 | addParameter(decayParameter); | |
59 | } | |
60 | public void onParameterChanged(LXParameter parameter) { | |
61 | if (parameter == decayParameter) { | |
62 | decay = parameter.getValuef(); | |
63 | } | |
64 | } | |
65 | private color flameColor(float level) { | |
a41f334c | 66 | if (level<=0) return lx.hsb(0,0,0); |
4ad0649d | 67 | float br=min(100,sqrt(level)*15); |
a41f334c | 68 | return lx.hsb(level/1.7,100,br); |
4ad0649d | 69 | } |
34327c96 | 70 | public void run(double deltaMs) { |
4ad0649d TS |
71 | for (int x=10;x<xm-10;x++) { |
72 | if (x%50>45 || x%50<5) { | |
73 | intensity[x][ym-1] = random(30,100); | |
74 | } else { | |
75 | intensity[x][ym-1] = random(0,50); | |
76 | } | |
77 | } | |
78 | for (int x=1;x<xm-1;x++) { | |
79 | for (int y=0;y<ym-1;y++) { | |
80 | intensity[x][y] = (intensity[x-1][y+1]+intensity[x][y+1]+intensity[x+1][y+1])/3-decay; | |
81 | } | |
82 | } | |
83 | ||
2bb56822 | 84 | for (LXPoint p : model.points) { |
190d91c2 MS |
85 | int x = max(0,(int(p.x)+int(p.z))%xm); |
86 | int y = constrain(ym-int(p.y),0,ym-1); | |
4ad0649d TS |
87 | colors[p.index] = flameColor(intensity[x][y]); |
88 | } | |
89 | } | |
90 | } | |
64d16e07 | 91 | |
b4aaf4e4 TS |
92 | class StripBounce extends SCPattern { |
93 | private final int numOsc = 30; | |
94 | SinLFO[] fX = new SinLFO[numOsc]; //new SinLFO(0, model.xMax, 5000); | |
95 | SinLFO[] fY = new SinLFO[numOsc]; //new SinLFO(0, model.yMax, 4000); | |
96 | SinLFO[] fZ = new SinLFO[numOsc]; //new SinLFO(0, model.yMax, 3000); | |
97 | SinLFO[] sat = new SinLFO[numOsc]; | |
98 | float[] colorOffset = new float[numOsc]; | |
99 | ||
dde75983 MS |
100 | public StripBounce(LX lx) { |
101 | super(lx); | |
b4aaf4e4 TS |
102 | for (int i=0;i<numOsc;i++) { |
103 | fX[i] = new SinLFO(0, model.xMax, random(2000,20000)); | |
104 | fY[i] = new SinLFO(0, model.yMax, random(2000,20000)); | |
105 | fZ[i] = new SinLFO(0, model.zMax, random(2000,20000)); | |
106 | sat[i] = new SinLFO(60, 100, random(2000,50000)); | |
107 | addModulator(fX[i]).trigger(); | |
108 | addModulator(fY[i]).trigger(); | |
109 | addModulator(fZ[i]).trigger(); | |
821ceae9 | 110 | colorOffset[i]=random(0,256); |
b4aaf4e4 TS |
111 | } |
112 | } | |
113 | ||
34327c96 | 114 | public void run(double deltaMs) { |
b4aaf4e4 TS |
115 | float[] bright = new float[model.points.size()]; |
116 | for (Strip strip : model.strips) { | |
117 | for (int i=0;i<numOsc;i++) { | |
118 | float avgdist=0.0; | |
190d91c2 | 119 | avgdist = dist(strip.points.get(8).x,strip.points.get(8).y,strip.points.get(8).z,fX[i].getValuef(),fY[i].getValuef(),fZ[i].getValuef()); |
b4aaf4e4 | 120 | boolean on = avgdist<30; |
821ceae9 | 121 | float hv = (lx.getBaseHuef()+colorOffset[i])%360; |
b4aaf4e4 | 122 | float br = max(0,100-avgdist*4); |
2bb56822 | 123 | for (LXPoint p : strip.points) { |
b4aaf4e4 | 124 | if (on && br>bright[p.index]) { |
a41f334c | 125 | colors[p.index] = lx.hsb(hv,sat[i].getValuef(),br); |
b4aaf4e4 TS |
126 | bright[p.index] = br; |
127 | } | |
128 | } | |
129 | } | |
130 | } | |
10692893 TS |
131 | } |
132 | } | |
133 | ||
821ceae9 | 134 | class SoundRain extends SCPattern { |
10692893 TS |
135 | |
136 | private FFT fft = null; | |
137 | private LinearEnvelope[] bandVals = null; | |
1b8ec15f | 138 | private float[] lightVals = null; |
10692893 | 139 | private int avgSize; |
956c6cec | 140 | private float gain = 25; |
1b8ec15f | 141 | SawLFO pos = new SawLFO(0, 9, 8000); |
dbf92cee | 142 | SinLFO col1 = new SinLFO(0, model.xMax, 5000); |
956c6cec | 143 | BasicParameter gainParameter = new BasicParameter("GAIN", 0.5); |
1b8ec15f | 144 | |
dde75983 MS |
145 | public SoundRain(LX lx) { |
146 | super(lx); | |
1b8ec15f | 147 | addModulator(pos).trigger(); |
dbf92cee | 148 | addModulator(col1).trigger(); |
956c6cec | 149 | addParameter(gainParameter); |
10692893 TS |
150 | } |
151 | ||
956c6cec TS |
152 | public void onParameterChanged(LXParameter parameter) { |
153 | if (parameter == gainParameter) { | |
154 | gain = 50*parameter.getValuef(); | |
155 | } | |
156 | } | |
4e6626a9 | 157 | void onActive() { |
10692893 TS |
158 | if (this.fft == null) { |
159 | this.fft = new FFT(lx.audioInput().bufferSize(), lx.audioInput().sampleRate()); | |
160 | this.fft.window(FFT.HAMMING); | |
161 | this.fft.logAverages(40, 1); | |
162 | this.avgSize = this.fft.avgSize(); | |
163 | this.bandVals = new LinearEnvelope[this.avgSize]; | |
164 | for (int i = 0; i < this.bandVals.length; ++i) { | |
165 | this.addModulator(this.bandVals[i] = (new LinearEnvelope(0, 0, 700+i*4))).trigger(); | |
b4aaf4e4 | 166 | } |
1b8ec15f | 167 | lightVals = new float[avgSize]; |
b4aaf4e4 TS |
168 | } |
169 | } | |
10692893 | 170 | |
34327c96 | 171 | public void run(double deltaMs) { |
10692893 | 172 | this.fft.forward(this.lx.audioInput().mix); |
10692893 TS |
173 | for (int i = 0; i < avgSize; ++i) { |
174 | float value = this.fft.getAvg(i); | |
175 | this.bandVals[i].setEndVal(value,40).trigger(); | |
956c6cec | 176 | float lv = min(value*gain,100); |
821ceae9 | 177 | if (lv>lightVals[i]) { |
f5d9de39 | 178 | lightVals[i]=min(lightVals[i]+15,lv,100); |
1b8ec15f | 179 | } else { |
821ceae9 | 180 | lightVals[i]=max(lv,lightVals[i]-5,0); |
1b8ec15f | 181 | } |
10692893 | 182 | } |
dbf92cee TS |
183 | for (Cube c : model.cubes) { |
184 | for (int j=0; j<c.strips.size(); j++) { | |
185 | Strip s = c.strips.get(j); | |
186 | if (j%4!=0 && j%4!=2) { | |
2bb56822 | 187 | for (LXPoint p : s.points) { |
190d91c2 | 188 | int seq = int(p.y*avgSize/model.yMax+pos.getValuef()+sin(p.x+p.z)*2)%avgSize; |
e608336b | 189 | seq=min(abs(seq-(avgSize/2)),avgSize-1); |
a41f334c | 190 | colors[p.index] = lx.hsb(200,max(0,100-abs(p.x-col1.getValuef())/2),lightVals[seq]); |
dbf92cee TS |
191 | } |
192 | } | |
1b8ec15f | 193 | } |
10692893 TS |
194 | } |
195 | } | |
b4aaf4e4 | 196 | } |
821ceae9 TS |
197 | |
198 | class FaceSync extends SCPattern { | |
199 | SinLFO xosc = new SinLFO(-10, 10, 3000); | |
200 | SinLFO zosc = new SinLFO(-10, 10, 3000); | |
dbf92cee TS |
201 | SinLFO col1 = new SinLFO(0, model.xMax, 5000); |
202 | SinLFO col2 = new SinLFO(0, model.xMax, 4000); | |
821ceae9 | 203 | |
dde75983 MS |
204 | public FaceSync(LX lx) { |
205 | super(lx); | |
821ceae9 TS |
206 | addModulator(xosc).trigger(); |
207 | addModulator(zosc).trigger(); | |
208 | zosc.setValue(0); | |
dbf92cee TS |
209 | addModulator(col1).trigger(); |
210 | addModulator(col2).trigger(); | |
211 | col2.setValue(model.xMax); | |
821ceae9 TS |
212 | } |
213 | ||
34327c96 | 214 | public void run(double deltaMs) { |
821ceae9 | 215 | int i=0; |
254fbb68 | 216 | for (Strip s : model.strips) { |
821ceae9 | 217 | i++; |
2bb56822 | 218 | for (LXPoint p : s.points) { |
821ceae9 | 219 | float dx, dz; |
254fbb68 | 220 | if (i%32 < 16) { |
190d91c2 MS |
221 | dx = p.x - (s.cx+xosc.getValuef()); |
222 | dz = p.z - (s.cz+zosc.getValuef()); | |
821ceae9 | 223 | } else { |
190d91c2 MS |
224 | dx = p.x - (s.cx+zosc.getValuef()); |
225 | dz = p.z - (s.cz+xosc.getValuef()); | |
821ceae9 TS |
226 | } |
227 | //println(dx); | |
190d91c2 MS |
228 | float a1=max(0,100-abs(p.x-col1.getValuef())); |
229 | float a2=max(0,100-abs(p.x-col2.getValuef())); | |
dbf92cee TS |
230 | float sat = max(a1,a2); |
231 | float h = (359*a1+200*a2) / (a1+a2); | |
a41f334c | 232 | colors[p.index] = lx.hsb(h,sat,100-abs(dx*5)-abs(dz*5)); |
821ceae9 TS |
233 | } |
234 | } | |
235 | } | |
236 | } | |
f5d9de39 TS |
237 | |
238 | class SoundSpikes extends SCPattern { | |
239 | private FFT fft = null; | |
240 | private LinearEnvelope[] bandVals = null; | |
241 | private float[] lightVals = null; | |
242 | private int avgSize; | |
243 | private float gain = 25; | |
244 | BasicParameter gainParameter = new BasicParameter("GAIN", 0.5); | |
245 | SawLFO pos = new SawLFO(0, model.xMax, 8000); | |
246 | ||
dde75983 MS |
247 | public SoundSpikes(LX lx) { |
248 | super(lx); | |
f5d9de39 TS |
249 | addParameter(gainParameter); |
250 | addModulator(pos).trigger(); | |
251 | } | |
252 | ||
253 | public void onParameterChanged(LXParameter parameter) { | |
254 | if (parameter == gainParameter) { | |
255 | gain = 50*parameter.getValuef(); | |
256 | } | |
257 | } | |
4e6626a9 | 258 | void onActive() { |
f5d9de39 TS |
259 | if (this.fft == null) { |
260 | this.fft = new FFT(lx.audioInput().bufferSize(), lx.audioInput().sampleRate()); | |
261 | this.fft.window(FFT.HAMMING); | |
262 | this.fft.logAverages(40, 1); | |
263 | this.avgSize = this.fft.avgSize(); | |
264 | this.bandVals = new LinearEnvelope[this.avgSize]; | |
265 | for (int i = 0; i < this.bandVals.length; ++i) { | |
266 | this.addModulator(this.bandVals[i] = (new LinearEnvelope(0, 0, 700+i*4))).trigger(); | |
267 | } | |
268 | lightVals = new float[avgSize]; | |
269 | } | |
270 | } | |
271 | ||
34327c96 | 272 | public void run(double deltaMs) { |
f5d9de39 TS |
273 | this.fft.forward(this.lx.audioInput().mix); |
274 | for (int i = 0; i < avgSize; ++i) { | |
275 | float value = this.fft.getAvg(i); | |
276 | this.bandVals[i].setEndVal(value,40).trigger(); | |
277 | float lv = min(value*gain,model.yMax+10); | |
278 | if (lv>lightVals[i]) { | |
279 | lightVals[i]=min(lightVals[i]+30,lv,model.yMax+10); | |
280 | } else { | |
281 | lightVals[i]=max(lv,lightVals[i]-10,0); | |
282 | } | |
283 | } | |
284 | int i = 0; | |
285 | for (Cube c : model.cubes) { | |
286 | for (int j=0; j<c.strips.size(); j++) { | |
287 | Strip s = c.strips.get(j); | |
288 | if (j%4!=0 && j%4!=2) { | |
2bb56822 | 289 | for (LXPoint p : s.points) { |
190d91c2 | 290 | float dis = (abs(p.x-model.xMax/2)+pos.getValuef())%model.xMax/2; |
f5d9de39 TS |
291 | int seq = int((dis*avgSize*2)/model.xMax); |
292 | if (seq>avgSize) seq=avgSize-seq; | |
293 | seq=constrain(seq,0,avgSize-1); | |
190d91c2 | 294 | float br=max(0, lightVals[seq]-p.y); |
a41f334c | 295 | colors[p.index] = lx.hsb((dis*avgSize*65)/model.xMax,90,br); |
f5d9de39 TS |
296 | } |
297 | } | |
298 | } | |
299 | } | |
300 | } | |
301 | } | |
302 |