Skip to main content

bae_rs/modifiers/
envelope.rs

1//! # Envelope
2
3use super::*;
4
5/// Envelope Follower filter. I don't remember my lectures well enough to write
6/// a detailed description.
7pub struct Envelope {
8    au: SampleT,
9    bu: SampleT,
10    ad: SampleT,
11    bd: SampleT,
12
13    x1: SampleT,
14    y1: SampleT,
15}
16
17impl Envelope {
18    /// Creates a new [`Envelope`] object from the given max and min frequencies
19    /// to follow.
20    /// 
21    /// [`Envelope`]: struct.Envelope.html
22    pub fn new(lower: SampleT, upper: SampleT) -> Envelope{
23        let theta_u = (std::f32::consts::PI * upper * INV_SAMPLE_RATE as SampleT).tan();
24        let theta_d = (std::f32::consts::PI * lower * INV_SAMPLE_RATE as SampleT).tan();
25
26        Envelope {
27            au: theta_u / (1.0 + theta_u),
28            bu: (1.0 - theta_u) / (1.0 + theta_u),
29            ad: theta_d / (1.0 + theta_d),
30            bd: (1.0 - theta_d) / (1.0 + theta_d),
31
32            x1: SampleT::default(),
33            y1: SampleT::default(),
34        }
35    }
36}
37
38impl Modifier for Envelope {
39    fn process(&mut self, x: SampleT) -> SampleT {
40        let y = if x.abs() > self.y1 {
41            self.au * (x.abs() + self.x1.abs()) + self.bu * self.y1
42        } else {
43            self.ad * (x.abs() + self.x1.abs()) + self.bd * self.y1
44        };
45
46        self.y1 = y;
47        self.x1 = x;
48
49        y
50    }
51}
52
53impl Clone for Envelope {
54    fn clone(&self) -> Self {
55        Envelope {
56            au: self.au,
57            bu: self.bu,
58            ad: self.ad,
59            bd: self.bd,
60            
61            x1: Default::default(),
62            y1: Default::default(),
63        }
64    }
65}