module Synthesizer.Storable.Filter.Recursive.Comb where
import qualified Synthesizer.Storable.Signal as Sig
import qualified Synthesizer.Plain.Filter.Recursive.FirstOrder as Filt1
import qualified Synthesizer.Generic.Signal as SigG
import qualified Synthesizer.Generic.SampledValue as Sample
import Foreign.Storable (Storable)
import qualified Algebra.Module as Module
import qualified Algebra.Ring as Ring
import qualified Algebra.Additive as Additive
import Algebra.Module((*>))
import qualified Prelude as P
import PreludeBase
import NumericPrelude
karplusStrong ::
(Ring.C a, Module.C a v, Sample.C v) =>
Filt1.Parameter a -> Sig.T v -> Sig.T v
karplusStrong c wave =
Sig.delayLoop (SigG.modifyStatic Filt1.lowpassModifier c) wave
run :: (Module.C a v, Storable v) =>
Int -> a -> Sig.T v -> Sig.T v
run time gain =
Sig.delayLoopOverlap time (amplify gain)
runMulti :: (Ring.C a, Module.C a v, Storable v) =>
[Int] -> a -> Sig.T v -> Sig.T v
runMulti times gain x =
let y = foldl
(Sig.zipWith (+)) x
(map (flip (Sig.delay Sig.defaultChunkSize zero) (amplify gain y)) times)
in y
runProc :: (Additive.C v, Storable v) =>
Int -> (Sig.T v -> Sig.T v) -> Sig.T v -> Sig.T v
runProc = Sig.delayLoopOverlap
amplify :: (Storable v, Module.C a v) =>
a -> Sig.T v -> Sig.T v
amplify gain = Sig.map (gain *>)