audio_processor_time/chorus/
mod.rs1use audio_processor_traits::simple_processor::MonoAudioProcessor;
24use audio_processor_traits::{AudioBuffer, AudioContext, AudioProcessor};
25use augmented_oscillator::Oscillator;
26
27use crate::MonoDelayProcessor;
28
29pub struct ChorusProcessor {
30 mono_delay_processor: Vec<MonoDelayProcessor<f32>>,
31 oscillator: Oscillator<f32>,
32}
33
34impl Default for ChorusProcessor {
35 fn default() -> Self {
36 Self {
37 mono_delay_processor: vec![],
38 oscillator: Oscillator::sine(44100.0),
39 }
40 }
41}
42
43impl AudioProcessor for ChorusProcessor {
44 type SampleType = f32;
45
46 fn prepare(&mut self, context: &mut AudioContext) {
47 self.mono_delay_processor.resize_with(
48 context.settings.output_channels(),
49 MonoDelayProcessor::default,
50 );
51 for processor in &mut self.mono_delay_processor {
52 processor.m_prepare(context);
53 processor.handle().set_feedback(0.0);
54 processor.handle().set_delay_time_secs(0.01);
55 }
56
57 self.oscillator
58 .set_sample_rate(context.settings.sample_rate());
59 self.oscillator.set_frequency(3.0);
60 }
61
62 fn process(&mut self, context: &mut AudioContext, data: &mut AudioBuffer<Self::SampleType>) {
63 for frame_num in 0..data.num_samples() {
64 let time = self.oscillator.next_sample();
65
66 for (channel_num, delay) in self.mono_delay_processor.iter_mut().enumerate() {
67 let sample = &mut data.channels_mut()[channel_num][frame_num];
68 delay.handle().set_delay_time_secs(0.02 + time * 0.001);
69 *sample = *sample + 0.4 * delay.m_process(context, *sample)
70 }
71 }
72 }
73}