1use num_traits::{Float, FloatConst};
4
5use dsp_process::SplitProcess;
6
7pub struct State<T> {
9 pub lp: T,
11 pub hp: T,
13 pub bp: T,
15}
16
17impl<T: Float> State<T> {
18 pub fn br(&self) -> T {
20 self.hp + self.lp
21 }
22}
23
24#[derive(Copy, Clone, Debug, PartialEq, PartialOrd)]
28pub struct Svf<T> {
29 f: T,
30 q: T,
31}
32
33impl<T: Float + FloatConst> Svf<T> {
34 pub fn set_frequency(&mut self, f0: T) {
38 self.f = (T::one() + T::one()) * (T::PI() * f0).sin();
39 }
40
41 pub fn set_q(&mut self, q: T) {
43 self.q = T::one() / q;
44 }
45}
46
47impl<T> SplitProcess<T, (), State<T>> for Svf<T>
48where
49 T: Float + FloatConst + Copy,
50{
51 fn process(&self, state: &mut State<T>, x: T) {
56 state.lp = state.bp * self.f + state.lp;
57 state.hp = x - state.lp - state.bp * self.q;
58 state.bp = state.hp * self.f + state.bp;
59 }
60}