devalang_wasm/engine/audio/effects/processors/
tremolo.rs1use 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}