use crate::algorithm::Algorithm;
use rill_core::time::ClockTick;
use rill_core::traits::ActionContext;
use rill_core::Transcendental;
pub trait Generator<T: Transcendental>: Algorithm<T> {
fn generate(&mut self) -> T {
let mut output = [T::ZERO];
let tick = ClockTick::default();
let ctx = ActionContext::new(&tick);
let _ = self.process(None, &mut output, &ctx);
output[0]
}
fn generate_block(&mut self, output: &mut [T]) {
let tick = ClockTick::default();
let ctx = ActionContext::new(&tick);
let _ = self.process(None, output, &ctx);
}
fn generate_block_vector(&mut self, output: &mut [T]) {
self.generate_block(output);
}
fn reset_phase(&mut self);
fn phase(&self) -> f32;
}
pub trait FrequencySource<T: Transcendental>: Generator<T> {
fn set_frequency(&mut self, freq: f32);
fn frequency(&self) -> f32;
fn set_midi_note(&mut self, note: u8) {
let freq = 440.0 * 2.0_f32.powf((note as f32 - 69.0) / 12.0);
self.set_frequency(freq);
}
}
pub trait AmplitudeSource<T: Transcendental>: Generator<T> {
fn set_amplitude(&mut self, amp: T);
fn amplitude(&self) -> T;
fn set_amplitude_db(&mut self, db: f32) {
self.set_amplitude(T::from_f32(10.0_f32.powf(db / 20.0)));
}
}
pub trait WaveformSource<T: Transcendental>: Generator<T> {
type Waveform;
fn set_waveform(&mut self, wf: Self::Waveform);
fn waveform(&self) -> Self::Waveform;
}
pub trait NoiseSource<T: Transcendental>: Generator<T> {
type NoiseType;
fn set_noise_type(&mut self, nt: Self::NoiseType);
fn noise_type(&self) -> Self::NoiseType;
}