use crate::AudioEffect;
#[derive(Debug, Clone)]
pub struct FuzzConfig {
pub fuzz: f32,
pub level: f32,
}
impl Default for FuzzConfig {
fn default() -> Self {
Self {
fuzz: 10.0,
level: 0.3,
}
}
}
pub struct Fuzz {
config: FuzzConfig,
}
impl Fuzz {
#[must_use]
pub fn new(config: FuzzConfig) -> Self {
Self { config }
}
fn hard_clip(x: f32) -> f32 {
x.clamp(-1.0, 1.0)
}
}
impl AudioEffect for Fuzz {
fn process_sample(&mut self, input: f32) -> f32 {
let fuzzed = input * self.config.fuzz;
Self::hard_clip(fuzzed) * self.config.level
}
fn reset(&mut self) {
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_fuzz() {
let config = FuzzConfig::default();
let mut fuzz = Fuzz::new(config);
let output = fuzz.process_sample(0.5);
assert!(output.is_finite());
assert!(output.abs() <= 1.0);
}
}