{- | Copyright : (c) Henning Thielemann 2008 License : GPL Maintainer : synthesizer@henning-thielemann.de Stability : provisional Portability : requires multi-parameter type classes -} module Synthesizer.Amplitude.Filter ( {- * Non-recursive -} {- ** Amplification -} amplify, negate, envelope, ) where import qualified Synthesizer.Amplitude.Signal as SigV import qualified Synthesizer.Plain.Filter.NonRecursive as FiltNR -- import qualified Algebra.OccasionallyScalar as OccScalar -- import qualified Algebra.Transcendental as Trans -- import qualified Algebra.Field as Field import qualified Algebra.Ring as Ring import qualified Algebra.Additive as Additive import qualified Algebra.Module as Module import NumericPrelude hiding (negate) -- import PreludeBase as P import Prelude () {- | The amplification factor must be positive. -} amplify :: (Ring.C y') => y' -> SigV.T y y' yv -> SigV.T y y' yv amplify volume x = SigV.Cons (volume * SigV.amplitude x) (SigV.samples x) negate :: (Additive.C yv) => SigV.T y y' yv -> SigV.T y y' yv negate x = SigV.Cons (SigV.amplitude x) (Additive.negate (SigV.samples x)) envelope :: (Module.C y0 yv, Ring.C y') => SigV.T y y' y0 {- ^ the envelope -} -> SigV.T y y' yv {- ^ the signal to be enveloped -} -> SigV.T y y' yv envelope y x = SigV.Cons (SigV.amplitude y * SigV.amplitude x) (FiltNR.envelopeVector (SigV.samples y) (SigV.samples x))