packages feed

synthesizer-inference-0.2: src/Synthesizer/Inference/Monad/SignalSeq/Displacement.hs

{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
{- |

Copyright   :  (c) Henning Thielemann 2006
License     :  GPL

Maintainer  :  synthesizer@henning-thielemann.de
Stability   :  provisional
Portability :  requires multi-parameter type classes

-}
module Synthesizer.Inference.Monad.SignalSeq.Displacement(
   {- * Non-linearities -}
   mapScalar,
   mapVector,

   {- * Mixing -}
   mix,
   mixMulti,
) where

import qualified Synthesizer.Inference.Monad.Signal             as SigI
import qualified Synthesizer.Inference.Monad.Signal.Displacement as SynI

import qualified Algebra.OccasionallyScalar as OccScalar
import qualified Algebra.Module             as Module
import qualified Algebra.Field              as Field
import qualified Algebra.Ring               as Ring

import UniqueLogicNP.Monad(liftP, liftP2)
-- import NumericPrelude
import PreludeBase


mapVector :: (Module.C a v0, Field.C q, OccScalar.C a q) =>
      q
   -> q
   -> (v0 -> v1)
   -> SigI.Process a q v0
   -> SigI.Process a q v1
mapVector rateX ampY f = liftP (SynI.mapVector rateX ampY f)

mapScalar :: (Ring.C a, Field.C q, OccScalar.C a q) =>
      q
   -> q
   -> (a -> a)
   -> SigI.Process a q a
   -> SigI.Process a q a
mapScalar rateX ampY f = liftP (SynI.mapScalar rateX ampY f)


{- | Mix two signals.
     In opposition to 'zipWith' the result has the length of the longer signal. -}
mix :: (Field.C q, Eq q, Module.C a v, OccScalar.C a q) =>
      SigI.Process a q v
   -> SigI.Process a q v
   -> SigI.Process a q v
mix = liftP2 SynI.mix

{- | Mix one or more signals. -}
mixMulti :: (Field.C q, Eq q, Module.C a v, OccScalar.C a q) =>
      [SigI.Process a q v]
   ->  SigI.Process a q v
mixMulti = liftP SynI.mixMulti . sequence