more bug fixes in dpat
[SugarCubes.git] / _Internals.pde
index 3710e0eb7b8fafe6b19018e0c7db3291a4b86fe1..19b4ed6cf682c47e1293a6925d0a28335f1c10b8 100644 (file)
@@ -48,8 +48,8 @@ HeronLX lx;
 LXPattern[] patterns;
 MappingTool mappingTool;
 PandaDriver[] pandaBoards;
-MidiListener midiQwertyKeys;
-MidiListener midiQwertyAPC;
+SCMidiInput midiQwertyKeys;
+SCMidiInput midiQwertyAPC;
 
 // Display configuration mode
 boolean mappingMode = false;
@@ -57,6 +57,7 @@ boolean debugMode = false;
 DebugUI debugUI;
 boolean uiOn = true;
 LXPattern restoreToPattern = null;
+PImage logo;
 
 // Handles to UI objects
 UIContext[] overlays;
@@ -123,12 +124,12 @@ void setup() {
   logTime("Built PandaDriver");
 
   // MIDI devices
-  List<MidiListener> midiListeners = new ArrayList<MidiListener>();
-  midiListeners.add(midiQwertyKeys = new MidiListener(MidiListener.KEYS));
-  midiListeners.add(midiQwertyAPC = new MidiListener(MidiListener.APC));
+  List<SCMidiInput> midiControllers = new ArrayList<SCMidiInput>();
+  midiControllers.add(midiQwertyKeys = new SCMidiInput(SCMidiInput.KEYS));
+  midiControllers.add(midiQwertyAPC = new SCMidiInput(SCMidiInput.APC));
   for (MidiInputDevice device : RWMidi.getInputDevices()) {
     boolean enableDevice = device.getName().contains("APC");
-    midiListeners.add(new MidiListener(device).setEnabled(enableDevice));
+    midiControllers.add(new SCMidiInput(device).setEnabled(enableDevice));
   }
   SCMidiDevices.initializeStandardDevices(glucose);
   logTime("Setup MIDI devices");
@@ -143,7 +144,7 @@ void setup() {
     new UISpeed(4, 624, 140, 50),
         
     new UIPatternDeck(lx.engine.getDeck(1), "PATTERN B", width-144, 4, 140, 324),
-    uiMidi = new UIMidi(midiListeners, width-144, 332, 140, 158),
+    uiMidi = new UIMidi(midiControllers, width-144, 332, 140, 158),
     new UIOutput(width-144, 494, 140, 106),
     
     uiCrossfader = new UICrossfader(width/2-90, height-90, 180, 86),
@@ -153,7 +154,10 @@ void setup() {
   };
   uiMapping.setVisible(false);
   logTime("Built overlay UI");
-    
+
+  // Load logo image
+  logo = loadImage("data/logo.png");
+  
   // Setup camera
   midX = TRAILER_WIDTH/2.;
   midY = glucose.model.yMax/2;
@@ -172,7 +176,11 @@ void setup() {
   println("Hit the 'p' key to toggle Panda Board output");
 }
 
-public class MidiListener extends AbstractScrollItem {
+public interface SCMidiInputListener {
+  public void onEnabled(SCMidiInput controller, boolean enabled);
+}
+
+public class SCMidiInput extends AbstractScrollItem {
   
   public static final int MIDI = 0;
   public static final int KEYS = 1;
@@ -180,13 +188,9 @@ public class MidiListener extends AbstractScrollItem {
   
   private boolean enabled = false;
   private final String name;
-  
-  MidiListener(MidiInputDevice d) {
-    mode = MIDI;
-    d.createInput(this);
-    name = d.getName();
-  }
-  
+  private final int mode;
+  private int octaveShift = 0;
+    
   class NoteMeta {
     int channel;
     int number;
@@ -197,11 +201,26 @@ public class MidiListener extends AbstractScrollItem {
   }
   
   final Map<Character, NoteMeta> keyToNote = new HashMap<Character, NoteMeta>();
+    
+  final List<SCMidiInputListener> listeners = new ArrayList<SCMidiInputListener>();
   
-  private final int mode;
-  private int octaveShift = 0;
+  public SCMidiInput addListener(SCMidiInputListener l) {
+    listeners.add(l);
+    return this;
+  }
+
+  public SCMidiInput removeListener(SCMidiInputListener l) {
+    listeners.remove(l);
+    return this;
+  }
+  
+  SCMidiInput(MidiInputDevice d) {
+    mode = MIDI;
+    d.createInput(this);
+    name = d.getName().replace("Unknown vendor","");
+  }
   
-  MidiListener(int mode) {
+  SCMidiInput(int mode) {
     this.mode = mode;
     switch (mode) {
       case APC:
@@ -312,23 +331,30 @@ public class MidiListener extends AbstractScrollItem {
     setEnabled(!enabled);
   }
   
-  public MidiListener setEnabled(boolean enabled) {
+  public SCMidiInput setEnabled(boolean enabled) {
     if (enabled != this.enabled) {
       this.enabled = enabled;
-      uiMidi.redraw();
+      for (SCMidiInputListener l : listeners) {
+        l.onEnabled(this, enabled);
+      }
     }
     return this;
   }
   
   private SCPattern getFocusedPattern() {
-    return (SCPattern) uiMidi.getFocusedDeck().getActivePattern();
+    Engine.Deck focusedDeck = (uiMidi != null) ? uiMidi.getFocusedDeck() : lx.engine.getDefaultDeck();
+    return (SCPattern) focusedDeck.getActivePattern();
+  }
+  
+  private boolean logMidi() {
+    return (uiMidi != null) && uiMidi.logMidi();
   }
   
   void programChangeReceived(ProgramChange pc) {
     if (!enabled) {
       return;
     }
-    if (uiMidi.logMidi()) {
+    if (logMidi()) {
       println(getLabel() + " :: Program Change :: " + pc.getNumber());
     }
   }
@@ -337,7 +363,7 @@ public class MidiListener extends AbstractScrollItem {
     if (!enabled) {
       return;
     }
-    if (uiMidi.logMidi()) {
+    if (logMidi()) {
       println(getLabel() + " :: Controller :: " + cc.getCC() + ":" + cc.getValue());
     }
     getFocusedPattern().controllerChangeReceived(cc);
@@ -347,7 +373,7 @@ public class MidiListener extends AbstractScrollItem {
     if (!enabled) {
       return;
     }
-    if (uiMidi.logMidi()) {
+    if (logMidi()) {
       println(getLabel() + " :: Note On  :: " + note.getChannel() + ":" + note.getPitch() + ":" + note.getVelocity());
     }
     getFocusedPattern().noteOnReceived(note);
@@ -357,7 +383,7 @@ public class MidiListener extends AbstractScrollItem {
     if (!enabled) {
       return;
     }
-    if (uiMidi.logMidi()) {
+    if (logMidi()) {
       println(getLabel() + " :: Note Off :: " + note.getChannel() + ":" + note.getPitch() + ":" + note.getVelocity());
     }
     getFocusedPattern().noteOffReceived(note);
@@ -402,6 +428,14 @@ void draw() {
   vertex(TRAILER_WIDTH, 0, TRAILER_DEPTH);
   vertex(0, 0, TRAILER_DEPTH);
   endShape();
+
+  // Draw the logo on the front of platform  
+  pushMatrix();
+  translate(0, 0, -1);
+  float s = .07;
+  scale(s, -s, s);
+  image(logo, TRAILER_WIDTH/2/s-logo.width/2, TRAILER_HEIGHT/2/s-logo.height/2-2/s);
+  popMatrix();
   
   noStroke();
 //  drawBassBox(glucose.model.bassBox);
@@ -581,6 +615,7 @@ void drawUI() {
   }
 }
 
+
 /**
  * Top-level keyboard event handling
  */
@@ -596,7 +631,7 @@ void keyPressed() {
     case '=':
     case '+':
       frameRate(++targetFramerate);
-      break;
+      break;      
     case 'd':
       if (!midiQwertyAPC.isEnabled() && !midiQwertyKeys.isEnabled()) {
         debugMode = !debugMode;