packages feed

hsc3-0.20: 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