Language/Atom/Common/Fader.hs

-- | 
-- Module: Fader
-- Description: Fades one signal to another
-- Copyright: (c) 2013 Tom Hawkins & Lee Pike
--
-- Fades one signal to another.

module Language.Atom.Common.Fader
 ( Fader
 , FaderInit (..)
 , fader
 , fadeToA
 , fadeToB
 , fadeToCenter
 ) where

import Language.Atom.Expressions
import Language.Atom.Language
import Data.Int (Int32)

-- | Fader object.
data Fader = Fader (V Int32)

-- | Fader initalization.
data FaderInit = OnA -- ^ Start at signal A
 | OnB -- ^ Start at signal B
 | OnCenter -- ^ Start at average of A and B

toA, toB, toCenter :: Int32
toA = 0
toB = 1
toCenter = 2

-- | Fader construction
fader :: Name -- ^ Name
 -> Double -- ^ Fade rate
 -> FaderInit -- ^ Initialization
 -> E Double -- ^ Signal A
 -> E Double -- ^ Signal B
 -> Atom (Fader, E Double)
fader name_ rate init_ a b = atom name_ $ do
 --assert "positiveRate" $ rate >= 0

 target <- int32 "target" $ case init_ of OnA -> toA
 OnB -> toB
 OnCenter -> toCenter
 perA <- double "perA" $ case init_ of OnA -> 1
 OnB -> 0
 OnCenter -> 0.5

 atom "toA" $ do
 cond $ value target ==. Const toA
 cond $ value perA <. 1
 perA <== mux (1 - value perA <. Const rate) 1 (value perA + Const rate)

 atom "toB" $ do
 cond $ value target ==. Const toB
 cond $ value perA >. 0
 perA <== mux (value perA <. Const rate) 0 (value perA - Const rate)

 atom "toCenterFrom0" $ do
 cond $ value target ==. Const toCenter
 cond $ value perA <. 0.5
 perA <== mux (0.5 - value perA <. Const rate) 0.5 (value perA + Const rate)

 atom "toCenterFrom1" $ do
 cond $ value target ==. Const toCenter
 cond $ value perA >. 0.5
 perA <== mux (value perA - 0.5 <. Const rate) 0.5 (value perA - Const rate)

 return (Fader target, (a * value perA + b * (1 - value perA)) / 2)

-- | Fade to signal A.
fadeToA :: Fader -> Atom ()
fadeToA (Fader target) = target <== Const toA

-- | Fade to signal B.
fadeToB :: Fader -> Atom ()
fadeToB (Fader target) = target <== Const toB

-- | Fade to center, i.e. average of signal A and B.
fadeToCenter :: Fader -> Atom ()
fadeToCenter (Fader target) = target <== Const toCenter

AltStyle によって変換されたページ (->オリジナル) /