module Language.Atom.Common.Fader
( Fader
, FaderInit (..)
, fader
, fadeToA
, fadeToB
, fadeToCenter
) where
import Language.Atom.Expressions
import Language.Atom.Language
import Data.Int (Int32)
data Fader = Fader (V Int32)
data FaderInit = OnA
| OnB
| OnCenter
toA, toB, toCenter :: Int32
toA = 0
toB = 1
toCenter = 2
fader :: Name
-> Double
-> FaderInit
-> E Double
-> E Double
-> Atom (Fader, E Double)
fader name_ rate init_ a b = atom name_ $ do
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)
fadeToA :: Fader -> Atom ()
fadeToA (Fader target) = target <== Const toA
fadeToB :: Fader -> Atom ()
fadeToB (Fader target) = target <== Const toB
fadeToCenter :: Fader -> Atom ()
fadeToCenter (Fader target) = target <== Const toCenter