7

Web Audio オシレーター ( noteOn) を使用してトーンを正常に作成し、そのnoteOff関数を呼び出すと、その後の の呼び出しnoteOnでトーンが再生されません。新しい音符を演奏するには、新しいオシレータを作成する必要があるようです。どうしてこれなの?

var ctx = new webkitAudioContext();
var osc = ctx.createOscillator();
osc.connect(ctx.destination);
osc.start(0); // tone is heard (previously noteOn(0))

// ... some time later
osc.stop(0); // tone falls silent (previously noteOff(0))

// ... some time later
osc.start(0); // no effect! (previously noteOn(0))
4

3 に答える 3

9

簡単に言えば、API はそのように設計されており、そのような用途向けに最適化されています。ノートごとに新しいオシレーターを作成する以外に選択肢はありません。

于 2012-10-29T10:28:30.023 に答える
6

オシレータ プールを使用し、ゲイン ノードでノートのオン/オフを制御します。アナログ シンセのように、オシレーターはプール内で常に実行されています。

オシレータ プールを作成することはできますが、Web Audio API は非常に最適化されているため、実行する価値はありません。私は以前、オシレータ プールは良いアイデアだと思っていましたが、そうではありません。新しいノートが必要になるたびに新しいオシレーターを作成するのは非常に簡単で、プールを維持するよりもはるかに簡単です。また、この継続的な作成/ガベージ コレクション プロセスによってパフォーマンスが大幅に低下することはありません。

考えてみれば、これは非常にクリーンなプログラミング モデルです。オブジェクトへの参照を維持して後で再利用する必要はありません。維持する状態が少なくなります。

于 2012-11-04T14:32:14.157 に答える
5

周波数を 0 に変更するとどうなりますか? このDataflow + Web Audio APIサンドボックスで動作するようです。(startそしてstop、切断/再接続パターンを使用します。)

于 2013-01-29T14:44:15.747 に答える