Skip to content

EZ Web Audio / FilterEffect

Class: FilterEffect ​

Defined in: packages/core/src/effects/filter-effect.ts:52

FilterEffect - A wrapper around BiquadFilterNode that implements the Effect interface.

Supports all 8 BiquadFilter types with wet/dry mixing via equal-power crossfade. The bypass and mix controls allow smooth blending between filtered and dry signal.

Extends BaseEffect for shared wet/dry mixing, bypass, and rampTo() functionality.

Example ​

typescript
const filter = createFilterEffect(audioContext, 'lowpass', { frequency: 800, q: 2 })
filter.frequency = 1000  // Adjust cutoff
filter.mix = 0.5  // 50% wet/dry
filter.bypass = true  // Bypass filter entirely
filter.rampTo('frequency', 2000, 1)  // Smooth ramp over 1 second

Extends ​

Constructors ​

Constructor ​

new FilterEffect(audioContext, type, options): FilterEffect

Defined in: packages/core/src/effects/filter-effect.ts:62

Parameters ​

audioContext ​

AudioContext

type ​

FilterType

options ​

FilterEffectOptions = {}

Returns ​

FilterEffect

Overrides ​

BaseEffect.constructor

Accessors ​

bypass ​

Get Signature ​

get bypass(): boolean

Defined in: packages/core/src/effects/base-effect.ts:95

When true, signal bypasses the effect entirely (100% dry).

Returns ​

boolean

Set Signature ​

set bypass(v): void

Defined in: packages/core/src/effects/base-effect.ts:99

When true, effect is bypassed (passthrough)

Parameters ​
v ​

boolean

Returns ​

void

When true, effect is bypassed (passthrough)

Inherited from ​

BaseEffect.bypass


detune ​

Get Signature ​

get detune(): number

Defined in: packages/core/src/effects/filter-effect.ts:136

Filter detune in cents

Returns ​

number

Set Signature ​

set detune(v): void

Defined in: packages/core/src/effects/filter-effect.ts:140

Parameters ​
v ​

number

Returns ​

void


frequency ​

Get Signature ​

get frequency(): number

Defined in: packages/core/src/effects/filter-effect.ts:91

Filter frequency in Hz. Clamped to [0, sampleRate / 2] (Nyquist) — BiquadFilterNode.frequency is spec'd over that range; anything outside it is meaningless (and some implementations clamp/misbehave silently).

Returns ​

number

Set Signature ​

set frequency(v): void

Defined in: packages/core/src/effects/filter-effect.ts:95

Parameters ​
v ​

number

Returns ​

void


gain ​

Get Signature ​

get gain(): number

Defined in: packages/core/src/effects/filter-effect.ts:121

Filter gain in dB. Only affects lowshelf, highshelf, and peaking filter types — the other 5 types (lowpass, highpass, bandpass, notch, allpass) ignore gain entirely per the Web Audio spec. Setting gain on one of those types is a silent no-op audibly; a dev warning is emitted to catch the mistake early.

Returns ​

number

Set Signature ​

set gain(v): void

Defined in: packages/core/src/effects/filter-effect.ts:125

Parameters ​
v ​

number

Returns ​

void


input ​

Get Signature ​

get input(): AudioNode

Defined in: packages/core/src/effects/base-effect.ts:83

The input AudioNode (receives signal from chain)

Returns ​

AudioNode

The input AudioNode that receives signal from the chain

Inherited from ​

BaseEffect.input


mix ​

Get Signature ​

get mix(): number

Defined in: packages/core/src/effects/base-effect.ts:108

Wet/dry mix: 0 = fully dry (no effect), 1 = fully wet (all through effect). Uses equal-power crossfade for natural mixing.

Returns ​

number

Set Signature ​

set mix(v): void

Defined in: packages/core/src/effects/base-effect.ts:112

Wet/dry mix: 0 = fully dry (no effect), 1 = fully wet (full effect)

Parameters ​
v ​

number

Returns ​

void

Wet/dry mix: 0 = fully dry (no effect), 1 = fully wet (full effect)

Inherited from ​

BaseEffect.mix


output ​

Get Signature ​

get output(): AudioNode

Defined in: packages/core/src/effects/base-effect.ts:88

The output AudioNode (sends signal to next in chain)

Returns ​

AudioNode

The output AudioNode that sends signal to the next in chain

Inherited from ​

BaseEffect.output


q ​

Get Signature ​

get q(): number

Defined in: packages/core/src/effects/filter-effect.ts:105

Filter Q factor (resonance). Floored just above 0 — a Q of exactly 0 (or negative) is undefined/unstable for resonant filter types (bandpass/notch/peaking).

Returns ​

number

Set Signature ​

set q(v): void

Defined in: packages/core/src/effects/filter-effect.ts:109

Parameters ​
v ​

number

Returns ​

void


type ​

Get Signature ​

get type(): FilterType

Defined in: packages/core/src/effects/filter-effect.ts:156

The current filter type.

Hard-cut, not a crossfade: changing type reconfigures the BiquadFilterNode's internal coefficients instantly — there is no ramp/interpolation between the old and new filter response. If audio is actively flowing through this effect when the type changes, expect an audible discontinuity (click/thump), the same class of pop that curve-swap effects (e.g. DistortionEffect) have. Wrap the change in a mix fade-to-0 / fade-back-to-target if that's audible in context.

Returns ​

FilterType

Set Signature ​

set type(v): void

Defined in: packages/core/src/effects/filter-effect.ts:160

Parameters ​
v ​

FilterType

Returns ​

void

Methods ​

_clearListeners() ​

protected _clearListeners(): void

Defined in: packages/core/src/events/typed-event-emitter.ts:192

Remove every listener registered through this emitter (via addEventListener(), on(), or once()), regardless of how many or what event type they're bound to.

Native EventTarget has no removeAllListeners(). This works around that by aborting a shared AbortSignal threaded through every addEventListener() call this class makes, then swapping in a fresh AbortController so the instance can keep accepting new listeners afterward (e.g. if it's reused before being garbage collected).

Subclasses call this from their dispose() alongside neutering dispatchEvent — the neuter stops future emits, this stops stale listener closures from being retained/invoked at all.

Returns ​

void

Inherited from ​

BaseEffect._clearListeners


addEventListener() ​

Call Signature ​

addEventListener<K>(type, listener, options?): void

Defined in: packages/core/src/events/typed-event-emitter.ts:44

Add a typed event listener for known event types. Overloaded to provide type safety for known event types while remaining compatible with the native EventTarget API.

Type Parameters ​
K ​

K extends "dispose"

Parameters ​
type ​

K

The event type (key of TMap)

listener ​

(event) => void

Typed event handler

options? ​

Standard addEventListener options

boolean | AddEventListenerOptions

Returns ​

void

Inherited from ​

BaseEffect.addEventListener

Call Signature ​

addEventListener(type, listener, options?): void

Defined in: packages/core/src/events/typed-event-emitter.ts:49

Add a typed event listener for known event types. Overloaded to provide type safety for known event types while remaining compatible with the native EventTarget API.

Parameters ​
type ​

string

The event type (key of TMap)

listener ​

Typed event handler

EventListenerOrEventListenerObject | null

options? ​

Standard addEventListener options

boolean | AddEventListenerOptions

Returns ​

void

Inherited from ​

BaseEffect.addEventListener


dispose() ​

dispose(): void

Defined in: packages/core/src/effects/filter-effect.ts:164

Disconnect all internal audio nodes and emit a 'dispose' event.

Subclass disposal contract: Subclasses that create additional audio nodes (e.g., BiquadFilterNode, DynamicsCompressorNode, WaveShaperNode) MUST override dispose() to disconnect those nodes before calling super.dispose().

Returns ​

void

Example ​

typescript
public override dispose(): void {
  try { this.myNode.disconnect() } catch { /* already disconnected */ }
  super.dispose()
}

Idempotent — safe to call multiple times.

Overrides ​

BaseEffect.dispose


emit() ​

protected emit<K>(type, detail): void

Defined in: packages/core/src/events/typed-event-emitter.ts:95

Emit a typed event with the given detail.

Creates a CustomEvent with the provided detail and dispatches it on this target. Subclasses call this internally to fire lifecycle events.

Type Parameters ​

K ​

K extends "dispose"

Parameters ​

type ​

K

The event type to emit (key of TMap)

detail ​

BaseEffectEventMap[K]["detail"]

The event detail object (typed by TMap)

Returns ​

void

Inherited from ​

BaseEffect.emit


getAudioContext() ​

getAudioContext(): AudioContext

Defined in: packages/core/src/effects/base-effect.ts:121

Get the AudioContext used by this effect. Useful for external tools (e.g., LFO) that need the context.

Returns ​

AudioContext

Inherited from ​

BaseEffect.getAudioContext


getAudioParam() ​

protected getAudioParam(name): AudioParam | null

Defined in: packages/core/src/effects/filter-effect.ts:172

Map a parameter name to its underlying AudioParam. Subclasses implement this to expose their effect-specific parameters.

Parameters ​

name ​

string

The parameter name

Returns ​

AudioParam | null

The AudioParam, or null if not recognized

Overrides ​

BaseEffect.getAudioParam


getParam() ​

getParam(name): AudioParam | null

Defined in: packages/core/src/effects/base-effect.ts:134

Get a named AudioParam from this effect for external modulation.

Delegates to the subclass's getAudioParam() implementation. Returns null if the parameter name is not recognized.

Parameters ​

name ​

string

The parameter name (e.g., 'frequency', 'time', 'feedback')

Returns ​

AudioParam | null

The AudioParam, or null if not recognized

Inherited from ​

BaseEffect.getParam


getUnrampableParams() ​

protected getUnrampableParams(): readonly string[]

Defined in: packages/core/src/effects/base-effect.ts:243

Names of documented effect properties that are NOT backed by a single AudioParam (e.g. WaveShaper curve swaps, multi-node comb/allpass networks) and therefore cannot be smoothly ramped via rampTo(). rampTo() warns instead of silently no-op-ing when called with one of these names, so callers don't mistake "no-op" for "it worked."

Default: none. Subclasses override where applicable.

Returns ​

readonly string[]

Inherited from ​

BaseEffect.getUnrampableParams


off() ​

off<K>(type, listener): this

Defined in: packages/core/src/events/typed-event-emitter.ts:167

Unsubscribe from an event.

Note: Due to native EventTarget limitations, you must provide the same listener function reference that was used when subscribing.

Type Parameters ​

K ​

K extends "dispose"

Parameters ​

type ​

K

The event type to unsubscribe from

listener ​

(event) => void

The event handler function to remove

Returns ​

this

this for chaining

Example ​

typescript
const handler = (e) => console.log(e.detail)
emitter.on('play', handler)
// later...
emitter.off('play', handler)

Inherited from ​

BaseEffect.off


on() ​

on<K>(type, listener): this

Defined in: packages/core/src/events/typed-event-emitter.ts:116

Subscribe to one or more events. Supports chaining.

Type Parameters ​

K ​

K extends "dispose"

Parameters ​

type ​

The event type(s) to subscribe to (key or array of keys of TMap)

K | K[]

listener ​

(event) => void

The event handler function

Returns ​

this

this for chaining

Example ​

typescript
emitter.on('play', handlePlay).on('stop', handleStop)
emitter.on(['play', 'stop'], handleBoth)

Inherited from ​

BaseEffect.on


once() ​

once<K>(type, listener): this

Defined in: packages/core/src/events/typed-event-emitter.ts:141

Subscribe to an event once. Handler is removed after first invocation.

Type Parameters ​

K ​

K extends "dispose"

Parameters ​

type ​

K

The event type to subscribe to

listener ​

(event) => void

The event handler function

Returns ​

this

this for chaining

Example ​

typescript
emitter.once('end', () => console.log('Finished'))

Inherited from ​

BaseEffect.once


onParamRamped() ​

protected onParamRamped(param, value): number

Defined in: packages/core/src/effects/filter-effect.ts:188

ramp-setter-desync fix: rampTo('frequency'/'q', ...) re-applies the same clamps the property setters use so the getter and AudioParam can never diverge; gain/detune have no range restriction so they pass through (matching their setters).

Parameters ​

param ​

string

value ​

number

Returns ​

number

Overrides ​

BaseEffect.onParamRamped


rampTo() ​

rampTo(param, value, duration): void

Defined in: packages/core/src/effects/base-effect.ts:164

Smoothly ramp a parameter to a target value over a duration.

Uses AudioParam.setTargetAtTime for glitch-free transitions. If the parameter name is not recognized, this is a no-op (a console.warn is emitted if the name is a real, documented effect property that just isn't backed by a single AudioParam — see getUnrampableParams).

Single write path: every ramped write is funneled through onParamRamped, the same hook subclasses use to keep their shadow getters honest. This guarantees effect.someParam reflects the ramp target immediately after calling rampTo(), and that the exact same validation/clamping a synchronous property-set would apply is also applied to ramped writes — the AudioParam and the getter can never diverge from each other.

Parameters ​

param ​

string

Parameter name (e.g., 'frequency', 'time', 'feedback')

value ​

number

Target value

duration ​

number

Ramp duration in seconds

Returns ​

void

Example ​

typescript
delay.rampTo('time', 0.5, 2)      // Ramp delay time to 0.5s over 2 seconds
filter.rampTo('frequency', 800, 1) // Ramp cutoff to 800Hz over 1 second

Inherited from ​

BaseEffect.rampTo


removeEventListener() ​

Call Signature ​

removeEventListener<K>(type, listener, options?): void

Defined in: packages/core/src/events/typed-event-emitter.ts:70

Remove a typed event listener for known event types. Overloaded to provide type safety for known event types while remaining compatible with the native EventTarget API.

Type Parameters ​
K ​

K extends "dispose"

Parameters ​
type ​

K

The event type (key of TMap)

listener ​

(event) => void

Typed event handler to remove

options? ​

Standard removeEventListener options

boolean | EventListenerOptions

Returns ​

void

Inherited from ​

BaseEffect.removeEventListener

Call Signature ​

removeEventListener(type, listener, options?): void

Defined in: packages/core/src/events/typed-event-emitter.ts:75

Remove a typed event listener for known event types. Overloaded to provide type safety for known event types while remaining compatible with the native EventTarget API.

Parameters ​
type ​

string

The event type (key of TMap)

listener ​

Typed event handler to remove

EventListenerOrEventListenerObject | null

options? ​

Standard removeEventListener options

boolean | EventListenerOptions

Returns ​

void

Inherited from ​

BaseEffect.removeEventListener