You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 12:28:15