{"version":3,"file":"ReverbFilter.mjs","sources":["../../src/filters/ReverbFilter.ts"],"sourcesContent":["import { getInstance } from '../instance';\nimport { Filter } from './Filter';\n\n/**\n * Filter for adding reverb. Refactored from\n * https://github.com/web-audio-components/simple-reverb/\n *\n * @memberof filters\n */\nclass ReverbFilter extends Filter\n{\n    private _seconds: number;\n    private _decay: number;\n    private _reverse: boolean;\n\n    /**\n     * @param seconds - Seconds for reverb\n     * @param decay - The decay length\n     * @param reverse - Reverse reverb\n     */\n    constructor(seconds = 3, decay = 2, reverse = false)\n    {\n        super(null);\n        this._seconds = this._clamp(seconds, 1, 50);\n        this._decay = this._clamp(decay, 0, 100);\n        this._reverse = reverse;\n        this._rebuild();\n    }\n\n    /**\n     * Clamp a value\n     * @param value\n     * @param min - Minimum value\n     * @param max - Maximum value\n     * @return Clamped number\n     */\n    private _clamp(value: number, min: number, max: number): number\n    {\n        return Math.min(max, Math.max(min, value));\n    }\n\n    /**\n     * Length of reverb in seconds from 1 to 50\n     * @default 3\n     */\n    get seconds(): number\n    {\n        return this._seconds;\n    }\n    set seconds(seconds: number)\n    {\n        this._seconds = this._clamp(seconds, 1, 50);\n        this._rebuild();\n    }\n\n    /**\n     * Decay value from 0 to 100\n     * @default 2\n     */\n    get decay(): number\n    {\n        return this._decay;\n    }\n    set decay(decay: number)\n    {\n        this._decay = this._clamp(decay, 0, 100);\n        this._rebuild();\n    }\n\n    /**\n     * Reverse value from 0 to 1\n     * @default false\n     */\n    get reverse(): boolean\n    {\n        return this._reverse;\n    }\n    set reverse(reverse: boolean)\n    {\n        this._reverse = reverse;\n        this._rebuild();\n    }\n\n    /**\n     * Utility function for building an impulse response\n     * from the module parameters.\n     */\n    private _rebuild(): void\n    {\n        if (getInstance().useLegacy)\n        {\n            return;\n        }\n        const { audioContext } = getInstance().context;\n        const rate: number = audioContext.sampleRate;\n        const length: number = rate * this._seconds;\n        const impulse: AudioBuffer = audioContext.createBuffer(2, length, rate);\n        const impulseL: Float32Array = impulse.getChannelData(0);\n        const impulseR: Float32Array = impulse.getChannelData(1);\n        let n: number;\n\n        for (let i = 0; i < length; i++)\n        {\n            n = this._reverse ? length - i : i;\n            impulseL[i] = ((Math.random() * 2) - 1) * Math.pow(1 - (n / length), this._decay);\n            impulseR[i] = ((Math.random() * 2) - 1) * Math.pow(1 - (n / length), this._decay);\n        }\n        const convolver = audioContext.createConvolver();\n\n        convolver.buffer = impulse;\n        this.init(convolver);\n    }\n}\n\nexport { ReverbFilter };\n"],"names":[],"mappings":"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"}