devalang 0.2.0

Write music with code. Devalang is a domain-specific language (DSL) for sound designers and music hackers. Compose, automate, and control sound — in plain text.
Documentation
use crate::engine::audio::effects::processors::super_trait::EffectProcessor;

#[derive(Debug, Clone)]
pub struct MonoizerProcessor {
    pub enabled: bool,
    pub mix: f32,
}

impl MonoizerProcessor {
    pub fn new(enabled: bool, mix: f32) -> Self {
        Self {
            enabled,
            mix: mix.clamp(0.0, 1.0),
        }
    }
}

impl Default for MonoizerProcessor {
    fn default() -> Self {
        Self::new(true, 1.0)
    }
}

impl EffectProcessor for MonoizerProcessor {
    fn process(&mut self, samples: &mut [f32], _sr: u32) {
        if !self.enabled {
            return;
        }
        for i in (0..samples.len()).step_by(2) {
            let l = samples[i];
            let r = if i + 1 < samples.len() {
                samples[i + 1]
            } else {
                l
            };
            let mid = (l + r) * 0.5;
            samples[i] = l * (1.0 - self.mix) + mid * self.mix;
            if i + 1 < samples.len() {
                samples[i + 1] = r * (1.0 - self.mix) + mid * self.mix;
            }
        }
    }
    fn reset(&mut self) {}
    fn name(&self) -> &str {
        "Monoizer"
    }
}