В случае если вам понадобилось написать музыку в браузере, для этого уже есть готовый инструмент Web Audio API, который работает с большинством браузеров. Это позволяет вам написать мелодию на JS не подключая никаких библиотек. Давайте подробно разберёмся с тем, как в нём работать со звуком. Для начала нам нужно инициализировать AudioContext. Именно через него и будет вестись вся работа со звуком.
var context = new (window.AudioContext || window.webkitAudioContext)();
var gainNode= context.createGain();
gainNode.gain.value = 0.5; // Установка громкости
gainNode.connect(context.destination);
Далее создаём осциллятор. Указываем тип его волны и подключаем его к нашему контексту.
oscillator = context.createOscillator();
oscillator.type = 'sine';
oscillator.connect(gainNode);
Ну и дальше просто создаём массив нот и по очереди играем каждую из них
var frequencies = [
261.63, // C
293.66, // D
329.63, // E
349.23, // F
392.00, // G
440.00 // A
];
// Воспроизведение первой ноты
oscillator.frequency.value = frequencies[0];
oscillator.start(now);
// Воспроизведение остальных нот
for (var i = 1; i < frequencies.length; i++) {
// Изменение частоты осциллятора для следующей ноты
oscillator.frequency.setValueAtTime (frequencies[i], now + i * noteDuration);
}
// Остановка осциллятора после последней ноты
oscillator.stop(now + frequencies.length * noteDuration);
Закрывается контекст через функцию close().
context.close().then(() => {...}).catch((error) => {...});
Дальше уже по мере вашей усидчивости можно создать множество вещей: сложную мелодию, генератор звуков или даже свой секвенсор — инструмент, который позволяет записывать, редактировать и воспроизводить последовательности музыкальных событий (нот, параметров синтеза, эффектов и т. д.).
Но возникает вопрос: можно ли работать со звуком быстрее, без постоянной необходимости открывать/закрывать осцилляторы и аудио контексты? Сам факт того, что с Web Audio API можно работать через JS уже говорит о том, что да, можно. Существует множество библиотек и фреймворков, созданных для того, чтобы не приходилось постоянно думать о таких низкоуровневый вещах: howler. js, Webaudiox. js, Tone.js.
У нас наибольшее количество опыта было именно с последним фреймворком. Он предоставляет обширную функциональность для создания уникального звука. В нём уже заготовлено много эффектов и синтезаторов, которые работают сразу «из коробки». Tone. js также позволяет задавать очередь прослушивания звуков не только через секунды, но и через доли тактов, что позволяет писать музыку в гораздо более удобном формате. Вот пример той же программы, что была написана выше, но только через Tone. Js:
const synth = new Tone.PolySynth(Tone.Synth).toDestination();
const now = Tone.now();
synth.triggerAttack("D4", now);
synth.triggerAttack("F4", now + 0.5);
synth.triggerAttack("A4", now + 1);
synth.triggerAttack("C5", now + 1.5);
synth.triggerAttack("E5", now + 2);
synth.triggerRelease(["D4", "F4", "A4", "C5", "E5"], now + 4);
Как можно видеть, код читается гораздо приятнее, чем если бы мы делали то же самое через Web Audio API.