Add preset saving and deck focus
[SugarCubes.git] / _MIDI.pde
index 06c3244c0491b08189a6d6f721528826f57a35c6..9a3ce5cb29f21266e69247ab6d9a2e087084f6af 100644 (file)
--- a/_MIDI.pde
+++ b/_MIDI.pde
@@ -348,7 +348,6 @@ public class APC40MidiInput extends GenericDeviceMidiInput {
     int pitch = note.getPitch();
     if (channel < 8) {
       if (pitch >= 53 && pitch <=57) return new GridPosition(pitch-53, channel);
-      else if (pitch == 52) return new GridPosition(5, channel);
     }
     return null;
   }
@@ -378,20 +377,20 @@ public class APC40MidiInput extends GenericDeviceMidiInput {
     case 7:
      switch (channel) {
        case 0:
-         EFF_colorFucker.sharp.setValue(value);
+         EFF_colorFucker.hueShift.setValue(value);
          break;
        case 1:
-         EFF_colorFucker.hueShift.setValue(value);
-         break;       
-       case 5:
+         EFF_colorFucker.desat.setValue(value);
+         break;
+       case 2:
+         EFF_colorFucker.sharp.setValue(value);
+         break;
+       case 3:
          EFF_blur.amount.setValue(value);
          break;
-       case 6:
+       case 4:
          EFF_quantize.amount.setValue(value);
          break;
-       case 7:
-         EFF_colorFucker.desat.setValue(value);
-         break;
      }
      break;
      
@@ -441,6 +440,9 @@ public class APC40MidiInput extends GenericDeviceMidiInput {
     
     case 49: // SOLO/CUE
       switch (nChan) {
+        case 4:
+          EFF_colorFucker.mono.setValue(1);
+          break;
         case 5:
           EFF_colorFucker.invert.setValue(1);
           break;
@@ -449,7 +451,7 @@ public class APC40MidiInput extends GenericDeviceMidiInput {
           break;
       }
       break;
-      
+            
     case 82: // scene 1
       EFF_boom.trigger();
       break;
@@ -526,6 +528,9 @@ public class APC40MidiInput extends GenericDeviceMidiInput {
       
     case 49: // SOLO/CUE
       switch (nChan) {
+        case 4:
+          EFF_colorFucker.mono.setValue(0);
+          break;
         case 5:
           EFF_colorFucker.invert.setValue(0);
           break;
@@ -534,7 +539,17 @@ public class APC40MidiInput extends GenericDeviceMidiInput {
           break;
       }
       break;
-      
+
+    case 52: // CLIP STOP
+      if (nChan < PresetManager.NUM_PRESETS) {
+        if (shiftOn) {
+          presetManager.store(nChan);
+        } else {
+          presetManager.select(nChan);
+        }
+      }
+      break;
+
     case 90: // SEND C
       long tapDelta = millis() - tap1;
       if (lbtwn(tapDelta,5000,300*1000)) {     // hackish tapping mechanism
@@ -630,11 +645,38 @@ class APC40MidiOutput implements LXParameter.Listener, GridOutput {
     for (Engine.Deck d : lx.engine.getDecks()) {
       d.addListener(deckListener);
     }
+    presetManager.addListener(new PresetListener() {
+      public void onPresetLoaded(Preset preset) {
+        for (int i = 0; i < 8; ++i) {
+          output.sendNoteOn(i, 52, (preset.index == i) ? 1 : 0);
+        }
+      }
+      public void onPresetDirty(Preset preset) {
+        output.sendNoteOn(preset.index, 52, 2);
+      }
+      public void onPresetStored(Preset preset) {
+        onPresetLoaded(preset);
+      }
+      public void onPresetUnloaded() {
+        for (int i = 0; i < 8; ++i) {
+          output.sendNoteOn(i, 52, 0);
+        }
+      }
+    });
     resetParameters();
     midiEngine.grid.addOutput(this);
 
     lx.cycleBaseHue(60000);
     output.sendNoteOn(6, 49, 127);
+    
+    // Turn off the track selection lights and preset selectors
+    for (int i = 0; i < 8; ++i) {
+      output.sendNoteOn(i, 51, 0);
+      output.sendNoteOn(i, 52, 0);
+    }
+    
+    // Turn off the MASTER selector
+    output.sendNoteOn(0, 80, 0);
   }
 
   private void resetParameters() {
@@ -721,9 +763,8 @@ class APC40MidiOutput implements LXParameter.Listener, GridOutput {
   }
   
   public void setGridState(int row, int col, int state) {
-    if (col < 8) {
-      if (row < 5) output.sendNoteOn(col, 53+row, state);
-      else if (row == 6) output.sendNoteOn(col, 52, state);
+    if (col < 8 && row < 5) {
+      output.sendNoteOn(col, 53+row, state);
     }
   }
 }