4

独立したゲイン エンベロープを持つ 2 つのオシレーターを作成できないようです。

以下のコードは、それぞれが異なるピッチでサイン トーンを再生する 2 つのボタンを作成します。最初のボタンをクリックすると、トーンの音量が大きくなるのが聞こえます。しかし、2 番目のボタンをクリックすると、1 番目のトーンのゲインに接続されているかのようにトーンが反応します。たとえば、1 番目のトーンがボリューム 1 のときに 2 番目のボタンをクリックすると (2 番目のトーンをオンにする)、2 番目のトーンはボリューム 1 で入力されます。 10秒の。

オーディオ コンテキストごとにゲイン ノードを 1 つだけ持つことはできますか? それとも、これらのオシレーターのゲインが接続されている他の理由がありますか? また、トーンを一度鳴らすと二度と鳴らなくなってしまうので、特に自分のやり方が間違っていると思います。: )

ありがとう。リンクは下にあり、コードはその下にあります。これは私の最初の投稿ですので、何か他に必要なものがあれば教えてください。このコードは、Web オーディオ 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>
4

2 に答える 2

4

オーディオ コンテキストごとにゲイン ノードを 1 つだけ持つことはできますか? それとも、これらのオシレーターのゲインが接続されている他の理由がありますか? また、トーンを一度鳴らすと二度と鳴らなくなってしまうので、特に自分のやり方が間違っていると思います。: )

必要な数のゲイン ノードを持つことができるので (これは、たとえば、バスのようなセットアップをミキシングする方法です)、それは問題ではありません。あなたの問題は次のとおりです。

linearRampToValueAtTime()の 2 番目のパラメーターは、 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 開始マークアップ タグに二重引用符があります。

于 2012-09-05T03:28:58.357 に答える
0

ウィル・コンクリンに聞く

gainNode2.gain.linearRampToValueAtTime(0.1, context.currentTime + 5); // envelope
于 2014-01-08T19:28:28.093 に答える