Add script to normalize all tracks
This commit is contained in:
parent
18511f851e
commit
637e70749c
58
scripts/normalize_all_tracks.lua
Normal file
58
scripts/normalize_all_tracks.lua
Normal file
@ -0,0 +1,58 @@
|
||||
ardour { ["type"] = "EditorAction",
|
||||
name = "Normalize All Tracks",
|
||||
license = "MIT",
|
||||
author = "Ardour Team",
|
||||
description = [[Normalize all regions using a common gain-factor per track.]]
|
||||
}
|
||||
|
||||
function factory () return function ()
|
||||
-- target values -- TODO: use a LuaDialog.Dialog and ask..
|
||||
local target_peak = -1 --dBFS
|
||||
local target_rms = -18 --dBFS/RMS
|
||||
|
||||
-- prepare undo operation
|
||||
Session:begin_reversible_command ("Normalize Tracks")
|
||||
local add_undo = false -- keep track if something has changed
|
||||
|
||||
-- loop over all tracks in the session
|
||||
for track in Session:get_tracks():iter() do
|
||||
local norm = 0 -- per track gain
|
||||
-- loop over all regions on track
|
||||
for r in track:to_track():playlist():region_list():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)
|
||||
-- check if region is silent
|
||||
if (peak > 0) then
|
||||
local f_rms = rms / 10 ^ (.05 * target_rms)
|
||||
local f_peak = peak / 10 ^ (.05 * target_peak)
|
||||
local tg = (f_peak > f_rms) and f_peak or f_rms -- max (f_peak, f_rms)
|
||||
norm = (tg > norm) and tg or norm -- max (tg, norm)
|
||||
end
|
||||
::next::
|
||||
end
|
||||
|
||||
-- apply same gain to all regions on track
|
||||
if norm > 0 then
|
||||
for r in track:to_track():playlist():region_list():iter() do
|
||||
local ar = r:to_audioregion ()
|
||||
if ar:isnil () then goto skip end
|
||||
ar:to_stateful ():clear_changes ()
|
||||
ar:set_scale_amplitude (1 / norm)
|
||||
add_undo = true
|
||||
::skip::
|
||||
end
|
||||
end
|
||||
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
|
Loading…
Reference in New Issue
Block a user