pub mod delay;
pub mod distortion;
pub mod envelopes;
pub mod filter;
mod freq;
mod trailing;
mod vol;
pub use delay as dly;
pub use distortion as dst;
pub use envelopes as env;
pub use filter as flt;
pub mod pan;
pub use freq::{Vib, Vibrato};
pub use trailing::{Retrigger, Stopping, Trailing};
pub use vol::{Gate, StopTremolo, Trem, Tremolo, Volume};
use crate::prelude::*;
#[derive(Clone, Copy, Debug, Default)]
pub struct MapSgn<S: Signal, F: Map<Input = S::Sample>>
where
F::Output: smp::Sample,
{
sgn: S,
map: F,
}
impl<S: Signal, F: Map<Input = S::Sample>> MapSgn<S, F>
where
F::Output: smp::Sample,
{
pub const fn new(sgn: S, map: F) -> Self {
Self { sgn, map }
}
pub fn new_default(sgn: S) -> Self
where
F: Default,
{
Self::new(sgn, F::default())
}
pub const fn sgn(&self) -> &S {
&self.sgn
}
pub fn sgn_mut(&mut self) -> &mut S {
&mut self.sgn
}
pub const fn map(&self) -> &F {
&self.map
}
pub fn map_mut(&mut self) -> &mut F {
&mut self.map
}
}
impl<S: Signal, F: Map<Input = S::Sample>> Signal for MapSgn<S, F>
where
F::Output: smp::Sample,
{
type Sample = F::Output;
fn get(&self) -> F::Output {
self.map().eval(self.sgn.get())
}
}
impl<S: SignalMut, F: Map<Input = S::Sample>> SignalMut for MapSgn<S, F>
where
F::Output: smp::Sample,
{
fn advance(&mut self) {
self.sgn_mut().advance();
}
fn retrigger(&mut self) {
self.sgn_mut().retrigger();
}
}
impl<S: Frequency, F: Map<Input = S::Sample>> Frequency for MapSgn<S, F>
where
F::Output: smp::Sample,
{
fn freq(&self) -> unt::Freq {
self.sgn().freq()
}
fn freq_mut(&mut self) -> &mut unt::Freq {
self.sgn_mut().freq_mut()
}
}
impl<S: Base, F: Map<Input = S::Sample>> Base for MapSgn<S, F>
where
F::Output: smp::Sample,
{
type Base = S::Base;
fn base(&self) -> &S::Base {
self.sgn().base()
}
fn base_mut(&mut self) -> &mut S::Base {
self.sgn_mut().base_mut()
}
}
impl<S: Stop, F: Map<Input = S::Sample>> Stop for MapSgn<S, F>
where
F::Output: smp::Sample,
{
fn stop(&mut self) {
self.sgn_mut().stop();
}
}
impl<S: Done, F: Map<Input = S::Sample>> Done for MapSgn<S, F>
where
F::Output: smp::Sample,
{
fn is_done(&self) -> bool {
self.sgn().is_done()
}
}
impl<S: Panic, F: Map<Input = S::Sample>> Panic for MapSgn<S, F>
where
F::Output: smp::Sample,
{
fn panic(&mut self) {
self.sgn_mut().panic();
}
}
pub type PwMapSgn<S, F> = MapSgn<S, map::Pw<<S as Signal>::Sample, F>>;
impl<S: Signal, F: Map<Input = f64, Output = f64>> PwMapSgn<S, F> {
pub const fn new_pw(sgn: S, map: F) -> Self {
Self::new(sgn, map::Pw::new(map))
}
pub const fn map_pw(&self) -> &F {
&self.map().func
}
pub fn map_pw_mut(&mut self) -> &mut F {
&mut self.map_mut().func
}
}
#[derive(Clone, Debug)]
pub struct MutSgn<S: Signal, E: Signal<Sample = smp::Env>, F: map::Env<S>> {
sgn: S,
env: E,
func: F,
}
impl<S: Signal, E: Signal<Sample = smp::Env>, F: map::Env<S>> MutSgn<S, E, F> {
pub fn new(mut sgn: S, env: E, mut func: F) -> Self {
func.modify_env(&mut sgn, env.get());
Self { sgn, env, func }
}
pub const fn sgn(&self) -> &S {
&self.sgn
}
pub fn sgn_mut(&mut self) -> &mut S {
&mut self.sgn
}
pub const fn env(&self) -> &E {
&self.env
}
pub fn env_mut(&mut self) -> &mut E {
&mut self.env
}
pub const fn func(&self) -> &F {
&self.func
}
pub fn func_mut(&mut self) -> &mut F {
&mut self.func
}
}
impl<S: Signal, E: Signal<Sample = smp::Env>, F: map::Env<S>> Signal for MutSgn<S, E, F> {
type Sample = S::Sample;
fn get(&self) -> S::Sample {
self.sgn().get()
}
}
impl<S: SignalMut, E: SignalMut<Sample = smp::Env>, F: map::Env<S>> SignalMut for MutSgn<S, E, F> {
fn advance(&mut self) {
self.sgn.advance();
self.func.modify_env(&mut self.sgn, self.env.next());
}
fn retrigger(&mut self) {
self.sgn_mut().retrigger();
self.env_mut().retrigger();
}
}
impl<S: Frequency, E: SignalMut<Sample = smp::Env>, F: map::Env<S>> Frequency for MutSgn<S, E, F> {
fn freq(&self) -> unt::Freq {
self.sgn().freq()
}
fn freq_mut(&mut self) -> &mut unt::Freq {
self.sgn_mut().freq_mut()
}
}
impl<S: Base, E: SignalMut<Sample = smp::Env>, F: map::Env<S>> Base for MutSgn<S, E, F> {
type Base = S::Base;
fn base(&self) -> &S::Base {
self.sgn().base()
}
fn base_mut(&mut self) -> &mut S::Base {
self.sgn_mut().base_mut()
}
}
impl<S: SignalMut + Done, E: SignalMut<Sample = smp::Env>, F: map::Env<S>> Done
for MutSgn<S, E, F>
{
fn is_done(&self) -> bool {
self.sgn().is_done()
}
}
impl<S: Stop, E: SignalMut<Sample = smp::Env>, F: map::Env<S>> Stop for MutSgn<S, E, F> {
fn stop(&mut self) {
self.sgn_mut().stop();
}
}
impl<S: Panic, E: SignalMut<Sample = smp::Env>, F: map::Env<S>> Panic for MutSgn<S, E, F> {
fn panic(&mut self) {
self.sgn_mut().panic();
}
}
#[derive(Clone, Debug)]
pub struct ModSgn<S: SignalMut, E: Stop<Sample = smp::Env>, F: map::Env<S>> {
inner: MutSgn<S, E, F>,
}
impl<S: SignalMut, E: Stop<Sample = smp::Env>, F: map::Env<S>> From<MutSgn<S, E, F>>
for ModSgn<S, E, F>
{
fn from(inner: MutSgn<S, E, F>) -> Self {
Self { inner }
}
}
impl<S: SignalMut, E: Stop<Sample = smp::Env>, F: map::Env<S>> ModSgn<S, E, F> {
pub fn new(sgn: S, env: E, func: F) -> Self {
MutSgn::new(sgn, env, func).into()
}
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()
}
pub const fn func(&self) -> &F {
self.inner.func()
}
pub fn func_mut(&mut self) -> &mut F {
self.inner.func_mut()
}
}
impl<S: SignalMut, E: Stop<Sample = smp::Env>, F: map::Env<S>> Signal for ModSgn<S, E, F> {
type Sample = S::Sample;
fn get(&self) -> S::Sample {
self.inner._get()
}
}
impl<S: SignalMut, E: Stop<Sample = smp::Env>, F: map::Env<S>> SignalMut for ModSgn<S, E, F> {
fn advance(&mut self) {
self.inner.advance();
}
fn retrigger(&mut self) {
self.inner.retrigger();
}
}
impl<S: Frequency, E: Stop<Sample = smp::Env>, F: map::Env<S>> Frequency for ModSgn<S, E, F> {
fn freq(&self) -> unt::Freq {
self.inner.freq()
}
fn freq_mut(&mut self) -> &mut unt::Freq {
self.inner.freq_mut()
}
}
impl<S: Base, E: Stop<Sample = smp::Env>, F: map::Env<S>> Base for ModSgn<S, E, F> {
type Base = S::Base;
fn base(&self) -> &S::Base {
self.inner.base()
}
fn base_mut(&mut self) -> &mut S::Base {
self.inner.base_mut()
}
}
impl<S: SignalMut, E: Stop<Sample = smp::Env> + Done, F: map::Env<S>> Done for ModSgn<S, E, F> {
fn is_done(&self) -> bool {
self.env().is_done()
}
}
impl<S: SignalMut, E: Stop<Sample = smp::Env>, F: map::Env<S>> Stop for ModSgn<S, E, F> {
fn stop(&mut self) {
self.env_mut().stop();
}
}
impl<S: SignalMut, E: Stop<Sample = smp::Env> + Panic, F: map::Env<S>> Panic for ModSgn<S, E, F> {
fn panic(&mut self) {
self.env_mut().panic();
}
}