Web Audio:Gain Node能否作为通用乘法器实现参数调制?
Web Audio API实现参数动态乘法调制
问题核心原因
你之前的代码无效,是因为GainNode不是“无输入的通用乘法器”——GainNode的工作逻辑是「输入信号 × 增益值 = 输出信号」,如果没有给GainNode接入任何输入信号,它的输出始终是0,所以连接到振荡器频率参数后毫无效果。
可行解决方案
要实现“基础值 × 动态乘数”的参数调制,最直接的方式是用ConstantSourceNode提供基础值,再通过GainNode完成乘法运算,同时支持用LFO等信号动态调制乘数。
基础实现代码
const context = new AudioContext(); const oscNode = context.createOscillator(); oscNode.connect(context.destination); // 创建提供基础频率的恒定信号源 const baseFreqSource = context.createConstantSource(); baseFreqSource.offset.setValueAtTime(1000, context.currentTime); // 基础频率1000Hz // 创建GainNode作为乘法器,控制倍数 const multiplierGain = context.createGain(); multiplierGain.gain.setValueAtTime(1.5, context.currentTime); // 初始倍数1.5 // 构建信号链路:基础源 → 乘法器 → 振荡器频率参数 baseFreqSource.connect(multiplierGain); multiplierGain.connect(oscNode.frequency); // 启动信号源和振荡器 baseFreqSource.start(); oscNode.start();
扩展:用LFO动态调制乘数
如果需要用LFO等信号调节倍数,直接把LFO连接到GainNode的gain参数即可,比如实现0.5到1.5之间的动态波动:
// 添加LFO调制乘数 const lfo = context.createOscillator(); lfo.frequency.setValueAtTime(2, context.currentTime); // 2Hz的调制频率 lfo.type = 'sine'; // 调整LFO输出范围:将-1~1的正弦信号转为0.5~1.5的倍数(基础倍数1,波动幅度0.5) const lfoGain = context.createGain(); lfoGain.gain.setValueAtTime(0.5, context.currentTime); lfo.connect(lfoGain); lfoGain.connect(multiplierGain.gain); lfo.start();
其他可选方案
如果需要更复杂的参数运算(比如加法、非线性运算),可以使用AudioWorklet编写自定义处理器,但对于单纯的乘法需求,上面的节点链路方案已经足够轻量高效。
内容的提问来源于stack exchange,提问作者heydon
相关产品推荐
相关产品推荐

