hsc3-0.21: Sound/Sc3/Ugen/Envelope.hs
-- | Envelope / Ugen.
module Sound.Sc3.Ugen.Envelope where
import Sound.Sc3.Common.Enum
import Sound.Sc3.Common.Envelope
import Sound.Sc3.Common.Math.Operator
import Sound.Sc3.Common.Rate
import Sound.Sc3.Ugen.Bindings
import Sound.Sc3.Ugen.Ugen
import Sound.Sc3.Ugen.Util
{- | Trapezoidal envelope generator.
> import Sound.Sc3.Plot
> plotEnvelope [envTrapezoid 0.99 0.5 1 1,envTrapezoid 0.5 0.75 0.65 0.35]
-}
envTrapezoid :: OrdE t => t -> t -> t -> t -> Envelope t
envTrapezoid = envTrapezoid_f (less_than_or_equal_to, greater_than_or_equal_to)
-- | 'latch' 1 of 'impulse' 0.
first_zero_then_one :: Rate -> Ugen
first_zero_then_one rt = latch 1 (impulse rt 0 0)
-- | 'env_circle_z' of k-rate 'first_zero_thereafter_one'.
env_circle_u :: Ugen -> Envelope_Curve Ugen -> Envelope Ugen -> Envelope Ugen
env_circle_u = env_circle_z (first_zero_then_one ControlRate)
-- | Singleton fade envelope.
envGate :: Ugen -> Ugen -> Ugen -> DoneAction Ugen -> Envelope_Curve Ugen -> Ugen
envGate level gate_ fadeTime doneAction curve =
let startVal = fadeTime `less_than_or_equal_to` 0
e = Envelope [startVal, 1, 0] [1, 1] [curve] (Just 1) Nothing 0
in envGen ControlRate gate_ level 0 fadeTime doneAction e
{- | Variant with default values for all inputs. @gate@ and
@fadeTime@ are 'control's, @doneAction@ is 'RemoveSynth', @curve@
is 'EnvSin'.
-}
envGate_def :: Ugen
envGate_def =
let level = 1
gate_ = control_m ControlRate "gate" 1 (0, 1, "gate")
fadeTime = control_m ControlRate "fadeTime" 0.02 (0, 10, "lin")
doneAction = RemoveSynth
curve = EnvSin
in envGate level gate_ fadeTime doneAction curve