module Synthesizer.Dimensional.Abstraction.Flat where
import qualified Synthesizer.Dimensional.Amplitude as Amp
import qualified Synthesizer.Dimensional.RatePhantom as RP
import qualified Synthesizer.Dimensional.Straight.Signal as SigS
import qualified Synthesizer.Dimensional.Amplitude.Signal as SigA
import qualified Synthesizer.State.Signal as Sig
import qualified Number.DimensionTerm as DN
import qualified Algebra.DimensionTerm as Dim
import qualified Algebra.Ring as Ring
import PreludeBase
toSamples :: C sig y => RP.T s sig y -> Sig.T y
toSamples = unwrappedToSamples . RP.toSignal
class C sig y where
unwrappedToSamples :: sig y -> Sig.T y
instance C Sig.T y where
unwrappedToSamples = id
instance C sig y => C (SigS.T sig) y where
unwrappedToSamples = unwrappedToSamples . SigS.samples
class Amp.C amp => Amplitude y amp where
toScalar :: amp -> y
instance Ring.C y => Amplitude y Amp.Flat where
toScalar = const Ring.one
instance (Dim.IsScalar v) => Amplitude y (DN.T v y) where
toScalar = DN.toNumber . DN.rewriteDimension Dim.toScalar
instance (C flat y, Amplitude y amp, Ring.C y) =>
C (SigA.T amp flat) y where
unwrappedToSamples =
SigA.scalarSamples toScalar .
(\x ->
SigA.fromSamples
(SigA.privateAmplitude x)
(unwrappedToSamples (SigA.signal x)))