This is the working branch from my desktop, that drives the cubes well with no bugs...
[SugarCubes.git] / DanKaminsky.pde
diff --git a/DanKaminsky.pde b/DanKaminsky.pde
new file mode 100644 (file)
index 0000000..59bde73
--- /dev/null
@@ -0,0 +1,268 @@
+class GenericController {
+    GenericController(){}
+    public void RotateKnob(int type, int num, float val){
+      LXParameter p = null;
+      if(type==0) {
+        p = glucose.patternKnobs.get(num);
+        if(p!=null) { p.setValue(val); }
+      }
+      if(type==1) {
+        p = glucose.transitionKnobs.get(num);
+        if(p!=null) { p.setValue(val); }
+      }
+      if(type==2) {
+        p = glucose.effectKnobs.get(num);
+        if(p!=null) { p.setValue(val); }
+      }
+    }
+}
+
+class MidiController extends GenericController {
+  MidiController() {
+     super();
+  }  
+}
+//PApplet xparent;  // be sure to set
+
+
+
+OscP5 listener;
+// Setup OSC
+//listener = new OscP5(this,7022);
+
+//boolean[] noteState = new boolean[16];
+//
+//void controllerChangeReceived(rwmidi.Controller cc) {
+//  if (debugMode) {
+//    println("CC: " + cc.toString());
+//  }
+//  if(cc.getCC()==1){
+//    for(int i=0; i<16; i++){
+//      if(noteState[i] && i<8)  { LXParameter p = glucose.patternKnobs.get(i); p.setValue(cc.getValue()/127.0); }
+//      else if(noteState[i] && i<12) { LXParameter p = glucose.transitionKnobs.get(i-8); p.setValue(cc.getValue()/127.0); }
+//      else if(noteState[i] && i<16) { LXParameter p = glucose.effectKnobs.get(i-12); p.setValue(cc.getValue()/127.0); }
+//    }
+//  }
+//}
+//
+//void noteOnReceived(Note note) {
+//  if (debugMode) {
+//    println("Note On: " + note.toString());
+//  }
+//  int pitch = note.getPitch();
+//  if(pitch>=36 && pitch <36+16){
+//    noteState[pitch-36]=true;
+//  }
+//}
+//
+//void noteOffReceived(Note note) {
+//  if (debugMode) {
+//    println("Note Off: " + note.toString());
+//  }
+//  int pitch = note.getPitch();
+//  if(pitch>=36 && pitch <36+16){
+//    noteState[pitch-36]=false;
+//  }
+//}
+//
+//void oscEvent(OscMessage theOscMessage) {
+//  println(theOscMessage);
+//  LXPattern currentPattern = lx.getPattern();
+//  if (currentPattern instanceof OSCPattern) {
+//    ((OSCPattern)currentPattern).oscEvent(theOscMessage);
+//  }
+//}
+//
+
+
+class ObjectMuckerEffect extends SCEffect {
+  ObjectMuckerEffect(GLucose glucose) {
+    super(glucose);
+  }
+  public void doApply(int[] colors){
+    /*for(Strip s: model.strips){
+      for(int i=0; i<s.points.size(); i++){
+         int index = s.points.get(i).index;
+         color c = colors[index];
+         colors[index] = color((i*22.5), saturation(c), brightness(c));
+      }
+    }*/
+  }
+}
+
+class BlendFrames extends SCEffect {
+  int fcount;
+  int frames[][];
+  int maxfbuf;
+  int blendfactor;
+  BlendFrames(GLucose glucose) {
+    super(glucose);
+    maxfbuf = 30;
+    blendfactor=30;
+    fcount=0;
+    frames = new int[maxfbuf][];
+    for(int i=0; i<maxfbuf; i++){
+       frames[i] = new int[model.points.size()];       
+    }
+  }
+  public void doApply(int[] colors) {
+    if(fcount<maxfbuf){
+      for(int i=0; i<colors.length; i++){
+        frames[(maxfbuf-1)-fcount][i]=colors[i];
+      }
+      fcount++;
+      return;
+    } else {
+      for(int i=maxfbuf-1; i>0; i--){
+        frames[i] = frames[i-1];
+      }
+      frames[0] = new int[model.points.size()];
+      
+      for(int i=0; i<colors.length; i++){
+        int r,g,b;
+        r=g=b=0;
+        for(int j=0; j<blendfactor; j++){          
+          if(j==0) { frames[0][i] = colors[i]; }
+          r += ((frames[j][i] >> 16) & 0xFF);
+          g += ((frames[j][i] >> 8) & 0xFF);
+          b += ((frames[j][i] >> 0) & 0xFF);
+        }
+        r/=blendfactor;
+        g/=blendfactor;
+        b/=blendfactor;
+        colorMode(ARGB);
+        colors[i] = (0xFF << 24) | (r << 16) | (g << 8) | b;
+        colorMode(HSB);
+      }
+            
+    }
+  }
+}
+
+
+import netP5.*;
+import oscP5.*;
+
+
+
+abstract class OSCPattern extends SCPattern {
+  public OSCPattern(GLucose glucose){super(glucose);}
+  public abstract void oscEvent(OscMessage msg);
+}
+
+class Ball {
+  public int lastSeen;
+  public float x,y;
+  public Ball(){
+    x=y=lastSeen=0;  
+  }
+}
+
+class OSC_Balls extends OSCPattern {
+  Ball[] balls;
+  public OSC_Balls(GLucose glucose){
+    super(glucose);
+    balls = new Ball[20];
+    for(int i=0; i<balls.length; i++) { balls[i] = new Ball(); }    
+  }
+  void oscEvent(OscMessage msg){
+    String pattern[] = split(msg.addrPattern(), "/");    
+    int ballnum = int(pattern[3]);
+    balls[ballnum].lastSeen=millis();
+    balls[ballnum].x = msg.get(0).floatValue();
+    balls[ballnum].y = msg.get(1).floatValue();    
+  }
+  
+  void run(int deltaMs){
+    for(Point p: model.points){ colors[p.index]=0; }
+    for(int i=1; i<balls.length; i++){
+      if(millis() - balls[i].lastSeen < 1000) {
+        for(Point p: model.points){
+          int x = int(balls[i].x * 255.0);
+          int y = int(balls[i].y * 127.0);
+          if(p.x < x+4 && p.x > x-4 && p.y < y+4 && p.y > y-4) { colors[p.index] = #FF0000; } 
+        }
+      }
+    }
+  }
+}
+
+import processing.serial.*;
+
+
+/*class ScreenScrape extends SCPattern {
+  PImage pret;
+  ScreenShot ss;
+  public ScreenScrape(GLucose glucose) {
+    super(glucose);
+    System.loadLibrary("ScreenShot");
+    pret = new PImage(8, 128, ARGB);
+    ss = new ScreenShot();
+  }
+  void run(int deltaMs){
+     int x=(1366/2)+516;
+     int y=768-516;
+     int w=8;
+     int h=128;
+     pret.pixels = ss.getScreenShotJNI2(x, y, w, h);
+     //for(int i=0; i<px.length; i++){ pret.pixels[i] = px[i]; }
+     //println(pret.get(10,10));
+     for(Point p: model.points){
+       colors[p.index] = pret.get((int(p.x)/8)*8, 128-int(p.y));
+     }     
+  }
+}*/
+
+List<LXParameter> gparams;
+
+class DualBlender extends SCEffect {
+  int lastSeen;
+  BasicParameter p1 = new BasicParameter("p1", 0);
+  BasicParameter p2 = new BasicParameter("p2", 0);  
+  BasicParameter p3 = new BasicParameter("p3", 0);
+  BasicParameter p4 = new BasicParameter("p4", 0);
+  BasicParameter p5 = new BasicParameter("p5", 0);  
+  BasicParameter p6 = new BasicParameter("p6", 0);
+  BasicParameter p7 = new BasicParameter("p7", 0);
+  BasicParameter p8 = new BasicParameter("p8", 0);  
+  DualBlender(GLucose glucose){
+    super(glucose);
+    gparams = gplay.getParameters();
+    addParameter(p1);
+    addParameter(p2);
+    addParameter(p3);
+    addParameter(p4);
+    addParameter(p5);
+    addParameter(p6);
+    addParameter(p7);
+    addParameter(p8);
+
+    lastSeen=millis();    
+  }
+  
+  void onParameterChanged(LXParameter p){
+    if(p==p1) { gparams.get(0).setValue(p.getValuef()); }
+    if(p==p2) { gparams.get(1).setValue(p.getValuef()); }
+    if(p==p3) { gparams.get(2).setValue(p.getValuef()); }
+    if(p==p4) { gparams.get(3).setValue(p.getValuef()); }
+    if(p==p5) { gparams.get(4).setValue(p.getValuef()); }
+    if(p==p6) { gparams.get(5).setValue(p.getValuef()); }
+    if(p==p7) { gparams.get(6).setValue(p.getValuef()); }
+    if(p==p8) { gparams.get(7).setValue(p.getValuef()); }    
+  }
+  
+  void doApply(int[] colors){
+    if(doDual==true){
+      //gplay.onActive();
+      gplay.go(millis()-lastSeen);
+      lastSeen=millis();
+      int[] pcolors = gplay.getColors();
+      for(int i=0; i<colors.length; i++){
+        colors[i]=blendColor(colors[i],pcolors[i], MULTIPLY);
+      }      
+    } else {}//gplay.onInactive(); }
+  }
+  
+  
+}
+