mod ladder;
mod solver;
use solver::DKSolver;
mod sallen_key;
mod svf;
pub use ladder::LadderFilter;
pub use sallen_key::SallenKey;
pub use svf::Svf;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SvfMode {
LP,
HP,
BP1,
Notch,
BP2,
}
#[derive(Debug, Clone)]
pub struct FilterParams {
pub cutoff: f32,
pub res: f32,
pub drive: f32,
pub mode: SvfMode,
pub ladder_mode: LadderMode,
pub g: f32,
pub sample_rate: f32,
pub zeta: f32,
pub k_ladder: f32,
}
impl FilterParams {
pub fn new() -> Self {
let mut this = Self {
cutoff: 440.0,
res: 0.5,
drive: 1.0,
mode: SvfMode::LP,
ladder_mode: LadderMode::LP6,
g: 0.0,
sample_rate: 0.0,
zeta: 0.0,
k_ladder: 0.0,
};
this.set_sample_rate(44100.0);
this.set_resonance(0.5);
this.set_frequency(440.0);
this
}
#[inline]
pub fn set_resonance(&mut self, res: f32) {
self.res = res;
self.zeta = 5. - 5.0 * res;
self.k_ladder = res.powi(2) * 4.5 - 0.2;
}
#[inline]
pub fn set_frequency(&mut self, freq: f32) {
self.cutoff = freq;
self.g = (std::f32::consts::PI * freq / self.sample_rate).tan();
}
#[inline]
pub fn set_sample_rate(&mut self, sr: f32) {
self.sample_rate = sr;
self.set_resonance(self.res);
self.set_frequency(self.cutoff);
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub enum LadderMode {
LP6,
LP12,
LP18,
LP24,
HP6,
HP12,
HP18,
HP24,
BP12,
BP24,
N12,
}
impl std::fmt::Display for LadderMode {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
LadderMode::LP6 => write!(f, "LP6"),
LadderMode::LP12 => write!(f, "LP12"),
LadderMode::LP18 => write!(f, "LP18"),
LadderMode::LP24 => write!(f, "LP24"),
LadderMode::HP6 => write!(f, "HP6"),
LadderMode::HP12 => write!(f, "HP12"),
LadderMode::HP18 => write!(f, "HP18"),
LadderMode::HP24 => write!(f, "HP24"),
LadderMode::BP12 => write!(f, "BP12"),
LadderMode::BP24 => write!(f, "BP24"),
LadderMode::N12 => write!(f, "N12"),
}
}
}
pub fn get_ladder_mix(mode: LadderMode) -> [f32; 5] {
let mix;
match mode {
LadderMode::LP6 => {
mix = [0., -1., 0., -0., 0.];
}
LadderMode::LP12 => {
mix = [0., -0., 1., -0., 0.];
}
LadderMode::LP18 => {
mix = [0., -0., 0., -1., 0.];
}
LadderMode::LP24 => {
mix = [0., -0., 0., -0., 1.];
}
LadderMode::HP6 => {
mix = [1., -1., 0., -0., 0.];
}
LadderMode::HP12 => {
mix = [1., -2., 1., -0., 0.];
}
LadderMode::HP18 => {
mix = [1., -3., 3., -1., 0.];
}
LadderMode::HP24 => {
mix = [1., -4., 6., -4., 1.];
}
LadderMode::BP12 => {
mix = [0., -1., 1., -0., 0.];
}
LadderMode::BP24 => {
mix = [0., -0., 1., -2., 1.];
}
LadderMode::N12 => {
mix = [1., -2., 2., -0., 0.];
}
}
mix
}