module Synthesizer.Physical.Control where
import qualified Synthesizer.SampleRateContext.Control as CtrlC
import qualified Synthesizer.Plain.Control as Ctrl
import qualified Synthesizer.Physical.Signal as SigP
import Synthesizer.Physical.Signal(toTimeScalar)
import qualified Algebra.OccasionallyScalar as OccScalar
import qualified Algebra.Module as Module
import qualified Algebra.Transcendental as Trans
import qualified Algebra.Real as Real
import qualified Algebra.Ring as Ring
exponential :: (Trans.C a, Ring.C a', Real.C a', OccScalar.C a a') =>
a'
-> a'
-> a'
-> SigP.T a a' a a' a
exponential sampleRate time y0 =
SigP.lift0 (CtrlC.exponential time y0) sampleRate
exponential2 :: (Trans.C a, Ring.C a', Real.C a', OccScalar.C a a') =>
a'
-> a'
-> a'
-> SigP.T a a' a a' a
exponential2 sampleRate halfLife y0 =
SigP.lift0 (CtrlC.exponential2 halfLife y0) sampleRate
vectorExponential ::
(Trans.C t, Ring.C t',
OccScalar.C t t', Module.C t yv) =>
t'
-> t'
-> y'
-> yv
-> SigP.T t t' y y' yv
vectorExponential sampleRate time amplitude y0 =
let z = SigP.cons sampleRate amplitude
(Ctrl.vectorExponential
(toTimeScalar z time) y0)
in z
vectorExponential2 ::
(Trans.C t, Ring.C t',
OccScalar.C t t', Module.C t yv) =>
t'
-> t'
-> y'
-> yv
-> SigP.T t t' y y' yv
vectorExponential2 sampleRate halfLife amplitude y0 =
let z = SigP.cons sampleRate amplitude
(Ctrl.vectorExponential2
(toTimeScalar z halfLife) y0)
in z