My first lua script : connect hydrogen

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.