Сразу оговорюсь: я не программист, особенно не программист на js, мне нужно решить одну конкретную задачу и забыть о существовании js на многие годы. Поэтому просьба не посылать меня читать гору толстых учебников.
Собственно, задача: сделать так, чтоб при нажатии определённых клавиш на клавиатуре проигрывались те или иные звуки. Аудиофайлы лежат в той же папке, что и скрипт.
Первоначально делалось так:
const r0 = new Audio("ringing_0.ogg");
r0.currentTime=0; r0.play();
И это работало, но с одной проблемой: при нажатии на кнопку звук, проигрываемый сейчас, мгновенно обрывался, и начинал проигрываться заново. Что сильно режет слух. Но убирать r0.currentTime=0 нельзя: звук вообще не будет воспроизводиться, пока текущее воспроизведение не закончится.
Тогда я поменял код:
r0.cloneNode(true).play();
Теперь играет довольно красиво, но возникла другая проблема: если нажимать кнопку слишком часто, звук начинает захлёбываться.
В интернетах много советов по использованию AudioContext'а, но с ним проблема: почему-то ВСЕ уроки, которые я находил, требуют использовать XMLHttpRequest для запроса звукового файла с сервера. В результате — куча непонятного кода, который ещё и не работает. Например, здесь описан следующий порядок действий:
0. Скачать файл через XMLHttpRequest;
1. Добавить полученный ответ к буферу;
2. Создать bufferSource и проигрывать его при каждом вызове;
Наткнулся на видео, где предлагается httprequest заменить на fetch. В результате код приобретает более простой и короткий вид:
async function getresponse() {
let response2 = await fetch ("http://mapper720.ru/belltowers/transfiguration/ringing_0.ogg");
}
Остаются невыясненными следующие вопросы:
0. Как полученный с помощью fetch аудиофайл добавить к буферу?
1. Как вообще работает этот буфер? Можно ли, например, после загрузки страницы непрерывно проигрывать буфер, в который по нажатию кнопки закидывать некий аудиофайл, или принцип работы иной?
2. И можно ли вообще обойтись без всяких httprequest'ов, fetch'ей и тому подобного? Файл-то вон он, под носом, в одной папке со скриптом, зачем тогда вообще эти сложности?