triggerRelease(unit, secondsFromNow) {
    // only trigger a release if an attack was triggered
    if (!this.wasTriggered) {
      // this currently causes a bit of trouble:
      // if a later release has been scheduled (via the play function)
      // a new earlier release won't interrupt it, because
      // this.wasTriggered has already been set to false.
      // If we want new earlier releases to override, then we need to
      // keep track of the last release time, and if the new release time is
      // earlier, then use it.
      return;
    }

    var now = p5sound.audiocontext.currentTime;
    var tFromNow = secondsFromNow || 0;
    var t = now + tFromNow;

    if (unit) {
      if (this.connection !== unit) {
        this.connect(unit);
      }
    }

    // get and set value (with linear or exponential ramp) to anchor automation
    var valToSet = this.control.getValueAtTime(t);

    if (this.isExponential === true) {
      this.control.exponentialRampToValueAtTime(
        this.checkExpInput(valToSet),
        t
      );
    } else {
      this.control.linearRampToValueAtTime(valToSet, t);
    }

    // release
    t += this.rTime;

    if (this.isExponential === true) {
      this.control.exponentialRampToValueAtTime(
        this.checkExpInput(this.rLevel),
        t
      );
      valToSet = this.checkExpInput(this.control.getValueAtTime(t));
      this.control.cancelScheduledValues(t);
      this.control.exponentialRampToValueAtTime(valToSet, t);
    } else {
      this.control.linearRampToValueAtTime(this.rLevel, t);
      valToSet = this.control.getValueAtTime(t);
      this.control.cancelScheduledValues(t);
      this.control.linearRampToValueAtTime(valToSet, t);
    }

    this.wasTriggered = false;
  }
Trigger the Release of the Envelope. This is similar to releasing
 the key on a piano and letting the sound fade according to the
 release level and release time.

 @method  triggerRelease
 @for p5.Envelope
 @param  {Object} unit p5.sound Object or Web Audio Param
 @param  {Number} secondsFromNow time to trigger the release
 @example
 <div><code>
 let attackTime = 0.001;
 let decayTime = 0.2;
 let susPercent = 0.3;
 let releaseTime = 0.4;
 let env, triOsc;

 function setup() {
   let cnv = createCanvas(100, 100);
   background(220);
   textAlign(CENTER);
   textSize(10);
   text('tap to triggerAttack', width/2, height/2);

   env = new p5.Envelope();
   env.setADSR(attackTime, decayTime, susPercent, releaseTime);
   env.setRange(1.0, 0.0);
   triOsc = new p5.Oscillator('triangle');
   triOsc.freq(220);

   cnv.mousePressed(envAttack);
 }

 function envAttack()  {
   background(0, 255, 255);
   text('release to release', width/2, height/2);

   // ensures audio is enabled. See also: `userStartAudio`
   triOsc.start();

   env.triggerAttack(triOsc);
 }

 function mouseReleased() {
   background(220);
   text('tap to triggerAttack', width/2, height/2);

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