module Synthesizer.State.Filter.Delay (
static,
staticPad,
staticPos,
staticNeg,
modulated,
) where
import qualified Synthesizer.Interpolation as Interpolation
import qualified Synthesizer.State.Interpolation as InterpolationS
import qualified Synthesizer.State.Signal as Sig
import qualified Algebra.RealField as RealField
import qualified Algebra.Additive as Additive
import NumericPrelude.Numeric
static :: Additive.C y => Int -> Sig.T y -> Sig.T y
static = staticPad zero
staticPad :: y -> Int -> Sig.T y -> Sig.T y
staticPad = InterpolationS.delayPad
staticPos :: Additive.C y => Int -> Sig.T y -> Sig.T y
staticPos n = Sig.append (Sig.replicate n zero)
staticNeg :: Int -> Sig.T y -> Sig.T y
staticNeg = Sig.drop
modulatedCore :: (RealField.C a, Additive.C v) =>
Interpolation.T a v -> Int -> Sig.T a -> Sig.T v -> Sig.T v
modulatedCore ip size =
Sig.zipWithTails
(\t -> InterpolationS.single ip (fromIntegral size + t))
modulated :: (RealField.C a, Additive.C v) =>
Interpolation.T a v -> Int -> Sig.T a -> Sig.T v -> Sig.T v
modulated ip minDev ts xs =
let size = Interpolation.number ip minDev
in modulatedCore ip
(size Interpolation.offset ip)
ts
(staticPos size xs)