用JavaScriptNode(Web Audio API)冲动
问题描述:
我正在使用Web Audio API,并且我正在尝试创建一个输出冲动的JavaScriptNode。也就是说,我想要一个节点,输出一个1后跟一大堆零,而不是别的。用JavaScriptNode(Web Audio API)冲动
我认为下面的代码将是一个明智的方式来做到这一点。我将名为“timeForAnImpulse”的变量初始化为true,并使用此变量触发音频回调中的脉冲输出。在回调中,我将“timeForAnImpulse”设置为false。
这似乎应该可以工作,但事实并非如此。我得到了一个冲动训练(在每个缓冲区的开始处一个1),而不是一个冲动。任何想法我做错了什么?
<script type="text/javascript">
window.onload = init;
function impulseNodeCB(evt){
if(timeForAnImpulse){
var buf = evt.outputBuffer.getChannelData(0);
buf[0] = 1;
timeForAnImpulse = false;
}
}
var timeForAnImpulse = true;
function init() {
var context = new webkitAudioContext();
impulseNode = context.createJavaScriptNode(2048,0,1);
impulseNode.onaudioprocess = impulseNodeCB;
impulseNode.connect(context.destination);
}
</script>
</head>
答
好吧,我想通了!
我假定在每个回调开始时输出缓冲区evt.outputBuffer.getChannelData(0)
已初始化为零。事实并非如此。相反,它似乎保留了上次调用的价值。在else
子句中显式调零缓冲区解决了该问题。
<script type="text/javascript">
window.onload = init;
function impulseNodeCB(evt){
if(timeForAnImpulse){
var buf = evt.outputBuffer.getChannelData(0);
buf[0] = 1;
timeForAnImpulse = false;
} else {
buf[0] = 0;
}
}
var timeForAnImpulse = true;
function init() {
var context = new webkitAudioContext();
impulseNode = context.createJavaScriptNode(2048,0,1);
impulseNode.onaudioprocess = impulseNodeCB;
impulseNode.connect(context.destination);
}
</script>
</head>
+1
你可能应该每次都在buf中设置每个值,而不仅仅是buf [0]。 API规范没有做出任何承诺,所以输出缓冲区可能包含垃圾。通过使用AudioBufferSourceNode,您也可以更高效地获得相同的结果。 – aldel 2014-09-11 14:30:30
所以你只是想创建一个非常简单的“点击”?正确。 – Lloyd 2012-02-09 16:18:09
没错。当你测试/调试信号处理结构时,冲动会派上用场,尽管我承认他们听起来并不好玩。 ;) – 2012-02-09 19:15:12