set(t1, l1, t2, l2, t3, l3) {
    this.aTime = t1;
    this.aLevel = l1;
    this.dTime = t2 || 0;
    this.dLevel = l2 || 0;
    this.rTime = t3 || 0;
    this.rLevel = l3 || 0;

    // set time constants for ramp
    this._setRampAD(t1, t2);
  }
Reset the envelope with a series of time/value pairs.

 @method  set
 @for p5.Envelope
 @param {Number} attackTime     Time (in seconds) before level
                                reaches attackLevel
 @param {Number} attackLevel    Typically an amplitude between
                                0.0 and 1.0
 @param {Number} decayTime      Time
 @param {Number} decayLevel   Amplitude (In a standard ADSR envelope,
                                decayLevel = sustainLevel)
 @param {Number} releaseTime   Release Time (in seconds)
 @param {Number} releaseLevel  Amplitude
 @example
 <div><code>
 let attackTime;
 let l1 = 0.7; // attack level 0.0 to 1.0
 let t2 = 0.3; // decay time in seconds
 let l2 = 0.1; // decay level  0.0 to 1.0
 let l3 = 0.2; // release time in seconds

 let env, triOsc;

 function setup() {
   let cnv = createCanvas(100, 100);
   cnv.mousePressed(playSound);

   env = new p5.Envelope();
   triOsc = new p5.Oscillator('triangle');
 }

 function draw() {
   background(220);
   text('tap here to play', 5, 20);

   attackTime = map(mouseX, 0, width, 0.0, 1.0);
   text('attack time: ' + attackTime, 5, height - 20);
 }

 // mouseClick triggers envelope if over canvas
 function playSound() {
   env.set(attackTime, l1, t2, l2, l3);

   triOsc.start();
   env.play(triOsc);
 }
 </code></div>