Add button and pad handlers
authorEugene Petkevich <nasedil.genio.code@gmail.com>
Sat, 4 Jun 2022 17:48:33 +0000 (20:48 +0300)
committerEugene Petkevich <nasedil.genio.code@gmail.com>
Sat, 4 Jun 2022 17:48:33 +0000 (20:48 +0300)
extensions/classes/midiremotesl.sc

index 1ced6b6..58fdf88 100644 (file)
@@ -5,15 +5,18 @@
 // 17..24 — faders
 // 33..40 — upper left buttons
 // 41..48 — lower left buttons
-// 49..56 — pads
+// 49..56 — pads — NOT USED
+// 51..55 — transport buttons
 // 64, 65 — pedals
-// 66 — joystick
+// 66 — joystick modulation
+// 67 — loop button
 // 70, 71 — touchpad
 // 73..80 — upper right buttons
 // 81..88 — lower right buttons
 // 94, 95 — tempo change selector
 
 MidiRemote25SL : MidiHandler {
+  classvar transportControls;
   var <idin2;
   var <>key;
   var <>bend;
@@ -24,21 +27,35 @@ MidiRemote25SL : MidiHandler {
   var <>program;
   var <>touchx, <>touchy;
   var <>uprot, <>lowrot, <>fader;
+  var <>butul, <>butll, <>butur, <>butlr;
+  var <>rewind, <>forward, <>stop, <>play, <>loop, <>record;
+  var <>pad;
 
   *new {|name='Novation SL25 ReMOTE MKII', midiNames=#["ReMOTE SL", "ReMOTE SL MIDI 1", "ReMOTE SL MIDI 1"], reveal=true|
     ^super.newCopyArgs(name, midiNames, reveal).midiInit.controlInit;
   }
 
+  *initClass {
+    transportControls = IdentityDictionary[
+      51 -> \rewind,
+      52 -> \forward,
+      53 -> \stop,
+      54 -> \play,
+      67 -> \loop,
+      55 -> \record,
+    ];
+  }
+
   controlInit {
     idin2 = MIDIClient.sources.detect{|i| i.name == "ReMOTE SL MIDI 2"}.uid;
 
     // key pressed/released
     MIDIdef.noteOn((\keyDown++name).asSymbol, {|...args|
       key.value(true, args[0].linlin(0, 127, 0, 1), args[1], *args);
-    }, (0..127), srcID: idin);
+    }, (0..127), 3, srcID: idin);
     MIDIdef.noteOff((\keyUp++name).asSymbol, {|...args|
       key.value(false, args[0].linlin(0, 127, 0, 1), args[1], *args);
-    }, (0..127), srcID: idin);
+    }, (0..127), 3, srcID: idin);
 
     // bend
     MIDIdef.bend((\bend++name).asSymbol, {|...args|
@@ -97,10 +114,39 @@ MidiRemote25SL : MidiHandler {
       fader.value(args[0].linlin(0, 127, 0, 1), args[1]-17, *args);
     }, (17..24), srcID: idin);
 
+    // buttons
+    MIDIdef.cc((\butul++name).asSymbol, {|...args|
+      butul.value((args[0]==0), args[1]-33, *args);
+    }, (33..40), srcID: idin);
+    MIDIdef.cc((\butll++name).asSymbol, {|...args|
+      butll.value((args[0]==0), args[1]-41, *args);
+    }, (41..48), srcID: idin);
+    MIDIdef.cc((\butur++name).asSymbol, {|...args|
+      butur.value((args[0]==0), args[1]-73, *args);
+    }, (73..80), srcID: idin);
+    MIDIdef.cc((\butlr++name).asSymbol, {|...args|
+      butlr.value((args[0]==0), args[1]-81, *args);
+    }, (81..88), srcID: idin);
+    MIDIdef.cc((\transport++name).asSymbol, {|...args|
+      var handler, controlName;
+      controlName = transportControls[args[1]];
+      handler = this.perform(controlName);
+      handler.value((args[0]!=127), *args);
+    }, transportControls.keys.asArray, srcID: idin);
+
+    // pads
+    MIDIdef.noteOn((\pad++name).asSymbol, {|...args|
+      pad.value(args[0].linlin(0, 127, 0, 1), args[1]-36, *args);
+    }, (0..127), 9, srcID: idin);
+
+
     // initialize handlers with revealing code
     [
       \key, \bend, \mod, \press, \tempo, \bank, \program,
-      \touchx, \touchy, \uprot, \lowrot, \fader
+      \touchx, \touchy, \uprot, \lowrot, \fader,
+      \butul, \butll, \butur, \butlr,
+      \rewind, \forward, \stop, \play, \loop, \record,
+      \pad
     ].do{|handlerName|
       this.perform((handlerName++\_).asSymbol, {|...args|
         this.noCallback(handlerName, *args);
@@ -112,7 +158,9 @@ MidiRemote25SL : MidiHandler {
   free {
     [
       \keyDown, \keyUp, \bend, \mod, \press, \tempo, \bank, \program,
-      \touchx, \touchy, \uprot, \lowrot, \fader
+      \touchx, \touchy, \uprot, \lowrot, \fader,
+      \butul, \butll, \butur, \butlr, \transport,
+      \pad
     ].do{|prefix|
       var defName = (prefix ++ name).asSymbol;
       MIDIdef(defName).free;