lua script to bounce regions w/processing and replace the region
authorRobin Gareus <robin@gareus.org>
Thu, 5 May 2016 21:49:44 +0000 (23:49 +0200)
committerRobin Gareus <robin@gareus.org>
Thu, 5 May 2016 21:49:44 +0000 (23:49 +0200)
scripts/bounce_replace.lua [new file with mode: 0644]

diff --git a/scripts/bounce_replace.lua b/scripts/bounce_replace.lua
new file mode 100644 (file)
index 0000000..d383a87
--- /dev/null
@@ -0,0 +1,66 @@
+ardour { ["type"] = "EditorAction", name = "Bounce+Replace Regions",
+       license     = "MIT",
+       author      = "Robin Gareus",
+       email       = "robin@gareus.org",
+       site        = "http://gareus.org",
+       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")
+       local add_undo = false -- keep track if something has changed
+
+       -- 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
+               local region = track:bounce_range (r:position (), r:position() + r:length (), ARDOUR.InterThreadInfo (), track:main_outs (), false);
+
+               -- remove old region..
+               playlist:remove_region (r);
+               -- ..and add the newly bounced one
+               playlist:add_region (region, r:position (), 1, 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
+       end
+
+       -- all done, commit the combined Undo Operation
+       if add_undo then
+               -- the 'nil' Command here mean to use the collected diffs added above
+               Session:commit_reversible_command (nil)
+       else
+               Session:abort_reversible_command ()
+       end
+
+end end