実際、はい、新しいオシレーターノードを作成する必要があります。APIは、そのパターンで動作するように設計および最適化されています。
Taoistのコードの切断パターンは、基本的に、新しいオシレーターを作成するための複雑な方法です(oscOnが実行されるたびに実行されます)。切断された古いオシレーターでnoteOffを明示的に呼び出すことはないため、オーディオチェーンから切断されているため聞こえませんが、バックグラウンドで実行されている可能性があります(Webオーディオがこれをどのように処理するかはわかりません)。そのため、CPUを実行し、消費しているオシレータをバックグラウンドでスタックする可能性があります。
noteOff()を適切に使用していますが、これは同じコードです。http://codepen.io/Theodeus/pen/afgqk
これは同じコードですが、ゲインノードを使用してオシレーターを制御し、常に同じオシレーターのみを使用するようになっています(これは推奨されていませんが、ノートごとに新しいオシレーターを作成する方が良いと思います)http:// codepen .io / Theodeus / pen / aKFje
2015年4月の編集
コードサンプルはサイバースペースで失われているようですので、オシレーターのワンショットの性質を示すコード例を含むオシレーターについて書いたチュートリアルを次に示します。上記で参照したコードとまったく同じコードではありませんが、同じ概念を示しています。http://codepen.io/Theodeus/blog/web-audio-synth-part-1-generated-sound-その要点は次のとおりです。
//This won't work. Can't call play twice.
var context = new AudioContext(),
oscillator = context.createOscillator();
oscillator.connect(context.destination);
oscillator.start(context.currentTime);
oscillator.stop(context.currentTime + 0.5);
oscillator.start(context.currentTime + 1);
oscillator.stop(context.currentTime + 1.5);
//this will work!
var context = new AudioContext(),
oscillator;
function playOscillator(startTime, endTime) {
oscillator = context.createOscillator();
oscillator.connect(context.destination);
oscillator.start(startTime);
oscillator.stop(endTime);
}
playOscillator(context.currentTime, context.currentTime + 0.5);
playOscillator(context.currentTime + 1, context.currentTime + 1.5);