module Synthesizer.Dimensional.ControlledProcess where
import qualified Synthesizer.Dimensional.Process as Proc
import qualified Synthesizer.Dimensional.Rate as Rate
import qualified Synthesizer.Dimensional.RatePhantom as RP
import qualified Synthesizer.Dimensional.RateWrapper as SigP
import qualified Synthesizer.Causal.Process as Causal
import qualified Synthesizer.Causal.Interpolation as Interpolation
import qualified Synthesizer.State.Signal as Sig
import qualified Number.DimensionTerm as DN
import qualified Algebra.DimensionTerm as Dim
import qualified Algebra.RealField as RealField
import qualified Algebra.Additive as Additive
import NumericPrelude
data T s ec ic a = Cons {
converter :: ec -> Sig.T ic,
processor :: Sig.T ic -> a
}
runSynchronous ::
Proc.T s u t (T s ec ic a) ->
Proc.T s u t (ec -> a)
runSynchronous cp =
do p <- cp
return (processor p . converter p)
runSynchronous1 ::
Proc.T s u t (T s (RP.T s sig0 ec0) ic a) ->
Proc.T s u t (RP.T s sig0 ec0 -> a)
runSynchronous1 = runSynchronous
runSynchronous2 ::
Proc.T s u t (T s (RP.T s sig0 ec0, RP.T s sig1 ec1) ic a) ->
Proc.T s u t (RP.T s sig0 ec0 -> RP.T s sig1 ec1 -> a)
runSynchronous2 = fmap curry . runSynchronous
runSynchronous3 ::
Proc.T s u t (T s (RP.T s sig0 ec0, RP.T s sig1 ec1, RP.T s sig2 ec2) ic a) ->
Proc.T s u t (RP.T s sig0 ec0 -> RP.T s sig1 ec1 -> RP.T s sig2 ec2 -> a)
runSynchronous3 =
fmap (\f x y z -> f (x,y,z)) . runSynchronous
runAsynchronous ::
(Dim.C u, Additive.C ic, RealField.C t) =>
Interpolation.T t ic ->
Proc.T s u t (T s ec ic a) ->
Rate.T r u t ->
ec ->
Proc.T s u t a
runAsynchronous ip cp srcRate sig =
do p <- cp
k <- fmap
(DN.divToScalar (Rate.toDimensionNumber srcRate))
Proc.getSampleRate
return $
processor p $
Causal.apply
(Interpolation.relativeConstantPad ip zero (converter p sig))
(Sig.repeat k)
runAsynchronous1 ::
(Dim.C u, Additive.C ic, RealField.C t) =>
Interpolation.T t ic ->
Proc.T s u t (T s (RP.T r sig0 ec0) ic a) ->
SigP.T u t sig0 ec0 ->
Proc.T s u t a
runAsynchronous1 ip cp x =
uncurry (runAsynchronous ip cp) (SigP.toSignal x)
runAsynchronous2 ::
(Dim.C u, Additive.C ic, RealField.C t) =>
Interpolation.T t ic ->
Proc.T s u t (T s (RP.T r sig0 ec0, RP.T r sig1 ec1) ic a) ->
SigP.T u t sig0 ec0 ->
SigP.T u t sig1 ec1 ->
Proc.T s u t a
runAsynchronous2 ip cp x y =
let (srcRateX,sigX) = SigP.toSignal x
(srcRateY,sigY) = SigP.toSignal y
srcRate = Rate.common "ControlledProcess.runAsynchronous2" srcRateX srcRateY
in runAsynchronous ip cp srcRate (sigX,sigY)
runAsynchronous3 ::
(Dim.C u, Additive.C ic, RealField.C t) =>
Interpolation.T t ic ->
Proc.T s u t (T s (RP.T r sig0 ec0, RP.T r sig1 ec1, RP.T r sig2 ec2) ic a) ->
SigP.T u t sig0 ec0 ->
SigP.T u t sig1 ec1 ->
SigP.T u t sig2 ec2 ->
Proc.T s u t a
runAsynchronous3 ip cp x y z =
let (srcRateX,sigX) = SigP.toSignal x
(srcRateY,sigY) = SigP.toSignal y
(srcRateZ,sigZ) = SigP.toSignal z
common = Rate.common "ControlledProcess.runAsynchronous3"
srcRate = srcRateX `common` srcRateY `common` srcRateZ
in runAsynchronous ip cp srcRate (sigX,sigY,sigZ)