module Synthesizer.Dimensional.Rate.Analysis (
centroid,
length,
) where
import qualified Synthesizer.Dimensional.Signal.Private as SigA
import qualified Synthesizer.Dimensional.Rate as Rate
import qualified Synthesizer.State.Analysis as Ana
import qualified Synthesizer.State.Signal as Sig
import qualified Number.DimensionTerm as DN
import qualified Algebra.DimensionTerm as Dim
import Number.DimensionTerm ((*&))
import qualified Algebra.Field as Field
import NumericPrelude.Base ((.), )
import NumericPrelude.Numeric
import Prelude ()
type SignalRate u t amp yv =
SigA.T (Rate.Actual (DN.T (Dim.Recip u) t)) amp (Sig.T yv)
{-# INLINE centroid #-}
centroid :: (Field.C q, Dim.C u) =>
SignalRate u q amp q -> DN.T u q
centroid :: forall q u amp. (C q, C u) => SignalRate u q amp q -> T u q
centroid = forall t u y amp.
(C t, C u) =>
(T y -> t) -> SignalRate u t amp y -> T u t
makePhysicalLength forall y. C y => T y -> y
Ana.centroid
{-# INLINE length #-}
length :: (Field.C t, Dim.C u) =>
SignalRate u t amp yv -> DN.T u t
length :: forall t u amp yv. (C t, C u) => SignalRate u t amp yv -> T u t
length = forall t u y amp.
(C t, C u) =>
(T y -> t) -> SignalRate u t amp y -> T u t
makePhysicalLength (forall a b. (C a, C b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. T a -> Int
Sig.length)
{-# INLINE makePhysicalLength #-}
makePhysicalLength :: (Field.C t, Dim.C u) =>
(Sig.T y -> t) ->
SignalRate u t amp y -> DN.T u t
makePhysicalLength :: forall t u y amp.
(C t, C u) =>
(T y -> t) -> SignalRate u t amp y -> T u t
makePhysicalLength T y -> t
f SignalRate u t amp y
x =
T y -> t
f (forall rate amplitude body. T rate amplitude body -> body
SigA.body SignalRate u t amp y
x) forall u a. (C u, C a) => a -> T u a -> T u a
*& forall u a. (C u, C a) => T (Recip u) a -> T u a
DN.unrecip (forall rate amp sig. T (Actual rate) amp sig -> rate
SigA.actualSampleRate SignalRate u t amp y
x)