【问题标题】:Web audio API polyphony - using 2 different gain nodes not working?Web 音频 API 复音 - 使用 2 个不同的增益节点不起作用?
【发布时间】:2012-08-28 11:00:27
【问题描述】:

我似乎无法创建两个具有独立增益包络的振荡器。

下面的代码创建了两个按钮,每个按钮以不同的音高播放正弦音。当我单击第一个按钮时,我听到音量按应有的增长。但是,当我单击第二个按钮时,音调的反应就好像它连接到第一个音调的增益一样。例如,如果我在第一个音调处于音量 1 时单击第二个按钮(打开第二个音调),则第二个音调将以音量 1 进入,即使它应该在整个过程中从 0 到 1 到 0 包络10 秒。

每个音频上下文只能有一个增益节点吗?或者是否有其他原因可以连接这些振荡器的增益?另外,我弹了一次之后,就不能再弹了,这让我特别觉得自己做错了什么。 :)

谢谢。链接在下面,代码在下面。这是我在这里的第一篇文章,所以如果您需要其他任何内容,请告诉我。此代码必须在支持网络音频 api 的 Chrome 或 Safari 版本中运行。

http://whitechord.org/just_mod/poly_test.html

WAAPI 测试

    <button onclick="play()">play one</button>
    <button onclick="play2()">play two</button>


    <script>

        var context;

        window.addEventListener('load', initAudio, false);

        function initAudio() {
            try {
                context = new webkitAudioContext();
            } catch(e) {
                onError(e);
            }
        }

        function play() {

            var oscillator = context.createOscillator(); 
            var gainNode = context.createGainNode();
            gainNode.gain.value = 0.0;
            oscillator.connect(gainNode);
            gainNode.connect(context.destination);
            oscillator.frequency.value = 700;

            gainNode.gain.linearRampToValueAtTime(0.0, 0); // envelope  
            gainNode.gain.linearRampToValueAtTime(0.1, 5); // envelope  
            gainNode.gain.linearRampToValueAtTime(0.0, 10); // envelope 

            oscillator.noteOn(0);
        }


        function play2() {

            var oscillator2 = context.createOscillator(); 
            var gainNode2 = context.createGainNode();
            gainNode2.gain.value = 0.0;
            oscillator2.connect(gainNode2);
            gainNode2.connect(context.destination);
            oscillator2.frequency.value = 400;

            gainNode2.gain.linearRampToValueAtTime(0.0, 0); // envelope 
            gainNode2.gain.linearRampToValueAtTime(0.1, 5); // envelope 
            gainNode2.gain.linearRampToValueAtTime(0.0, 10); // envelope    

            oscillator2.noteOn(0);
        }


        /* error */

        function onError(e) {
            alert(e);   
        }



    </script>

</body>
</html>

【问题讨论】:

    标签: api audio web web-audio-api


    【解决方案1】:

    每个音频上下文只能有一个增益节点吗?或者是否有其他原因可以连接这些振荡器的增益?另外,我弹了一次之后,就不能再弹了,这让我特别觉得自己做错了什么。 :)

    您可以拥有任意数量的增益节点(例如,您可以通过这种方式实现类似总线的混音设置),所以这不是问题所在。您的问题如下:

    请记住,linearRampToValueAtTime() 的第二个参数是时间与您的 context.currentTime 在同一时间坐标系中

    而且您的 context.currentTime 总是实时向前移动,因此您的所有坡道、曲线等都应该相对于它计算

    如果您想在 4 秒后发生某些事情,您可以将 context.currentTime + 4 传递给 Web Audio API 函数。

    因此,更改代码中的所有调用 linearRampToValueAtTime(),使它们看起来像:

    gainNode2.gain.linearRampToValueAtTime(0.0, context.currentTime); // envelope     
    gainNode2.gain.linearRampToValueAtTime(0.1, context.currentTime + 5); // envelope     
    gainNode2.gain.linearRampToValueAtTime(0.0, context.currentTime + 10); // envelope 
    

    这应该可以解决您的问题。

    顺便说一句,您的 BODY 开始标记标记中有一个杂散的双引号。

    【讨论】:

    • @ThomasVerbeke 此代码中没有调用 .noteOff()。
    • 我的意思是你只能调用noteOn一次;之后你必须创建新的音频节点
    【解决方案2】:

    问威尔·康克林

    gainNode2.gain.linearRampToValueAtTime(0.1, context.currentTime + 5); // envelope
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 2020-11-25
      相关资源
      最近更新 更多