+ float xlv = 100*xl.getValuef();
+ float ylv = 100*yl.getValuef();
+ float zlv = 100*zl.getValuef();
+
+ float xwv = 100. / (10 + 40*xw.getValuef());
+ float ywv = 100. / (10 + 40*yw.getValuef());
+ float zwv = 100. / (10 + 40*zw.getValuef());
+
+ for (Point p : model.points) {
+ color c = 0;
+ c = blendColor(c, color(
+ (lx.getBaseHuef() + p.fx/10 + p.fy/3) % 360,
+ constrain(140 - 1.1*abs(p.fx - model.xMax/2.), 0, 100),
+ max(0, xlv - xwv*abs(p.fx - xv))
+ ), ADD);
+ c = blendColor(c, color(
+ (lx.getBaseHuef() + 80 + p.fy/10) % 360,
+ constrain(140 - 2.2*abs(p.fy - model.yMax/2.), 0, 100),
+ max(0, ylv - ywv*abs(p.fy - yv))
+ ), ADD);
+ c = blendColor(c, color(
+ (lx.getBaseHuef() + 160 + p.fz / 10 + p.fy/2) % 360,
+ constrain(140 - 2.2*abs(p.fz - model.zMax/2.), 0, 100),
+ max(0, zlv - zwv*abs(p.fz - zv))
+ ), ADD);
+ colors[p.index] = c;
+ }
+ }
+}
+
+class Blinders extends SCPattern {
+
+ final SinLFO[] m;
+ final TriangleLFO r;
+ final SinLFO s;
+ final TriangleLFO hs;
+
+ public Blinders(GLucose glucose) {
+ super(glucose);
+ m = new SinLFO[12];
+ for (int i = 0; i < m.length; ++i) {
+ addModulator(m[i] = new SinLFO(0.5, 120, (120000. / (3+i)))).trigger();
+ }
+ addModulator(r = new TriangleLFO(9000, 15000, 29000)).trigger();
+ addModulator(s = new SinLFO(-20, 275, 11000)).trigger();
+ addModulator(hs = new TriangleLFO(0.1, 0.5, 15000)).trigger();
+ s.modulateDurationBy(r);
+ }
+
+ public void run(double deltaMs) {
+ float hv = lx.getBaseHuef();
+ int si = 0;
+ for (Strip strip : model.strips) {
+ int i = 0;
+ float mv = m[si % m.length].getValuef();
+ for (Point p : strip.points) {
+ colors[p.index] = color(
+ (hv + p.fz + p.fy*hs.getValuef()) % 360,
+ min(100, abs(p.fx - s.getValuef())/2.),
+ max(0, 100 - mv/2. - mv * abs(i - (strip.metrics.length-1)/2.))
+ );
+ ++i;
+ }
+ ++si;
+ }
+ }
+}
+
+class Psychedelia extends SCPattern {
+
+ final int NUM = 3;
+ SinLFO m = new SinLFO(-0.5, NUM-0.5, 9000);
+ SinLFO s = new SinLFO(-20, 147, 11000);
+ TriangleLFO h = new TriangleLFO(0, 240, 19000);
+ SinLFO c = new SinLFO(-.2, .8, 31000);
+
+ Psychedelia(GLucose glucose) {
+ super(glucose);
+ addModulator(m).trigger();
+ addModulator(s).trigger();
+ addModulator(h).trigger();
+ addModulator(c).trigger();
+ }
+
+ void run(double deltaMs) {
+ float huev = h.getValuef();
+ float cv = c.getValuef();
+ float sv = s.getValuef();
+ float mv = m.getValuef();
+ int i = 0;
+ for (Strip strip : model.strips) {
+ for (Point p : strip.points) {
+ colors[p.index] = color(
+ (huev + i*constrain(cv, 0, 2) + p.fz/2. + p.fx/4.) % 360,
+ min(100, abs(p.fy-sv)),
+ max(0, 100 - 50*abs((i%NUM) - mv))
+ );