Есть ли лучший способ создать полифоническое звучание? - PullRequest
0 голосов
/ 25 марта 2019

Я создал фрагмент кода, который, кажется, работает при воспроизведении звукового файла несколько раз одновременно, однако я не уверен, что это лучший подход.

По сути, я пытаюсь создать простое веб-пианино, и я могу использовать этот подход позже в игре или что-то в этом роде. Результат довольно идеальный. Я могу играть аккорды без проблем, за исключением ограничений на комбинацию клавиш. Если бы я переместил var request = new XMLHttpRequest(); за пределы функций, что сделало бы его глобальной переменной с однократным вызовом, то звук не воспроизводился бы одновременно, как сейчас.

document.onkeydown = function(key)
{
    if(pitch[key.keyCode]!==undefined)
    Voice(pitch[key.keyCode]);
}

function Voice(pitch)
{
    var source = audioCtx.createBufferSource();
    var request = new XMLHttpRequest();
    request.open("GET","sample.wav",true);
    request.responseType = "arraybuffer";
    request.send();
    request.onload = function()
    {
        var audioData = request.response;
        audioCtx.decodeAudioData(audioData, function(buffer)
        {
            source.buffer = buffer;
            source.playbackRate.value = pitch;
            source.connect(audioCtx.destination);
            source.start(0);
        },
        function(e)
        {
            console.log(e);
        });
    }
}

Меня беспокоит только то, будет ли код заполнять память новыми функциями. Как и в случае воспроизведения сэмпла, в памяти все еще остаются source, request, audioData и все функции, которые бесконечно плавают в памяти.

Так что, если сборщик мусора не позаботится об этом, что будет лучшим способом узнать, когда этот экземпляр образца воспроизводится и удаляет этот конкретный "объект" вручную из памяти?

...