#lang scribble/manual
@(require (for-label racket))

@title{(linen gate attackTime susLevel releaseTime doneAction)}


A linear envelope generator.  The done flag is set when the
envelope reaches zero.

Note that the sustain level input is consulted only at the instant
when the gate is opened.


@racketblock[
(let ((e (linen (impulse kr 2 0) 0.01 0.1 0.4 do-nothing)))
  (audition (out 0 (mul (sin-osc ar 440 0) e))))
]


@racketblock[
(let* ((y (mouse-y kr 0.1 0.5 0 0.1))
       (x (mouse-x kr -1 1 0 0.1))
       (e (linen x 1 y 1.0 do-nothing))
       (o (sin-osc ar 440 0)))
  (audition (out 0 (mul o e))))
]

Open gate for a random interval.


@racketblock[
(let* ((r (rand 0.05 0.4))
       (u (letc ((gate 0))
	    (let ((e (linen gate 0.1 0.2 0.1 do-nothing)))
	      (out 0 (mul (sin-osc ar 440 0) e)))))
       (g (encode-graphdef (synthdef "linen" u))))
  (with-sc3
   (lambda (fd)
     (async fd (d-recv g))
     (send fd (s-new0 "linen" 1001 1 1))
     (send fd (bundle (utc) (n-set1 1001 "gate" 1)))
     (send fd (bundle (+ (utc) r)
		    (n-set1 1001 "gate" 0)))
     (sleep (* r 4))
     (send fd (n-free1 1001)))))
]


