From 47cb04d2e3f6aaab8fd71a341a9d6f413fc62e26 Mon Sep 17 00:00:00 2001 From: Eugene Petkevich Date: Sat, 4 Jun 2022 20:48:33 +0300 Subject: [PATCH] Add button and pad handlers --- extensions/classes/midiremotesl.sc | 60 +++++++++++++++++++++++++++--- 1 file changed, 54 insertions(+), 6 deletions(-) diff --git a/extensions/classes/midiremotesl.sc b/extensions/classes/midiremotesl.sc index 1ced6b6..58fdf88 100644 --- a/extensions/classes/midiremotesl.sc +++ b/extensions/classes/midiremotesl.sc @@ -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 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; -- 2.17.1