{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
module Synthesizer.State.Filter.Recursive.Comb where
import qualified Synthesizer.State.Signal as Sig
import qualified Synthesizer.Plain.Filter.Recursive.FirstOrder as Filt1
import qualified Synthesizer.State.Filter.Delay as Delay
import qualified Algebra.Module as Module
import qualified Algebra.Ring as Ring
import qualified Algebra.Additive as Additive
import NumericPrelude.Numeric
import NumericPrelude.Base
{-# INLINE karplusStrong #-}
karplusStrong :: (Ring.C a, Module.C a v) =>
Filt1.Parameter a -> Sig.T v -> Sig.T v
karplusStrong c wave =
Sig.delayLoop (Sig.modifyStatic Filt1.lowpassModifier c) wave
{-# INLINE run #-}
run :: (Module.C a v) => Int -> a -> Sig.T v -> Sig.T v
run time gain = Sig.delayLoopOverlap time (gain *>)
{-# INLINE runMulti #-}
runMulti :: (Ring.C a, Module.C a v) => [Int] -> a -> Sig.T v -> Sig.T v
runMulti times gain x =
let y = Sig.fromList $ Sig.toList $
foldl
(Sig.zipWith (+)) x
(map (flip Delay.staticPos (gain *> y)) times)
in y
{-# INLINE runProc #-}
runProc :: Additive.C v => Int -> (Sig.T v -> Sig.T v) -> Sig.T v -> Sig.T v
runProc = Sig.delayLoopOverlap