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

1use crate::engine::audio::effects::processors::super_trait::EffectProcessor;
2
3#[derive(Debug, Clone)]
4pub struct TremoloProcessor {
5    pub rate: f32,
6    pub depth: f32,
7    pub sync: bool,
8    phase: f32,
9}
10
11impl TremoloProcessor {
12    pub fn new(rate: f32, depth: f32, sync: bool) -> Self {
13        Self {
14            rate: rate.clamp(0.1, 20.0),
15            depth: depth.clamp(0.0, 1.0),
16            sync,
17            phase: 0.0,
18        }
19    }
20}
21
22impl Default for TremoloProcessor {
23    fn default() -> Self {
24        Self::new(5.0, 0.5, false)
25    }
26}
27
28impl EffectProcessor for TremoloProcessor {
29    fn process(&mut self, samples: &mut [f32], sr: u32) {
30        let sr_f = sr as f32;
31        for i in (0..samples.len()).step_by(2) {
32            let lfo = (2.0 * std::f32::consts::PI * self.phase).sin();
33            let mod_amp = 1.0 - self.depth + self.depth * ((lfo + 1.0) * 0.5);
34            samples[i] *= mod_amp;
35            if i + 1 < samples.len() {
36                samples[i + 1] *= mod_amp;
37            }
38            self.phase += self.rate / sr_f;
39            if self.phase >= 1.0 {
40                self.phase -= 1.0;
41            }
42        }
43    }
44
45    fn reset(&mut self) {
46        self.phase = 0.0;
47    }
48
49    fn name(&self) -> &str {
50        "Tremolo"
51    }
52}