Minor filter example fixes and tweaks
Signed-off-by: Christopher Arndt <chris@chrisarndt.de>
This commit is contained in:
parent
8fc3663bc3
commit
4dc371c7de
|
@ -24,7 +24,7 @@ type
|
||||||
proc instantiate(descriptor: ptr Lv2Descriptor; sampleRate: cdouble;
|
proc instantiate(descriptor: ptr Lv2Descriptor; sampleRate: cdouble;
|
||||||
bundlePath: cstring; features: ptr ptr Lv2Feature):
|
bundlePath: cstring; features: ptr ptr Lv2Feature):
|
||||||
Lv2Handle {.cdecl.} =
|
Lv2Handle {.cdecl.} =
|
||||||
var plug = createShared(SVFPlugin)
|
let plug = createShared(SVFPlugin)
|
||||||
plug.svf = initFilterSV(fmLowPass, sampleRate)
|
plug.svf = initFilterSV(fmLowPass, sampleRate)
|
||||||
return plug
|
return plug
|
||||||
|
|
||||||
|
@ -56,7 +56,7 @@ proc activate(instance: Lv2Handle) {.cdecl.} =
|
||||||
|
|
||||||
proc run(instance: Lv2Handle; nSamples: cuint) {.cdecl.} =
|
proc run(instance: Lv2Handle; nSamples: cuint) {.cdecl.} =
|
||||||
let plug = cast[ptr SVFPlugin](instance)
|
let plug = cast[ptr SVFPlugin](instance)
|
||||||
plug.svf.setMode(plug.mode[].int.clamp(0, 4).FilterMode)
|
plug.svf.setMode(plug.mode[].int.clamp(0, 3).FilterMode)
|
||||||
plug.svf.setCutoff(plug.cutoff[].clamp(16.0, 7_000.0))
|
plug.svf.setCutoff(plug.cutoff[].clamp(16.0, 7_000.0))
|
||||||
plug.svf.setQ(plug.q[].clamp(0.8, 10.0))
|
plug.svf.setQ(plug.q[].clamp(0.8, 10.0))
|
||||||
plug.svf.calcCoef()
|
plug.svf.calcCoef()
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
## State Variable Filter after Hal Chamberlin, Musical Applications of Microprocessors
|
## State Variable Filter after Hal Chamberlin, Musical Applications of Microprocessors
|
||||||
|
##
|
||||||
## Only stable up to fc ~= fs / 6.5 !
|
## Only stable up to fc ~= fs / 6.5 !
|
||||||
|
## Sensible range for q ~= 0.8 .. 10.0
|
||||||
|
|
||||||
import std/math
|
import std/math
|
||||||
|
|
||||||
|
@ -18,23 +20,23 @@ type
|
||||||
a: float
|
a: float
|
||||||
b: float
|
b: float
|
||||||
maxCutoff: float
|
maxCutoff: float
|
||||||
sampleRate: float
|
sampleRate: float64
|
||||||
needs_update: bool
|
needs_update: bool
|
||||||
|
|
||||||
|
|
||||||
proc reset*(self: var FilterSV) =
|
proc reset*(self: var FilterSV) =
|
||||||
self.lowPass = 0
|
self.lowPass = 0.0
|
||||||
self.hiPass = 0
|
self.hiPass = 0.0
|
||||||
self.bandPass = 0
|
self.bandPass = 0.0
|
||||||
self.bandReject = 0
|
self.bandReject = 0.0
|
||||||
|
|
||||||
|
|
||||||
proc initFilterSV*(mode: FilterMode = fmLowPass, sampleRate: float = 48_000): FilterSV =
|
proc initFilterSV*(mode: FilterMode = fmLowPass, sampleRate: float64 = 48_000.0): FilterSV =
|
||||||
result.mode = mode
|
result.mode = mode
|
||||||
result.sampleRate = sampleRate
|
result.sampleRate = sampleRate
|
||||||
result.reset()
|
result.reset()
|
||||||
result.a = 0
|
result.a = 0.0
|
||||||
result.b = 0
|
result.b = 0.0
|
||||||
result.maxCutoff = sampleRate / 6.0
|
result.maxCutoff = sampleRate / 6.0
|
||||||
result.needs_update = true
|
result.needs_update = true
|
||||||
|
|
||||||
|
@ -52,7 +54,7 @@ proc calcCoef*(self: var FilterSV) =
|
||||||
|
|
||||||
|
|
||||||
proc setCutoff*(self: var FilterSV, cutoff: float) =
|
proc setCutoff*(self: var FilterSV, cutoff: float) =
|
||||||
let fc = if cutoff > self.maxCutoff: self.maxCutoff else: cutoff
|
let fc = min(self.maxCutoff, cutoff)
|
||||||
|
|
||||||
if fc != self.cutoff:
|
if fc != self.cutoff:
|
||||||
self.cutoff = fc
|
self.cutoff = fc
|
||||||
|
|
Loading…
Reference in New Issue