- PVSM.RU - https://www.pvsm.ru -
Доброго времени суток, уважаемые читатели!
Несколько дней назад мне в голову пришла идея сделать случайный генератор простой музыки,
причем не как-нибудь, а на JavaScript — чтобы он работал прямо в браузере.
Как заставить ваш браузер сыграть по нотам — читаем под катом.
Если Вы любитель современного рока и отчасти такого его ответвления как хардкор, Вы наверняка знаете, что во всех производных этого жанра есть такое явление, как брейкдауны — простые проигрышы на одном и том же аккорде, которые, однако, во всех произведениях разные: темп композиции, барабанные партии и сами последовательности аккорда делают их уникальными. Этот вариант довольно простой и в то же время предоставляет огромное поле для манёвра.
Разберёмся, что нам необходимо для того, чтобы сделать скрипт, генерующий случайные брейкдауны.
Шаги, которые нужно предпринять для реализации задачи, выглядят следующим образом:
Первым делом нам нужны звуки, которые мы будем комбинировать в музыку. В нашем случае это звуки барабанов и электрогитар. Нагуглить первые не составит никакого труда, так как готовые звуки барабанов повсеместно используются в сведении треков. С гитарой сложнее: либо пишем сами, либо с помощью любого редактора звуков (например, бесплатный Audacity [1]) извлекаем из какой-либо песни аккорд. Я сделал второе: плюс такого подхода в том, что кроме гитары мы имеем во фрагменте готовый басовый фон, и при прослушивании в наушниках это даёт о себе знать.
Интерфейс, который позволяет работать со звуками в большинстве современных браузеров, называется Web Audio API. Мне посчастливилось найти набор примеров [2], среди которых есть и планирование воспроизведения нескольких звуков согласно музыкальному размеру. Это, можно сказать, готовое полотно, на котором только нужно начертить схему наших звуков — и дело в шляпе. В таком случае, не упоминая нюансы самого API, можно переходить к главной теме:
Чтобы послушать настоящие брейкдауны, нам нужно скомбинировать:
Игра на бас-бочке является важным аспектом в хардкоре: вместе с бас-гитарой она делает фон песни. Она сводится к постоянным очередям ударов, темп и ритмический рисунок которых может меняться. Скажем так: партия на кардане напоминает перестрелку. Малый барабан присутствует во всех жанрах рока, и его всегда слышно по резкому звуку со щелчком. Быстрый уличный панк-рок, военный марш — это всё он. Такая классика, как тарелки, конечно, даже не обсуждается, а электрогитару у нас будут представлять два перегруженных звука — приглушенный аккорд и открытая струна (что, как выяснится, беспроигрышная комбинация).
В примере очень простым образом реализовано планирование воспроизведения. Такт там разделен на 8 частей — оставим как есть.
Планировать воспроизведение кардана программа будет следующим образом:
Как по мне, это отличный способ сделать кардан хаотичным подобно тому, как он звучит в хардкоре.
Малый барабан после долгих раздумий было решено проигрывать в каждой части такта случайно. Таким образом мы можем услышать как одиночные удары, так и бластбиты по 8 ударов подрят — либо не услышать вовсе:
Так как кардан и малый барабан у нас случайны, роль поддержания ритма сыграют именно тарелки. Они случайны только отчасти. Например, в первой и пятой части такта тарелки воспроизводятся гарантировано, а в остальных — случайно. Получаем следующую схему:
Электрогитара, как и малый барабан, полностью случайна, с той особенностью — как уже упоминалось — что вместо одного звука здесь чередуются два.
Моя реализация генератора брейкдаунов на JavaScript находится здесь [3].
Также, разумеется, Вы можете просмотреть его исходный код [4] с комментариями на русском языке, в котором реализованы указанные алгоритмы.
Спасибо за внимание!
Автор: IlyaTereschuk
Источник [5]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/67904
Ссылки в тексте:
[1] Audacity: http://audacity.sourceforge.net/
[2] набор примеров: http://www.html5rocks.com/en/tutorials/webaudio/intro/
[3] здесь: http://rockmusiciansmap.com/progressivebreakdowngenerator
[4] исходный код : http://rockmusiciansmap.com/js/progressivebreakdowngenerator/jsMainInitialize.js
[5] Источник: http://habrahabr.ru/post/233959/
Нажмите здесь для печати.