【问题标题】:Making an impulse with a JavaScriptNode (Web Audio API)使用 JavaScriptNode(Web 音频 API)制造冲动
【发布时间】:2012-03-01 16:36:57
【问题描述】:

我正在使用 Web Audio API,并且正在尝试制作一个输出脉冲的 JavaScriptNode。也就是说,我想要一个输出 1 后跟一大堆零的节点,仅此而已。

我认为下面的代码是一种明智的做法。我将一个名为“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>

【问题讨论】:

  • 那么您只是想创建一个极其简短的“点击”吗?有趣..
  • 没错。当您测试/调试信号处理结构时,冲动会派上用场,尽管我承认听它们并不太有趣。 ;)

标签: javascript web-audio-api


【解决方案1】:

好的,我想通了!

我假设输出缓冲区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>

【讨论】:

  • 您可能应该每次都设置 buf 中的每个值,而不仅仅是 buf[0]。 API 规范没有做出任何承诺,因此输出缓冲区可能包含垃圾。您还可以通过使用 AudioBufferSourceNode 更有效地获得相同的结果。
猜你喜欢
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 2021-06-23
  • 2015-08-30
  • 1970-01-01
  • 1970-01-01
  • 2016-04-26
  • 1970-01-01
相关资源
最近更新 更多