{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE FlexibleInstances #-}
module Synthesizer.Dimensional.Amplitude.Flat
(C, amplifySample, canonicalize, toSamples, ) where
import qualified Synthesizer.Dimensional.Amplitude as Amp
import qualified Synthesizer.Dimensional.Signal.Private as SigA
import qualified Synthesizer.Generic.Filter.NonRecursive as FiltG
import qualified Synthesizer.Generic.Signal as SigG
import qualified Number.DimensionTerm as DN
import qualified Algebra.DimensionTerm as Dim
import qualified Algebra.Ring as Ring
import NumericPrelude.Numeric
import NumericPrelude.Base
import Prelude ()
class Amp.C amp => C y amp | amp -> y where
toScalar :: amp -> y
amplifySample :: amp -> y -> y
amplify :: (SigG.Transform sig y) =>
amp -> sig y -> sig y
instance Ring.C y => C y (Amp.Flat y) where
toScalar :: Flat y -> y
toScalar = forall a b. a -> b -> a
const forall a. C a => a
Ring.one
amplifySample :: Flat y -> y -> y
amplifySample Flat y
_ = forall a. a -> a
id
amplify :: forall (sig :: * -> *). Transform sig y => Flat y -> sig y -> sig y
amplify Flat y
_ = forall a. a -> a
id
instance (Dim.IsScalar v, Ring.C y) => C y (Amp.Numeric (DN.T v y)) where
toScalar :: Numeric (T v y) -> y
toScalar (Amp.Numeric T v y
amp) =
forall a. Scalar a -> a
DN.toNumber forall b c a. (b -> c) -> (a -> b) -> a -> c
.
forall u v a. (C u, C v) => (u -> v) -> T u a -> T v a
DN.rewriteDimension forall dim. IsScalar dim => dim -> Scalar
Dim.toScalar forall a b. (a -> b) -> a -> b
$
T v y
amp
amplifySample :: Numeric (T v y) -> y -> y
amplifySample Numeric (T v y)
amp y
y = forall y amp. C y amp => amp -> y
toScalar Numeric (T v y)
amp forall a. C a => a -> a -> a
* y
y
amplify :: forall (sig :: * -> *).
Transform sig y =>
Numeric (T v y) -> sig y -> sig y
amplify Numeric (T v y)
amp = forall a (sig :: * -> *).
(C a, Transform sig a) =>
a -> sig a -> sig a
FiltG.amplify (forall y amp. C y amp => amp -> y
toScalar Numeric (T v y)
amp)
{-# INLINE toSamples #-}
toSamples ::
(C y flat, SigG.Transform sig y) =>
SigA.T rate flat (sig y) -> sig y
toSamples :: forall y flat (sig :: * -> *) rate.
(C y flat, Transform sig y) =>
T rate flat (sig y) -> sig y
toSamples T rate flat (sig y)
sig =
forall y amp (sig :: * -> *).
(C y amp, Transform sig y) =>
amp -> sig y -> sig y
amplify (forall rate amplitude body. T rate amplitude body -> amplitude
SigA.amplitude T rate flat (sig y)
sig) (forall rate amplitude body. T rate amplitude body -> body
SigA.body T rate flat (sig y)
sig)
{-# INLINE canonicalize #-}
canonicalize ::
(C y flat, SigG.Transform sig y) =>
SigA.T rate flat (sig y) -> SigA.T rate (Amp.Flat y) (sig y)
canonicalize :: forall y flat (sig :: * -> *) rate.
(C y flat, Transform sig y) =>
T rate flat (sig y) -> T rate (Flat y) (sig y)
canonicalize T rate flat (sig y)
sig =
forall rate amplitude body.
rate -> amplitude -> body -> T rate amplitude body
SigA.Cons (forall rate amplitude body. T rate amplitude body -> rate
SigA.sampleRate T rate flat (sig y)
sig) forall y. Flat y
Amp.Flat (forall y flat (sig :: * -> *) rate.
(C y flat, Transform sig y) =>
T rate flat (sig y) -> sig y
toSamples T rate flat (sig y)
sig)