1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
ix!();

use crate::{
    Reverb,
    ReverbParam,
    REVERB_TAPS,
};

impl Reverb {

    pub fn need_recalc_coefficients(&mut self) -> bool {
        // periodically true
        let x = matches![self.b, 0];
        self.b = ( self.b + 1) & 31;
        x
    }

    pub fn maybe_recalc_coefficients(&mut self) {

        if self.need_recalc_coefficients() {

            let f_freq1: f64 = self.pvalf(ReverbParam::Band1Freq).into();
            let f_locut: f64 = self.pvalf(ReverbParam::LowCut).into();
            let f_hicut      = self.pvalf(ReverbParam::HighCut);
            let f_gain1: f64 = self.pvalf(ReverbParam::Band1Gain).into();

            self.band1.coeff_peak_eq(
                self.band1.calc_omega(f_freq1 * (1.0 / 12.0)), 2.0, f_gain1);

            self.locut.coeff_hp(
                self.locut.calc_omega(f_locut * (1.0 / 12.0)), 0.5);

            self.hicut.coeff_lp2b(self.hicut.calc_omega(f_hicut as f64 * (1.0 / 12.0)), 0.5);
        }
    }

    pub fn update_rtime(&mut self) {

        let mut max_dt: i32 = 0;
        let decaytime:  f32 = self.pvalf(ReverbParam::DecayTime);
        let sr_f32:     f32 = self.srunit.samplerate() as f32;

        for t in 0..REVERB_TAPS {

            self.delay_fb[t] = (db60![] as f32).powf(
                (self.delay_time[t] as f32) / (256.0 * sr_f32 * 2.0_f32.powf(decaytime))
            );

            max_dt = maxf(max_dt as f32, self.delay_time[t] as f32) as i32;
        }

        self.lastf[ReverbParam::DecayTime as usize] = self.pvalf(ReverbParam::DecayTime);

        let t: f32 = BLOCK_SIZE_INV * (
            ((max_dt >> 8) as f32) + 
            sr_f32 * 2.0_f32.powf(decaytime) * 2.0  // *2 is to get the db120 time
        );

        self.ringout = Ringout::blocks(t as NumberOfBlocks);
    }

    pub fn update_rsize(&mut self) {
        self.load_preset(self.preset);
    }
}