ConstantSourceNode 是 Web Audio API 中用于精确参数自动化的轻量控制节点,通过其 offset 参数连接至其他节点的 AudioParam(如 gainNode.gain),调用 setValueAtTime 等方法实现微秒级同步的自动化调度。
ConstantSourceNode 本身不直接“控制参数自动化”,而是作为一个**稳定输出固定值的信号源**,常被用作“自动化控制器”——通过将其输出连接到其他节点(如 GainNode、BiquadFilterNode)的可写参数(例如 gain.value 或 frequency.value),再结合 setValueAtTime、linearRampToValueAtTime 等方法,实现对目标参数的**精确时间对齐的自动化调度**。
Web Audio API 中,大多数音频参数(如 gain、frequency)支持自动化方法,但这些方法必须在**音频渲染线程内调用才保证时序精准**。而普通 JS 定时器(setTimeout、requestAnimationFrame)无法满足微秒级精度要求。ConstantSourceNode 的输出是音频信号,其 offset 参数支持完整的自动化方法,并且它的输出可直接连入其他节点的参数输入口(通过 connect()),从而把“控制信号”注入音频图,实现真正同步的自动化。
以下是一个典型示例:用 ConstantSourceNode 控制一个 GainNode 的 gain 参数,实现 0 → 1 → 0.2 的平滑增益变化:
const audioContext = new (window.AudioContext || window.webkitAudioContext)();const gainNode = audioContext.createGain();const constantSource = audioContext.createConstantSource();// 将 constantSource 的输出连接到 gainNode.gain 参数(注意:不是 connect(gainNode)!)constantSource.connect(gainNode.gain);// 设置 offset 参数的自动化曲线(单位:线性增益值)constantSource.offset.setValueAtTime(0, audioContext.currentTime);constantSource.offset.linearRampToValueAtTime(1, audioContext.currentTime + 0.5);constantSource.offset.linearRampToValueAtTime(0.2, audioContext.currentTime + 1.0);// 启动 constantSource(它必须 start 才会输出信号)constantSource.start();// 后续可连接音频源到 gainNodeconst oscillator = audioContext.createOscillator();oscillator.connect(gainNode);gainNode.connect(audioContext.destination);oscillator.start();
start():ConstantSourceNode 默认不输出,不调用 start() 则 offset 自动化不会生效,目标参数也不会变化。gainNode.gain、filter.frequency、delay.delayTime 等,它们的类型是 AudioParam,支持 connect() 输入。gainNode.connect(anotherNode))来控制参数:必须明确连接到具体参数对象(gainNode.gain),否则只是路由音频信号,不触发参数控制。setValueAtTime、exponentialRampToValueAtTime、setTargetAtTime 等,行为与其他 AudioParam 一致。一个 ConstantSourceNode 可同时驱动多个参数,实现同步变化:
立即学习“前端免费学习笔记(深入)”;
gainNode.gain 和 filter.frequency,让音量与截止频率同节奏变化;setTargetAtTime 实现平滑跟随(如模拟包络跟随);audioContext.suspend()/resume() 注意重置:暂停后恢复需重新 start() ConstantSourceNode;cancelAndHoldAtTime() 清除旧曲线后再设新值。本质上,ConstantSourceNode 是 Web Audio 中最轻量、最可靠的“控制总线”节点——它不产生声音,只传递你定义好的数值轨迹,把 JavaScript 的定时逻辑彻底交给音频引擎调度,确保所有变化严格对齐音频时钟。