Implement dynamic cutoff param smoothing

Signed-off-by: Christopher Arndt <chris@chrisarndt.de>
This commit is contained in:
Christopher Arndt 2024-04-29 18:07:00 +02:00
parent 2ec533edca
commit b377e9e8be
2 changed files with 51 additions and 3 deletions

View File

@ -0,0 +1,48 @@
## Dynamic Smoothing Using Self Modulating Filter
## Andrew Simper, Cytomic, 2014, andy@cytomic.com
## public release: 6th Dec 2016
## https://cytomic.com/files/dsp/DynamicSmoothing.pdf
type
DynParamSmooth* = object
baseFreq: float
sensitivity: float
wc: float
low1: float
low2: float
inz: float
proc reset*(self: var DynParamSmooth) =
self.low1 = 0.0
self.low2 = 0.0
self.inz = 0.0
proc setSampleRate*(self: var DynParamSmooth, sampleRate: float) =
self.wc = self.baseFreq / sampleRate
self.reset()
proc process*(self: var DynParamSmooth, sample: float): float =
let low1z = self.low1
let low2z = self.low2
let bandz = low1z - low2z
let wd = self.wc + self.sensitivity * abs(bandz)
let g = min(wd * (5.9948827 + wd * (-11.969296 + wd * 15.959062)), 1.0)
self.low1 = low1z + g * (0.5 * (sample + self.inz) - low1z)
self.low2 = low2z + g * (0.5 * (self.low1 + low1z) - low2z)
self.inz = sample
return self.low2
proc initDynParamSmooth*(
baseFreq: float = 2.0,
sensitivity: float = 2.0,
sampleRate: float = 48_000.0
): DynParamSmooth =
result.baseFreq = baseFreq
result.sensitivity = sensitivity
result.wc = result.baseFreq / sampleRate
result.reset()

View File

@ -2,7 +2,7 @@
import nymph
import paramsmooth
import dynparamsmooth
import svf
const PluginUri = "urn:nymph:examples:multimode-filter"
@ -20,7 +20,7 @@ type
q: ptr cfloat
mode: ptr cfloat
svf: FilterSV
smoothCutoff: ParamSmooth
smoothCutoff: DynParamSmooth
proc instantiate(descriptor: ptr Lv2Descriptor; sampleRate: cdouble;
@ -28,7 +28,7 @@ proc instantiate(descriptor: ptr Lv2Descriptor; sampleRate: cdouble;
Lv2Handle {.cdecl.} =
let plug = createShared(SVFPlugin)
plug.svf = initFilterSV(fmLowPass, sampleRate)
plug.smoothCutoff = initParamSmooth(20.0, sampleRate)
plug.smoothCutoff = initDynParamSmooth(sampleRate=sampleRate)
return plug