use std::marker::PhantomData;
use crate::prelude::*;
pub struct Vib<S: Frequency> {
pub base: Freq,
phantom: PhantomData<S>,
}
impl<S: Frequency> Vib<S> {
#[must_use]
pub const fn new(base: Freq) -> Self {
Self {
base,
phantom: PhantomData,
}
}
}
impl<S: Frequency> Default for Vib<S> {
fn default() -> Self {
Self::new(Freq::default())
}
}
impl<S: Frequency> MutEnv<S> for Vib<S> {
fn modify_env(&mut self, sgn: &mut S, bend: Env) {
*sgn.freq_mut() = self.base * bend.0;
}
}
pub struct Vibrato<S: Frequency, E: SignalMut<Sample = Env>> {
inner: MutSgn<S, E, Vib<S>>,
}
impl<S: Frequency, E: SignalMut<Sample = Env>> Vibrato<S, E> {
pub fn new(sgn: S, base: Freq, env: E) -> Self {
Self {
inner: MutSgn::new(sgn, env, Vib::new(base)),
}
}
pub const fn sgn(&self) -> &S {
self.inner.sgn()
}
pub fn sgn_mut(&mut self) -> &mut S {
self.inner.sgn_mut()
}
pub const fn env(&self) -> &E {
self.inner.env()
}
pub fn env_mut(&mut self) -> &mut E {
self.inner.env_mut()
}
}
impl<S: Frequency, E: SignalMut<Sample = Env>> Signal for Vibrato<S, E> {
type Sample = S::Sample;
fn get(&self) -> S::Sample {
self.inner.get()
}
}
impl<S: Frequency, E: SignalMut<Sample = Env>> SignalMut for Vibrato<S, E> {
fn advance(&mut self) {
self.inner.advance();
}
fn retrigger(&mut self) {
self.inner.retrigger();
}
}
impl<S: Frequency + Base, E: SignalMut<Sample = Env>> Base for Vibrato<S, E> {
type Base = S::Base;
fn base(&self) -> &Self::Base {
self.inner.base()
}
fn base_mut(&mut self) -> &mut Self::Base {
self.inner.base_mut()
}
}
impl<S: Frequency, E: SignalMut<Sample = Env>> Frequency for Vibrato<S, E> {
fn freq(&self) -> Freq {
self.inner.func().base
}
fn freq_mut(&mut self) -> &mut Freq {
&mut self.inner.func_mut().base
}
}
impl<S: Frequency + Done, E: SignalMut<Sample = Env>> Done for Vibrato<S, E> {
fn is_done(&self) -> bool {
self.inner.is_done()
}
}
impl<S: Frequency + Stop, E: SignalMut<Sample = Env>> Stop for Vibrato<S, E> {
fn stop(&mut self) {
self.inner.stop();
}
}