use super::delay_line::{DelayLine, InterpolationType};
pub struct FeedbackDelay {
delay_line: DelayLine,
delay_samples: f32,
feedback: f32,
mix: f32, interp: InterpolationType,
}
impl FeedbackDelay {
pub fn new(max_delay_samples: usize, initial_delay: f32, feedback: f32, mix: f32) -> Self {
Self {
delay_line: DelayLine::new(max_delay_samples),
delay_samples: initial_delay,
feedback: feedback.clamp(-0.99, 0.99), mix: mix.clamp(0.0, 1.0),
interp: InterpolationType::Linear,
}
}
pub fn set_delay_samples(&mut self, delay: f32) {
self.delay_samples = delay;
}
pub fn set_feedback(&mut self, feedback: f32) {
self.feedback = feedback.clamp(-0.99, 0.99);
}
pub fn set_mix(&mut self, mix: f32) {
self.mix = mix.clamp(0.0, 1.0);
}
pub fn set_interpolation(&mut self, interp: InterpolationType) {
self.interp = interp;
}
#[inline]
pub fn process_sample(&mut self, input: f32) -> f32 {
let delayed = self
.delay_line
.read_delay_before_push(self.delay_samples, self.interp);
let to_delay = input + delayed * self.feedback;
self.delay_line.push(to_delay);
(1.0 - self.mix) * input + self.mix * delayed
}
pub fn process_buffer(&mut self, buffer: &mut [f32]) {
for sample in buffer.iter_mut() {
*sample = self.process_sample(*sample);
}
}
pub fn clear(&mut self) {
self.delay_line.clear();
}
}