basic_reverb/diffuser/
diffuser_half_lengths.rs

1use super::diffusion_step::DiffusionStep;
2use array_init::array_init;
3
4pub(crate) struct DiffuserHalfLengths<const CHANNELS: usize, const SAMPLE_RATE: u32> {
5    steps: [DiffusionStep<CHANNELS, SAMPLE_RATE>; CHANNELS],
6}
7
8impl<const CHANNELS: usize, const SAMPLE_RATE: u32> DiffuserHalfLengths<CHANNELS, SAMPLE_RATE> {
9    pub(crate) fn new(diffusion_ms: f64) -> Self {
10        let mut diffusion_ms = diffusion_ms;
11        let steps = array_init(|_| {
12            let mut step = DiffusionStep::new();
13            diffusion_ms *= 0.5;
14            step.delay_ms_range = diffusion_ms;
15            step
16        });
17
18        Self { steps }
19    }
20
21    pub(crate) fn process(&mut self, samples: [f64; CHANNELS]) -> [f64; CHANNELS] {
22        let mut samples = samples;
23        for step in &mut self.steps {
24            samples = step.process(samples);
25        }
26        samples
27    }
28}