wam-community
Version:
A collection of prebuilt Web Audio Modules ready for use
51 lines (49 loc) • 2.18 kB
JavaScript
import addFunctionModule from './sdk/src/addFunctionModule.js';
import processor from './ParamMgrProcessor.js';
import ParamMappingConfigurator from './ParamConfigurator.js';
import ParamMgrNode from './ParamMgrNode.js';
/** @typedef {import('@webaudiomodules/api').WebAudioModule} WebAudioModule */
/** @typedef {import('./types').ParametersMappingConfiguratorOptions} ParametersMappingConfiguratorOptions */
/** @typedef {import('./types').ParamMgrOptions} ParamMgrOptions */
/** @typedef {import('./types').AudioWorkletRegister} AudioWorkletRegister */
export default class ParamMgrFactory {
/**
* @param {WebAudioModule} module
* @param {ParametersMappingConfiguratorOptions} [optionsIn = {}]
*/
static async create(module, optionsIn = {}) {
const { audioContext, moduleId } = module;
const instanceId = optionsIn.instanceId || module.instanceId;
const groupId = optionsIn.groupId || module.groupId;
const { paramsConfig, paramsMapping, internalParamsConfig } = new ParamMappingConfigurator(optionsIn);
const initialParamsValue = Object.entries(paramsConfig)
.reduce((currentParams, [name, { defaultValue }]) => {
currentParams[name] = defaultValue;
return currentParams;
}, {});
const serializableParamsConfig = Object.entries(paramsConfig)
.reduce((currentParams, [name, { id, label, type, defaultValue, minValue, maxValue, discreteStep, exponent, choices, units }]) => {
currentParams[name] = { id, label, type, defaultValue, minValue, maxValue, discreteStep, exponent, choices, units };
return currentParams;
}, {});
await addFunctionModule(audioContext.audioWorklet, processor, moduleId, serializableParamsConfig);
/** @type {ParamMgrOptions} */
const options = {
internalParamsConfig,
parameterData: initialParamsValue,
processorOptions: {
paramsConfig,
paramsMapping,
internalParamsMinValues: Object.values(internalParamsConfig)
.map((config) => Math.max(0, config?.minValue || 0)),
internalParams: Object.keys(internalParamsConfig),
groupId,
instanceId,
moduleId,
},
};
const node = new ParamMgrNode(module, options);
await node.initialize();
return node;
}
}