summaryrefslogtreecommitdiff
path: root/share/scripts/s_fader_automation.lua
diff options
context:
space:
mode:
Diffstat (limited to 'share/scripts/s_fader_automation.lua')
-rw-r--r--share/scripts/s_fader_automation.lua58
1 files changed, 58 insertions, 0 deletions
diff --git a/share/scripts/s_fader_automation.lua b/share/scripts/s_fader_automation.lua
new file mode 100644
index 0000000000..3a9cb30eef
--- /dev/null
+++ b/share/scripts/s_fader_automation.lua
@@ -0,0 +1,58 @@
+ardour { ["type"] = "Snippet", name = "Fader Automation" }
+
+function factory () return function ()
+ local playhead = Session:transport_sample ()
+ local samplerate = Session:nominal_sample_rate ()
+
+ -- get selected tracks
+ rl = Editor:get_selection ().tracks:routelist ()
+
+ -- prepare undo operation
+ Session:begin_reversible_command ("Fancy Fade Out")
+ local add_undo = false -- keep track if something has changed
+
+ -- iterate over selected tracks
+ for r in rl:iter () do
+ local ac = r:amp ():gain_control () -- ARDOUR:AutomationControl
+ local al = ac:alist () -- ARDOUR:AutomationList (state, high-level)
+
+ -- set automation state to "Touch"
+ ac:set_automation_state (ARDOUR.AutoState.Touch)
+
+ -- query the value at the playhead position
+ local g = al:eval (playhead)
+
+ -- get state for undo
+ local before = al:get_state ()
+
+ -- delete all events after the playhead...
+ al:truncate_end (playhead)
+
+ -- ...and generate some new ones.
+ for i=0,50 do
+ -- use a sqrt fade-out (the shape is recognizable, and otherwise
+ -- not be possible to achieve with existing ardour fade shapes)
+ al:add (playhead + i * samplerate / 50,
+ g * (1 - math.sqrt (i / 50)),
+ false, true)
+ end
+
+ -- remove dense events
+ al:thin (20)
+
+ -- save undo
+ local after = al:get_state ()
+ Session:add_command (al:memento_command (before, after))
+ add_undo = true
+
+ ::out::
+ 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
+end end