// SPDX-License-Identifier: GPL-3.0-or-later export const EQ_FREQUENCIES = [25,40,63,100,160,250,400,630,1000,1600,2500,4000,6300,10000,16000]; export const COMP_FREQUENCIES = [95,200,400,800,1600,3400,7500]; export const EFFECTS = ['eq','compressor','bass','stereo','reverb','crossfeed','tube','convolver','liveprog','ddc','arbitrary']; export const PARAMS = { bypass:[0,1,0], gain:[-24,12,0], 'limiter.threshold':[-24,0,-0.1], 'limiter.release':[10,1000,100], 'eq.mode':[0,5,1], 'eq.interpolation':[0,1,0], 'compressor.time':[0.01,2,0.1], 'compressor.mode':[0,3,3], 'compressor.granularity':[0,4,0], 'bass.boost':[0,12,6], 'stereo.mix':[0,1,0.5], 'reverb.preset':[0,18,0], 'crossfeed.mode':[0,5,0], 'tube.drive':[-12,12,0], }; for (const effect of EFFECTS) PARAMS[`${effect}.enabled`] = [0,1,0]; EQ_FREQUENCIES.forEach((_, i) => PARAMS[`eq.band${i}`] = [-12,12,0]); COMP_FREQUENCIES.forEach((_, i) => PARAMS[`compressor.band${i}`] = [-12,12,0]); export const DEFAULT_PARAMS = Object.fromEntries(Object.entries(PARAMS).map(([k,v])=>[k,v[2]])); export function validateParam(name, value) { const spec=PARAMS[name]; if (!spec || typeof value!=='number' || !Number.isFinite(value) || valuespec[1]) throw new RangeError(`Invalid parameter ${name}: ${value}`); if ((name.endsWith('.enabled') || /mode|preset|granularity|interpolation|bypass/.test(name)) && !Number.isInteger(value)) throw new RangeError(`${name} requires an integer`); } export const PRESETS = { Flat: {}, 'Warm lows': {'eq.band0':4,'eq.band1':4,'eq.band2':3,'eq.band3':2,'eq.enabled':1,'gain':-3}, 'Headphones': {'crossfeed.enabled':1,'crossfeed.mode':1,'eq.band8':-2,'eq.enabled':1}, 'Small room': {'reverb.preset':7,'reverb.enabled':1,'gain':-3}, };