hsc3-0.3: Sound/SC3/UGen/Envelope/Construct.hs
module Sound.SC3.UGen.Envelope.Construct where
import Sound.SC3.UGen.UGen
import Sound.SC3.UGen.Math
import Sound.SC3.UGen.Enum
import Sound.SC3.UGen.Utilities
-- | Basic envelope data constructor.
env :: [UGen] -> [UGen] -> [EnvCurve] -> UGen -> UGen -> [UGen]
env [] _ _ _ _ = error "env: illegal specification"
env (l:vl) tms crv rls lp =
[l, n', rls, lp] ++ concat (zipWith3 f vl tms (take n $ cycle crv))
where f l' t c = [l', t, env_curve c, env_value c]
n = length tms
n' = fromIntegral n
-- | Co-ordinate based static envelope generator.
envCoord :: [(UGen, UGen)] -> UGen -> UGen -> EnvCurve -> [UGen]
envCoord bp dur amp c = env l t (repeat c) (-1) (-1)
where l = map (* amp) (map snd bp)
t = map (* dur) (d_dx (map fst bp))
{- | Trapezoidal envelope generator. The arguments are: 1. @shape@
determines the sustain time as a proportion of @dur@, zero is a
triangular envelope, one a rectangular envelope; 2. @skew@ determines
the attack\/decay ratio, zero is an immediate attack and a slow decay,
one a slow attack and an immediate decay; 3. @duration@ in seconds;
4. @amplitude@ as linear gain. -}
envTrapezoid :: UGen -> UGen -> UGen -> UGen -> [UGen]
envTrapezoid shape skew dur amp = envCoord bp dur amp EnvLin
where x1 = skew * (1 - shape)
bp = [ (0, skew <=* 0)
, (x1, 1)
, (shape + x1, 1)
, (1, skew >=* 1) ]
envPerc' :: UGen -> UGen -> UGen -> [EnvCurve] -> [UGen]
envPerc' atk rls lvl crv = env [0.0, lvl, 0.0] [atk, rls] crv (-1.0) (-1.0)
-- | Percussive envelope, with attack, release, level and curve inputs.
envPerc :: UGen -> UGen -> [UGen]
envPerc atk rls = envPerc' atk rls 1.0 (dbl (EnvNum (-4.0)))
-- | Triangular envelope, with duration and level inputs.
envTriangle :: UGen -> UGen -> [UGen]
envTriangle dur lvl =
env [0.0, lvl, 0.0] (dbl (dur / 2.0)) (dbl EnvLin) (-1.0) (-1.0)
-- | Sine envelope, with duration and level inputs.
envSine :: UGen -> UGen -> [UGen]
envSine dur lvl =
env [0.0, lvl, 0.0] (dbl (dur / 2.0)) (dbl EnvSin) (-1.0) (-1.0)
-- | Linear envelope parameter constructor.
envLinen :: UGen -> UGen -> UGen -> UGen -> [EnvCurve] -> [UGen]
envLinen aT sT rT l c = env [0, l, l, 0] [aT, sT, rT] c (-1) (-1)