@@ -29,8 +29,6 @@ define(function (require) {
2929 * @param {Number } dTime Time
3030 * @param {Number } [dLevel] Amplitude (In a standard ADSR envelope,
3131 * decayLevel = sustainLevel)
32- * @param {Number } [sTime] Time (in seconds)
33- * @param {Number } [sLevel] Amplitude 0.0 to 1.0
3432 * @param {Number } [rTime] Time (in seconds)
3533 * @param {Number } [rLevel] Amplitude 0.0 to 1.0
3634 * @example
@@ -39,8 +37,6 @@ define(function (require) {
3937 * var aL = 0.7; // attack level 0.0 to 1.0
4038 * var dT = 0.3; // decay time in seconds
4139 * var dL = 0.1; // decay level 0.0 to 1.0
42- * var sT = 0.2; // sustain time in seconds
43- * var sL = dL; // sustain level 0.0 to 1.0
4440 * var rT = 0.5; // release time in seconds
4541 * // release level defaults to zero
4642 *
@@ -88,14 +84,6 @@ define(function (require) {
8884 * @property decayLevel
8985 */
9086 this . dLevel = l2 || 0 ;
91- /**
92- * @property sustainTime
93- */
94- this . sTime = t3 || 0 ;
95- /**
96- * @property sustainLevel
97- */
98- this . sLevel = l3 || 0 ;
9987 /**
10088 * @property releaseTime
10189 */
@@ -152,23 +140,21 @@ define(function (require) {
152140 * Reset the envelope with a series of time/value pairs.
153141 *
154142 * @method set
155- * @param {Number } aTime Time (in seconds) before level
143+ * @param {Number } attackTime Time (in seconds) before level
156144 * reaches attackLevel
157- * @param {Number } aLevel Typically an amplitude between
145+ * @param {Number } attackLevel Typically an amplitude between
158146 * 0.0 and 1.0
159- * @param {Number } dTime Time
160- * @param {Number } [sLevel] Amplitude (In a standard ADSR envelope,
147+ * @param {Number } decayTime Time
148+ * @param {Number } decayLevel Amplitude (In a standard ADSR envelope,
161149 * decayLevel = sustainLevel)
162- * @param {Number } [rTime] Release Time (in seconds)
163- * @param {Number } [rLevel] Amplitude 0.0 to 1.0
150+ * @param {Number } releaseTime Release Time (in seconds)
151+ * @param {Number } releaseLevel Amplitude
164152 */
165- p5 . Env . prototype . set = function ( t1 , l1 , t2 , l2 , t3 , l3 , t4 , l4 ) {
153+ p5 . Env . prototype . set = function ( t1 , l1 , t2 , l2 , t3 , l3 ) {
166154 this . aTime = t1 ;
167155 this . aLevel = l1 ;
168156 this . dTime = t2 || 0 ;
169157 this . dLevel = l2 || 0 ;
170- this . sTime = t3 || 0 ;
171- this . sLevel = l3 || 0 ;
172158 this . rTime = t4 || 0 ;
173159 this . rLevel = l4 || 0 ;
174160
@@ -183,23 +169,47 @@ define(function (require) {
183169 * </a>.
184170 *
185171 * @method setADSR
186- * @param {Number } attackTime in seconds from now
187- * @param { Number } attackVal value
188- * @param {Number } [decayTime] in seconds from now (defaults to 0)
189- * @param { Number } [sustainVal] value (defaults to 0)
190- * @param {Number } [releaseTime ] in seconds from now (defaults to 0)
191- * @param {Number } [releaseVal ] value (defaults to 0)
172+ * @param {Number } attackTime Time ( in seconds before envelope
173+ * reaches Attack Level
174+ * @param {Number } [decayTime] Time ( in seconds) before envelope
175+ * reaches Decay/Sustain Level
176+ * @param {Number } [sustainPercent ] percent between attackLevel and releaseLevel
177+ * @param {Number } [releaseTime ] Time in seconds from now (defaults to 0)
192178 */
193179 p5 . Env . prototype . setADSR = function ( aTime , dTime , sPercent , rTime ) {
194180 this . aTime = aTime ;
195181 this . dTime = dTime || 0 ;
182+
183+ // lerp
196184 this . sPercent = sPercent ;
197- this . rTime = rTime ;
185+ this . dLevel = typeof ( sPercent ) !== 'undefined' ? sPercent * ( this . aLevel - this . rLevel ) + this . rLevel : 0 ;
186+
187+ this . rTime = rTime || 0 ;
198188
199189 // also set time constants for ramp
200190 this . _setRampAD ( aTime , dTime ) ;
201191 } ;
202192
193+ /**
194+ * Set max and min of envelope
195+ *
196+ * @method setRange
197+ * @param {Number } aLevel attack level (defaults to 1)
198+ * @param {Number } rLevel release level (defaults to 0)
199+ */
200+ p5 . Env . prototype . setRange = function ( aLevel , rLevel ) {
201+ this . aLevel = aLevel || 1 ;
202+ this . rLevel = 0 ;
203+
204+ // not sure if this belongs here:
205+
206+ // {Number} [dLevel] decay/sustain level (optional)
207+ // if (typeof(dLevel) !== 'undefined') {
208+ // this.dLevel = dLevel
209+ // } else if (this.sPercent) {
210+ // this.dLevel = this.sPercent ? this.sPercent * (this.aLevel - this.rLevel) + this.rLevel : 0;
211+ // }
212+ }
203213
204214 // private (undocumented) method called when ADSR is set to set time constants for ramp
205215 //
@@ -287,27 +297,29 @@ define(function (require) {
287297 * @method play
288298 * @param {Object } unit A p5.sound object or
289299 * Web Audio Param.
290- * @param {Number } secondsFromNow time from now (in seconds)
300+ * @param {Number } [startTime] time from now (in seconds) at which to play
301+ * @param {Number } [sustainTime] time to sustain before releasing the envelope
302+
291303 */
292- p5 . Env . prototype . play = function ( unit , secondsFromNow ) {
304+ p5 . Env . prototype . play = function ( unit , secondsFromNow , susTime ) {
293305 var now = p5sound . audiocontext . currentTime ;
294306 var tFromNow = secondsFromNow || 0 ;
295- var t = now + tFromNow ;
307+ var susTime = susTime || 0 ;
296308
297309 if ( unit ) {
298310 if ( this . connection !== unit ) {
299311 this . connect ( unit ) ;
300312 }
301313 }
302314
303- this . triggerAttack ( unit , secondsFromNow ) ;
315+ this . triggerAttack ( unit , tFromNow ) ;
304316
305- this . triggerRelease ( unit , secondsFromNow + this . aTime + this . dTime + this . sTime ) ;
317+ this . triggerRelease ( unit , tFromNow + this . aTime + this . dTime + susTime ) ;
306318
307319 } ;
308320
309321 /**
310- * Trigger the Attack, Decay, and Sustain of the Envelope.
322+ * Trigger the Attack, and Decay portion of the Envelope.
311323 * Similar to holding down a key on a piano, but it will
312324 * hold the sustain level until you let go. Input can be
313325 * any p5.sound object, or a <a href="
@@ -381,23 +393,6 @@ define(function (require) {
381393 this . control . cancelScheduledValues ( t ) ;
382394 this . control . linearRampToValueAtTime ( valToSet , t ) ;
383395 }
384-
385- // move to sustain level and hold for sustain time (if using ADSR, sustain time is set to 0 and sustain level is set to decay level)
386- t += this . sTime ;
387- if ( this . isExponential == true )
388- {
389- this . control . exponentialRampToValueAtTime ( this . checkExpInput ( this . sLevel ) , t ) ;
390- valToSet = this . checkExpInput ( this . control . getValueAtTime ( t ) ) ;
391- this . control . cancelScheduledValues ( t ) ;
392- this . control . exponentialRampToValueAtTime ( valToSet , t ) ;
393- }
394- else
395- {
396- this . control . linearRampToValueAtTime ( this . sLevel , t ) ;
397- valToSet = this . control . getValueAtTime ( t ) ;
398- this . control . cancelScheduledValues ( t ) ;
399- this . control . linearRampToValueAtTime ( valToSet , t ) ;
400- }
401396 } ;
402397
403398 /**
0 commit comments