Last active
February 14, 2019 05:38
-
-
Save Linux-cpp-lisp/9a11add5619340a55ee22fcacf889bdd to your computer and use it in GitHub Desktop.
MIDI Node Mapping Plugin -- Ardour Lua DSP Script
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
ardour { | |
["type"] = "dsp", | |
name = "MIDI Remap Notes", | |
category = "Utility", -- "Utility" | |
license = "MIT", | |
author = "Alby Musaelian", | |
description = [[Map arbitrary MIDI notes to others. Affects Note On/Off and polyphonic key pressure.]] | |
} | |
N_REMAPINGS = 10 | |
function dsp_ioconfig () | |
return { { midi_in = 1, midi_out = 1, audio_in = 0, audio_out = 0}, } | |
end | |
function dsp_params () | |
local note_names = {"C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"} | |
local map_scalepoints = {} | |
for note=0,127 do | |
local octave = -5 + math.floor(note / 12) | |
local name = note_names[(note % 12) + 1] | |
map_scalepoints[string.format("%03d (%s%d)", note, name, octave)] = note | |
end | |
local map_params = {} | |
i = 1 | |
for mapnum = 1,N_REMAPINGS do | |
-- From and to | |
for _,name in pairs({"| #" .. mapnum .. " Map note", "|__ to"}) do | |
map_params[i] = { | |
["type"] = "input", | |
name = name, | |
min = 0, | |
max = 127, | |
default = 0, | |
integer = true, | |
enum = true, | |
scalepoints = map_scalepoints | |
} | |
i = i + 1 | |
end | |
end | |
return map_params | |
end | |
function dsp_init(samplerate) | |
-- Init translation table, reserve memory | |
translation_table = {} | |
for i = 0,127 do | |
translation_table[i] = i | |
end | |
end | |
function dsp_run (_, _, n_samples) | |
assert (type(midiin) == "table") | |
assert (type(midiout) == "table") | |
local cnt = 1; | |
function tx_midi (time, data) | |
midiout[cnt] = {} | |
midiout[cnt]["time"] = time; | |
midiout[cnt]["data"] = data; | |
cnt = cnt + 1; | |
end | |
-- Restore translation table | |
for i = 0,127 do | |
translation_table[i] = i | |
end | |
-- Update it | |
local ctrl = CtrlPorts:array() | |
for i=1,N_REMAPINGS*2,2 do | |
translation_table[ctrl[i]] = ctrl[i + 1] | |
end | |
-- for each incoming midi event | |
for _,b in pairs (midiin) do | |
local t = b["time"] -- t = [ 1 .. n_samples ] | |
local d = b["data"] -- get midi-event | |
local event_type | |
if #d == 0 then event_type = -1 else event_type = d[1] >> 4 end | |
if (#d == 3) and (event_type == 9 or event_type == 8 or event_type == 10) then -- note on, note off, poly. afterpressure | |
-- Do the mapping - 2 is note byte for these types | |
d[2] = translation_table[d[2]] | |
tx_midi (t, d) | |
else | |
tx_midi (t, d) | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment