UNPKG

@pixi/sound

Version:

WebAudio API playback library with filters

282 lines (279 loc) 6.13 kB
import { getInstance } from '../instance.mjs'; import { WebAudioUtils } from '../webaudio/WebAudioUtils.mjs'; import { Filter } from './Filter.mjs'; const _EqualizerFilter = class extends Filter { /** * @param f32 - Default gain for 32 Hz * @param f64 - Default gain for 64 Hz * @param f125 - Default gain for 125 Hz * @param f250 - Default gain for 250 Hz * @param f500 - Default gain for 500 Hz * @param f1k - Default gain for 1000 Hz * @param f2k - Default gain for 2000 Hz * @param f4k - Default gain for 4000 Hz * @param f8k - Default gain for 8000 Hz * @param f16k - Default gain for 16000 Hz */ constructor(f32 = 0, f64 = 0, f125 = 0, f250 = 0, f500 = 0, f1k = 0, f2k = 0, f4k = 0, f8k = 0, f16k = 0) { let bands = []; const equalizerBands = [ { f: _EqualizerFilter.F32, type: "lowshelf", gain: f32 }, { f: _EqualizerFilter.F64, type: "peaking", gain: f64 }, { f: _EqualizerFilter.F125, type: "peaking", gain: f125 }, { f: _EqualizerFilter.F250, type: "peaking", gain: f250 }, { f: _EqualizerFilter.F500, type: "peaking", gain: f500 }, { f: _EqualizerFilter.F1K, type: "peaking", gain: f1k }, { f: _EqualizerFilter.F2K, type: "peaking", gain: f2k }, { f: _EqualizerFilter.F4K, type: "peaking", gain: f4k }, { f: _EqualizerFilter.F8K, type: "peaking", gain: f8k }, { f: _EqualizerFilter.F16K, type: "highshelf", gain: f16k } ]; if (!getInstance().useLegacy) { bands = equalizerBands.map((band) => { const node = getInstance().context.audioContext.createBiquadFilter(); node.type = band.type; WebAudioUtils.setParamValue(node.Q, 1); node.frequency.value = band.f; WebAudioUtils.setParamValue(node.gain, band.gain); return node; }); } super(bands[0], bands[bands.length - 1]); this.bands = bands; this.bandsMap = {}; for (let i = 0; i < this.bands.length; i++) { const node = this.bands[i]; if (i > 0) { this.bands[i - 1].connect(node); } this.bandsMap[node.frequency.value] = node; } } /** * Set gain on a specific frequency. * @param frequency - The frequency, see EqualizerFilter.F* for bands * @param gain - Recommended -40 to 40. */ setGain(frequency, gain = 0) { if (!this.bandsMap[frequency]) { throw new Error(`No band found for frequency ${frequency}`); } WebAudioUtils.setParamValue(this.bandsMap[frequency].gain, gain); } /** * Get gain amount on a specific frequency. * @return The amount of gain set. */ getGain(frequency) { if (!this.bandsMap[frequency]) { throw new Error(`No band found for frequency ${frequency}`); } return this.bandsMap[frequency].gain.value; } /** * Gain at 32 Hz frequencey. * @default 0 */ set f32(value) { this.setGain(_EqualizerFilter.F32, value); } get f32() { return this.getGain(_EqualizerFilter.F32); } /** * Gain at 64 Hz frequencey. * @default 0 */ set f64(value) { this.setGain(_EqualizerFilter.F64, value); } get f64() { return this.getGain(_EqualizerFilter.F64); } /** * Gain at 125 Hz frequencey. * @default 0 */ set f125(value) { this.setGain(_EqualizerFilter.F125, value); } get f125() { return this.getGain(_EqualizerFilter.F125); } /** * Gain at 250 Hz frequencey. * @default 0 */ set f250(value) { this.setGain(_EqualizerFilter.F250, value); } get f250() { return this.getGain(_EqualizerFilter.F250); } /** * Gain at 500 Hz frequencey. * @default 0 */ set f500(value) { this.setGain(_EqualizerFilter.F500, value); } get f500() { return this.getGain(_EqualizerFilter.F500); } /** * Gain at 1 KHz frequencey. * @default 0 */ set f1k(value) { this.setGain(_EqualizerFilter.F1K, value); } get f1k() { return this.getGain(_EqualizerFilter.F1K); } /** * Gain at 2 KHz frequencey. * @default 0 */ set f2k(value) { this.setGain(_EqualizerFilter.F2K, value); } get f2k() { return this.getGain(_EqualizerFilter.F2K); } /** * Gain at 4 KHz frequencey. * @default 0 */ set f4k(value) { this.setGain(_EqualizerFilter.F4K, value); } get f4k() { return this.getGain(_EqualizerFilter.F4K); } /** * Gain at 8 KHz frequencey. * @default 0 */ set f8k(value) { this.setGain(_EqualizerFilter.F8K, value); } get f8k() { return this.getGain(_EqualizerFilter.F8K); } /** * Gain at 16 KHz frequencey. * @default 0 */ set f16k(value) { this.setGain(_EqualizerFilter.F16K, value); } get f16k() { return this.getGain(_EqualizerFilter.F16K); } /** Reset all frequency bands to have gain of 0 */ reset() { this.bands.forEach((band) => { WebAudioUtils.setParamValue(band.gain, 0); }); } destroy() { this.bands.forEach((band) => { band.disconnect(); }); this.bands = null; this.bandsMap = null; } }; let EqualizerFilter = _EqualizerFilter; /** * Band at 32 Hz * @readonly */ EqualizerFilter.F32 = 32; /** * Band at 64 Hz * @readonly */ EqualizerFilter.F64 = 64; /** * Band at 125 Hz * @readonly */ EqualizerFilter.F125 = 125; /** * Band at 250 Hz * @readonly */ EqualizerFilter.F250 = 250; /** * Band at 500 Hz * @readonly */ EqualizerFilter.F500 = 500; /** * Band at 1000 Hz * @readonly */ EqualizerFilter.F1K = 1e3; /** * Band at 2000 Hz * @readonly */ EqualizerFilter.F2K = 2e3; /** * Band at 4000 Hz * @readonly */ EqualizerFilter.F4K = 4e3; /** * Band at 8000 Hz * @readonly */ EqualizerFilter.F8K = 8e3; /** * Band at 16000 Hz * @readonly */ EqualizerFilter.F16K = 16e3; export { EqualizerFilter }; //# sourceMappingURL=EqualizerFilter.mjs.map