#[derive(Debug, Clone)]
pub struct EnvelopeFollower {
current_value: f32,
attack_coeff: f32,
release_coeff: f32,
sample_rate: u32,
}
impl EnvelopeFollower {
pub fn new(sample_rate: u32, attack_time: f32, release_time: f32) -> Self {
let mut follower = Self {
current_value: 0.0,
attack_coeff: 0.0,
release_coeff: 0.0,
sample_rate,
};
follower.set_attack_time(attack_time);
follower.set_release_time(release_time);
follower
}
pub fn set_attack_time(&mut self, time: f32) {
self.attack_coeff = if time > 0.0 {
(-1.0 / (time * self.sample_rate as f32)).exp()
} else {
0.0
};
}
pub fn set_release_time(&mut self, time: f32) {
self.release_coeff = if time > 0.0 {
(-1.0 / (time * self.sample_rate as f32)).exp()
} else {
0.0
};
}
pub fn run(&mut self, input: f32) -> f32 {
if input > self.current_value {
self.current_value = input + self.attack_coeff * (self.current_value - input);
} else {
self.current_value = input + self.release_coeff * (self.current_value - input);
}
self.current_value
}
pub fn reset(&mut self, value: f32) {
self.current_value = value;
}
}
impl Default for EnvelopeFollower {
fn default() -> Self {
Self::new(44100, 0.01, 0.1)
}
}