ardour/scripts/s_tomsloop.lua

86 lines
2.5 KiB
Lua
Raw Normal View History

2016-04-09 09:44:53 -04:00
ardour { ["type"] = "Snippet", name = "Tom's Loop",
license = "MIT",
author = "Robin Gareus",
email = "robin@gareus.org",
site = "http://gareus.org",
description = [[Bounce the loop-range of all non muted audio tracks, paste N times at playhead]]
}
-- unused ; cfg parameter for ["type"] = "EditorAction"
function action_params ()
return { ["times"] = { title = "Number of copies to add", default = "1"}, }
end
function factory () return function ()
-- get options
local p = params or {}
local npaste = p["times"] or 1
assert (npaste > 0)
local proc = ARDOUR.LuaAPI.nil_proc () -- bounce w/o processing
local itt = ARDOUR.InterThreadInfo () -- bounce progress info (unused)
local loop = Session:locations ():auto_loop_location ()
local playhead = Session:transport_frame ()
-- make sure we have a loop, and the playhead (edit point) is after it
if not loop then
print ("A Loop range must be set.")
goto errorout
end
2016-04-09 09:44:53 -04:00
assert (loop:start () < loop:_end ())
if loop:_end () >= playhead then
print ("The Playhead (paste point) needs to be after the loop.")
goto errorout
end
-- prepare undo operation
Session:begin_reversible_command ("Tom's Loop")
local add_undo = false -- keep track if something has changed
2016-04-09 09:44:53 -04:00
for route in Session:get_tracks ():iter () do
-- skip muted tracks
if route:muted () then
goto continue
end
-- test if bouncing is possible
local track = route:to_track ()
if not track:bounceable (proc, false) then
goto continue
2016-04-09 09:44:53 -04:00
end
-- only audio tracks
local playlist = track:playlist ()
if playlist:data_type ():to_string () ~= "audio" then
2016-04-09 09:44:53 -04:00
goto continue
end
-- check if there are any regions in the loop-range of this track
2016-04-10 17:02:00 -04:00
if playlist:regions_touched (loop:start (), loop:_end ()):empty () then
2016-04-09 09:44:53 -04:00
goto continue
end
-- clear existing changes, prepare "diff" of state
playlist:to_stateful ():clear_changes ()
2016-04-09 09:44:53 -04:00
-- do the actual work
local region = track:bounce_range (loop:start (), loop:_end (), itt, proc, false)
playlist:add_region (region, playhead, npaste, false)
-- create a diff of the performed work, add it to the session's undo stack
-- and check if it is not empty
if not Session:add_stateful_diff_command (playlist:to_statefuldestructible ()):empty () then
add_undo = true
end
2016-04-09 09:44:53 -04:00
::continue::
end
-- all done, commit the combined Undo Operation
if add_undo then
-- the 'nil' Commend here mean to use the collected diffs added above
Session:commit_reversible_command (nil)
else
Session:abort_reversible_command ()
end
::errorout::
2016-04-09 09:44:53 -04:00
end end