0

Google Chromium Shiny Drum Machineの例のように、テンポによって設定された方法で Web Audio からノートを再生しようとしています。音符はその後下に向かって再生され、各行には 2 オクターブの音符が含まれます (デモを行うには、ここに移動し、音符を選択する前に [スティッキー] をクリックしてから、[開始] をクリックします)。

ここに画像の説明を入力

スタートボタンがあります:

$("#start").click(function () {
    noteTime = 0.0;
    startTime = audioCtx.currentTime + 0.005;
    schedule();
});

スケジュール機能:

function schedule() { var currentTime = audioCtx.currentTime;

currentTime -= startTime;

while (noteTime < currentTime + 0.200) {
    var contextPlayTime = noteTime + startTime;

    for (var i = 0; i < theArray.length; i++) {
        if ($("." + rhythmIndex + ".bar" + i).hasClass("selected")) {
            $("." + rhythmIndex + ".bar" + i).effect("highlight", {}, 10);
            playSound($("." + rhythmIndex + ".bar" + i).attr("freq"), 400, contextPlayTime);
        }
    }
    advanceNote();
}

timeoutId = setTimeout("schedule()", 0);

}

次の演奏ノートを選択する事前ノート機能:

function advanceNote() {
    // Advance time by a 16th note...
    var secondsPerBeat = 60.0 / $("#tempo").slider("option", "value");

    rhythmIndex++;

    if (rhythmIndex == loopLength) {
        rhythmIndex = 0;
    }

    noteTime = secondsPerBeat;
}

そして最後に私のサウンドプレーヤー:

function playSound(x, y, quick, noteTime) {
    if (soundBuffer) {
        var sound = audioCtx.createBufferSource();
        var gain = audioCtx.createGainNode();
        sound.buffer = soundBuffer;
        sound.playbackRate.value = x / canvas.width * 2;
        sound.connect(gain);
        gain.connect(audioCtx.destination);

        var volume = 0.5;
        gain.gain.value = volume;

        if (quick) {
            sound.noteGrainOn(0., .2, .4);
        } else {
            sound.noteOn(noteTime);
        }
    }
}

問題は、スタートを押すとすぐに、タイミングやテンポを考慮せずに各ノートを同時に再生することです。サウンドが毎秒再生され続けると、ブラウザが過負荷になり、何が問題なのかわかりません。ここで何がおかしいのですか?

前もって感謝します!

4

1 に答える 1

2

どうでも!修正は、noteTime がインクリメンタルであるということでしnoteTime = secondsPerBeatnoteTime += secondsPerBeat

于 2012-11-15T08:20:45.300 に答える