Merge branch 'master' into tobysegaran
authorToby Segaran <tobys@tobys-macbookpro2.local>
Mon, 12 Aug 2013 00:51:00 +0000 (17:51 -0700)
committerToby Segaran <tobys@tobys-macbookpro2.local>
Mon, 12 Aug 2013 00:51:00 +0000 (17:51 -0700)
Conflicts:
SugarCubes.pde

SugarCubes.pde
TobySegaran.pde

index a7210f3054b4504807939381d72e82559c6db3be..bb55e6fea0ca40c693dc7169ca9d9877d17cd275 100644 (file)
@@ -36,9 +36,10 @@ LXPattern[] patterns(GLucose glucose) {
     new Psychedelia(glucose),
     new CubeEQ(glucose),
     new PianoKeyPattern(glucose),
-    new WarmPlasma(glucose),
-    // new FireTest(glucose),
-    // new SineSphere(glucose),
+    new GlitchPlasma(glucose),
+    new FireEffect(glucose),
+    new StripBounce(glucose),
+    new SoundCubes(glucose),
     
     // Basic test patterns for reference, not art    
     new TestCubePattern(glucose),
index 650bbb027abe2fb8a7fb73343afb0210dc831741..2eba4cfd5f74f324461b1e6dcd3d2c88d292494d 100644 (file)
@@ -1,20 +1,25 @@
-class WarmPlasma extends SCPattern {
+class GlitchPlasma extends SCPattern {
   private int pos = 0;
   private float satu = 100;
   private float speed = 1;
+  private float glitch = 0;
   BasicParameter saturationParameter = new BasicParameter("SATU", 1.0);
   BasicParameter speedParameter = new BasicParameter("SPEED", 0.1);
+  BasicParameter glitchParameter = new BasicParameter("GLITCH", 0.0);
   
-  public WarmPlasma(GLucose glucose) {
+  public GlitchPlasma(GLucose glucose) {
     super(glucose);
     addParameter(saturationParameter);
     addParameter(speedParameter);
+    addParameter(glitchParameter);
   }
   public void onParameterChanged(LXParameter parameter) {
     if (parameter == saturationParameter) {
       satu = 100*parameter.getValuef();
     } else if (parameter == speedParameter) {
-      speed = 10*parameter.getValuef();
+      speed = 8*parameter.getValuef();
+    } else if (parameter == glitchParameter) {
+      glitch = parameter.getValuef();
     }
   }
 
@@ -27,13 +32,16 @@ class WarmPlasma extends SCPattern {
       float bv = 100;
       colors[p.index] = color((hv+2)*25, satu, bv);
     }
+    if (random(1.0)<glitch/20) {
+      pos=pos-int(random(10,30));
+    }
     pos+=speed;
-    if (pos >= MAX_INT-1) pos=0;
+    if (pos >= MAX_INT-1) pos=0;    
   }
 }
 
 // This is very much a work in progress. Trying to get a flame effect.
-class FireTest extends SCPattern {
+class FireEffect extends SCPattern {
   private float[][] intensity;
   private float hotspot;
   private float decay = 0.3;
@@ -41,7 +49,7 @@ class FireTest extends SCPattern {
   private int ym;
   BasicParameter decayParameter = new BasicParameter("DECAY", 0.3);
   
-  public FireTest(GLucose glucose) {
+  public FireEffect(GLucose glucose) {
     super(glucose);
     xm = int(model.xMax);
     ym = int(model.yMax);
@@ -74,9 +82,87 @@ class FireTest extends SCPattern {
     }
     
     for (Point p : model.points) {
-      int x = (int(p.fx)+int(p.fz))%xm;
-      int y = min(ym-int(p.fy),ym-1);
+      int x = max(0,(int(p.fx)+int(p.fz))%xm);
+      int y = constrain(ym-int(p.fy),0,ym-1);
       colors[p.index] = flameColor(intensity[x][y]);
     }
   }
 }
+
+class StripBounce extends SCPattern {
+  private final int numOsc = 30;
+  SinLFO[] fX = new SinLFO[numOsc]; //new SinLFO(0, model.xMax, 5000);
+  SinLFO[] fY = new SinLFO[numOsc]; //new SinLFO(0, model.yMax, 4000);
+  SinLFO[] fZ = new SinLFO[numOsc]; //new SinLFO(0, model.yMax, 3000);
+  SinLFO[] sat = new SinLFO[numOsc];
+  float[] colorOffset = new float[numOsc];
+  
+  public StripBounce(GLucose glucose) {
+    super(glucose);
+    for (int i=0;i<numOsc;i++) {
+      fX[i] = new SinLFO(0, model.xMax, random(2000,20000)); 
+      fY[i] = new SinLFO(0, model.yMax, random(2000,20000)); 
+      fZ[i] = new SinLFO(0, model.zMax, random(2000,20000)); 
+      sat[i] = new SinLFO(60, 100, random(2000,50000)); 
+      addModulator(fX[i]).trigger();      
+      addModulator(fY[i]).trigger();
+      addModulator(fZ[i]).trigger();
+      colorOffset[i]=random(0,100);
+    }
+  }
+  
+  public void run(int deltaMs) {
+    float[] bright = new float[model.points.size()];
+    for (Strip strip : model.strips) {
+      for (int i=0;i<numOsc;i++) {
+        float avgdist=0.0;
+        avgdist = dist(strip.points.get(8).fx,strip.points.get(8).fy,strip.points.get(8).fz,fX[i].getValuef(),fY[i].getValuef(),fZ[i].getValuef());
+        boolean on = avgdist<30;
+        float hv = (lx.getBaseHuef()+colorOffset[i])%100;
+        float br = max(0,100-avgdist*4);
+        for (Point p : strip.points) {
+          if (on && br>bright[p.index]) {
+            colors[p.index] = color(hv,sat[i].getValuef(),br);
+            bright[p.index] = br;
+          }
+        }
+      }
+    }
+  }
+}
+
+class SoundCubes extends SCPattern {
+
+  private FFT fft = null; 
+  private LinearEnvelope[] bandVals = null;
+  private int avgSize;
+    
+  public SoundCubes(GLucose glucose) {
+    super(glucose);
+  }
+
+  protected void onActive() {
+    if (this.fft == null) {
+      this.fft = new FFT(lx.audioInput().bufferSize(), lx.audioInput().sampleRate());
+      this.fft.window(FFT.HAMMING);
+      this.fft.logAverages(40, 1);
+      this.avgSize = this.fft.avgSize();
+      this.bandVals = new LinearEnvelope[this.avgSize];
+      for (int i = 0; i < this.bandVals.length; ++i) {
+        this.addModulator(this.bandVals[i] = (new LinearEnvelope(0, 0, 700+i*4))).trigger();
+      }
+    }
+  }
+  
+  public void run(int deltaMs) {
+    this.fft.forward(this.lx.audioInput().mix);
+
+    for (int i = 0; i < avgSize; ++i) {
+      float value = this.fft.getAvg(i);
+      this.bandVals[i].setEndVal(value,40).trigger();
+    }
+    for (Point p : model.points) {
+      colors[p.index] = color(100,0,bandVals[1].getValuef()*25 );
+    }
+  }  
+}