yep! I’m using the Twister with the Norns. It is pretty easy to map any of the MIDI controls in Norns using MIDI learn as @AlessandroBonino mentions.
In this case, though, I was using a patch that was made beforehand and my Twister is set to relative mode for a number of reasons. Because of that I handled the MIDI messages directly in the lua script and quickly tweaked the shape of the data (as opposed to a control spec). I also set the colors of each encoder on the Twister in the resetMidiDevice() function (set all to blue, then the first 3 to red, then the bottom row to green).
A bit hacky but was quick and certain before the gig. It also made it quick to iterate since I handled scaling of individual sample players through lua instead of SC which required restarting SC every time I made a change. I also had never really touched any Lua prior. Here is an excerpt if you are curious:
local midiDevice
local externalEncoders = {
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0,
0, 0, 0, 0
}
local function midi_event(data)
local msg = midi.to_msg(data)
if (msg.type == 'cc') then
onExternalEncoder(msg.cc + 1, (msg.val - 64))
end
end
local function resetMIDIDevice()
for i in ipairs(externalEncoders) do
midiDevice:cc(i-1, 37, 2)
end
for i=1,3 do
midiDevice:cc(i-1, 90, 2)
end
for i=13,15 do
midiDevice:cc(i-1, 53, 2)
end
for i,v in ipairs(externalEncoders) do
midiDevice:cc(i-1, v, 1)
end
end
-- init function
function init()
midiDevice = midi.connect(1)
midiDevice.event = midi_event
resetMIDIDevice()
end
function onExternalEncoder(n, delta)
local value = externalEncoders[n] + delta
if (value > 127) then
value = 127
end
externalEncoders[n] = value
local scaledVal = (value/127)
if (scaledVal < 0) then
scaledVal = 0
end
-- update synths
if (n == 1) then
engine.setHighToneVol(scaledVal^3 * 0.01);
elseif (n == 2) then
engine.setMidToneVol(scaledVal^3);
elseif (n == 3) then
engine.setLowToneVol(scaledVal^3);
elseif (n == 13) then
engine.setSampleVol(n-13, scaledVal^3 * 0.85);
elseif (n == 14) then
engine.setSampleVol(n-13, scaledVal^3 * 0.85);
elseif (n == 15) then
engine.setSampleVol(n-13, scaledVal^3 * 0.25);
elseif (n == 16) then
engine.setSampleVol(n-13, scaledVal^3 * 0.25);
end
-- redraw screen
redraw()
-- update device
midiDevice:cc(n-1, value, 1)
end