synthesizer-0.0.3: src/Synthesizer/Dimensional/Abstraction/Homogeneous.hs
{- |
Copyright : (c) Henning Thielemann 2008
License : GPL
Maintainer : synthesizer@henning-thielemann.de
Stability : provisional
Portability : requires multi-parameter type classes
Class that allows unified handling of
@SigS.T@ and @Sig.D s u@
whenever the applied function is homogeneous (with degree one),
that is scaling of the input must only result in scaling of the output.
Unfortunately, Haskell's type system cannot check this property,
so use this abstraction only for signal processes that are actually homogeneous.
-}
module Synthesizer.Dimensional.Abstraction.Homogeneous where
import qualified Synthesizer.State.Signal as Sig
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 Number.DimensionTerm as DN
import qualified Algebra.DimensionTerm as Dim
{-
import qualified Algebra.Module as Module
import qualified Algebra.Field as Field
import qualified Algebra.Ring as Ring
-}
-- import Number.DimensionTerm ((&/&))
-- import NumericPrelude
-- import PreludeBase
-- import Prelude ()
{-# INLINE processSamples #-}
processSamples :: C sig =>
(Sig.T y0 -> Sig.T y1) -> RP.T s sig y0 -> RP.T s sig y1
processSamples f =
RP.fromSignal . unwrappedProcessSamples f . RP.toSignal
{-# INLINE processSampleList #-}
processSampleList :: C sig =>
([y0] -> [y1]) ->
RP.T s sig y0 ->
RP.T s sig y1
processSampleList f =
processSamples (Sig.fromList . f . Sig.toList)
class C sig where
unwrappedProcessSamples :: (Sig.T y0 -> Sig.T y1) -> sig y0 -> sig y1
instance C Sig.T where
unwrappedProcessSamples f = f
instance C sig => C (SigS.T sig) where
-- processSamples = SigS.processSamples
unwrappedProcessSamples f =
SigS.Cons . unwrappedProcessSamples f . SigS.samples
instance (C sig, Dim.C u) => C (SigA.T u y sig) where
unwrappedProcessSamples f =
(\(SigA.Cons amp sig) ->
SigA.Cons amp (unwrappedProcessSamples f sig))