bae_rs/modifiers/
envelope.rs1use super::*;
4
5pub 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 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}