2 ["type"] = "EditorAction",
5 This template helps create the tracks for a typical pop/rock band.
7 You will be prompted to assemble your session from a list of track types.
9 Each track will be pre-assigned with a color.
11 Optionally, tracks may be assigned to sensible Groups ( vocals, guitars, drums )
13 Optionally, tracks may be assigned Gates and other plugins.
17 function session_setup ()
21 function route_setup ()
24 ['Insert_at'] = ARDOUR.PresentationInfo.max_order
28 function factory (params) return function ()
30 local p = params or route_setup ()
31 local insert_at = p["insert_at"] or ARDOUR.PresentationInfo.max_order
33 --prompt the user for the tracks they'd like to instantiate
34 local dialog_options = {
35 { type = "heading", title = "Select the tracks you'd like\nto add to your session: ", col=0, align = "left", colspan = 1},
36 { type = "heading", title = "Name", col=1, colspan = 1 },
37 { type = "heading", title = "Stereo?", col=2, colspan = 1 },
39 { type = "checkbox", key = "check-ldvox", default = false, title = "Lead Vocal", col=0 },
40 { type = "entry", key = "name-ldvox", default = "Lead Vocal", title = "", col=1 },
41 { type = "checkbox", key = "stereo-ldvox", default = false, title = "", col=2 },
43 { type = "checkbox", key = "check-bass", default = false, title = "Bass", col=0 },
44 { type = "entry", key = "name-bass", default = "Bass", title = "", col=1 },
45 { type = "checkbox", key = "stereo-bass", default = false, title = "", col=2 },
47 { type = "checkbox", key = "check-piano", default = false, title = "Piano", col=0 },
48 { type = "entry", key = "name-piano", default = "Piano", title = "", col=1 },
49 { type = "checkbox", key = "stereo-piano", default = false, title = "", col=2 },
51 { type = "checkbox", key = "check-electric-piano", default = false, title = "Electric Piano", col=0 },
52 { type = "entry", key = "name-electric-piano", default = "E Piano", title = "", col=1 },
53 { type = "checkbox", key = "stereo-electric-piano", default = false, title = "", col=2 },
55 { type = "checkbox", key = "check-organ", default = false, title = "Organ", col=0 },
56 { type = "entry", key = "name-organ", default = "Organ", title = "", col=1 },
57 { type = "checkbox", key = "stereo-organ", default = false, title = "", col=2 },
59 { type = "checkbox", key = "check-electric-guitar", default = false, title = "Electric Guitar", col=0 },
60 { type = "entry", key = "name-electric-guitar", default = "E Guitar", title = "", col=1 },
61 { type = "checkbox", key = "stereo-electric-guitar", default = false, title = "", col=2 },
63 { type = "checkbox", key = "check-solo-guitar", default = false, title = "Lead Guitar", col=0 },
64 { type = "entry", key = "name-solo-guitar", default = "Ld Gtr", title = "", col=1 },
65 { type = "checkbox", key = "stereo-solo-guitar", default = false, title = "", col=2 },
67 { type = "checkbox", key = "check-accoustic-guitar", default = false, title = "Acoustic Guitar", col=0 },
68 { type = "entry", key = "name-accoustic-guitar", default = "Ac Gtr", title = "", col=1 },
69 { type = "checkbox", key = "stereo-accoustic-guitar", default = false, title = "", col=2 },
71 { type = "checkbox", key = "check-basic-kit", default = false, title = "Basic Drum Mics", col=0 },
72 { type = "label", title = "(Kick + Snare)", col=1, colspan = 1, align = "left"},
73 -- { type = "checkbox", key = "stereo-overhead-mono", default = false, title = "", col=2 },
75 { type = "checkbox", key = "check-full-kit", default = false, title = "Full Drum Mics", col=0 },
76 { type = "label", title = "(Kick, Snare, HiHat, 3 Toms)", col=1, colspan = 1, align = "left"},
77 -- { type = "checkbox", key = "stereo-overhead-mono", default = false, title = "", col=2 },
79 { type = "checkbox", key = "check-overkill-kit", default = false, title = "Overkill Drum Mics", col=0 },
80 { type = "label", title = "(Kick (2x), Snare(2x), HiHat, 3 Toms)", col=1, colspan = 1, align = "left"},
81 -- { type = "checkbox", key = "stereo-overhead-mono", default = false, title = "", col=2 },
83 { type = "checkbox", key = "check-overhead", default = false, title = "Drum Overheads", col=0 },
84 -- { type = "entry", key = "name-ldvox", default = "Lead Vocal", title = "", col=1 },
85 { type = "checkbox", key = "stereo-overhead", default = false, title = "", col=2 },
87 { type = "checkbox", key = "check-room", default = false, title = "Drum Room", col=0 },
88 -- { type = "entry", key = "name-ldvox", default = "Lead Vocal", title = "", col=1 },
89 { type = "checkbox", key = "stereo-room", default = false, title = "", col=2 },
91 { type = "checkbox", key = "check-bgvox", default = false, title = "Background Vocals (3x)", col=0 },
92 -- { type = "entry", key = "name-ldvox", default = "Lead Vocal", title = "", col=1 },
93 { type = "checkbox", key = "stereo-bgvox", default = false, title = "", col=2 },
95 { type = "hseparator", title="", col=0, colspan = 3},
97 { type = "checkbox", key = "group", default = false, title = "Group Track(s)?", col=0 },
100 --- check for available plugins
102 local xt_eg = not ARDOUR.LuaAPI.new_plugin_info ("XT-EG Expander Gate (Mono)", ARDOUR.PluginType.LV2):isnil ()
103 local xt_tg = not ARDOUR.LuaAPI.new_plugin_info ("XT-TG Tom Gate (Mono", ARDOUR.PluginType.LV2):isnil ()
105 local xt_tg = not ARDOUR.LuaAPI.new_plugin_info ("XT-BC Bass Character (Mono)", ARDOUR.PluginType.LV2):isnil ()
106 local xt_vc = not ARDOUR.LuaAPI.new_plugin_info ("XT-VC Vocal Character (Mono)", ARDOUR.PluginType.LV2):isnil ()
108 if (xt_eg and xt_tg) then
109 table.insert (dialog_options,
110 { type = "checkbox", key = "gates", default = false, title = "Add Gate(s)?", col=0 }
113 if (xt_tg and xt_vc) then
114 table.insert (dialog_options,
115 { type = "checkbox", key = "char", default = false, title = "Add Character Plugin(s)?", col=0 }
121 local dlg = LuaDialog.Dialog ("Template Setup", dialog_options)
127 -- helper function to reference processors
128 function processor(t, s) --takes a track (t) and a string (s) as arguments
130 local proc = t:nth_processor(i)
132 if ( proc:display_name() == s ) then
137 proc = t:nth_processor(i)
141 --INSTANTIATING MIDI TRACKS IS TOO DAMN HARD
142 function create_midi_track(name, chan_count) -- call this function with a name argument and output channel count
143 Session:new_midi_track(ARDOUR.ChanCount(ARDOUR.DataType ("midi"), 1), ARDOUR.ChanCount(ARDOUR.DataType ("audio"), chan_count), true, ARDOUR.PluginInfo(), nil, nil, 1, name, 1, ARDOUR.TrackMode.Normal)
147 function add_lv2_plugin (track, pluginname, position)
148 local p = ARDOUR.LuaAPI.new_plugin(Session, pluginname, ARDOUR.PluginType.LV2, "")
149 if not p:isnil () then
150 track:add_processor_by_index(p, position, nil, true)
155 local drum_group, bass_group, guitar_group, key_group, vox_group
158 drum_group = Session:new_route_group("Drums")
159 drum_group:set_rgba(0x425CADff)
160 bass_group = Session:new_route_group("Bass")
161 bass_group:set_rgba(0x1AE54Eff)
162 guitar_group = Session:new_route_group("Guitars")
163 guitar_group:set_rgba(0xB475CBff)
164 key_group = Session:new_route_group("Keys")
165 key_group:set_rgba(0xDA8032ff)
166 vox_group = Session:new_route_group("Vox")
167 vox_group:set_rgba(0xC54249ff)
170 local channel_count = 0
172 if rv['check-basic-kit'] then
173 local names = {"Kick", "Snare"}
175 local tl = Session:new_audio_track (1, 1, nil, 1, names[i], insert_at, ARDOUR.TrackMode.Normal)
176 for track in tl:iter() do
177 --track:rec_enable_control ():set_value (1, PBD.GroupControlDisposition.NoGroup)
178 if rv['group'] then drum_group:add(track) end
180 add_lv2_plugin (track, "XT-EG Expander Gate (Mono)", 0)
184 channel_count = channel_count + #names
187 if rv['check-full-kit'] then
188 local names = {"Kick", "Snare", "Hi-Hat", "Hi-tom", "Mid-tom", "Fl-tom"}
190 local tl = Session:new_audio_track (1, 1, nil, 1, names[i], insert_at, ARDOUR.TrackMode.Normal)
191 for track in tl:iter() do
192 --track:rec_enable_control ():set_value (1, PBD.GroupControlDisposition.NoGroup)
193 if rv['group'] then drum_group:add(track) end
195 if string.find(track:name(), '-tom') then
196 add_lv2_plugin (track, "XT-TG Tom Gate (Mono)", 0)
198 add_lv2_plugin (track, "XT-EG Expander Gate (Mono)", 0)
203 channel_count = channel_count + #names
206 if rv['check-overkill-kit'] then
207 local names = {"Kick In", "Kick Out", "Snare Top", "Snare Btm", "Hi-Hat", "Hi-tom", "Mid-tom", "Fl-tom"}
209 local tl = Session:new_audio_track (1, 1, nil, 1, names[i], insert_at, ARDOUR.TrackMode.Normal)
210 for track in tl:iter() do
211 --track:rec_enable_control ():set_value (1, PBD.GroupControlDisposition.NoGroup)
212 if rv['group'] then drum_group:add(track) end
214 if string.find(track:name(), '-tom') then
215 add_lv2_plugin (track, "XT-TG Tom Gate (Mono)", 0)
217 add_lv2_plugin (track, "XT-EG Expander Gate (Mono)", 0)
222 channel_count = channel_count + #names
225 if rv['check-overhead'] then
226 local names = { "OH" }
228 if rv["stereo-overhead"] then ch = 2 end --stereo
230 local tl = Session:new_audio_track (ch, ch, nil, 1, names[i], insert_at, ARDOUR.TrackMode.Normal)
231 for track in tl:iter() do
232 --track:rec_enable_control ():set_value (1, PBD.GroupControlDisposition.NoGroup)
233 if rv['group'] then drum_group:add(track) end
236 channel_count = channel_count + ch
240 if rv['check-room'] then
241 local names = { "Drum Room" }
243 if rv["stereo-room"] then ch = 2 end --stereo
245 local tl = Session:new_audio_track (ch, ch, nil, 1, names[i], insert_at, ARDOUR.TrackMode.Normal)
246 for track in tl:iter() do
247 --track:rec_enable_control ():set_value (1, PBD.GroupControlDisposition.NoGroup)
248 if rv['group'] then drum_group:add(track) end
251 channel_count = channel_count + ch
254 if rv['check-bass'] then
255 local names = { rv["name-bass"] }
257 if rv["stereo-bass"] then ch = 2 end --stereo
259 local tl = Session:new_audio_track (ch, ch, nil, 1, names[i], insert_at, ARDOUR.TrackMode.Normal)
260 for track in tl:iter() do
261 --track:rec_enable_control ():set_value (1, PBD.GroupControlDisposition.NoGroup)
262 if rv['group'] then bass_group:add(track) end
264 add_lv2_plugin (track, "XT-BC Bass Character (Mono)", 0)
268 channel_count = channel_count + ch
271 if rv['check-electric-guitar'] then
272 local names = { rv["name-electric-guitar"] }
274 if rv["stereo-electric-guitar"] then ch = 2 end --stereo
276 local tl = Session:new_audio_track (ch, ch, nil, 1, names[i], insert_at, ARDOUR.TrackMode.Normal)
277 for track in tl:iter() do
278 --track:rec_enable_control ():set_value (1, PBD.GroupControlDisposition.NoGroup)
279 if rv['group'] then guitar_group:add(track) end
282 channel_count = channel_count + ch
285 if rv['check-solo-guitar'] then
286 local names = { rv["name-solo-guitar"] }
288 if rv["stereo-solo-guitar"] then ch = 2 end --stereo
290 local tl = Session:new_audio_track (ch, ch, nil, 1, names[i], insert_at, ARDOUR.TrackMode.Normal)
291 for track in tl:iter() do
292 --track:rec_enable_control ():set_value (1, PBD.GroupControlDisposition.NoGroup)
293 if rv['group'] then guitar_group:add(track) end
297 channel_count = channel_count + ch
300 if rv['check-acoustic-guitar'] then
301 local names = { rv["name-acoustic-guitar"] }
303 if rv["stereo-acoustic-guitar"] then ch = 2 end --stereo
305 local tl = Session:new_audio_track (ch, ch, nil, 1, names[i], insert_at, ARDOUR.TrackMode.Normal)
306 for track in tl:iter() do
307 --track:rec_enable_control ():set_value (1, PBD.GroupControlDisposition.NoGroup)
308 if rv['group'] then guitar_group:add(track) end
312 channel_count = channel_count + ch
315 if rv['check-piano'] then
316 local names = { rv["name-piano"] }
318 if rv["stereo-piano"] then ch = 2 end --stereo
320 local tl = Session:new_audio_track (ch, ch, nil, 1, names[i], insert_at, ARDOUR.TrackMode.Normal)
321 for track in tl:iter() do
322 --track:rec_enable_control ():set_value (1, PBD.GroupControlDisposition.NoGroup)
323 if rv['group'] then key_group:add(track) end
327 channel_count = channel_count + ch
330 if rv['check-electric-piano'] then
331 local names = { rv["name-electric-piano"] }
333 if rv["stereo-electric-piano"] then ch = 2 end --stereo
335 local tl = Session:new_audio_track (ch, ch, nil, 1, names[i], insert_at, ARDOUR.TrackMode.Normal)
336 for track in tl:iter() do
337 --track:rec_enable_control ():set_value (1, PBD.GroupControlDisposition.NoGroup)
338 if rv['group'] then key_group:add(track) end
341 channel_count = channel_count + ch
344 if rv['check-organ'] then
345 local names = { rv["name-organ"] }
347 if rv["stereo-organ"] then ch = 2 end --stereo
349 local tl = Session:new_audio_track (ch, ch, nil, 1, names[i], insert_at, ARDOUR.TrackMode.Normal)
350 for track in tl:iter() do
351 --track:rec_enable_control ():set_value (1, PBD.GroupControlDisposition.NoGroup)
352 if rv['group'] then key_group:add(track) end
355 channel_count = channel_count + ch
358 if rv['check-ldvox'] then
359 local names = { rv["name-ldvox"] }
361 if rv["stereo-ldvox"] then ch = 2 end --stereo
363 local tl = Session:new_audio_track ( ch, ch, nil, 1, names[i], insert_at, ARDOUR.TrackMode.Normal)
364 for track in tl:iter() do
365 --track:rec_enable_control ():set_value (1, PBD.GroupControlDisposition.NoGroup)
366 if rv['group'] then vox_group:add(track) end
368 add_lv2_plugin (track, "XT-VC Vocal Character (Mono)", 0)
372 channel_count = channel_count + ch
375 if rv['check-bgvox'] then
376 local names = { rv["name-bgvox"] }
378 if rv["stereo-bgvox"] then ch = 2 end --stereo
380 local tl = Session:new_audio_track (ch, ch, nil, 1, names[i], insert_at, ARDOUR.TrackMode.Normal)
381 for track in tl:iter() do
382 --track:rec_enable_control ():set_value (1, PBD.GroupControlDisposition.NoGroup)
383 if rv['group'] then vox_group:add(track) end
386 channel_count = channel_count + ch
389 --fit all tracks on the screen
390 Editor:access_action("Editor","fit_all_tracks")
392 Session:save_state("")
394 -- determine the number of channels we can record
395 local e = Session:engine()
396 local _, t = e:get_backend_ports ("", ARDOUR.DataType("audio"), ARDOUR.PortFlags.IsOutput | ARDOUR.PortFlags.IsPhysical, C.StringVector()) -- from the engine's POV readable/capture ports are "outputs"
397 local num_inputs = t[4]:size() -- table 't' holds argument references. t[4] is the C.StringVector (return value)
399 if num_inputs < channel_count then
400 -- warn the user if there are less physical inputs than created tracks
401 LuaDialog.Message ("Session Creation",
402 "Created more tracks than there are physical inputs on the soundcard",
403 LuaDialog.MessageType.Info, LuaDialog.ButtonType.Close):run ()