module Synthesizer.Generic.Filter.Delay (
static,
staticPad,
staticPos,
staticNeg,
modulated,
) where
import qualified Synthesizer.Generic.Filter.NonRecursive as FiltNR
import qualified Synthesizer.Generic.Interpolation as Interpolation
import qualified Synthesizer.Generic.Signal as SigG
import qualified Algebra.RealField as RealField
import qualified Algebra.Additive as Additive
import NumericPrelude.Numeric
static ::
(Additive.C y, SigG.Write sig y) =>
Int -> sig y -> sig y
static = FiltNR.delay
staticPad ::
(SigG.Write sig y) =>
y -> Int -> sig y -> sig y
staticPad = FiltNR.delayPad
staticPos ::
(Additive.C y, SigG.Write sig y) =>
Int -> sig y -> sig y
staticPos = FiltNR.delayPos
staticNeg ::
(SigG.Write sig y) =>
Int -> sig y -> sig y
staticNeg = FiltNR.delayNeg
modulatedCore ::
(RealField.C t, Additive.C y, SigG.Read sig t, SigG.Transform sig t, SigG.Transform sig y) =>
Interpolation.T t y -> Int ->
sig t -> sig y -> sig y
modulatedCore ip size =
SigG.zipWithTails
(\t -> Interpolation.single ip (fromIntegral size + t))
modulated ::
(RealField.C t, Additive.C y,
SigG.Read sig t, SigG.Transform sig t, SigG.Transform sig y, SigG.Write sig y) =>
Interpolation.T t y -> Int ->
sig t -> sig y -> sig y
modulated ip minDev ts xs =
let size = Interpolation.number ip minDev
in modulatedCore ip
(size Interpolation.offset ip)
ts
(staticPos size xs)