use crate::{DspFloat, DspFormat, DspFormatBase, DspType};
use core::iter::{repeat, Iterator, Repeat};
pub(crate) mod amp;
pub(crate) mod env;
pub(crate) mod filt;
pub(crate) mod lfo;
pub(crate) mod mixer;
pub(crate) mod mixosc;
pub(crate) mod modfilt;
pub(crate) mod osc;
pub(crate) mod ringmod;
mod iter;
use crate::context::{Context, ContextFxP};
use crate::{fixedmath, EnvParamFxP, NoteFxP, SampleFxP, ScalarFxP};
pub trait Device<T: DspFormat> {
type Input;
type Params;
type Output;
fn next(
&mut self,
context: &T::Context,
input: Self::Input,
params: Self::Params,
) -> Self::Output;
fn process<'a, InputIt: Iterator<Item = Self::Input>, ParamIt: Iterator<Item = Self::Params>>(
&'a mut self,
context: &'a T::Context,
input: InputIt,
params: ParamIt,
) -> DeviceIter<'a, T, Self, InputIt, ParamIt>
where
Self: Sized,
{
DeviceIter {
dev: self,
ctx: context,
input,
params,
}
}
}
pub struct DeviceIter<
'a,
T: DspFormat,
D: Device<T>,
InputIt: Iterator<Item = D::Input>,
ParamIt: Iterator<Item = D::Params>,
> {
dev: &'a mut D,
ctx: &'a T::Context,
input: InputIt,
params: ParamIt,
}
impl<
'a,
T: DspFormat,
D: Device<T>,
InputIt: Iterator<Item = D::Input>,
ParamIt: Iterator<Item = D::Params>,
> Iterator for DeviceIter<'a, T, D, InputIt, ParamIt>
{
type Item = D::Output;
fn next(&mut self) -> Option<D::Output> {
Some(self.dev.next(self.ctx, self.input.next()?, self.params.next()?))
}
}
pub use amp::Amp;
pub use env::{Env, EnvParams};
pub use filt::{Filt, FiltOutput, FiltParams};
pub use iter::env::{new_env_param_iter, EnvParamIter};
pub use iter::filt::{new_filt_param_iter, FiltParamIter};
pub use iter::lfo::{new_lfo_param_iter, LfoParamIter};
pub use iter::mixosc::{
new_mixosc_param_iter, new_synced_mixoscs_param_iter, MixOscParamIter, SyncedMixOscsParamIter,
};
pub use iter::modfilt::{
new_modfilt_input_iter, new_modfilt_param_iter, ModFiltInputIter, ModFiltParamIter,
};
pub use iter::osc::{
new_osc_param_iter, new_synced_oscs_param_iter, OscParamIter, SyncedOscsParamIter,
};
pub use iter::ringmod::{
new_ringmod_input_iter, new_ringmod_param_iter, RingModInputIter, RingModParamIter,
};
pub use lfo::{Lfo, LfoOptions, LfoParams, LfoWave};
pub use mixer::Mixer;
pub use mixosc::{MixOsc, MixOscParams, SyncedMixOscs, SyncedMixOscsOutput, SyncedMixOscsParams};
pub use modfilt::{ModFilt, ModFiltInput, ModFiltParams};
pub use osc::{Osc, OscOutput, OscParams, SyncedOscs, SyncedOscsOutput, SyncedOscsParams};
pub use ringmod::{RingMod, RingModInput, RingModParams};