diff options
author | Robin Gareus <robin@gareus.org> | 2019-04-18 14:11:52 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2019-04-18 14:11:52 +0200 |
commit | 0a9674ec6b1c026180fb3a1f917347a2429475af (patch) | |
tree | 497638110a63a0c6c37f972e6a1283cbeb94c54f /scripts | |
parent | 6edc9196561ed33042e8907db661bf93e9e5e202 (diff) |
Release notch-bank filter
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/notch_bank.lua (renamed from scripts/_notch_bank.lua) | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/scripts/_notch_bank.lua b/scripts/notch_bank.lua index cd1f71bdc6..76901920d9 100644 --- a/scripts/_notch_bank.lua +++ b/scripts/notch_bank.lua @@ -1,15 +1,15 @@ ardour { ["type"] = "dsp", - name = "Notch Bank", - category = "Example", + name = "a-Notch Bank", + category = "Filter", license = "MIT", author = "Ardour Lua Task Force", - description = [[An Example Filter Plugin]] + description = [[Notch Filter Bank; useful to remove noise with a harmonic spectum (e.g, mains hum, GSM signals, charge-pump noise, etc). +Note: this plugin is not suitable to be automated, it is intended for static noise only.]] } -------------------------------------------------------------------- --- this is a quick/dirty example filter: no de-click, no de-zipper, --- no latency reporting,... +------------------------------------------------------------------ +-- this is a quick/dirty example filter: no de-click, no de-zipper ------------------------------------------------------------------- -- configuration @@ -28,23 +28,22 @@ end function dsp_params () return { - { ["type"] = "input", name = "Base Freq", min = 10, max = 1000, default = 100, unit="Hz", logarithmic = true }, + { ["type"] = "input", name = "Base Freq", min = 10, max = 2000, default = 100, unit="Hz", logarithmic = true }, { ["type"] = "input", name = "Quality", min = 1.0, max = 100.0, default = 8.0, logarithmic = true }, { ["type"] = "input", name = "Stages", min = 1.0, max = max_stages, default = 8.0, integer = true }, } end - -- plugin instance state local filters = {} -- the biquad filter instances local chn = 0 -- configured channel count local sample_rate = 0 -- configured sample-rate +local limit = 0 -- max number of stages (given freq & sample-rate) -- cached control ports (keep track of changed) local freq = 0 local qual = 0 - -- dsp_init is called once when instantiating the plugin function dsp_init (rate) -- remember the sample-rate @@ -56,6 +55,10 @@ end function dsp_configure (ins, outs) assert (ins:n_audio () == outs:n_audio ()) + -- explicit cleanup + filters = {} + collectgarbage () + -- remember audio-channels chn = ins:n_audio () @@ -68,7 +71,6 @@ function dsp_configure (ins, outs) end end - -- the actual process function, called every cycle -- ins, outs are audio-data arrays -- http://manual.ardour.org/lua-scripting/class_reference/#C:FloatArray @@ -79,31 +81,33 @@ function dsp_run (ins, outs, n_samples) -- ...and matches the configured number of channels assert (#ins == chn) - local ctrl = CtrlPorts:array() -- get control parameters as array - -- ctrl[1] .. corresponds to the parameters given in in dsp_params() + local ctrl = CtrlPorts:array () -- get control parameters as array + -- ctrl[] .. correspond to the parameters given in in dsp_params() -- test if the plugin-parameters have changed if freq ~= ctrl[1] or qual ~= ctrl[2] then -- remember current settings freq = ctrl[1] qual = ctrl[2] + -- calc max number of states to configure/process + limit = math.floor (sample_rate / (2 * freq)) -- at most up to SR / 2 + if limit > max_stages then limit = max_stages end + -- re-compute the filter coefficients for all filters for c = 1, chn do -- for each channel - for i = 1, max_stages do -- and for each filter stage - -- the parameters are type, frequency, quality(bandwidth), gain + for i = 1, limit do -- and for each filter stage -- see http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:DSP:Biquad - -- for a list of available types, see + -- and for a list of available types, see -- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR.DSP.Biquad.Type + -- the parameters are type, frequency, quality(bandwidth), gain filters[c][i]:compute (ARDOUR.DSP.BiquadType.Notch, freq * i, qual * i, 0) end end end -- limit the number of process stages - local limit = math.floor (sample_rate / ( 2 * freq )) -- at most up to SR / 2 local stages = math.floor (ctrl['3']) -- current user-set parameter if stages < 1 then stages = 1 end -- at least one stage... - if stages > max_stages then stages = max_stages end if stages > limit then stages = limit end -- process all channels |