2016-05-05 17:49:44 -04:00
|
|
|
ardour { ["type"] = "EditorAction", name = "Bounce+Replace Regions",
|
|
|
|
license = "MIT",
|
2016-07-12 09:21:23 -04:00
|
|
|
author = "Ardour Team",
|
2016-05-05 17:49:44 -04:00
|
|
|
description = [[Bounce selected regions with processing and replace region]]
|
|
|
|
}
|
|
|
|
|
|
|
|
function factory (params) return function ()
|
|
|
|
-- there is currently no direct way to find the track
|
|
|
|
-- corresponding to a [selected] region
|
|
|
|
function find_track_for_region (region_id)
|
|
|
|
for route in Session:get_tracks():iter() do
|
|
|
|
local track = route:to_track();
|
|
|
|
local pl = track:playlist ()
|
|
|
|
if not pl:region_by_id (region_id):isnil () then
|
|
|
|
return track
|
|
|
|
end
|
|
|
|
end
|
|
|
|
assert (0); -- can't happen, region must be in a playlist
|
|
|
|
end
|
|
|
|
|
|
|
|
-- get selection
|
|
|
|
-- http://manual.ardour.org/lua-scripting/class_reference/#ArdourUI:Selection
|
|
|
|
local sel = Editor:get_selection ()
|
|
|
|
|
|
|
|
-- prepare undo operation
|
|
|
|
Session:begin_reversible_command ("Bounce+Replace Regions")
|
|
|
|
|
|
|
|
-- Iterate over Regions part of the selection
|
|
|
|
-- http://manual.ardour.org/lua-scripting/class_reference/#ArdourUI:RegionSelection
|
|
|
|
for r in sel.regions:regionlist ():iter () do
|
|
|
|
-- each of the items 'r' is a
|
|
|
|
-- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:Region
|
|
|
|
|
|
|
|
local track = find_track_for_region (r:to_stateful():id())
|
|
|
|
local playlist = track:playlist ()
|
|
|
|
|
|
|
|
-- clear existing changes, prepare "diff" of state for undo
|
|
|
|
playlist:to_stateful ():clear_changes ()
|
|
|
|
|
|
|
|
-- bounce the region with processing
|
2023-10-16 14:59:47 -04:00
|
|
|
local region = track:bounce_range (r:position ():samples(), (r:position() + r:length ()):samples(), ARDOUR.InterThreadInfo (), track:main_outs (), false, "", false);
|
2016-05-05 17:49:44 -04:00
|
|
|
|
|
|
|
-- remove old region..
|
|
|
|
playlist:remove_region (r);
|
|
|
|
-- ..and add the newly bounced one
|
2019-12-08 11:40:38 -05:00
|
|
|
playlist:add_region (region, r:position (), 1, false, 0, 0, false)
|
2016-05-05 17:49:44 -04:00
|
|
|
|
|
|
|
-- create a diff of the performed work, add it to the session's undo stack
|
|
|
|
-- and check if it is not empty
|
2022-09-27 12:58:53 -04:00
|
|
|
Session:add_stateful_diff_command (playlist:to_statefuldestructible ())
|
2016-05-05 17:49:44 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
-- all done, commit the combined Undo Operation
|
2022-09-27 12:58:53 -04:00
|
|
|
if not Session:abort_empty_reversible_command () then
|
2016-05-05 17:49:44 -04:00
|
|
|
Session:commit_reversible_command (nil)
|
|
|
|
end
|
|
|
|
|
|
|
|
end end
|
2017-02-19 18:53:09 -05:00
|
|
|
|
|
|
|
function icon (params) return function (ctx, width, height, fg)
|
|
|
|
local wh = math.min (width, height) * .5
|
|
|
|
local ar = wh * .2
|
|
|
|
|
|
|
|
ctx:set_line_width (1)
|
|
|
|
function stroke_outline (c)
|
|
|
|
ctx:set_source_rgba (0, 0, 0, 1)
|
|
|
|
ctx:stroke_preserve ()
|
|
|
|
ctx:set_source_rgba (c, c, c, 1)
|
|
|
|
ctx:fill ()
|
|
|
|
end
|
|
|
|
|
2019-11-18 21:33:28 -05:00
|
|
|
ctx:translate (math.floor (width * .5 - wh), math.floor (height * .5 - wh))
|
2017-02-19 18:53:09 -05:00
|
|
|
ctx:rectangle (wh - wh * .6, wh - .7 * wh, wh * 1.2, .5 * wh)
|
|
|
|
stroke_outline (.7)
|
|
|
|
|
|
|
|
ctx:rectangle (wh - wh * .6, wh + .1 * wh, wh * 1.2, .5 * wh)
|
|
|
|
stroke_outline (.9)
|
|
|
|
|
|
|
|
-- arrow
|
|
|
|
ctx:set_source_rgba (0, 1, 0, 1)
|
|
|
|
ctx:set_line_width (ar * .7)
|
|
|
|
|
|
|
|
ctx:move_to (wh, wh - .5 * wh)
|
|
|
|
ctx:rel_line_to (0, wh)
|
|
|
|
ctx:stroke ()
|
|
|
|
|
|
|
|
ctx:move_to (wh, wh + .5 * wh)
|
|
|
|
ctx:rel_line_to (-ar, -ar)
|
|
|
|
ctx:rel_line_to (2 * ar, 0)
|
|
|
|
ctx:close_path ()
|
|
|
|
ctx:stroke ()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
end end
|