ardour/share/scripts/_stereo_to_mono.lua

64 lines
1.9 KiB
Lua

ardour { ["type"] = "EditorAction", name = "Stereo to Mono",
license = "MIT",
author = "Ardour Team",
description = [[Convert a Stereo Track into two Mono Tracks]]
}
function factory (params) return function ()
-- http://manual.ardour.org/lua-scripting/class_reference/#ArdourUI:Selection
-- the Ardour Selection can include multiple items
-- (regions, tracks, ranges, markers, automation, midi-notes etc)
local sel = Editor:get_selection ()
-- default track output channel count (= master bus input count)
local n_chan_out = 2
if not Session:master_out():isnil() then
n_chan_out = Session:master_out():n_inputs ():n_audio ()
end
-- for each track..
for t in sel.tracks:routelist ():iter () do
local track = t:to_track ()
if track:isnil() then goto next end
-- only audio tracks
local playlist = track:playlist ()
if playlist:data_type ():to_string () ~= "audio" then goto next end
-- skip tracks without any regions
if playlist:region_list ():size() == 0 then goto next end
-- we can't access diskstream n_channels()
local channels = track:n_inputs(): n_audio()
-- stereo only
if channels ~= 2 then goto next end
-- create 2 new tracks (using the name of the original track)(
local newtracks = Session:new_audio_track (1, n_chan_out, nil, 2, t:name(), ARDOUR.PresentationInfo.max_order, ARDOUR.TrackMode.Normal, true)
assert (newtracks:size() == 2)
for r in playlist:region_list ():iter () do
local region = r:to_audioregion ()
local rl = ARDOUR.RegionVector ()
local _, rv = region:separate_by_channel (rl)
assert (rv[1]:size () == 2)
-- 1:1 mapping of regions to new tacks
local plc = 1
for nr in rv[1]:iter () do
local pl = newtracks:table()[plc]:playlist()
pl:add_region (nr, r:position(), 1, false)
plc = plc + 1
end
end
-- TODO remove the old track
-- drop references for good.
collectgarbage ()
::next::
end
end end