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.