From 6efa5d4be29457359039bbec6e8a637a5b15c652 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 25 Apr 2017 14:00:29 +0200 Subject: Update CC-to-Automation script: use Lua-Dialog for parameters --- scripts/_midi_cc_to_automation.lua | 66 ++++++++++++++++++++++++++++++++------ 1 file changed, 57 insertions(+), 9 deletions(-) diff --git a/scripts/_midi_cc_to_automation.lua b/scripts/_midi_cc_to_automation.lua index 2d97b2c975..28967dc37d 100644 --- a/scripts/_midi_cc_to_automation.lua +++ b/scripts/_midi_cc_to_automation.lua @@ -1,17 +1,65 @@ ardour { ["type"] = "Snippet", name = "MIDI CC to Plugin Automation" } function factory () return function () - -- target automation lane: a plugin parameter on a track - local tgt = Session:route_by_name('Audio') -- get track - assert (not tgt:isnil ()) - -- get AutomationList, ControlList and ParameterDescriptor - -- of the first plugin's 2nd parameter - local al, _, pd = ARDOUR.LuaAPI.plugin_automation (tgt:nth_plugin (0), 1) + -- find target parameters + local targets = {} + local have_entries = false + for r in Session:get_routes():iter() do -- for every track/bus + local i = 0; + while 1 do -- iterate over all plugins on the route + local proc = r:nth_plugin (i) + if proc:isnil () then break end + if not targets [r:name ()] then targets [r:name ()] = {} end + targets [r:name ()][proc:display_name ()] = {}; + local plug = proc:to_insert ():plugin (0) + local n = 0 + for j = 0, plug:parameter_count () - 1 do -- iterate over all plugin parameters + if plug:parameter_is_control(j) then + if plug:parameter_is_input(j) then + local nn = n + targets [r:name ()][proc:display_name ()][plug:parameter_label(j)] = function () return {["p"] = proc, ["n"] = nn} end + have_entries = true + end + n = n + 1 + end + end + i = i + 1 + end + end + + -- bail out if there are no parameters + if not have_entries then + LuaDialog.Message ("CC to Plugin", "No Plugins found", LuaDialog.MessageType.Info, LuaDialog.ButtonType.Close):run() + collectgarbage () + return + end + + -- create a dialog, ask user which MIDI-CC to map and to what parameter + local dialog_options = { + { type = "dropdown", key = "param", title = "Target Parameter", values = targets }, + { type = "number", key = "channel", title = "Channel", min = 1, max = 16, step = 1, digits = 0 }, + { type = "number", key = "ccparam", title = "CC Parameter", min = 0, max = 127, step = 1, digits = 0 } + } + local od = LuaDialog.Dialog ("Select Taget", dialog_options) + local rv = od:run() + + if not rv then + od = nil collectgarbage () + return; + end + + -- parse user response - -- Source MIDI CC parameter - local midi_channel = 0 -- 0..15 - local cc_param = 0x56 + local midi_channel = rv["channel"] - 1 + local cc_param = rv["ccparam"] + local pp = rv["param"]() + local al, _, pd = ARDOUR.LuaAPI.plugin_automation (pp["p"], pp["n"]) + od = nil collectgarbage () + assert (al) + assert (midi_channel >= 0 and midi_channel < 16) + assert (cc_param >= 0 and cc_param < 128) + -- all systems go local add_undo = false Session:begin_reversible_command ("CC to Automation") local before = al:get_state() -- cgit v1.2.3