2

setInterval のインスタンスが 2 つあります。それぞれが異なる関数をトリガーしています (これらの 2 つの関数のタイトルはQuarterNoteFuncthirdNoteFunc です)。QuarterNoteFuncの間隔は 600 ミリ秒です。thirdNoteFuncの間隔は 300 ミリ秒です。これらの機能は両方とも、繰り返し間隔で異なるオーディオ ファイルをトリガーするため、基本的な音楽リズムが作成されます。2 つの関数呼び出しの間のリズムは、最終的に Google Chrome で「ドリフト」し、2 つのサウンドの間のリズムが解消されます。私の質問は:

ブラウザベースのタイミングはガベージですが、「グローバル」タイミングがオフセットされてもサウンドがロックされ、サウンドが同期し続けるように、ある種の「ハード」タイミングリファレンスを作成する方法であるように思われます。同じ変数ミリ秒 (以下のコード) を割り当てるとこれが抑制されると思いましたが、間違っていました。

(省略された)コードは次のようになります

ミリ秒 = 600;

QuarterNote = setInterval(quarterNoteFunc, ミリ秒);

EighthNote = setInterval(eighthNoteFunc, ミリ秒/2);

4

1 に答える 1

1

おそらく、これを行う最善の方法は、常にアクティブな 1/8 音符間隔を 1 つ設定し、1 ティックおきに 4 分音符を呼び出すことです。

// wrapped in a closure to allow for a private tickCount variable
// alternatively, you could use a more advanced object with start/stop methods, etc.
(function() {
    var tickCount = 0,
        tick = function() {
            eighthNoteFunc();
            if(tickCount %2 == 0) {
                quarterNoteFunc();
            }
            tickCount++;
        };

    setInterval(tick, 300);
})();

これにより、メソッドが常に同じティックで呼び出されることが保証されます。tickCount % 4 == 0これを拡張して、半音符 ( ) と全音符 ( )をサポートすることもできますtickCount % 8 == 0


これに興味を持ったので、完全に機能するサンプルを作成することにしました (オーディオの代わりにアニメーションの背景を使用することを除く): http://jsfiddle.net/SycBm/

これにより、8分音符、4分音符、および2分音符の同期を確認したり、タイマーを開始および停止したり、音符を個別に有効または無効にしたりできます。

楽しみ!

于 2012-05-27T06:11:00.500 に答える