📄 fader.hs
字号:
-- | Fades one signal to another.module Language.Atom.Common.Fader ( Fader , FaderInit (..) , fader , fadeToA , fadeToB , fadeToCenter ) whereimport Language.Atom-- | Fader object.data Fader = Fader (Var Int)-- | Fader initalization.data FaderInit = OnA | OnB | OnCentertoA = 0toB = 1toCenter = 2-- | Fader construction. Name, fade rate, fader init, and signal A and B.fader :: Name -> Double -> FaderInit -> Term Double -> Term Double -> System (Fader, Term Double)fader name rate init a b = scope name $ do assert "positiveRate" $ rate >= 0 target <- int "target" (case init of {OnA -> toA; OnB -> toB; OnCenter -> toCenter}) perA <- double "perA" (case init of {OnA -> 1; OnB -> 0; OnCenter -> 0.5}) rule "toA" $ do when $ value target ==. intC toA when $ value perA <. 1 perA <== mux (1 - value perA <. doubleC rate) 1 (value perA + doubleC rate) rule "toB" $ do when $ value target ==. intC toB when $ value perA >. 0 perA <== mux (value perA <. doubleC rate) 0 (value perA - doubleC rate) rule "toCenterFrom0" $ do when $ value target ==. intC toCenter when $ value perA <. 0.5 perA <== mux (0.5 - value perA <. doubleC rate) 0.5 (value perA + doubleC rate) rule "toCenterFrom1" $ do when $ value target ==. intC toCenter when $ value perA >. 0.5 perA <== mux (value perA - 0.5 <. doubleC rate) 0.5 (value perA - doubleC rate) return (Fader target, (a * value perA + b * (1 - value perA)) / 2)-- | Fade to signal A.fadeToA :: Fader -> Action ()fadeToA (Fader target) = target <== intC toA-- | Fade to signal B.fadeToB :: Fader -> Action ()fadeToB (Fader target) = target <== intC toB-- | Fade to center, ie average of signal A and B.fadeToCenter :: Fader -> Action ()fadeToCenter (Fader target) = target <== intC toCenter
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -