Env {
 // envelope specification for an EnvGen, Env is not a UGen itself
 // you must not change an envelope while an EnvGen is running.
 // Therefore these inst vars are read only.
 var <levels;
 var <times;
 var <curves = 'linear';  // can also be 'exponential', 'sine', a float curve value,
        // or an array of curve values
 var <releaseNode; // index of release level, if nil then ignore release;
 var <loopNode;  // index of loop start level, if nil then does not loop;
 
 
 *new { arg levels=#[0,1,0], times=#[1,1], curve='linear', releaseNode, loopNode;
  ^super.new.init(levels, times, curve, releaseNode, loopNode)
 }
 init { arg argLevelsArray, argTimesArray, argCurvesArray, argReleaseNode, argLoopNode;
  levels = argLevelsArray;
  times = argTimesArray;
  curves = argCurvesArray;
  releaseNode = argReleaseNode;
  loopNode = argLoopNode;
 }
 
 // methods to make some typical shapes :
 
 // fixed duration envelopes
 *linen { arg attack=1.0, sustain=2.0, release=1.0, level=1.0, curve='linear';
  // trapezoid
  ^this.new(
   [0, level, level, 0],
   [attack, sustain, release],
   curve
  )
 }
 *triangle { arg dur=1.0, level=1.0;
  dur = dur * 0.5;
  ^this.new(
   [0, level, 0],
   [dur, dur]
  )
 }
 *sine { arg dur=1.0, level=1.0;
  dur = dur * 0.5;
  ^this.new(
   [0, level, 0],
   [dur, dur],
   'sine'
  )
 }
 *perc { arg attack=0.01, release=1.0, level=1.0, curve = -4.0;
  ^this.new(
   [0, level, 0],
   [attack, release],
   curve
  )
 }
 
 
 // envelopes with sustain
 *adsr { arg attack=0.01, decay=0.3, sustain=0.5, release=1.0,
    level=1.0, curve = -4.0;
  ^this.new(
   [0, level, level * sustain, 0],
   [attack, decay, release],
   curve,
   2
  )
 }
 *asr { arg attack=0.01, sustain=1.0, release=1.0, level=1.0, curve = -4.0;
  ^this.new(
   [0, level * sustain, 0],
   [attack, release],
   curve,
   1
  )
 }
 
 // blend two envelopes
 blend { arg argAnotherEnv, argBlendFrac=0.5;
  ^this.class.new(
   levels.blend(argAnotherEnv.levels, argBlendFrac),
   times.blend(argAnotherEnv.times, argBlendFrac),
   curves.blend(argAnotherEnv.curves, argBlendFrac),
   releaseNode,
   loopNode
  )
 }
 plot {
  var timeScale;
  timeScale = 0.01 / times.sum;
  Synth.plot({ arg synth;
   synth.releaseTime = 0.005;
   EnvGen.ar(this, 1, 0, 1, 0, timeScale)
  }, 0.01)
 }
 test { arg releaseTime = 3.0;
  Synth.play({ arg synth;
   synth.releaseTime = releaseTime;
   EnvGen.ar(this, FSinOsc.ar(800, 0.3))
  })
 }
}

Cutoff {
 // applies a cutoff envelope to a continuous sound
 *ar { arg in, sustain = 1.0, decay = 0.01, curve = 'linear';
  var env;
  env = Env.new(#[1.0, 1.0, 0.0], [sustain, decay], curve);
  ^in * EnvGen.ar(env);
 }
}


This page was created by SimpleText2Html 1.0.3 on 22-Feb-100.