Я создал фрагмент кода, который, кажется, работает при воспроизведении звукового файла несколько раз одновременно, однако я не уверен, что это лучший подход.
По сути, я пытаюсь создать простое веб-пианино, и я могу использовать этот подход позже в игре или что-то в этом роде. Результат довольно идеальный. Я могу играть аккорды без проблем, за исключением ограничений на комбинацию клавиш. Если бы я переместил 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
и все функции, которые бесконечно плавают в памяти.
Так что, если сборщик мусора не позаботится об этом, что будет лучшим способом узнать, когда этот экземпляр образца воспроизводится и удаляет этот конкретный "объект" вручную из памяти?