My first lua script aims to prepare a new ardour project.
As I use Hydrogen and want to have more than just stereo output to be able to side chain kick or other stuff, i have many tracks to create in ardour and connect with hydrogen (it could be the same with other soft like Rosegarden).
So, this script takes input files that tell which tracks to create and connect.
I choosed to use input files (easy to create with jack_lsp) to be able to group hydrogen outputs (maybe do I want all HH to be on the same track)
ardour { ["type"] = "EditorAction", name = "Create basic Tracks", author = "Jice", description = [[Creates a basic skeleton for recording.]] } function factory () return function () default_hydrogen_track='Drums' a = Session:engine() print ("----- Recuperation de la liste des ports ----"); initial_ardour_ports = {} _, t = a:get_backend_ports ("", ARDOUR.DataType("audio"), 0, C.StringVector()) -- table 't' holds argument references. t[4] is the StringVector for n in t[4]:iter() do if n:find("ardour:") then initial_ardour_ports[n] = 1 end -- print (n) end -- print(initial_ardour_ports) print ("----- ajout des pistes pour les pistes d'hydrogen que l'on souhaite separer ----"); local f = assert(io.open("/mnt/barrique/Zik/Projets/batches/hydrogen_group_tracks.txt", "r")) local t = f:read("*all") f:close() tracks={} done={} for port_data in string.gmatch(t, "[^\n]+") do port_name={} -- transformation de l'iter en tableau for pn in port_data:gmatch("[^|]+") do -- print (tr) table.insert(port_name, pn) end print(port_name[1], ' - ', port_name[2], ' - ', port_name[3]) -- 1er parametre : 1 = mono, 2 = stereo -- 4eme parametre : nbre de pistes if not done[port_name[2]] then local tl = Session:new_audio_track (port_name[3], 2, nil, 1, port_name[2], ARDOUR.PresentationInfo.max_order, ARDOUR.TrackMode.Normal) done[port_name[2]] = 1 end if port_name[3] == 1 then tracks[port_name[1] .. "_L"] = "ardour:" .. port_name[2] .. "/audio_in 1" tracks[port_name[1] .. "_R"] = "ardour:" .. port_name[2] .. "/audio_in 1" else tracks[port_name[1] .. "_L"] = "ardour:" .. port_name[2] .. "/audio_in 1" tracks[port_name[1] .. "_R"] = "ardour:" .. port_name[2] .. "/audio_in 2" end end print ("----- Ajout des pistes standards ----"); -- ajout de quelques pistes "standards" local f = assert(io.open("/mnt/barrique/Zik/Projets/batches/default_ardour_tracks.txt", "r")) local t = f:read("*all") f:close() for port_name in t:gmatch("[^\n]+") do track_name={} -- transformation de l'iter en tableau for tr in port_name:gmatch("[^|]+") do -- print (tr) table.insert(track_name, tr) end print(track_name[1]) -- 1er parametre : 1 = mono, 2 = stereo -- 4eme parametre : nbre de pistes local tl = Session:new_audio_track (track_name[2], 2, nil, 1, track_name[1], ARDOUR.PresentationInfo.max_order, ARDOUR.TrackMode.Normal) tracks[track_name] = port_name end print ("----- deconnexion des pistes system ----"); _, t = a:get_backend_ports ("", ARDOUR.DataType("audio"), ARDOUR.PortFlags.IsOutput, C.StringVector()) for n in t[4]:iter() do if n:find("system:capture") then print(n) _, ct = a:get_connections (n, C.StringVector()) for c in ct[2]:iter() do -- print(" ->", c) if c:find("ardour:") and not initial_ardour_ports[c] then a:disconnect(n, c) -- print (" disconnected") end end end end print ("----- connexion des pistes hydrogen ----"); initial_ardour_ports = {} _, t = a:get_backend_ports ("", ARDOUR.DataType("audio"), 0, C.StringVector()) -- table 't' holds argument references. t[4] is the StringVector for n in t[4]:iter() do if n:find("Hydrogen:Track") then ardour_track = tracks[n] -- print(n, " -> ", ardour_track) if ardour_track == nil then if n:find("_L$") then a:connect(n, "ardour:"..default_hydrogen_track.."/audio_in 1") elseif n:find("_R$") then a:connect(n, "ardour:"..default_hydrogen_track.."/audio_in 2") else a:connect(n, "ardour:"..default_hydrogen_track.."/audio_in 1") end else a:connect(n, ardour_track) print(n, " -> ", ardour_track) end end end end end -- function factory
The default_ardour_tracks.txt looks like this
Drums|2 Guitar_1|1 Guitar_2|1 Bass|1 Voice_1|1 Voice_2|1
where the first element is the name of the track ans the seconds tells if it’s mono (1) or stereo (2)
and the hydrogen_group_tracks.txt looks like
Hydrogen out track name|Ardour track to create and/or connect|mono(1) or stereo(2)
As you see, I made it for hydrogen but it could be any jack output…
Hydrogen:Track_1_Kick_Reg_1|Kick|2 Hydrogen:Track_2_Kick_Reg_1b|Kick|2 Hydrogen:Track_3_Kick_Rock|Kick|2 Hydrogen:Track_4_Snare_Reg_1|Snare|2 Hydrogen:Track_5_Snare_Reg_1b|Snare|2 Hydrogen:Track_6_Snare_Reg_1c|Snare|2 Hydrogen:Track_7_Snare_Reg_1flam|Snare|2 Hydrogen:Track_8_Snare_Reg_1ghost|Snare|2 Hydrogen:Track_9_Snare_Rock|Snare|2 Hydrogen:Track_10_Snare_Rock_ghost|Snare|2 Hydrogen:Track_11_HH_1_closed_|HH|2 Hydrogen:Track_12_HH_1_closed_b|HH|2 Hydrogen:Track_13_HH_1_open|HH|2
Note : jack_lsp lists all the jack in and outputs.
jack_lsp > myfile.txt
is a good starting point to create the files.