NOP: Convert back to using tabs instead of spaces

See Ardour style guide rule #27 for reasoning
This commit is contained in:
Nikolaus Gullotta 2020-01-30 13:43:05 -06:00
parent cfea85b496
commit 454a2d0cce
2 changed files with 738 additions and 738 deletions

View file

@ -1,470 +1,470 @@
ardour { ardour {
["type"] = "EditorAction", ["type"] = "EditorAction",
name = "Recall Mixer Settings", name = "Recall Mixer Settings",
author = "Mixbus Team", author = "Mixbus Team",
description = [[ description = [[
Recalls mixer settings outined by files Recalls mixer settings outined by files
created by Store Mixer Settings. created by Store Mixer Settings.
Allows for some room to change Source Allows for some room to change Source
and Destination. and Destination.
]] ]]
} }
function factory () function factory ()
local acoraida_monicas_last_used_recall_file local acoraida_monicas_last_used_recall_file
return function () return function ()
local user_cfg = ARDOUR.user_config_directory(-1) local user_cfg = ARDOUR.user_config_directory(-1)
local local_path = ARDOUR.LuaAPI.build_filename(Session:path(), 'mixer_settings') local local_path = ARDOUR.LuaAPI.build_filename(Session:path(), 'mixer_settings')
local global_path = ARDOUR.LuaAPI.build_filename(user_cfg, 'mixer_settings') local global_path = ARDOUR.LuaAPI.build_filename(user_cfg, 'mixer_settings')
local invalidate = {} local invalidate = {}
function exists(file) function exists(file)
local ok, err, code = os.rename(file, file) local ok, err, code = os.rename(file, file)
if not ok then if not ok then
if code == 13 then -- Permission denied, but it exists if code == 13 then -- Permission denied, but it exists
return true return true
end end
end return ok, err end return ok, err
end end
function whoami() function whoami()
if not pcall(function() local first_check = Session:get_mixbus(0) end) then if not pcall(function() local first_check = Session:get_mixbus(0) end) then
return "Ardour" return "Ardour"
else else
local second_check = Session:get_mixbus(11) local second_check = Session:get_mixbus(11)
if second_check:isnil() then if second_check:isnil() then
return "Mixbus" return "Mixbus"
else else
return "32C" return "32C"
end end
end end
end end
function isdir(path) function isdir(path)
return exists(path.."/") return exists(path.."/")
end end
function get_processor_by_name(track, name) function get_processor_by_name(track, name)
local i = 0 local i = 0
local proc = track:nth_processor(i) local proc = track:nth_processor(i)
repeat repeat
if(proc:display_name() == name) then if(proc:display_name() == name) then
return proc return proc
else else
i = i + 1 i = i + 1
end end
proc = track:nth_processor(i) proc = track:nth_processor(i)
until proc:isnil() until proc:isnil()
end end
function new_plugin(name, type) function new_plugin(name, type)
local plugin = ARDOUR.LuaAPI.new_plugin(Session, name, type, "") local plugin = ARDOUR.LuaAPI.new_plugin(Session, name, type, "")
if not(plugin:isnil()) then return plugin end if not(plugin:isnil()) then return plugin end
end end
function group_by_id(id) function group_by_id(id)
local id = tonumber(id) local id = tonumber(id)
for g in Session:route_groups():iter() do for g in Session:route_groups():iter() do
local group_id = tonumber(g:to_stateful():id():to_s()) local group_id = tonumber(g:to_stateful():id():to_s())
if group_id == id then return g end if group_id == id then return g end
end end
end end
function group_by_name(name) function group_by_name(name)
for g in Session:route_groups():iter() do for g in Session:route_groups():iter() do
if g:name() == name then return g end if g:name() == name then return g end
end end
end end
function route_groupid_interrogate(t) function route_groupid_interrogate(t)
local group = false local group = false
for g in Session:route_groups():iter() do for g in Session:route_groups():iter() do
for r in g:route_list():iter() do for r in g:route_list():iter() do
if r:name() == t:name() then group = g:to_stateful():id():to_s() end if r:name() == t:name() then group = g:to_stateful():id():to_s() end
end end
end return group end return group
end end
function route_group_interrogate(t) function route_group_interrogate(t)
for g in Session:route_groups():iter() do for g in Session:route_groups():iter() do
for r in g:route_list():iter() do for r in g:route_list():iter() do
if r:name() == t:name() then return g end if r:name() == t:name() then return g end
end end
end end
end end
function recall(debug, path, dry_run) function recall(debug, path, dry_run)
local file = io.open(path, "r") local file = io.open(path, "r")
assert(file, "File not found!") assert(file, "File not found!")
local bypass_routes = {} local bypass_routes = {}
local i = 0 local i = 0
for l in file:lines() do for l in file:lines() do
--print(i, l) --print(i, l)
local create_groups = dry_run["create_groups"] local create_groups = dry_run["create_groups"]
local skip_line = false local skip_line = false
local plugin, route, group = false, false, false local plugin, route, group = false, false, false
local f = load(l) local f = load(l)
if debug then if debug then
--print('create_groups ' .. tostring(create_groups)) --print('create_groups ' .. tostring(create_groups))
print(i, string.sub(l, 0, 29), f) print(i, string.sub(l, 0, 29), f)
end end
if f then f() end if f then f() end
if instance["route_id"] then route = true end if instance["route_id"] then route = true end
if instance["plugin_id"] then plugin = true end if instance["plugin_id"] then plugin = true end
if instance["group_id"] then group = true end if instance["group_id"] then group = true end
if group then if group then
local g_id = instance["group_id"] local g_id = instance["group_id"]
local routes = instance["routes"] local routes = instance["routes"]
local name = instance["name"] local name = instance["name"]
local group = group_by_id(g_id) local group = group_by_id(g_id)
if not(group) then if not(group) then
if create_groups then if create_groups then
local group = Session:new_route_group(name) local group = Session:new_route_group(name)
for _, v in pairs(routes) do for _, v in pairs(routes) do
local rt = Session:route_by_id(PBD.ID(v)) local rt = Session:route_by_id(PBD.ID(v))
if rt:isnil() then rt = Session:route_by_name(name) end if rt:isnil() then rt = Session:route_by_name(name) end
if not(rt:isnil()) then group:add(rt) end if not(rt:isnil()) then group:add(rt) end
end end
end end
end end
end end
if route then if route then
local substitution = tonumber(dry_run["destination-"..i]) local substitution = tonumber(dry_run["destination-"..i])
if substitution == 0 then if substitution == 0 then
bypass_routes[#bypass_routes + 1] = instance["route_id"] bypass_routes[#bypass_routes + 1] = instance["route_id"]
goto nextline goto nextline
end end
local old_order = ARDOUR.ProcessorList() local old_order = ARDOUR.ProcessorList()
local route_id = instance["route_id"] local route_id = instance["route_id"]
local r_id = PBD.ID(instance["route_id"]) local r_id = PBD.ID(instance["route_id"])
local muted, soloed = instance["muted"], instance["soloed"] local muted, soloed = instance["muted"], instance["soloed"]
local order = instance["order"] local order = instance["order"]
local cache = instance["cache"] local cache = instance["cache"]
local group = instance["group"] local group = instance["group"]
local group_name = instance["group_name"] local group_name = instance["group_name"]
local name = instance["route_name"] local name = instance["route_name"]
local gc, tc, pc = instance["gain_control"], instance["trim_control"], instance["pan_control"] local gc, tc, pc = instance["gain_control"], instance["trim_control"], instance["pan_control"]
local sends = instance["sends"] local sends = instance["sends"]
if not(substitution == instance["route_id"]) then if not(substitution == instance["route_id"]) then
print('SUBSTITUTION FOR: ', name, substitution, Session:route_by_id(PBD.ID(substitution)):name()) print('SUBSTITUTION FOR: ', name, substitution, Session:route_by_id(PBD.ID(substitution)):name())
--bypass_routes[#bypass_routes + 1] = route_id --bypass_routes[#bypass_routes + 1] = route_id
was_subbed = true was_subbed = true
r_id = PBD.ID(substitution) r_id = PBD.ID(substitution)
end end
local rt = Session:route_by_id(r_id) local rt = Session:route_by_id(r_id)
if rt:isnil() then rt = Session:route_by_name(name) end if rt:isnil() then rt = Session:route_by_name(name) end
if rt:isnil() then goto nextline end if rt:isnil() then goto nextline end
if sends then if sends then
for i, data in pairs(sends) do for i, data in pairs(sends) do
i = i-1 i = i-1
for j, ctrl in pairs({ for j, ctrl in pairs({
rt:send_level_controllable(i), rt:send_level_controllable(i),
rt:send_enable_controllable(i), rt:send_enable_controllable(i),
rt:send_pan_azimuth_controllable(i), rt:send_pan_azimuth_controllable(i),
rt:send_pan_azimuth_enable_controllable(i), rt:send_pan_azimuth_enable_controllable(i),
}) do }) do
if not(ctrl:isnil()) then if not(ctrl:isnil()) then
local value = data[j] local value = data[j]
if value then if value then
if debug then if debug then
print("Setting " .. ctrl:name() .. " to value " .. value) print("Setting " .. ctrl:name() .. " to value " .. value)
end end
ctrl:set_value(value, PBD.GroupControlDisposition.NoGroup) ctrl:set_value(value, PBD.GroupControlDisposition.NoGroup)
end end
end end
end end
end end
end end
local cur_group_id = route_groupid_interrogate(rt) local cur_group_id = route_groupid_interrogate(rt)
if not(group) and (cur_group_id) then if not(group) and (cur_group_id) then
local g = group_by_id(cur_group_id) local g = group_by_id(cur_group_id)
if g then g:remove(rt) end if g then g:remove(rt) end
end end
local rt_group = group_by_name(group_name) local rt_group = group_by_name(group_name)
if rt_group then rt_group:add(rt) end if rt_group then rt_group:add(rt) end
well_known = {'PRE', 'Trim', 'EQ', 'Comp', 'Fader', 'POST'} well_known = {'PRE', 'Trim', 'EQ', 'Comp', 'Fader', 'POST'}
protected_instrument = false protected_instrument = false
for k, v in pairs(order) do for k, v in pairs(order) do
local proc = Session:processor_by_id(PBD.ID(1)) local proc = Session:processor_by_id(PBD.ID(1))
if not(was_subbed) then if not(was_subbed) then
proc = Session:processor_by_id(PBD.ID(v)) proc = Session:processor_by_id(PBD.ID(v))
end end
if proc:isnil() then if proc:isnil() then
for id, sub_tbl in pairs(cache) do for id, sub_tbl in pairs(cache) do
local name = sub_tbl[1] local name = sub_tbl[1]
local type = sub_tbl[2] local type = sub_tbl[2]
if v == id then if v == id then
proc = new_plugin(name, type) proc = new_plugin(name, type)
for _, control in pairs(well_known) do for _, control in pairs(well_known) do
if name == control then if name == control then
proc = get_processor_by_name(rt, control) proc = get_processor_by_name(rt, control)
invalidate[v] = proc:to_stateful():id():to_s() invalidate[v] = proc:to_stateful():id():to_s()
goto nextproc goto nextproc
end end
end end
if not(proc) then goto nextproc end if not(proc) then goto nextproc end
if not(proc:isnil()) then if not(proc:isnil()) then
rt:add_processor_by_index(proc, 0, nil, true) rt:add_processor_by_index(proc, 0, nil, true)
invalidate[v] = proc:to_stateful():id():to_s() invalidate[v] = proc:to_stateful():id():to_s()
end end
end end
end end
end end
::nextproc:: ::nextproc::
if proc and not(proc:isnil()) then old_order:push_back(proc) end if proc and not(proc:isnil()) then old_order:push_back(proc) end
if not(old_order:empty()) and not(protected_instrument) then if not(old_order:empty()) and not(protected_instrument) then
if not(rt:to_track():to_midi_track():isnil()) then if not(rt:to_track():to_midi_track():isnil()) then
if not(rt:the_instrument():isnil()) then if not(rt:the_instrument():isnil()) then
protected_instrument = true protected_instrument = true
old_order:push_back(rt:the_instrument()) old_order:push_back(rt:the_instrument())
end end
end end
end end
end end
rt:reorder_processors(old_order, nil) rt:reorder_processors(old_order, nil)
if muted then rt:mute_control():set_value(1, 1) else rt:mute_control():set_value(0, 1) end if muted then rt:mute_control():set_value(1, 1) else rt:mute_control():set_value(0, 1) end
if soloed then rt:solo_control():set_value(1, 1) else rt:solo_control():set_value(0, 1) end if soloed then rt:solo_control():set_value(1, 1) else rt:solo_control():set_value(0, 1) end
rt:gain_control():set_value(gc, 1) rt:gain_control():set_value(gc, 1)
rt:trim_control():set_value(tc, 1) rt:trim_control():set_value(tc, 1)
if pc ~= false and not(rt:is_master()) then rt:pan_azimuth_control():set_value(pc, 1) end if pc ~= false and not(rt:is_master()) then rt:pan_azimuth_control():set_value(pc, 1) end
end end
if plugin then if plugin then
--if the plugin is owned by a route --if the plugin is owned by a route
--we decided not to use, skip it --we decided not to use, skip it
for _, v in pairs(bypass_routes) do for _, v in pairs(bypass_routes) do
if instance["owned_by_route_id"] == v then if instance["owned_by_route_id"] == v then
goto nextline goto nextline
end end
end end
local enable = {} local enable = {}
local params = instance["parameters"] local params = instance["parameters"]
local p_id = instance["plugin_id"] local p_id = instance["plugin_id"]
local act = instance["active"] local act = instance["active"]
for k, v in pairs(invalidate) do --invalidate any deleted plugin's id for k, v in pairs(invalidate) do --invalidate any deleted plugin's id
if p_id == k then if p_id == k then
p_id = v p_id = v
end end
end end
local proc = Session:processor_by_id(PBD.ID(p_id)) local proc = Session:processor_by_id(PBD.ID(p_id))
if proc:isnil() then goto nextline end if proc:isnil() then goto nextline end
local plug = proc:to_insert():plugin(0) local plug = proc:to_insert():plugin(0)
for k, v in pairs(params) do for k, v in pairs(params) do
local label = plug:parameter_label(k) local label = plug:parameter_label(k)
if string.find(label, "Assign") or string.find(label, "Enable") then --@ToDo: Check Plugin type == LADSPA or VST? if string.find(label, "Assign") or string.find(label, "Enable") then --@ToDo: Check Plugin type == LADSPA or VST?
enable[k] = v --queue any assignments/enables for after the initial parameter recalling to duck the 'in-on-change' feature enable[k] = v --queue any assignments/enables for after the initial parameter recalling to duck the 'in-on-change' feature
end end
print(string.format("%s (Port: %s) -> %s", label, k, v)) print(string.format("%s (Port: %s) -> %s", label, k, v))
ARDOUR.LuaAPI.set_processor_param(proc, k, v) ARDOUR.LuaAPI.set_processor_param(proc, k, v)
end end
for k, v in pairs(enable) do for k, v in pairs(enable) do
ARDOUR.LuaAPI.set_processor_param(proc, k, v) ARDOUR.LuaAPI.set_processor_param(proc, k, v)
end end
if act then proc:activate() else proc:deactivate() end if act then proc:activate() else proc:deactivate() end
end end
::nextline:: ::nextline::
i = i + 1 i = i + 1
end end
end end
function dry_run(debug, path) function dry_run(debug, path)
--returns a dialog-able table of --returns a dialog-able table of
--everything we do (logically) --everything we do (logically)
--in the recall function --in the recall function
local route_values = {['----'] = "0"} local route_values = {['----'] = "0"}
for r in Session:get_routes():iter() do for r in Session:get_routes():iter() do
route_values[r:name()] = r:to_stateful():id():to_s() route_values[r:name()] = r:to_stateful():id():to_s()
end end
local i = 0 local i = 0
local dry_table = { local dry_table = {
{type = "label", align="right", key="col-1-title", col=0, colspan=1, title = 'Source:'}, {type = "label", align="right", key="col-1-title", col=0, colspan=1, title = 'Source:'},
{type = "label", align="left", key="col-2-title", col=1, colspan=1, title = 'Destination:'}, {type = "label", align="left", key="col-2-title", col=1, colspan=1, title = 'Destination:'},
} }
local file = io.open(path, "r") local file = io.open(path, "r")
assert(file, "File not found!") assert(file, "File not found!")
pad = 0 pad = 0
for l in file:lines() do for l in file:lines() do
local do_plugin, do_route, do_group = false, false, false local do_plugin, do_route, do_group = false, false, false
local f = load(l) local f = load(l)
if debug then if debug then
print(i, string.sub(l, 0, 29), f) print(i, string.sub(l, 0, 29), f)
end end
if f then f() end if f then f() end
if instance["route_id"] then do_route = true end if instance["route_id"] then do_route = true end
if instance["plugin_id"] then do_plugin = true end if instance["plugin_id"] then do_plugin = true end
if instance["group_id"] then do_group = true end if instance["group_id"] then do_group = true end
if do_group then if do_group then
local group_id = instance["group_id"] local group_id = instance["group_id"]
local group_name = instance["name"] local group_name = instance["name"]
local dlg_title, action_title = "", "" local dlg_title, action_title = "", ""
local group_ptr = group_by_id(group_id) local group_ptr = group_by_id(group_id)
if not(group_ptr) then if not(group_ptr) then
dlg_title = string.format("(Group) %s.", group_name) dlg_title = string.format("(Group) %s.", group_name)
--action_title = "will create and use settings" --action_title = "will create and use settings"
else else
dlg_title = string.format("(Group) %s.", group_ptr:name()) dlg_title = string.format("(Group) %s.", group_ptr:name())
--action_title = "will use group settings" --action_title = "will use group settings"
end end
table.insert(dry_table, { table.insert(dry_table, {
order=pad, type = "label", align="right", key = "group-"..i , col = 0, colspan = 1, title = dlg_title order=pad, type = "label", align="right", key = "group-"..i , col = 0, colspan = 1, title = dlg_title
}) })
pad = pad + 1 pad = pad + 1
end end
if do_route then if do_route then
local route_id = instance["route_id"] local route_id = instance["route_id"]
local route_name = instance["route_name"] local route_name = instance["route_name"]
local dlg_title = "" local dlg_title = ""
local route_ptr = Session:route_by_id(PBD.ID(route_id)) local route_ptr = Session:route_by_id(PBD.ID(route_id))
if route_ptr:isnil() then if route_ptr:isnil() then
route_ptr = Session:route_by_name(route_name) route_ptr = Session:route_by_name(route_name)
if not(route_ptr:isnil()) then if not(route_ptr:isnil()) then
dlg_title = string.format("%s", route_ptr:name()) dlg_title = string.format("%s", route_ptr:name())
--action_title = "will use route settings" --action_title = "will use route settings"
else else
dlg_title = string.format("%s", route_name) dlg_title = string.format("%s", route_name)
--action_title = "will be ignored" --action_title = "will be ignored"
end end
else else
dlg_title = string.format("%s", route_ptr:name()) dlg_title = string.format("%s", route_ptr:name())
--action_title = "will use route settings" --action_title = "will use route settings"
end end
if route_ptr:isnil() then name = route_name else name = route_ptr:name() end if route_ptr:isnil() then name = route_name else name = route_ptr:name() end
table.insert(dry_table, { table.insert(dry_table, {
order=instance['pi_order']+pad, type = "label", align="right", key = "route-"..i , col = 0, colspan = 1, title = dlg_title order=instance['pi_order']+pad, type = "label", align="right", key = "route-"..i , col = 0, colspan = 1, title = dlg_title
}) })
table.insert(dry_table, { table.insert(dry_table, {
type = "dropdown", align="left", key = "destination-"..i, col = 1, colspan = 1, title = "", values = route_values, default = name or "----" type = "dropdown", align="left", key = "destination-"..i, col = 1, colspan = 1, title = "", values = route_values, default = name or "----"
}) })
end end
i = i + 1 i = i + 1
end end
table.insert(dry_table, { table.insert(dry_table, {
type = "checkbox", col=0, colspan=2, align="left", key = "create_groups", default = true, title = "Create Groups if necessary?" type = "checkbox", col=0, colspan=2, align="left", key = "create_groups", default = true, title = "Create Groups if necessary?"
}) })
return dry_table return dry_table
end end
local global_vs_local_dlg = { local global_vs_local_dlg = {
{ type = "label", col=0, colspan=20, align="left", title = "" }, { type = "label", col=0, colspan=20, align="left", title = "" },
{ {
type = "radio", col=0, colspan=20, align="left", key = "recall-dir", title = "", values = type = "radio", col=0, colspan=20, align="left", key = "recall-dir", title = "", values =
{ {
['Pick from Global Settings'] = 1, ['Pick from Local Settings'] = 2, ['Last Used Recall File'] = 3, ['Pick from Global Settings'] = 1, ['Pick from Local Settings'] = 2, ['Last Used Recall File'] = 3,
}, },
default = 'Last Used Recall File' default = 'Last Used Recall File'
}, },
{ type = "label", col=0, colspan=20, align="left", title = ""}, { type = "label", col=0, colspan=20, align="left", title = ""},
} }
local recall_options = { local recall_options = {
{ type = "label", col=0, colspan=10, align="left", title = "" }, { type = "label", col=0, colspan=10, align="left", title = "" },
{ type = "file", col=0, colspan=15, align="left", key = "file", title = "Select a Settings File", path = ARDOUR.LuaAPI.build_filename(Session:path(), "export", "params.lua") }, { type = "file", col=0, colspan=15, align="left", key = "file", title = "Select a Settings File", path = ARDOUR.LuaAPI.build_filename(Session:path(), "export", "params.lua") },
{ type = "label", col=0, colspan=10, align="left", title = "" }, { type = "label", col=0, colspan=10, align="left", title = "" },
} }
local gvld = LuaDialog.Dialog("Recall Mixer Settings:", global_vs_local_dlg):run() local gvld = LuaDialog.Dialog("Recall Mixer Settings:", global_vs_local_dlg):run()
if not(gvld) then if not(gvld) then
return return
else else
if gvld['recall-dir'] == 1 then if gvld['recall-dir'] == 1 then
local global_ok = isdir(global_path) local global_ok = isdir(global_path)
local global_default_path = ARDOUR.LuaAPI.build_filename(global_path, string.format("FactoryDefault-%s.lua", whoami())) local global_default_path = ARDOUR.LuaAPI.build_filename(global_path, string.format("FactoryDefault-%s.lua", whoami()))
print(global_default_path) print(global_default_path)
if global_ok then if global_ok then
recall_options[2]['path'] = global_default_path recall_options[2]['path'] = global_default_path
local rv = LuaDialog.Dialog("Recall Mixer Settings:", recall_options):run() local rv = LuaDialog.Dialog("Recall Mixer Settings:", recall_options):run()
if not(rv) then return end if not(rv) then return end
local dry_return = LuaDialog.Dialog("Recall Mixer Settings:", dry_run(false, rv['file'])):run() local dry_return = LuaDialog.Dialog("Recall Mixer Settings:", dry_run(false, rv['file'])):run()
if dry_return then if dry_return then
acoraida_monicas_last_used_recall_file = rv['file'] acoraida_monicas_last_used_recall_file = rv['file']
recall(false, rv['file'], dry_return) recall(false, rv['file'], dry_return)
else else
return return
end end
else else
LuaDialog.Message ("Recall Mixer Settings:", LuaDialog.Message ("Recall Mixer Settings:",
global_path .. ' does not exist!\nPlease run Store Mixer Settings first.', global_path .. ' does not exist!\nPlease run Store Mixer Settings first.',
LuaDialog.MessageType.Info, LuaDialog.ButtonType.Close):run() LuaDialog.MessageType.Info, LuaDialog.ButtonType.Close):run()
end end
end end
if gvld['recall-dir'] == 2 then if gvld['recall-dir'] == 2 then
local local_ok = isdir(local_path) local local_ok = isdir(local_path)
local local_default_path = ARDOUR.LuaAPI.build_filename(local_path, 'asdf') local local_default_path = ARDOUR.LuaAPI.build_filename(local_path, 'asdf')
print(local_default_path) print(local_default_path)
if local_ok then if local_ok then
recall_options[2]['path'] = local_default_path recall_options[2]['path'] = local_default_path
local rv = LuaDialog.Dialog("Recall Mixer Settings:", recall_options):run() local rv = LuaDialog.Dialog("Recall Mixer Settings:", recall_options):run()
if not(rv) then return end if not(rv) then return end
local dry_return = LuaDialog.Dialog("Recall Mixer Settings:", dry_run(false, rv['file'])):run() local dry_return = LuaDialog.Dialog("Recall Mixer Settings:", dry_run(false, rv['file'])):run()
if dry_return then if dry_return then
acoraida_monicas_last_used_recall_file = rv['file'] acoraida_monicas_last_used_recall_file = rv['file']
recall(true, rv['file'], dry_return) recall(true, rv['file'], dry_return)
else else
return return
end end
else else
LuaDialog.Message ("Recall Mixer Settings:", LuaDialog.Message ("Recall Mixer Settings:",
local_path .. 'does not exist!\nPlease run Store Mixer Settings first.', local_path .. 'does not exist!\nPlease run Store Mixer Settings first.',
LuaDialog.MessageType.Info, LuaDialog.ButtonType.Close):run() LuaDialog.MessageType.Info, LuaDialog.ButtonType.Close):run()
end end
end end
if gvld['recall-dir'] == 3 then if gvld['recall-dir'] == 3 then
if acoraida_monicas_last_used_recall_file then if acoraida_monicas_last_used_recall_file then
local dry_return = LuaDialog.Dialog("Recall Mixer Settings:", dry_run(false, acoraida_monicas_last_used_recall_file)):run() local dry_return = LuaDialog.Dialog("Recall Mixer Settings:", dry_run(false, acoraida_monicas_last_used_recall_file)):run()
if dry_return then if dry_return then
recall(true, acoraida_monicas_last_used_recall_file, dry_return) recall(true, acoraida_monicas_last_used_recall_file, dry_return)
else else
return return
end end
else else
LuaDialog.Message ("Script has no record of last used file:", LuaDialog.Message ("Script has no record of last used file:",
'Please pick a recall file and then this option will be available', 'Please pick a recall file and then this option will be available',
LuaDialog.MessageType.Info, LuaDialog.ButtonType.Close):run() LuaDialog.MessageType.Info, LuaDialog.ButtonType.Close):run()
end end
end end
end end
end end end end

View file

@ -1,383 +1,383 @@
ardour { ardour {
["type"] = "EditorAction", ["type"] = "EditorAction",
name = "Store Mixer Settings", name = "Store Mixer Settings",
author = "Mixbus Team", author = "Mixbus Team",
description = [[ description = [[
Stores the current Mixer state as a file Stores the current Mixer state as a file
that can be read and recalled arbitrarily that can be read and recalled arbitrarily
by it's companion script, Recall Mixer Settings. by it's companion script, Recall Mixer Settings.
Supports: processor settings, grouping, Supports: processor settings, grouping,
mute, solo, gain, trim, pan and processor ordering, mute, solo, gain, trim, pan and processor ordering,
plus re-adding certain deleted plugins. plus re-adding certain deleted plugins.
]] ]]
} }
function factory () return function () function factory () return function ()
local user_cfg = ARDOUR.user_config_directory(-1) local user_cfg = ARDOUR.user_config_directory(-1)
local local_path = ARDOUR.LuaAPI.build_filename(Session:path(), 'mixer_settings') local local_path = ARDOUR.LuaAPI.build_filename(Session:path(), 'mixer_settings')
local global_path = ARDOUR.LuaAPI.build_filename(user_cfg, 'mixer_settings') local global_path = ARDOUR.LuaAPI.build_filename(user_cfg, 'mixer_settings')
function exists(file) function exists(file)
local ok, err, code = os.rename(file, file) local ok, err, code = os.rename(file, file)
if not ok then if not ok then
if code == 13 then -- Permission denied, but it exists if code == 13 then -- Permission denied, but it exists
return true return true
end end
end return ok, err end return ok, err
end end
function whoami() function whoami()
if not pcall(function() local first_check = Session:get_mixbus(0) end) then if not pcall(function() local first_check = Session:get_mixbus(0) end) then
return "Ardour" return "Ardour"
else else
local second_check = Session:get_mixbus(11) local second_check = Session:get_mixbus(11)
if second_check:isnil() then if second_check:isnil() then
return "Mixbus" return "Mixbus"
else else
return "32C" return "32C"
end end
end end
end end
function isdir(path) function isdir(path)
return exists(path.."/") return exists(path.."/")
end end
function setup_paths() function setup_paths()
local global_ok, local_ok = false, false local global_ok, local_ok = false, false
if not(isdir(global_path)) then if not(isdir(global_path)) then
global_ok, _, _ = os.execute('mkdir '.. global_path) global_ok, _, _ = os.execute('mkdir '.. global_path)
if global_ok == 0 then if global_ok == 0 then
global_ok = true global_ok = true
end end
else else
global_ok = true global_ok = true
end end
if not(isdir(local_path)) then if not(isdir(local_path)) then
local_ok, _, _ = os.execute('mkdir '.. local_path) local_ok, _, _ = os.execute('mkdir '.. local_path)
if local_ok == 0 then if local_ok == 0 then
local_ok = true local_ok = true
end end
else else
local_ok = true local_ok = true
end end
return global_ok, local_ok return global_ok, local_ok
end end
function get_processor_by_name(track, name) function get_processor_by_name(track, name)
local i = 0 local i = 0
local proc = track:nth_processor(i) local proc = track:nth_processor(i)
repeat repeat
if(proc:display_name() == name) then if(proc:display_name() == name) then
return proc return proc
else else
i = i + 1 i = i + 1
end end
proc = track:nth_processor(i) proc = track:nth_processor(i)
until proc:isnil() until proc:isnil()
end end
function group_by_id(id) function group_by_id(id)
local id = tonumber(id) local id = tonumber(id)
for g in Session:route_groups():iter() do for g in Session:route_groups():iter() do
local group_id = tonumber(g:to_stateful():id():to_s()) local group_id = tonumber(g:to_stateful():id():to_s())
if group_id == id then return g end if group_id == id then return g end
end end
end end
function group_by_name(name) function group_by_name(name)
for g in Session:route_groups():iter() do for g in Session:route_groups():iter() do
if g:name() == name then return g end if g:name() == name then return g end
end end
end end
function route_groupid_interrogate(t) function route_groupid_interrogate(t)
local group = false local group = false
for g in Session:route_groups():iter() do for g in Session:route_groups():iter() do
for r in g:route_list():iter() do for r in g:route_list():iter() do
if r:name() == t:name() then group = g:to_stateful():id():to_s() end if r:name() == t:name() then group = g:to_stateful():id():to_s() end
end end
end return group end return group
end end
function route_group_interrogate(t) function route_group_interrogate(t)
for g in Session:route_groups():iter() do for g in Session:route_groups():iter() do
for r in g:route_list():iter() do for r in g:route_list():iter() do
if r:name() == t:name() then return g end if r:name() == t:name() then return g end
end end
end end
end end
function empty_last_store(path) --empty current file from last run function empty_last_store(path) --empty current file from last run
local file = io.open(path, "w") local file = io.open(path, "w")
--file:write(string.format("instance = { whoami = '%s' }", whoami()) --file:write(string.format("instance = { whoami = '%s' }", whoami())
file:write("") file:write("")
file:close() file:close()
end end
function mark_tracks(selected, path) function mark_tracks(selected, path)
empty_last_store(path) empty_last_store(path)
local route_string = [[instance = { local route_string = [[instance = {
route_id = %d, route_id = %d,
route_name = '%s', route_name = '%s',
gain_control = %s, gain_control = %s,
trim_control = %s, trim_control = %s,
pan_control = %s, pan_control = %s,
sends = {%s}, sends = {%s},
muted = %s, muted = %s,
soloed = %s, soloed = %s,
order = {%s}, order = {%s},
cache = {%s}, cache = {%s},
group = %s, group = %s,
group_name = '%s', group_name = '%s',
pi_order = %d pi_order = %d
}]] }]]
local group_string = [[instance = { local group_string = [[instance = {
group_id = %s, group_id = %s,
name = '%s', name = '%s',
routes = {%s}, routes = {%s},
}]] }]]
local processor_string = [[instance = { local processor_string = [[instance = {
plugin_id = %d, plugin_id = %d,
type = %d, type = %d,
display_name = '%s', display_name = '%s',
owned_by_route_name = '%s', owned_by_route_name = '%s',
owned_by_route_id = %d, owned_by_route_id = %d,
parameters = {%s}, parameters = {%s},
active = %s, active = %s,
}]] }]]
local group_route_string = " [%d] = %s," local group_route_string = " [%d] = %s,"
local proc_order_string = " [%d] = %d," local proc_order_string = " [%d] = %d,"
local proc_cache_string = " [%d] = {'%s', %d}," local proc_cache_string = " [%d] = {'%s', %d},"
local params_string = " [%d] = %s," local params_string = " [%d] = %s,"
--ensure easy-to-read formatting doesn't make it through --ensure easy-to-read formatting doesn't make it through
local route_string = string.gsub(route_string, "[\n\t%s]", "") local route_string = string.gsub(route_string, "[\n\t%s]", "")
local group_string = string.gsub(group_string, "[\n\t%s]", "") local group_string = string.gsub(group_string, "[\n\t%s]", "")
local processor_string = string.gsub(processor_string, "[\n\t%s]", "") local processor_string = string.gsub(processor_string, "[\n\t%s]", "")
local sel = Editor:get_selection () local sel = Editor:get_selection ()
local groups_to_write = {} local groups_to_write = {}
local i = 0 local i = 0
local tracks = Session:get_stripables() local tracks = Session:get_stripables()
if selected then tracks = sel.tracks:routelist() end if selected then tracks = sel.tracks:routelist() end
for r in tracks:iter() do for r in tracks:iter() do
local group = route_group_interrogate(r) local group = route_group_interrogate(r)
if group then if group then
local already_there = false local already_there = false
for _, v in pairs(groups_to_write) do for _, v in pairs(groups_to_write) do
if group == v then if group == v then
already_there = true already_there = true
end end
end end
if not(already_there) then if not(already_there) then
groups_to_write[#groups_to_write + 1] = group groups_to_write[#groups_to_write + 1] = group
end end
end end
end end
for _, g in pairs(groups_to_write) do for _, g in pairs(groups_to_write) do
local tmp_str = "" local tmp_str = ""
for t in g:route_list():iter() do for t in g:route_list():iter() do
tmp_str = tmp_str .. string.format(group_route_string, i, t:to_stateful():id():to_s()) tmp_str = tmp_str .. string.format(group_route_string, i, t:to_stateful():id():to_s())
i = i + 1 i = i + 1
end end
local group_str = string.format( local group_str = string.format(
group_string, group_string,
g:to_stateful():id():to_s(), g:to_stateful():id():to_s(),
g:name(), g:name(),
tmp_str tmp_str
) )
file = io.open(path, "a") file = io.open(path, "a")
file:write(group_str, "\r\n") file:write(group_str, "\r\n")
file:close() file:close()
end end
for r in tracks:iter() do for r in tracks:iter() do
if r:is_monitor () or r:is_auditioner () or not(r:to_vca():isnil()) then goto nextroute end -- skip special routes if r:is_monitor () or r:is_auditioner () or not(r:to_vca():isnil()) then goto nextroute end -- skip special routes
r = r:to_route() r = r:to_route()
if r:isnil() then goto nextroute end if r:isnil() then goto nextroute end
local order = ARDOUR.ProcessorList() local order = ARDOUR.ProcessorList()
local x = 0 local x = 0
repeat repeat
local proc = r:nth_processor(x) local proc = r:nth_processor(x)
if not proc:isnil() then if not proc:isnil() then
order:push_back(proc) order:push_back(proc)
end end
x = x + 1 x = x + 1
until proc:isnil() until proc:isnil()
local route_group = route_group_interrogate(r) local route_group = route_group_interrogate(r)
if route_group then route_group = route_group:name() else route_group = "" end if route_group then route_group = route_group:name() else route_group = "" end
local rid = r:to_stateful():id():to_s() local rid = r:to_stateful():id():to_s()
local pan = r:pan_azimuth_control() local pan = r:pan_azimuth_control()
if pan:isnil() then pan = false else pan = pan:get_value() end --sometimes a route doesn't have pan, like the master. if pan:isnil() then pan = false else pan = pan:get_value() end --sometimes a route doesn't have pan, like the master.
-- Get send information, if any. -- Get send information, if any.
local send_string = "" local send_string = ""
local i = 0 local i = 0
repeat repeat
local fmt = "{%s, %s, %s, %s}" local fmt = "{%s, %s, %s, %s}"
string.gsub(fmt, "[\n\t]", "") string.gsub(fmt, "[\n\t]", "")
local values = {} local values = {}
for j, ctrl in pairs({ for j, ctrl in pairs({
r:send_level_controllable(i), r:send_level_controllable(i),
r:send_enable_controllable(i), r:send_enable_controllable(i),
r:send_pan_azimuth_controllable(i), r:send_pan_azimuth_controllable(i),
r:send_pan_azimuth_enable_controllable(i), r:send_pan_azimuth_enable_controllable(i),
}) do }) do
if not(ctrl:isnil()) then if not(ctrl:isnil()) then
values[#values + 1] = ctrl:get_value() values[#values + 1] = ctrl:get_value()
else else
values[#values + 1] = "nil" values[#values + 1] = "nil"
end end
end end
send_string = send_string .. string.format(fmt, table.unpack(values)) send_string = send_string .. string.format(fmt, table.unpack(values))
send_string = send_string .. "," send_string = send_string .. ","
i = i + 1 i = i + 1
until r:send_enable_controllable(i):isnil() until r:send_enable_controllable(i):isnil()
print(send_string) print(send_string)
local order_nmbr = 0 local order_nmbr = 0
local tmp_order_str, tmp_cache_str = "", "" local tmp_order_str, tmp_cache_str = "", ""
for p in order:iter() do for p in order:iter() do
local ptype local ptype
if not(p:to_insert():isnil()) then if not(p:to_insert():isnil()) then
ptype = p:to_insert():plugin(0):get_info().type ptype = p:to_insert():plugin(0):get_info().type
else else
ptype = 99 ptype = 99
end end
local pid = p:to_stateful():id():to_s() local pid = p:to_stateful():id():to_s()
if not(string.find(p:display_name(), "latcomp")) then if not(string.find(p:display_name(), "latcomp")) then
tmp_order_str = tmp_order_str .. string.format(proc_order_string, order_nmbr, pid) tmp_order_str = tmp_order_str .. string.format(proc_order_string, order_nmbr, pid)
tmp_cache_str = tmp_cache_str .. string.format(proc_cache_string, pid, p:display_name(), ptype) tmp_cache_str = tmp_cache_str .. string.format(proc_cache_string, pid, p:display_name(), ptype)
end end
order_nmbr = order_nmbr + 1 order_nmbr = order_nmbr + 1
end end
local route_str = string.format( local route_str = string.format(
route_string, route_string,
rid, rid,
r:name(), r:name(),
ARDOUR.LuaAPI.ascii_dtostr(r:gain_control():get_value()), ARDOUR.LuaAPI.ascii_dtostr(r:gain_control():get_value()),
ARDOUR.LuaAPI.ascii_dtostr(r:trim_control():get_value()), ARDOUR.LuaAPI.ascii_dtostr(r:trim_control():get_value()),
tostring(pan), tostring(pan),
send_string, send_string,
r:muted(), r:muted(),
r:soloed(), r:soloed(),
tmp_order_str, tmp_order_str,
tmp_cache_str, tmp_cache_str,
route_groupid_interrogate(r), route_groupid_interrogate(r),
route_group, route_group,
r:presentation_info_ptr():order() r:presentation_info_ptr():order()
) )
file = io.open(path, "a") file = io.open(path, "a")
file:write(route_str, "\n") file:write(route_str, "\n")
file:close() file:close()
local i = 0 local i = 0
while true do while true do
local params = {} local params = {}
local proc = r:nth_plugin (i) local proc = r:nth_plugin (i)
if proc:isnil () then break end if proc:isnil () then break end
local active = proc:active() local active = proc:active()
local id = proc:to_stateful():id():to_s() local id = proc:to_stateful():id():to_s()
local plug = proc:to_insert ():plugin (0) local plug = proc:to_insert ():plugin (0)
local ptype = proc:to_insert():plugin(0):get_info().type local ptype = proc:to_insert():plugin(0):get_info().type
local n = 0 -- count control-ports local n = 0 -- count control-ports
for j = 0, plug:parameter_count () - 1 do -- iterate over all plugin parameters for j = 0, plug:parameter_count () - 1 do -- iterate over all plugin parameters
if plug:parameter_is_control (j) then if plug:parameter_is_control (j) then
local label = plug:parameter_label (j) local label = plug:parameter_label (j)
if plug:parameter_is_input (j) and label ~= "hidden" and label:sub (1,1) ~= "#" then if plug:parameter_is_input (j) and label ~= "hidden" and label:sub (1,1) ~= "#" then
--local _, _, pd = ARDOUR.LuaAPI.plugin_automation(proc, n) --local _, _, pd = ARDOUR.LuaAPI.plugin_automation(proc, n)
local val = ARDOUR.LuaAPI.get_processor_param(proc, j, true) local val = ARDOUR.LuaAPI.get_processor_param(proc, j, true)
print(r:name(), "->", proc:display_name(), label, val) print(r:name(), "->", proc:display_name(), label, val)
params[j] = val params[j] = val
end end
n = n + 1 n = n + 1
end end
end end
i = i + 1 i = i + 1
local tmp_params_str = "" local tmp_params_str = ""
for k, v in pairs(params) do for k, v in pairs(params) do
tmp_params_str = tmp_params_str .. string.format(params_string, k, ARDOUR.LuaAPI.ascii_dtostr(v)) tmp_params_str = tmp_params_str .. string.format(params_string, k, ARDOUR.LuaAPI.ascii_dtostr(v))
end end
local proc_str = string.format( local proc_str = string.format(
processor_string, processor_string,
id, id,
ptype, ptype,
proc:display_name(), proc:display_name(),
r:name(), r:name(),
r:to_stateful():id():to_s(), r:to_stateful():id():to_s(),
tmp_params_str, tmp_params_str,
active active
) )
file = io.open(path, "a") file = io.open(path, "a")
file:write(proc_str, "\n") file:write(proc_str, "\n")
file:close() file:close()
end end
::nextroute:: ::nextroute::
end end
end end
local store_options = { local store_options = {
{ type = "label", col=0, colspan=1, align="right", title = "Name:" }, { type = "label", col=0, colspan=1, align="right", title = "Name:" },
{ type = "entry", col=1, colspan=1, align="left" , key = "filename", default = Session:name(), title=""}, { type = "entry", col=1, colspan=1, align="left" , key = "filename", default = Session:name(), title=""},
{ type = "label", col=0, colspan=1, align="right", title = "Location:" }, { type = "label", col=0, colspan=1, align="right", title = "Location:" },
{ {
type = "radio", col=1, colspan=3, align="left", key = "store-dir", title = "", values = type = "radio", col=1, colspan=3, align="left", key = "store-dir", title = "", values =
{ {
['Global (accessible from any session)'] = 1, ['Local (this session only)'] = 2 ['Global (accessible from any session)'] = 1, ['Local (this session only)'] = 2
}, },
default = 'Locally (this session only)' default = 'Locally (this session only)'
}, },
{ type = "hseparator", title="", col=0, colspan = 3}, { type = "hseparator", title="", col=0, colspan = 3},
{ type = "label", col=0, colspan=1, align="right", title = "Selected Tracks Only:" }, { type = "label", col=0, colspan=1, align="right", title = "Selected Tracks Only:" },
{ type = "checkbox", col=1, colspan=1, align="left", key = "selected", default = false, title = ""}, { type = "checkbox", col=1, colspan=1, align="left", key = "selected", default = false, title = ""},
--{ type = "label", col=0, colspan=2, align="left", title = ''}, --{ type = "label", col=0, colspan=2, align="left", title = ''},
--{ type = "label", col=0, colspan=2, align="left", title = "Global Path: " .. global_path}, --{ type = "label", col=0, colspan=2, align="left", title = "Global Path: " .. global_path},
--{ type = "label", col=0, colspan=2, align="left", title = "Local Path: " .. local_path}, --{ type = "label", col=0, colspan=2, align="left", title = "Local Path: " .. local_path},
} }
local global_ok, local_ok = setup_paths() local global_ok, local_ok = setup_paths()
if global_ok and local_ok then if global_ok and local_ok then
local rv = LuaDialog.Dialog("Store Mixer Settings:", store_options):run() local rv = LuaDialog.Dialog("Store Mixer Settings:", store_options):run()
if not(rv) then return end if not(rv) then return end
local filename = rv['filename'] local filename = rv['filename']
if rv['store-dir'] == 1 then if rv['store-dir'] == 1 then
local store_path = ARDOUR.LuaAPI.build_filename(global_path, string.format("%s-%s.lua", filename, whoami())) local store_path = ARDOUR.LuaAPI.build_filename(global_path, string.format("%s-%s.lua", filename, whoami()))
local selected = rv['selected'] local selected = rv['selected']
mark_tracks(selected, store_path) mark_tracks(selected, store_path)
end end
if rv['store-dir'] == 2 then if rv['store-dir'] == 2 then
local store_path = ARDOUR.LuaAPI.build_filename(local_path, string.format("%s-%s.lua", filename, whoami())) local store_path = ARDOUR.LuaAPI.build_filename(local_path, string.format("%s-%s.lua", filename, whoami()))
print(store_path) print(store_path)
local selected = rv['selected'] local selected = rv['selected']
mark_tracks(selected, store_path) mark_tracks(selected, store_path)
end end
end end
end end end end