{-# 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