reanimate-0.1.6.0: src/Reanimate/Signal.hs
module Reanimate.Signal where
type Signal = Double -> Double
signalFromList :: [(Double, Signal)] -> Signal
signalFromList fns t = worker 0 fns
where
worker _ [] = 0
worker now [(len, fn)] = fn (min 1 ((t-now) / min (1-now) len))
worker now ((len, fn):rest)
| now+len < t = worker (now+len) rest
| otherwise = fn ((t-now) / len)
signalFlat :: Double -> Signal
signalFlat x = const x
signalLinear :: Signal
signalLinear = id
signalFromTo :: Double -> Double -> Signal -> Signal
signalFromTo from to c t = from + (to-from)*(c t)
signalReverse :: Signal -> Signal
signalReverse fn t = fn (1-t)
signalCurve :: Double -> Signal
signalCurve steepness s =
if s < 0.5
then 0.5 * (2*s)**steepness
else 1-0.5 * (2 - 2*s)**steepness
signalBell :: Double -> Signal
signalBell steepness s
| s < 0.5 = signalCurve steepness (s/0.5)
| otherwise = signalCurve steepness (1-((s-0.5)/0.5))