devalang_wasm/engine/audio/effects/processors/
monoizer.rs

1use crate::engine::audio::effects::processors::super_trait::EffectProcessor;
2
3#[derive(Debug, Clone)]
4pub struct MonoizerProcessor {
5    pub enabled: bool,
6    pub mix: f32,
7}
8
9impl MonoizerProcessor {
10    pub fn new(enabled: bool, mix: f32) -> Self {
11        Self {
12            enabled,
13            mix: mix.clamp(0.0, 1.0),
14        }
15    }
16}
17
18impl Default for MonoizerProcessor {
19    fn default() -> Self {
20        Self::new(true, 1.0)
21    }
22}
23
24impl EffectProcessor for MonoizerProcessor {
25    fn process(&mut self, samples: &mut [f32], _sr: u32) {
26        if !self.enabled {
27            return;
28        }
29        for i in (0..samples.len()).step_by(2) {
30            let l = samples[i];
31            let r = if i + 1 < samples.len() {
32                samples[i + 1]
33            } else {
34                l
35            };
36            let mid = (l + r) * 0.5;
37            samples[i] = l * (1.0 - self.mix) + mid * self.mix;
38            if i + 1 < samples.len() {
39                samples[i + 1] = r * (1.0 - self.mix) + mid * self.mix;
40            }
41        }
42    }
43    fn reset(&mut self) {}
44    fn name(&self) -> &str {
45        "Monoizer"
46    }
47}