Skip to content

EZ Web Audio / Envelope

Class: Envelope

Defined in: packages/core/src/envelope.ts:60

ADSR Envelope class for managing amplitude envelope scheduling.

The envelope controls how a sound's amplitude evolves over time:

  • Attack: Ramp from 0 to peak (the sound's target gain, 1.0 by default)
  • Decay: Ramp from peak to sustain level
  • Sustain: Hold at sustain level until release() called
  • Release: Exponential decay to silence

Supports clickless retriggering: when a note is retriggered while the envelope is still active, it picks up from the current value instead of jumping to zero, preventing audible clicks.

Example

typescript
const envelope = new Envelope({
  attack: 0.05,
  decay: 0.1,
  sustain: 0.7,
  release: 0.3
})

// Apply on note start
envelope.applyTo(gainNode.gain, audioContext.currentTime)

// Release on note end
envelope.triggerRelease(gainNode.gain, audioContext.currentTime)

Constructors

Constructor

new Envelope(options): Envelope

Defined in: packages/core/src/envelope.ts:99

Creates a new Envelope with the specified ADSR parameters.

Parameters

options

EnvelopeOptions = {}

ADSR configuration options

Returns

Envelope

Properties

attack

readonly attack: number

Defined in: packages/core/src/envelope.ts:62

Duration in seconds to ramp from 0 to peak (1.0)


decay

readonly decay: number

Defined in: packages/core/src/envelope.ts:65

Duration in seconds to ramp from peak to sustain level


release

readonly release: number

Defined in: packages/core/src/envelope.ts:71

Duration in seconds for release to silence


sustain

readonly sustain: number

Defined in: packages/core/src/envelope.ts:68

Amplitude level (0-1) held during sustain phase

Accessors

isActive

Get Signature

get isActive(): boolean

Defined in: packages/core/src/envelope.ts:109

Whether the envelope is currently active (between applyTo and release).

Returns

boolean

Methods

applyTo()

applyTo(gainParam, startTime, peak): void

Defined in: packages/core/src/envelope.ts:200

Applies the attack-decay-sustain phases to an AudioParam.

Schedules:

  1. setValueAtTime(startValue, startTime) - Start from current value (0 for first trigger)
  2. linearRampToValueAtTime(peak, startTime + attackTime) - Attack to peak
  3. linearRampToValueAtTime(sustain * peak, startTime + attackTime + decayTime) - Decay to sustain

If retriggering (envelope already active), cancels scheduled values and starts the attack from the current estimated value to prevent clicks.

Parameters

gainParam

AudioParam

The AudioParam to schedule the envelope on (typically gainNode.gain)

startTime

number

The audio context time to start the envelope

peak

number = 1

Absolute amplitude the attack ramps to — the sound's target gain (default: 1)

Returns

void


estimateCurrentValue()

estimateCurrentValue(currentTime): number

Defined in: packages/core/src/envelope.ts:122

Estimates the current envelope value at a given time.

Used for retriggering to determine where to pick up from. Returns 0 if envelope is not active.

Parameters

currentTime

number

The time to estimate the value at

Returns

number

The estimated absolute envelope value (0 to peak)


triggerRelease()

triggerRelease(gainParam, startTime): void

Defined in: packages/core/src/envelope.ts:254

Applies the release phase to an AudioParam.

Cancels any in-progress attack/decay automation (preserving the current value via cancelAndHoldAtTime) and schedules a linear ramp to zero over the release duration. A linear ramp is used instead of setTargetAtTime because setTargetAtTime is an asymptotic exponential that never reaches zero — the residual amplitude causes an audible click when the oscillator node is stopped, especially on smooth waveforms (sine, triangle).

Parameters

gainParam

AudioParam

The AudioParam to schedule the release on

startTime

number

The audio context time to start the release phase

Returns

void