summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorNikolaus Gullotta <nikolaus.gullotta@gmail.com>2018-07-25 15:47:16 -0500
committerNikolaus Gullotta <nikolaus.gullotta@gmail.com>2018-07-25 15:47:16 -0500
commit1698abc3822837aa1650c2a7cfe15722732cd05a (patch)
treec24749cd07a119ab21a5b3423b001bf152c5e7b5 /scripts
parent4b55d65eaa86157a965246e8a023e6396b5bce4c (diff)
get rid of ugly concatenation in favor of string.format(), and add small readout for what the script will do to your session allowing user to pick and choose
Diffstat (limited to 'scripts')
-rw-r--r--scripts/store_recall_mixer.lua256
1 files changed, 225 insertions, 31 deletions
diff --git a/scripts/store_recall_mixer.lua b/scripts/store_recall_mixer.lua
index 724feb9cd5..bd5cd41872 100644
--- a/scripts/store_recall_mixer.lua
+++ b/scripts/store_recall_mixer.lua
@@ -12,6 +12,20 @@ function factory() return function()
local invalidate = {}
local path = ARDOUR.LuaAPI.build_filename(Session:path(), "export", "params.lua")
+ function mismatch_dialog(mismatch_str, checkbox_str)
+ --string.format("Track didn't match ID: %d, but did match track in session: %s", 999, 'track')
+ local dialog = {
+ { type = "label", colspan = 5, title = mismatch_str },
+ { type = "checkbox", col=1, colspan = 1, key = "use", default = true, title = checkbox_str },
+ }
+ local mismatch_return = LuaDialog.Dialog("", dialog):run()
+ if mismatch_return then
+ return mismatch_return['use']
+ else
+ return false
+ end
+ end
+
function get_processor_by_name(track, name)
local i = 0
local proc = track:nth_processor(i)
@@ -64,8 +78,46 @@ function factory() return function()
end
function mark_tracks(selected)
+
empty_last_store()
+ local route_string = [[instance = {
+ route_id = %d,
+ route_name = '%s',
+ gain_control = %f,
+ trim_control = %f,
+ pan_control = %s,
+ muted = %s,
+ soloed = %s,
+ order = {%s},
+ cache = {%s},
+ group = %s
+ }]]
+
+ local group_string = [[instance = {
+ group_id = %s,
+ name = '%s',
+ routes = {%s},
+ }]]
+
+ local processor_string = [[instance = {
+ plugin_id = %d,
+ display_name = '%s',
+ owned_by_route_name = '%s',
+ owned_by_route_id = %d,
+ parameters = {%s},
+ active = %s,
+ }]]
+
+ local group_route_string = " [%d] = %s,"
+ local proc_order_string = " [%d] = %d,"
+ local proc_cache_string = " [%d] = '%s',"
+ local params_string = " [%d] = %f,"
+
+ local route_string = string.gsub(route_string, "[\n\t]", "")
+ local group_string = string.gsub(group_string, "[\n\t]", "")
+ local processor_string = string.gsub(processor_string, "[\n\t]", "")
+
local sel = Editor:get_selection ()
local groups_to_write = {}
local i = 0
@@ -74,24 +126,37 @@ function factory() return function()
if selected then tracks = sel.tracks:routelist() end
- for r in sel.tracks:routelist():iter() do
+ for r in tracks:iter() do
local group = route_group_interrogate(r)
- if group then groups_to_write[#groups_to_write + 1] = group end
+ if group then
+ local already_there = false
+ for _, v in pairs(groups_to_write) do
+ if group == v then
+ already_there = true
+ end
+ end
+ if not(already_there) then
+ groups_to_write[#groups_to_write + 1] = group
+ end
+ end
end
- for k, g in pairs(groups_to_write) do
- local g_route_str, group_str = "", ""
- group_str = "instance = {group_id = " .. g:to_stateful():id():to_s() .. ", name = " .. "\"" .. g:name() .. "\"" .. ", routes = {"
+ for _, g in pairs(groups_to_write) do
+ local tmp_str = ""
for t in g:route_list():iter() do
- g_route_str = g_route_str .."[".. 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
end
- group_str = group_str .. g_route_str .. "}}"
- if not(group_str == "") then --sometimes there are no groups in the session
- file = io.open(path, "a")
- file:write(group_str, "\r\n")
- file:close()
- end
+ local group_str = string.format(
+ group_string,
+ g:to_stateful():id():to_s(),
+ g:name(),
+ tmp_str
+ )
+
+ file = io.open(path, "a")
+ file:write(group_str, "\r\n")
+ file:close()
end
for r in tracks:iter() do
@@ -107,30 +172,42 @@ function factory() return function()
x = x + 1
until proc:isnil()
- local route_str, proc_order_str, cache_str = "", "", ""
local rid = r:to_stateful():id():to_s()
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.
- local on = 0
+ local order_nmbr = 0
+ local tmp_order_str, tmp_cache_str = "", ""
for p in order:iter() do
local pid = p:to_stateful():id():to_s()
if not(string.find(p:display_name(), "latcomp")) then
- proc_order_str = proc_order_str .. "[" .. on .. "] = " .. pid ..","
- cache_str = cache_str .. "[" .. pid .. "] = " .. "\"" .. p:display_name() .. "\"" ..","
+ 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())
end
- on = on + 1
+ order_nmbr = order_nmbr + 1
end
- route_str = "instance = {route_id = " .. rid .. ", route_name = " .. r:name() .. ", gain_control = " .. r:gain_control():get_value() .. ", trim_control = " .. r:trim_control():get_value() .. ", pan_control = " .. tostring(pan) .. ", muted = " .. tostring(r:muted()) .. ", soloed = " .. tostring(r:soloed()) .. ", order = {" .. proc_order_str .."}, cache = {" .. cache_str .. "}, group = " .. tostring(route_groupid_interrogate(r)) .. "}"
+ local route_str = string.format(
+ route_string,
+ rid,
+ r:name(),
+ r:gain_control():get_value(),
+ r:trim_control():get_value(),
+ tostring(pan),
+ r:muted(),
+ r:soloed(),
+ tmp_order_str,
+ tmp_cache_str,
+ route_groupid_interrogate(r)
+ )
+
file = io.open(path, "a")
- file:write(route_str, "\r\n")
+ file:write(route_str, "\n")
file:close()
local i = 0
while true do
local params = {}
- local proc_str, params_str = "", ""
local proc = r:nth_plugin (i)
if proc:isnil () then break end
local active = proc:active()
@@ -150,45 +227,81 @@ function factory() return function()
end
end
i = i + 1
+
+ local tmp_params_str = ""
for k, v in pairs(params) do
- params_str = params_str .. "[".. k .."] = " .. v .. ","
+ tmp_params_str = tmp_params_str .. string.format(params_string, k, v)
end
- proc_str = "instance = {plugin_id = " .. id .. ", parameters = {" .. params_str .. "}, active = " .. tostring(active) .. "}"
+
+ local proc_str = string.format(
+ processor_string,
+ id,
+ proc:display_name(),
+ r:name(),
+ r:to_stateful():id():to_s(),
+ tmp_params_str,
+ active
+ )
file = io.open(path, "a")
- file:write(proc_str, "\r\n")
+ file:write(proc_str, "\n")
file:close()
end
::nextroute::
end
end
- function recall()
+ function recall(debug, dry_run)
local file = io.open(path, "r")
assert(file, "File not found!")
+
+ local i = 0
for l in file:lines() do
- --print(l)
+ --print(i, l)
+
+ local exec_line = dry_run["dothis-"..i]
+ local skip_line = false
+ if not(exec_line == nil) and not(exec_line) then
+ skip_line = true
+ end
local plugin, route, group = false, false, false
local f = load(l)
- f ()
+
+ if debug then
+ print(i, string.sub(l, 0, 29), f)
+ end
+
+ if f then f() end
if instance["route_id"] then route = true end
if instance["plugin_id"] then plugin = true end
if instance["group_id"] then group = true end
if group then
+ if skip_line then goto nextline end
+
local g_id = instance["group_id"]
local routes = instance["routes"]
local name = instance["name"]
local group = group_by_id(g_id)
- if not(group) then group = Session:new_route_group(name) end
- for k, v in pairs(routes) do
- local rt = Session:route_by_id(PBD.ID(v))
- if not(rt:isnil()) then group:add(rt) end
+ if not(group) then
+ --local mis_str = string.format("Couldn't find group by ID: %s", g_id)
+ --local chk_str = string.format("Create group and use?")
+ --local continue = mismatch_dialog(mis_str, chk_str)
+
+ --if continue then
+ local group = Session:new_route_group(name)
+ for _, v in pairs(routes) do
+ local rt = Session:route_by_id(PBD.ID(v))
+ if rt:isnil() then rt = Session:route_by_name(name) end
+ if not(rt:isnil()) then group:add(rt) end
+ end
+ --end
end
end
if route then
+ if skip_line then goto nextline end
local old_order = ARDOUR.ProcessorList()
local r_id = PBD.ID(instance["route_id"])
@@ -245,6 +358,8 @@ function factory() return function()
end
if plugin then
+ if skip_line then goto nextline end
+
local enable = {}
local params = instance["parameters"]
local p_id = instance["plugin_id"]
@@ -273,8 +388,85 @@ function factory() return function()
end
if act then proc:activate() else proc:deactivate() end
end
+
::nextline::
+ i = i + 1
+
+ end
+ end
+
+ function dry_run(debug)
+ --returns a dialog-able table of
+ --everything we do (logically)
+ --in the recall function
+
+ local i = 0
+ local dry_table = {{type = "label", key = "col-1-title" , col = 1, colspan = 1, title = 'Do this?'}}
+ local file = io.open(path, "r")
+ assert(file, "File not found!")
+
+ for l in file:lines() do
+ local do_plugin, do_route, do_group = false, false, false
+ local f = load(l)
+
+ if debug then
+ print(i, string.sub(l, 0, 29), f)
+ end
+
+ if f then f() end
+
+ if instance["route_id"] then do_route = true end
+ if instance["plugin_id"] then do_plugin = true end
+ if instance["group_id"] then do_group = true end
+
+ if do_group then
+ local group_id = instance["group_id"]
+ local group_name = instance["name"]
+ local dlg_title = ""
+
+ local group_ptr = group_by_id(group_id)
+
+ if not(group_ptr) then
+ new_group = Session:new_route_group(group_name)
+ dlg_title = string.format("Group: %s-> (will be created) %s", group_name, new_group:name())
+ else
+ dlg_title = string.format("Group ID Match: %s.", group_ptr:name())
+ end
+ table.insert(dry_table, {
+ type = "label", key = "group-"..i , col = 0, colspan = 1, title = dlg_title
+ })
+ table.insert(dry_table, {
+ type = "checkbox", col=1, colspan = 1, key = "dothis-"..i, default = true, title = "line:"..i
+ })
+ end
+
+ if do_route then
+ local route_id = instance["route_id"]
+ local route_name = instance["route_name"]
+ local dlg_title = ""
+
+ local route_ptr = Session:route_by_id(PBD.ID(route_id))
+
+ if route_ptr:isnil() then
+ route_ptr = Session:route_by_name(route_name)
+ if not(route_ptr:isnil()) then
+ dlg_title = string.format("Route: %s-> (found by name) %s", route_name, route_ptr:name())
+ else
+ dlg_title = string.format("Route: %s-> (cannot find matching ID or name) ????", route_name)
+ end
+ else
+ dlg_title = string.format("Route Found by ID: %s", route_ptr:name())
+ end
+ table.insert(dry_table, {
+ type = "label", key = "route-"..i , col = 0, colspan = 1, title = dlg_title
+ })
+ table.insert(dry_table, {
+ type = "checkbox", col=1, colspan = 1, key = "dothis-"..i, default = true, title = "line:"..i
+ })
+ end
+ i = i + 1
end
+ return dry_table
end
local dialog_options = {
@@ -313,7 +505,9 @@ function factory() return function()
local rrv = LuaDialog.Dialog("Mixer Store:", recall_options):run()
if rrv then
if rrv['file'] ~= path then path = rrv['file'] end
- recall()
+ --recall(true)
+ local dry_return = LuaDialog.Dialog("Dry Run Info:", dry_run(true)):run()
+ recall(true, dry_return)
end
end
end