WebAudioAPI:基于输入触发包络
WebAudioAPI: Trigger envelope based on input
上下文:我正在尝试在网络上制作一个 100% 模块化的合成器
到目前为止,我看到的制作包络的教程都使用函数来触发包络的不同阶段,但是如果我想根据 AudioNode 的输出触发包络怎么办?
比如方波振荡器的上升沿攻击,下降沿释放?
我是否必须求助于使用脚本处理器节点(并且性能受到影响)或者是否有更好的方法来做到这一点我还没有找到?
提前致谢
澄清:
输入是一个简单的二进制门。按下时为 1,未按下时为 0。
应该有一些参数是 AudioParams,可以控制启动时间、衰减时间、维持电平和释放时间。假设衰减电平(ADSR包络的峰值)为1
输出是 ADSR 包络信号本身。
虽然我不太明白where/how用于触发的节点实际上会触发一些东西(除了使用sourceNode.onended事件,最终我相信你需要处理信封在附加的增益节点上使用 setValueAtTime 和 linearRampToValueAtTime。同样,如何推导起音、维持和释放的时间仍然是个谜。
无论如何,这是我构建信封的基本要点:
var triggerAtTime = 10;
var attackTime = 3;
var sustainTime = 5;
var releaseTime = 5;
var attackVol = 0.8;
var attackStartTime = triggerAtTime;
var attackEndTime = triggerAtTime + attackTime;
var releaseStartTime = attackEndTime + sustainTime;
var releaseEndTime = releaseStartTime + releaseTime;
var gainNode = ctx.createGain();
var gng = gainNode.gain;
gng.setValueAtTime(0, attackStartTime);
gng.linearRampToValueAtTime(attackVol, attackEndTime);
gng.setValueAtTime(attackVol, releaseStartTime);
gng.linearRampToValueAtTime(0, releaseEndTime);
sourceNode.connect(gainNode);
这是另一种方法。如果你有模拟电路,你可以区分你的方波以获得前沿的正脉冲和后沿的负脉冲。将该脉冲串馈入 RC 电路。这将产生攻击和释放阶段。
在 WebAudio 中,您可以通过将信号延迟一个样本并从原始信号中减去它来做一个简单的微分器。对于 RC 电路,您可以使用 BiquadFilterNode
或 IIRFilterNode
来产生所需的结果。
如果您想要更复杂的 ADSR 响应,我不确定该怎么做。
上下文:我正在尝试在网络上制作一个 100% 模块化的合成器
到目前为止,我看到的制作包络的教程都使用函数来触发包络的不同阶段,但是如果我想根据 AudioNode 的输出触发包络怎么办?
比如方波振荡器的上升沿攻击,下降沿释放?
我是否必须求助于使用脚本处理器节点(并且性能受到影响)或者是否有更好的方法来做到这一点我还没有找到?
提前致谢
澄清:
输入是一个简单的二进制门。按下时为 1,未按下时为 0。
应该有一些参数是 AudioParams,可以控制启动时间、衰减时间、维持电平和释放时间。假设衰减电平(ADSR包络的峰值)为1
输出是 ADSR 包络信号本身。
虽然我不太明白where/how用于触发的节点实际上会触发一些东西(除了使用sourceNode.onended事件,最终我相信你需要处理信封在附加的增益节点上使用 setValueAtTime 和 linearRampToValueAtTime。同样,如何推导起音、维持和释放的时间仍然是个谜。
无论如何,这是我构建信封的基本要点:
var triggerAtTime = 10;
var attackTime = 3;
var sustainTime = 5;
var releaseTime = 5;
var attackVol = 0.8;
var attackStartTime = triggerAtTime;
var attackEndTime = triggerAtTime + attackTime;
var releaseStartTime = attackEndTime + sustainTime;
var releaseEndTime = releaseStartTime + releaseTime;
var gainNode = ctx.createGain();
var gng = gainNode.gain;
gng.setValueAtTime(0, attackStartTime);
gng.linearRampToValueAtTime(attackVol, attackEndTime);
gng.setValueAtTime(attackVol, releaseStartTime);
gng.linearRampToValueAtTime(0, releaseEndTime);
sourceNode.connect(gainNode);
这是另一种方法。如果你有模拟电路,你可以区分你的方波以获得前沿的正脉冲和后沿的负脉冲。将该脉冲串馈入 RC 电路。这将产生攻击和释放阶段。
在 WebAudio 中,您可以通过将信号延迟一个样本并从原始信号中减去它来做一个简单的微分器。对于 RC 电路,您可以使用 BiquadFilterNode
或 IIRFilterNode
来产生所需的结果。
如果您想要更复杂的 ADSR 响应,我不确定该怎么做。