// 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;
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|
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);
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;