{- |
Copyright   :  (c) Henning Thielemann 2008
License     :  GPL

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


Control curves which can be used
as envelopes, for controlling filter parameters and so on.
-}
module Synthesizer.Dimensional.Amplitude.Control (
   -- * Primitives
   constant, constantVector,
   ) where

import qualified Synthesizer.Dimensional.Signal.Private as SigA

import qualified Synthesizer.State.Control as Ctrl
-- import qualified Synthesizer.State.Signal  as Sig

import qualified Number.DimensionTerm        as DN
import qualified Algebra.DimensionTerm       as Dim

-- import qualified Algebra.Module             as Module
import qualified Algebra.Absolute               as Absolute
-- import qualified Algebra.Ring               as Ring
-- import qualified Algebra.Additive           as Additive

-- import NumericPrelude.Numeric
import NumericPrelude.Base as P
import Prelude ()


{-# INLINE constant #-}
constant :: (Absolute.C y, Dim.C u) =>
      DN.T u y {-^ value -}
   -> SigA.R s u y y
constant =
   uncurry constantVector .
   DN.absSignum

{- |
The amplitude must be positive!
This is not checked.
-}
{-# INLINE constantVector #-}
constantVector :: -- (Field.C y', Absolute.C y', OccScalar.C y y') =>
      DN.T u y {-^ amplitude -}
   -> yv       {-^ value -}
   -> SigA.R s u y yv
constantVector y yv =
   SigA.fromBody y (Ctrl.constant yv)