diff options
author | Robin Gareus <robin@gareus.org> | 2020-02-23 20:48:02 +0100 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2020-02-23 20:48:02 +0100 |
commit | 180843f9bd28b191c7404245ba0a121107992511 (patch) | |
tree | c60312dc09f76c2f55ba2383245c427e15c38dea /share/scripts/s_region_gain2.lua | |
parent | bf649cd68ad46c34a656700aa6cb89416d648c64 (diff) |
Also move Lua scripts to share subfolder
Diffstat (limited to 'share/scripts/s_region_gain2.lua')
-rw-r--r-- | share/scripts/s_region_gain2.lua | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/share/scripts/s_region_gain2.lua b/share/scripts/s_region_gain2.lua new file mode 100644 index 0000000000..cec56ca412 --- /dev/null +++ b/share/scripts/s_region_gain2.lua @@ -0,0 +1,63 @@ +ardour { ["type"] = "Snippet", name = "Normalize Regions" } + +function factory () return function () + -- get Editor GUI Selection + -- http://manual.ardour.org/lua-scripting/class_reference/#ArdourUI:Selection + local sel = Editor:get_selection () + + -- prepare undo operation + Session:begin_reversible_command ("Lua Normalize") + local add_undo = false -- keep track if something has changed + + -- iterate over selected regions + -- http://manual.ardour.org/lua-scripting/class_reference/#ArdourUI:RegionSelection + for r in sel.regions:regionlist ():iter () do + -- test if it's an audio region + local ar = r:to_audioregion (); + if ar:isnil () then + goto next + end + + local peak = ar:maximum_amplitude (nil); + local rms = ar:rms (nil); + + if (peak > 0) then + print ("Region:", r:name (), "peak:", 20 * math.log (peak) / math.log(10), "dBFS") + print ("Region:", r:name (), "rms :", 20 * math.log (rms) / math.log(10), "dBFS") + else + print ("Region:", r:name (), " is silent") + end + + -- normalize region + if (peak > 0) then + -- prepare for undo + r:to_stateful ():clear_changes () + -- calculate gain. + local f_rms = rms / 10 ^ (.05 * -18) -- -18dBFS/RMS + local f_peak = peak / 10 ^ (.05 * -1) -- -1dbFS/peak + -- apply gain + if (f_rms > f_peak) then + print ("Region:", r:name (), "RMS normalized by:", -20 * math.log (f_rms) / math.log(10), "dB") + ar:set_scale_amplitude (1 / f_rms) + else + print ("Region:", r:name (), "peak normalized by:", -20 * math.log (f_peak) / math.log(10), "dB") + ar:set_scale_amplitude (1 / f_peak) + end + -- save changes (if any) to undo command + if not Session:add_stateful_diff_command (r:to_statefuldestructible ()):empty () then + add_undo = true + end + end + + ::next:: + end + + -- all done. now commit the combined undo operation + if add_undo then + -- the 'nil' command here means to use all collected diffs + Session:commit_reversible_command (nil) + else + Session:abort_reversible_command () + end + +end end |