pub enum Effect {
FIR(FIR),
Reverb(Reverb),
}
pub struct FIR {
coeffs: Vec<f32>,
state: Vec<f32>,
}
pub struct FIRBuilder {
coeffs: Vec<f32>,
}
#[allow(unused)]
pub struct Reverb {
state: f32,
}
impl FIRBuilder {
pub fn new() -> Self {
Self { coeffs: vec![] }
}
pub fn low_pass(mut self, cutoff: f32, sample_rate: f32) -> Self {
let n = 2.0 * sample_rate / cutoff;
let n = n as usize;
let mut coeffs = vec![0.0; n];
for (i, item) in coeffs.iter_mut().enumerate() {
let x = (n - i) as f32 * cutoff / sample_rate;
*item = x.sin() / (n as f32 * x);
}
self.coeffs = coeffs;
self
}
pub fn build(&self) -> FIR {
FIR::new(self.coeffs.clone())
}
}
impl Default for FIRBuilder {
fn default() -> Self {
Self::new()
}
}
impl FIR {
fn new(coeffs: Vec<f32>) -> Self {
let state = vec![0.0; coeffs.len()];
Self { coeffs, state }
}
pub fn process(&mut self, input: f32) -> f32 {
let mut output = 0.0;
self.state.insert(0, input);
self.state.pop();
for i in 0..self.coeffs.len() {
output += self.coeffs[i] * self.state[i];
}
output
}
}
impl Reverb {
pub fn new() -> Self {
Self { state: 0.0 }
}
pub fn process(&mut self, input: f32) -> f32 {
input
}
}
impl Default for Reverb {
fn default() -> Self {
Self::new()
}
}