Merge branch 'master' of https://github.com/sugarcubes/SugarCubes
authorAlexander Green <alexandergreen22@gmail.com>
Fri, 25 Oct 2013 01:08:10 +0000 (18:08 -0700)
committerAlexander Green <alexandergreen22@gmail.com>
Fri, 25 Oct 2013 01:08:10 +0000 (18:08 -0700)
local stuff

MarkSlee.pde
SugarCubes.pde
_MIDI.pde
_Mappings.pde
_UIImplementation.pde

index fde5fc7eda9a7b828652ba2b25c0335ca20d6a44..58b0ea66f1f876c033396951149ce9062b30643f 100644 (file)
@@ -1,18 +1,55 @@
 class MidiMusic extends SCPattern {
   
+  private final Stack<LXLayer> newLayers = new Stack<LXLayer>();
+  
   private final Map<Integer, LightUp> lightMap = new HashMap<Integer, LightUp>();
-  private final List<LightUp> allLights = new ArrayList<LightUp>();
+  private final List<LightUp> lights = new ArrayList<LightUp>();
+  private final BasicParameter lightSize = new BasicParameter("SIZE", 0.5);
+
+  private final List<Sweep> sweeps = new ArrayList<Sweep>();
+
+  private final LinearEnvelope sparkle = new LinearEnvelope(0, 1, 500);
+  private boolean sparkleDirection = true;
+  private float sparkleBright = 100;
   
-  private final Stack<LightUp> newLayers = new Stack<LightUp>();
+  private final BasicParameter wave = new BasicParameter("WAVE", 0);
   
   MidiMusic(GLucose glucose) {
     super(glucose);
+    addParameter(lightSize);
+    addParameter(wave);
+    addModulator(sparkle).setValue(1);
+  }
+  
+  class Sweep extends LXLayer {
+    
+    final LinearEnvelope position = new LinearEnvelope(0, 1, 1000);
+    float bright = 100;
+    float falloff = 10;
+    
+    Sweep() {
+      addModulator(position);
+    }
+    
+    public void run(double deltaMs, color[] colors) {
+      if (!position.isRunning()) {
+        return;
+      }
+      float posf = position.getValuef();
+      for (Point p : model.points) {
+        colors[p.index] = blendColor(colors[p.index], color(
+          (lx.getBaseHuef() + .2*abs(p.x - model.cx) + .2*abs(p.y - model.cy)) % 360,
+          100,
+          max(0, bright - posf*100 - falloff*abs(p.y - posf*model.yMax))
+        ), ADD);
+      }
+    }
   }
   
   class LightUp extends LXLayer {
     
-    private LinearEnvelope brt = new LinearEnvelope(0, 0, 0);
-    private Accelerator yPos = new Accelerator(0, 0, 0);
+    private final LinearEnvelope brt = new LinearEnvelope(0, 0, 0);
+    private final Accelerator yPos = new Accelerator(0, 0, 0);
     private float xPos;
     
     LightUp() {
@@ -25,8 +62,8 @@ class MidiMusic extends SCPattern {
     }
     
     void noteOn(Note note) {
-      xPos = lerp(0, model.xMax, constrain(0.5 + (note.getPitch() - 64) / 12., 0, 1));
-      yPos.setValue(lerp(20, model.yMax, note.getVelocity() / 127.));
+      xPos = lerp(0, model.xMax, constrain(0.5 + (note.getPitch() - 60) / 28., 0, 1));
+      yPos.setValue(lerp(20, model.yMax*.72, note.getVelocity() / 127.)).stop();
       brt.setRangeFromHereTo(lerp(40, 100, note.getVelocity() / 127.), 20).start();     
     }
 
@@ -42,10 +79,11 @@ class MidiMusic extends SCPattern {
       }
       float yVal = yPos.getValuef();
       for (Point p : model.points) {
-        float b = max(0, bVal - 3*dist(p.x, p.y, xPos, yVal));
+        float falloff = 6 - 5*lightSize.getValuef();
+        float b = max(0, bVal - falloff*dist(p.x, p.y, xPos, yVal));
         if (b > 0) {
           colors[p.index] = blendColor(colors[p.index], lx.hsb(
-            (lx.getBaseHuef() + abs(p.x - model.cx) + abs(p.y - model.cy)) % 360,
+            (lx.getBaseHuef() + .2*abs(p.x - model.cx) + .2*abs(p.y - model.cy)) % 360,
             100,
             b
           ), ADD);
@@ -54,22 +92,61 @@ class MidiMusic extends SCPattern {
     }
   }
   
+  private LightUp getLight() {
+    for (LightUp light : lights) {
+      if (light.isAvailable()) {
+        return light;
+      }
+    }
+    LightUp newLight = new LightUp();
+    lights.add(newLight);
+    synchronized(newLayers) {
+      newLayers.push(newLight);
+    }
+    return newLight;
+  }
+  
+  private Sweep getSweep() {
+    for (Sweep s : sweeps) {
+      if (!s.position.isRunning()) {
+        return s;
+      }
+    }
+    Sweep newSweep = new Sweep();
+    sweeps.add(newSweep);
+    synchronized(newLayers) {
+      newLayers.push(newSweep);
+    }
+    return newSweep;
+  }
+  
   public synchronized boolean noteOn(Note note) {
     if (note.getChannel() == 0) {
-      for (LightUp light : allLights) {
-        if (light.isAvailable()) {
-          light.noteOn(note);
-          lightMap.put(note.getPitch(), light);
-          return true;
+      LightUp light = getLight();
+      lightMap.put(note.getPitch(), light);
+      light.noteOn(note);
+    } else if (note.getChannel() == 1) {
+    } else if (note.getChannel() == 9) {
+      if (note.getVelocity() > 0) {
+        switch (note.getPitch()) {
+          case 36:
+            Sweep s = getSweep();
+            s.bright = 50 + note.getVelocity() / 127. * 50;
+            s.falloff = 20 - note.getVelocity() / 127. * 17;
+            s.position.trigger();
+            break;
+          case 37:
+            sparkleBright = note.getVelocity() / 127. * 100;
+            sparkleDirection = true;
+            sparkle.trigger();
+            break;
+          case 38:
+            sparkleBright = note.getVelocity() / 127. * 100;
+            sparkleDirection = false;
+            sparkle.trigger();       
+            break;
         }
       }
-      LightUp newLight = new LightUp();
-      newLight.noteOn(note);
-      lightMap.put(note.getPitch(), newLight);
-      synchronized(newLayers) {
-        newLayers.push(newLight);
-      }
-    } else if (note.getChannel() == 1) {
     }
     return true;
   }
@@ -84,8 +161,30 @@ class MidiMusic extends SCPattern {
     return true;
   }
   
+  final float[] wval = new float[16];
+  float wavoff = 0;
+  
   public synchronized void run(double deltaMs) {
-    setColors(#000000);
+    wavoff += deltaMs * .001;
+    for (int i = 0; i < wval.length; ++i) {
+      wval[i] = model.cy + 0.2 * model.yMax/2. * sin(wavoff + i / 1.9);
+    }
+    float sparklePos = (sparkleDirection ? sparkle.getValuef() : (1 - sparkle.getValuef())) * (Cube.POINTS_PER_STRIP)/2.;
+    float maxBright = sparkleBright * (1 - sparkle.getValuef());
+    for (Strip s : model.strips) {
+      int i = 0;
+      for (Point p : s.points) {
+        int wavi = (int) constrain(p.x / model.xMax * wval.length, 0, wval.length-1);
+        float wavb = max(0, wave.getValuef()*100. - 8.*abs(p.y - wval[wavi]));
+        colors[p.index] = color(
+          (lx.getBaseHuef() + .2*abs(p.x - model.cx) + .2*abs(p.y - model.cy)) % 360,
+          100,
+          constrain(wavb + max(0, maxBright - 40.*abs(sparklePos - abs(i - (Cube.POINTS_PER_STRIP-1)/2.))), 0, 100)
+        );
+        ++i;
+      }
+    }
+        
     if (!newLayers.isEmpty()) {
       synchronized(newLayers) {
         while (!newLayers.isEmpty()) {
index 6877613e4cca823f389e25b53c0aa024a4d967f3..00cc3b85725357fe911451147469dbaf3abcfde5 100644 (file)
@@ -28,7 +28,7 @@ LXPattern[] patterns(GLucose glucose) {
 
     
     // Slee
-    // new MidiMusic(glucose),
+    new MidiMusic(glucose),
     new Pulley(glucose),
     new Swarm(glucose),
     new ViolinWave(glucose),
index 59c5f826f7eea8e88acc00c396efe00dc7885614..99c60d2bb5efb5a535532df39ee102be1a2e9461 100644 (file)
--- a/_MIDI.pde
+++ b/_MIDI.pde
@@ -62,8 +62,12 @@ class MidiEngine {
         midiControllers.add(new APC40MidiInput(this, device, apcDeck).setEnabled(true));
       } else if (device.getName().contains("SLIDER/KNOB KORG")) {
         midiControllers.add(new KorgNanoKontrolMidiInput(this, device).setEnabled(true));
+      } else if (device.getName().contains("Arturia MINILAB")) {
+        midiControllers.add(new ArturiaMinilabMidiInput(this, device).setEnabled(true));
       } else {
-        boolean enabled = device.getName().contains("KEYBOARD KORG") || device.getName().contains("Bus 1 Apple");
+        boolean enabled =
+          device.getName().contains("KEYBOARD KORG") ||
+          device.getName().contains("Bus 1 Apple");
         midiControllers.add(new GenericDeviceMidiInput(this, device).setEnabled(enabled));
       }
     }
@@ -509,13 +513,23 @@ public class APC40MidiInput extends GenericDeviceMidiInput {
       return true;
 
     case 91: // play
-    case 97: // left bank
-      midiEngine.setFocusedDeck(0);
+      if (shiftOn) {
+        midiEngine.setFocusedDeck(GLucose.LEFT_DECK);
+      } else {
+        uiCrossfader.setDisplayMode("A");
+      }
       return true;
-
+      
+    case 92: // stop
+      uiCrossfader.setDisplayMode("COMP");
+      return true;
+      
     case 93: // rec
-    case 96: // right bank
-      midiEngine.setFocusedDeck(1);
+      if (shiftOn) {
+        midiEngine.setFocusedDeck(GLucose.RIGHT_DECK);
+      } else {
+        uiCrossfader.setDisplayMode("B");
+      }
       return true;
 
     case 94: // up bank
@@ -863,6 +877,36 @@ class APC40MidiOutput implements LXParameter.Listener, GridOutput {
   }
 }
 
+class ArturiaMinilabMidiInput extends GenericDeviceMidiInput {
+  ArturiaMinilabMidiInput(MidiEngine midiEngine, MidiInputDevice d) {
+    super(midiEngine, d);
+  }
+  
+  protected boolean handleControllerChange(rwmidi.Controller cc) {
+    int parameterIndex = -1;
+    switch (cc.getCC()) {
+      case 7:   parameterIndex = 0; break;
+      case 74:  parameterIndex = 1; break;
+      case 71:  parameterIndex = 2; break;
+      case 76:  parameterIndex = 3; break;
+      case 114: parameterIndex = 4; break;
+      case 18:  parameterIndex = 5; break;
+      case 19:  parameterIndex = 6; break;
+      case 16:  parameterIndex = 7; break;
+    }
+    if (parameterIndex >= 0) {
+      List<LXParameter> parameters = midiEngine.getFocusedPattern().getParameters();
+      if (parameterIndex < parameters.size()) {
+        LXParameter p = parameters.get(parameterIndex);
+        float curVal = p.getValuef();
+        curVal += (cc.getValue() - 64) / 127.;
+        p.setValue(constrain(curVal, 0, 1));
+      }
+    }
+    return false;
+  }
+}
+
 interface GridOutput {
   public static final int OFF = 0;
   public static final int GREEN = 1;
index 46a7da5768e452b40b71ee5c576b8664ce6659f4..4649b62d9c8226bc593117f36e76c41df595d591 100644 (file)
@@ -51,31 +51,13 @@ public Model buildModel() {
   //  We can do better than this.  The raw object index should be obvious from the code-- looking through the
   //  rendered simulation and counting through cubes in mapping mode is grossly inefficient. 
 
-
-  ////////////////////////////////////////////////////////////////////////
-  // dan's proposed lattice
-  ArrayList<StaggeredTower> scubes = new ArrayList<StaggeredTower>();
-  // if (NumBackTowers != 9) exit();
-  for (int i=0; i<NumBackTowers; i++) scubes.add(new StaggeredTower(
-      (i+1)*CW,               // x
-      (i % 2 == 0) ? 0 : CH * 2./3.   ,   // y
-     - ((i % 2 == 0) ? 0 : 11) + 97   ,   // z
-     -135, (i % 2 == 0) ? MaxCubeHeight : MaxCubeHeight-1) );  // num cubes
-  
-  ArrayList<Cube> dcubes = new ArrayList<Cube>();
-  for (int i=1; i<6; i++) {
-    if (i>1) dcubes.add(new Cube(-6+CW*4/3*i             , 0, 0, 0, 0, 0, WRR));  
-         dcubes.add(new Cube(-6+CW*4/3*i+CW*2/3., CH*.5, 0, 0, 0, 0, WRR)); 
-  }
-
-
   TowerMapping[] towerCubes = new TowerMapping[] {};
   
   // Single cubes can be constructed directly here if you need them
   Cube[] singleCubes = new Cube[] {
-     //new Cube(15, int( Cube.EDGE_HEIGHT), 39, 0, 10, 0,  WRL),     // Back left channel behind speaker
+    // new Cube(15, int( Cube.EDGE_HEIGHT), 39, 0, 10, 0,  WRL),     // Back left channel behind speaker
      //new Cube(x, y, z, rx, ry, rz, wiring),
-     //new Cube(0,0,0,0,-135,0, WRR),
+   //new Cube(0,0,0,0,225,0, WRR),
   };
 
   // The bass box!
@@ -89,6 +71,104 @@ public Model buildModel() {
      // new Speaker(TRAILER_WIDTH - Speaker.EDGE_WIDTH + 8, 6, 3, -15)
   });
 
+
+  ////////////////////////////////////////////////////////////////////////
+  // dan's proposed lattice
+        ArrayList<StaggeredTower> scubes = new ArrayList<StaggeredTower>();
+        if (NumBackTowers != 11) exit();
+        // for (int i=0; i<NumBackTowers; i++) scubes.add(new StaggeredTower(
+        //           (i+1)*CW,                                                                 // x
+        //           (i % 2 == 0) ? 0 : CH * 2./3.                ,   // y
+        //          - ((i % 2 == 0) ? 0 : 11) + 97          ,   // z
+        //          225, (i % 2 == 0) ? MaxCubeHeight : MaxCubeHeight-1) );         // num cubes
+        
+        ArrayList<Cube> dcubes = new ArrayList<Cube>();
+        // for (int i=1; i<6; i++) {
+        //         if (i>1) dcubes.add(new Cube(-6+CW*4/3*i             , 0, 0, 0, 0, 0, WRR));        
+        //                          dcubes.add(new Cube(-6+CW*4/3*i+CW*2/3., CH*.5, 0, 0, 0, 0, WRR));        
+        // }
+
+scubes.add(new StaggeredTower(//tower 1
+      0,               // x
+       0   ,   // y
+       0  ,   // z
+     0,  3, new Cube.Wiring[]{ WFR, WRL, WFR}));  
+scubes.add(new StaggeredTower(// tower 2
+      22,               // x
+       0  ,   // y
+       26   ,   // z
+     0,  3, new Cube.Wiring[]{ WRL, WFR, WRL})  );  
+scubes.add(new StaggeredTower(//tower 3
+      27,               // x
+       0   ,   // y
+       64,   // z
+     0,  4, new Cube.Wiring[]{ WFR, WRL, WFR, WRL})  );  
+scubes.add(new StaggeredTower(//tower 4
+    54,               // x
+       7,   // y
+       75.5  ,   // z
+     0,  4, new Cube.Wiring[]{ WFR, WRL, WFR, WRL})  );  
+
+scubes.add(new StaggeredTower(//tower 5
+      75.5,               // x
+       0   ,   // y
+       100.5 ,   // z
+     0,  4, new Cube.Wiring[]{ WRR, WFL, WRR, WFL})  );
+scubes.add(new StaggeredTower(//tower 6
+      93.5,               // x
+       7 ,   // y
+       75.5,   // z
+     0, 4, new Cube.Wiring[]{ WFR, WRL, WFR, WRL})  );  
+scubes.add(new StaggeredTower(// tower 7
+      119,               // x
+       0   ,   // y
+      56.5,   // z
+     0,  4, new Cube.Wiring[]{ WRL, WFR, WRL, WFR})  ); 
+     
+scubes.add(new StaggeredTower(//tower 8
+      136.5,               // x
+       7  ,   // y
+       31.5  ,   // z
+     0,  4, new Cube.Wiring[]{ WFR, WRL, WFR, WRL})  );  
+  
+scubes.add(new StaggeredTower(//tower 9
+      161.5,               // x
+       0   ,   // y
+       20  ,   // z
+     0,  4, new Cube.Wiring[]{ WFR, WRL, WFR, WRL})  );  
+scubes.add(new StaggeredTower(//tower 10
+      176,               // x
+       7   ,   // y
+       -6.5  ,   // z
+     0,  3, new Cube.Wiring[]{ WRL, WFR, WRL})  );  
+scubes.add(new StaggeredTower(// tower 11
+      202.5,               // x
+       0   ,   // y
+         -26.5,   // z
+     0,  3, new Cube.Wiring[]{ WRL, WFR, WRL})  );  
+scubes.add(new StaggeredTower(// tower 12 CENTER TOWER AT 45degrees
+      73,               // x
+       0   ,   // y
+         58,   // z
+     -45,  4, new Cube.Wiring[]{ WFL, WRR, WFL, WRR})  );  
+scubes.add(new StaggeredTower(// Single cube on top of tower 3
+      22,               // x
+       81.5  ,   // y
+         39,   // z
+     -45,  1, new Cube.Wiring[]{ WFR})  );  
+scubes.add(new StaggeredTower(// Single cube on top of tower 4
+      42,               // x
+       112   ,   // y
+         72,   // z
+     -10,  1, new Cube.Wiring[]{ WRL})  );  
+
+
+
+
+
+
+
   //////////////////////////////////////////////////////////////////////
   //      BENEATH HERE SHOULD NOT REQUIRE ANY MODIFICATION!!!!        //
   //////////////////////////////////////////////////////////////////////
@@ -113,11 +193,13 @@ public Model buildModel() {
 
   
   for (Cube cube : singleCubes) cubes[cubeIndex++] = cube;
-  for (Cube cube : dcubes)             cubes[cubeIndex++] = cube;
+  for (Cube cube : dcubes)                 cubes[cubeIndex++] = cube;
 for (StaggeredTower st : scubes) {
     tower = new ArrayList<Cube>();
-    for (int i=0; i < st.n; i++)
-      tower.add(cubes[cubeIndex++] = new Cube(st.x, st.y + CH* 4/3.*i, st.z, 0, st.r, 0, WRR));
+    for (int i=0; i < st.n; i++) {
+      Cube.Wiring w = (i < st.wiring.length) ? st.wiring[i] : WRR;
+      tower.add(cubes[cubeIndex++] = new Cube(st.x, st.y + CH* 4/3.*i, st.z, 0, st.r, 0, w));
+    }
     towerList.add(new Tower(tower));
   }
 
@@ -134,49 +216,50 @@ public PandaMapping[] buildPandaList() {
   
   // 8 channels map to:  3, 4, 7, 8, 13, 14, 15, 16.
   return new PandaMapping[] {
-    // new PandaMapping(
-    //   "10.200.1.30", new ChannelMapping[] {
-    //     new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 39, 40, 41, 42 }), // 30 J3 *
-    //     new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 37, 38, 36, 35}),  // 30 J4 //ORIG *
-    //     new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { }),                // 30 J7 *
-    //     new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 16, 17, 18, 19}),  // 30 J8 *
-    //     new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { }),                // 30 J13 (not working)
-    //     new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { }),                // 30 J14 (unplugged)
-    //     new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { }),                // 30 J15 (unplugged)
-    //     new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 53, 54, 55, 72 }), // 30 J16
-    // }),
-    // new PandaMapping(
-    //   "10.200.1.29", new ChannelMapping[] {
-    //     new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1,2,3,4}),                // 29 J3  (not connected)
-    //     new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1,2,3,4 }),                // 29 J4  (not connected)
-    //     new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1,2,3,4}),  // 29 J7
-    //     new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1,2,3,4}),  // 29 J8  //XXX   
-    //     new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 8,9,10}),                // 29 J13 //XX //bassbox  (not working)
-    //     new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 8,9,10 }),                // 29 J14 (not working)
-    //     new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 14,15,16,17 }), // 29 J15
-    //     new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] {  14,15,16,17 }), // 29 J16
-    // }),    
+    new PandaMapping(
+      "10.200.1.28", new ChannelMapping[] {
+        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { }), // 30 J3 *
+        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { }),  // 30 J4 //ORIG *
+        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 41, 42}),                // 30 J7 *
+        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 43, 44}),  // 30 J8 *
+        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 6, 3}),                // 30 J13 (not working)
+        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 45, 46}),                // 30 J14 (unplugged)
+        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 1, 2}),                // 30 J15 (unplugged)
+        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 4, 5}), // 30 J16
+    }),
+    new PandaMapping(
+      "10.200.1.29", new ChannelMapping[] {
+        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { }), // 30 J3 *
+        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { }),  // 30 J4 //ORIG *
+        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 7, 8}),                // 30 J7 *
+        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 9, 10}),  // 30 J8 *
+        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 11, 12}),                // 30 J13 (not working)
+        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 13, 14}),                // 30 J14 (unplugged)
+        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 15, 16}),                // 30 J15 (unplugged)
+        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 17, 18}), // 30 J16
+    }),    
     new PandaMapping(
       "10.200.1.30", new ChannelMapping[] {
-        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 11, 12, 13, 14}), // J3
-        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { }), // J4
-        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 20, 21, 22, 23}), // J7
-        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 29 ,30, 31, 32}), // J8
-        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 38, 39, 40, 41}), // J13
-        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 47, 48, 49, 50}), // J14
-        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 56, 57, 58, 59}), // J15
-        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 55, 46, 37}), // J16
+        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 38, 39}), // 30 J3 *
+        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { }),  // 30 J4 //ORIG *
+        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 23, 24}),                // 30 J7 *
+        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 25, 26}),  // 30 J8 *
+        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 19, 20}),                // 30 J13 (not working)
+        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 21, 22}),                // 30 J14 (unplugged)
+        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { }),                // 30 J15 (unplugged)
+        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { }), // 30 J16
+
    }),    
     new PandaMapping(
       "10.200.1.31", new ChannelMapping[] {
-        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 15, 16, 17, 18}), // J3
-        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { }), // J4
-        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 24, 25, 26, 27}), // J7
-        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 33, 34, 35, 36}), // J8
-        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 42, 43, 44, 45}), // J13
-        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 51, 52, 53, 54}), // J14
-        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 28, 19, 10}), // J15
-        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 11, 12, 13, 14}), // J16
+        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 37, 40}), // 30 J3 *
+        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { }),  // 30 J4 //ORIG *
+        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 27, 28}),                // 30 J7 *
+        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 29, 30}),  // 30 J8 *
+        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 31, 32}),                // 30 J13 (not working)
+        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 33, 34}),                // 30 J14 (unplugged)
+        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { 35, 36}),                // 30 J15 (unplugged)
+        new ChannelMapping(ChannelMapping.MODE_CUBES, new int[] { }), // 30 J16               // 31 J16
     }),
   };
 }
@@ -215,7 +298,9 @@ class CubeMapping {
 class StaggeredTower {
   public final float x, y, z, r;
   public final int n;
-  StaggeredTower(float _x, float _y, float _z, float _r, int _n) { x=_x; y=_y; z=_z; r=_r; n=_n;}
+  public final Cube.Wiring[] wiring;
+  StaggeredTower(float _x, float _y, float _z, float _r, int _n) { this(_x, _y, _z, _r, _n, new Cube.Wiring[]{}); }
+  StaggeredTower(float _x, float _y, float _z, float _r, int _n, Cube.Wiring[] _wiring) { x=_x; y=_y; z=_z; r=_r; n=_n; wiring=_wiring;}
 }
 
 /**
@@ -318,4 +403,4 @@ class ChannelMapping {
       objectIndices[i] = (i < rawObjectIndices.length) ? rawObjectIndices[i] : NO_OBJECT;
     }
   }
-}
+}
\ No newline at end of file
index bd303ddac38f23581015b264fa9bfef19e0b253f..ac28fd6a9a96d00d333819809d2584cb71616ca9 100644 (file)
@@ -142,6 +142,11 @@ class UICrossfader extends UIWindow {
     (displayMode = new UIToggleSet(4, titleHeight + 36, w-9, 20)).setOptions(new String[] { "A", "COMP", "B" }).setValue("COMP").addToContainer(this);
   }
   
+  public UICrossfader setDisplayMode(String value) {
+    displayMode.setValue(value);
+    return this;
+  }
+  
   public String getDisplayMode() {
     return displayMode.getValue();
   }