Web音频API复音 - 使用2个不同的增益节点不起作用?

时间:2012-09-03 18:09:31

标签: api audio web web-audio

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

下面的代码创建了两个按钮,每个按钮以不同的音高播放正弦音。当我点击第一个按钮时,我听到音调按体积增长。但是,当我点击第二个按钮时,音调就像是连接到第一个音调的增益一样。例如,如果我在第一个音调处于音量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>

2 个答案:

答案 0 :(得分:4)

  

每个音频上下文我只能有一个增益节点吗?还是有其他原因使这些振荡器的增益得到连接?另外,在我演奏一次音调之后,我再也无法播放它了,这让我特别认为我做错了。 :)

您可以拥有任意数量的增益节点(例如,这就是如何实现混合总线式设置),这不是问题所在。您的问题如下:

请记住,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开场标记标签中有一个迷路双引号。

答案 1 :(得分:0)

问Will Conklin

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