Apat and added acos to spherycolor, not included in color yet but working
[SugarCubes.git] / _MIDI.pde
index 6467c4c4c19d6e56cadf49398693c3722675f7c1..7673f7ffd87d6cadf3630ed7abfa64efc0e50c7e 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));
       }
     }
@@ -214,6 +218,16 @@ public abstract class SCMidiInput extends AbstractScrollItem {
       getTargetPattern().noteOff(note);
     }
   }
+  
+  protected void setNormalized(LXParameter parameter, float value) {
+    if (parameter != null) {
+      if (parameter instanceof BasicParameter) {
+        ((BasicParameter)parameter).setNormalized(value);
+      } else {
+        parameter.setValue(value);
+      }
+    }
+  }
 
   // Subclasses may implement these to map top-level functionality
   protected boolean handleProgramChange(ProgramChange pc) { return false; }
@@ -407,31 +421,44 @@ public class APC40MidiInput extends GenericDeviceMidiInput {
     case 7:
      switch (channel) {
        case 0:
-         EFF_colorFucker.hueShift.setValue(value);
+         uiSpeed.speed.setNormalized(0.5 - value*0.5);
          return true;
        case 1:
-         EFF_colorFucker.desat.setValue(value);
+         effects.colorFucker.desat.setNormalized(value);
          return true;
        case 2:
-         EFF_colorFucker.sharp.setValue(value);
+         effects.colorFucker.desat.setNormalized(value);
          return true;
        case 3:
-         EFF_blur.amount.setValue(value);
+         effects.blur.amount.setNormalized(value);
          return true;
        case 4:
-         EFF_quantize.amount.setValue(value);
+         effects.quantize.amount.setNormalized(value);
          return true;
      }
      break;
      
     // Master bright
     case 14:
-      EFF_colorFucker.level.setValue(value);
+      effects.colorFucker.level.setNormalized(value);
       return true;
 
     // Crossfader
     case 15:
-      lx.engine.getDeck(GLucose.RIGHT_DECK).getFader().setValue(value);
+      lx.engine.getDeck(GLucose.RIGHT_DECK).getFader().setNormalized(value);
+      return true;
+      
+    // Cue level
+    case 47:
+      float val = effects.colorFucker.hueShift.getValuef();
+      int cv = cc.getValue();
+      if (cv < 64) {
+        cv = 64 + cv;
+      } else {
+        cv = cv - 64;
+      }
+      val += (cv - 64) / 500.;
+      effects.colorFucker.hueShift.setNormalized((val+1) % 1);
       return true;
     }
     
@@ -444,7 +471,7 @@ public class APC40MidiInput extends GenericDeviceMidiInput {
     if (parameterIndex >= 0) {
       List<LXParameter> parameters = getTargetPattern().getParameters();
       if (parameterIndex < parameters.size()) {
-        parameters.get(parameterIndex).setValue(value);
+        setNormalized(parameters.get(parameterIndex), value);
         return true;
       }
     }
@@ -453,7 +480,7 @@ public class APC40MidiInput extends GenericDeviceMidiInput {
       int effectIndex = number - 20;
       List<LXParameter> parameters = glucose.getSelectedEffect().getParameters();
       if (effectIndex < parameters.size()) {
-        parameters.get(effectIndex).setValue(value);
+        setNormalized(parameters.get(effectIndex), value);
         return true;
       }
     }
@@ -479,10 +506,10 @@ public class APC40MidiInput extends GenericDeviceMidiInput {
     case 49: // SOLO/CUE
       switch (nChan) {
         case 4:
-          EFF_colorFucker.mono.setValue(1);
+          effects.colorFucker.mono.setNormalized(1);
           return true;
         case 5:
-          EFF_colorFucker.invert.setValue(1);
+          effects.colorFucker.invert.setNormalized(1);
           return true;
         case 6:
           lx.cycleBaseHue(60000);
@@ -491,11 +518,15 @@ public class APC40MidiInput extends GenericDeviceMidiInput {
       break;
             
     case 82: // scene 1
-      EFF_boom.trigger();
+      effects.boom.trigger();
       return true;
       
     case 83: // scene 2
-      EFF_flash.trigger();
+      effects.flash.trigger();
+      return true;
+      
+    case 84: // scene 3
+      getTargetPattern().reset();
       return true;
       
     case 90:
@@ -505,13 +536,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
@@ -576,10 +617,10 @@ public class APC40MidiInput extends GenericDeviceMidiInput {
     case 49: // SOLO/CUE
       switch (nChan) {
         case 4:
-          EFF_colorFucker.mono.setValue(0);
+          effects.colorFucker.mono.setNormalized(0);
           return true;
         case 5:
-          EFF_colorFucker.invert.setValue(0);
+          effects.colorFucker.invert.setNormalized(0);
           return true;
         case 6:
           lx.setBaseHue(lx.getBaseHue());
@@ -639,7 +680,7 @@ class KorgNanoKontrolMidiInput extends GenericDeviceMidiInput {
       int parameterIndex = number - 16;
       List<LXParameter> parameters = midiEngine.getFocusedPattern().getParameters();
       if (parameterIndex < parameters.size()) {
-        parameters.get(parameterIndex).setValue(cc.getValue() / 127.);
+        setNormalized(parameters.get(parameterIndex), cc.getValue() / 127.);
         return true;
       }
     }
@@ -669,7 +710,7 @@ class KorgNanoKontrolMidiInput extends GenericDeviceMidiInput {
   }
 }
 
-class APC40MidiOutput implements LXParameter.Listener, GridOutput {
+class APC40MidiOutput implements LXParameterListener, GridOutput {
   
   private final MidiEngine midiEngine;
   private final MidiOutput output;
@@ -727,9 +768,7 @@ class APC40MidiOutput implements LXParameter.Listener, GridOutput {
         }
       }
       public void onPresetStored(LXDeck deck, Preset preset) {
-        if (deck == getTargetDeck()) {
-          onPresetStored(deck, preset);
-        }
+        onPresetSelected(deck, preset);
       }
     });
     resetParameters();
@@ -861,6 +900,42 @@ 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;
+      
+      case 75:
+        float val = effects.colorFucker.hueShift.getValuef();
+        val += (cc.getValue() - 64) / 256.;
+        effects.colorFucker.hueShift.setNormalized((val+1) % 1);
+        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.;
+        setNormalized(p, constrain(curVal, 0, 1));
+      }
+    }
+    return false;
+  }
+}
+
 interface GridOutput {
   public static final int OFF = 0;
   public static final int GREEN = 1;