mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-13 10:06:33 +01:00
MIDI PC/CC: add "MIDI Program" function lines to run Lua functions when program change occurs
This commit is contained in:
parent
d8f01e1eb8
commit
b2a980b032
1 changed files with 53 additions and 1 deletions
|
|
@ -176,7 +176,25 @@ function program_change()
|
||||||
local route_comment = route:comment()
|
local route_comment = route:comment()
|
||||||
local route_active = false
|
local route_active = false
|
||||||
local local_CC_functions = { }
|
local local_CC_functions = { }
|
||||||
|
local program_functions = { } -- to store functions to execute after track activation
|
||||||
|
-- Look for "MIDI Bank # Program #: code" statements with function calls
|
||||||
|
while true do
|
||||||
|
local MIDI_Program_start, MIDI_Program_end, bank_list, program_list, code
|
||||||
|
MIDI_Program_start,MIDI_Program_end,bank_list,program_list,code = string.find(route_comment, "MIDI Bank (%d[-%d,]*) Program (%d[-%d,]*): ([^\n]+)", nextchar)
|
||||||
|
if bank_list then
|
||||||
|
local matches = match_number_range(program, program_list) and match_number_range(bank, bank_list)
|
||||||
|
route_active = route_active or matches
|
||||||
|
MIDI_Program_seen = true
|
||||||
|
if matches and code then
|
||||||
|
table.insert(program_functions, code)
|
||||||
|
end
|
||||||
|
nextchar = MIDI_Program_end + 1
|
||||||
|
else
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
-- Look for "MIDI Bank # Program #" statements that match both the program number and the bank number
|
-- Look for "MIDI Bank # Program #" statements that match both the program number and the bank number
|
||||||
|
nextchar = 1
|
||||||
while true do
|
while true do
|
||||||
local MIDI_Program_start, MIDI_Program_end, bank_list, program_list
|
local MIDI_Program_start, MIDI_Program_end, bank_list, program_list
|
||||||
MIDI_Program_start,MIDI_Program_end,bank_list,program_list = string.find(route_comment, "MIDI Bank (%d[-%d,]*) Program (%d[-%d,]*)", nextchar)
|
MIDI_Program_start,MIDI_Program_end,bank_list,program_list = string.find(route_comment, "MIDI Bank (%d[-%d,]*) Program (%d[-%d,]*)", nextchar)
|
||||||
|
|
@ -188,6 +206,23 @@ function program_change()
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
-- Look for "MIDI Program #: code" statements with function calls
|
||||||
|
nextchar = 1
|
||||||
|
while true do
|
||||||
|
local MIDI_Program_start, MIDI_Program_end, program_list, code
|
||||||
|
MIDI_Program_start,MIDI_Program_end,program_list,code = string.find(route_comment, "MIDI Program (%d[-%d,]*): ([^\n]+)", nextchar)
|
||||||
|
if program_list then
|
||||||
|
local matches = match_number_range(program, program_list)
|
||||||
|
route_active = route_active or matches
|
||||||
|
MIDI_Program_seen = true
|
||||||
|
if matches and code then
|
||||||
|
table.insert(program_functions, code)
|
||||||
|
end
|
||||||
|
nextchar = MIDI_Program_end + 1
|
||||||
|
else
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
-- Look for "MIDI Program #" statements that match just the program number
|
-- Look for "MIDI Program #" statements that match just the program number
|
||||||
nextchar = 1
|
nextchar = 1
|
||||||
while true do
|
while true do
|
||||||
|
|
@ -206,8 +241,25 @@ function program_change()
|
||||||
-- all tracks with a "MIDI Program" line present are set either active or inactive, depending on if they matched
|
-- all tracks with a "MIDI Program" line present are set either active or inactive, depending on if they matched
|
||||||
-- all other tracks (no "MIDI Progam" line) are not affected (they never get to this point)
|
-- all other tracks (no "MIDI Progam" line) are not affected (they never get to this point)
|
||||||
route:set_active(route_active, nil);
|
route:set_active(route_active, nil);
|
||||||
-- if this route is active, parse any CC functions in the route's comment block
|
-- if this route is active, execute any program change functions and parse any CC functions in the route's comment block
|
||||||
if route_active then
|
if route_active then
|
||||||
|
-- execute program change functions after track activation
|
||||||
|
for _, code in ipairs(program_functions) do
|
||||||
|
local func, err = load("return function(route) " .. code .. " end")
|
||||||
|
if func then
|
||||||
|
local ok, generated_func = pcall(func)
|
||||||
|
if ok then
|
||||||
|
local success, exec_err = pcall(generated_func, route)
|
||||||
|
if not success then
|
||||||
|
print("Program function execution error:", exec_err)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
print("Program function generation error:", generated_func)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
print("Program function compilation error:", err)
|
||||||
|
end
|
||||||
|
end
|
||||||
local nextchar = 1
|
local nextchar = 1
|
||||||
local local_CC_functions = { }
|
local local_CC_functions = { }
|
||||||
-- we wrap the code inside "return function (route, value)" and "end"
|
-- we wrap the code inside "return function (route, value)" and "end"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue