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