Как сочинить музыку? Где ее готовую взять чтобы, например, озвучить видео на ютубе (и чтобы там не появилась метка о нарушении авторских прав)? Как написать эту самую музыку самому когда никаких мотивов не лезет в голову? Откуда взять идеи о новой мелодии, хотя бы об ее отрывках?
Я поклоняюсь великому непредвзятому рандому. Он то никогда не будет сочинять мелодии на основе уже услышанных на прошлой неделе, не будет, исходя из своих вкусов, выделять одни стили музыки и давить другие, у него нет эмоций и настроения. Он просто берет и делает музыку всех стилей, всех направлений, всех размеров (в пределах возможностей, заложенных в алгоритм).
![](https://habrastorage.org/r/w780q1/storage2/60a/d71/f31/60ad71f31623199df2588ef5c36e0a47.jpg)
И мой рассказ будет посвящен алгоритму, работающему на основе такого рандома, и соответствующему фрагменту софта, проигрывающему свежесочиненные мелодии прямо в колонки или сохраняющему в MID-файлы.
Он был назван Muzz.
Изначально была идея создать генератор мелодий для графического редактора PaintCAD 4Windows. По задумке, он должен был быть одной из дополнительных возможностей, позволяющей генерировать и играть в колонки/наушники что нибудь расслабляющее для комфортного рисования в редакторе. Но в результате нескольких попыток создания мелодий обособленных стилей — алгоритм Muzz был приведен в универсальный вид, генерирующий совершенно случайную (в пределах своих возможностей) музыку различных стилей.
Грустный цирковой вальс
Таинственный вальс
Какой-то сектор газа без припевов
Рок
Флейта и музыкальная шкатулка
Колокола
Трагичный хор
И еще один легкий рок
Итак, если сгенерировать случайную последовательность нот, то с некоторой вероятностью она будет одной из мелодий уже придуманных, или даже тех, которые придумают через год, два, пять, десять лет.
Аналогично, кстати, и с картинками — если сгенерировать картинку из случайных пикселей, то с копеечной вероятностью вы получите еще не нарисованную картину или кадр из неснятого фильма с изображением еще не родившегося актера. Но даже в самой простой по цветности черно-белой картинке один пиксель это 1 бит, и придется сгенерировать порядочное количество пикселей, например, для картинки 100х100 — это 10000 пикселей или 2^10000 вариантов картинки. Из этого ясно, что вероятность получения красивой картинки весьма и весьма мала.
А в музыке все немного проще — каждая нота это число в пределах нескольких октав. Например, в MIDI — каждая нота это число от 0 до 127.
Сгенерировав случайную последовательность нот одинаковой длительности — получим музыкальный мусор. Чтобы получить что-то более красивое — надо задуматься: «а что же такое — музыка?».
В алгоритме Muzz я задумался и поделил музыку на три части:
Барабанный ритм — будем сочинять попсу, рок, что нибудь с четким ритмом. Иногда ритм может быть не включен в конечный результат.
Аккомпанемент — каждый такт играется определенный стиль аккомпанемента, в соответствии с текущим аккордом. Для этого сначала алгоритмом создается очередь аккордов. Играется аккомпанемент определенным инструментом.
Мелодия — в один момент времени активна одна нота, ноты могут иметь разные длительности. Также могут быть паузы различных длительностей. Ноты соответствуют текущему аккорду аккомпанемента. Инструмент может быть как тот же, что и в аккомпанементе, так и другой.
Чтобы получить что нибудь подальше от «какофонии» и поближе к «шедевру» — нужно задать определенные начальные условия. И формировать музыку в соответствии с ними.
Следующие параметры (начальные условия) были выбраны, как задаваемые пользователем и поступающие на вход алгоритма:
1) Окрас: грустная, нормальная, веселая.
2) Размер: от 2/8 до 8/8. Например, 3/8 это вальс, 6/8 (т.е. 3/4) — тоже вальс, но длинный, а 2/8, 4/8 или 8/8 — обычная попса, рок и т.п.
3) Набор инструментов: в MIDI существует 16 наборов инструментов (по 8 в каждом, например, клавишные или медные духовые). При создании музыки можно взять инструменты для мелодии и аккомпанемента из одного набора (как будто скрипач и бас-скрипач играют, или два пианиста). Но можно взять и из разных.
4) Наличие или отсутствие барабанов
5) Наличие вступления
6) Количество куплетов (от Минимального до Максимального значения, выбирается алгоритмом случайно между мин и макс)
7) Наличие припевов
8) Наличие заключения.
Вот так они выбираются и редактируются в окошке:
![](https://habrastorage.org/r/w1560/storage2/75b/806/5d3/75b8065d3c7c2a95b047c06bac677ca8.png)
Вот это служебное окно с «удобным» интерфейсом не показывается никому кроме тех, кто запустит PaintCAD 4Windows с ключом -muzz в командной строке. Предполагается, что пользователь просто запускает на проигрывание композитор Muzz и слушает музыку, не видя никаких его интерфейсов (см. раздел Управление композитором в конце статьи). Но алгоритм генерации использует как раз все эти флажки, поля, движки и прочие компоненты в своей работе:
![](https://habrastorage.org/r/w1560/storage2/5a3/c87/ccc/5a3c87ccc7a94317c45dcf08d0b17bb9.png)
Посередине этого окошка три поля: «Исходник», «Подготовленные» и «Мелодия».
Скрипт №1 записывается в поле «Исходник». В нем лежат и аккорды, и служебные команды («переключить ритм барабанов», «сменить инструмент», «сменить образец ритмики мелодии» и т.д.).
Затем очищенный от служебных команд он поступает в список «Подготовленные» — это получается Скрипт №2. Там лежит чистая последовательность аккордов. Один аккорд на один такт музыки.
Кроме того, при записывании в поле «Подготовленные» чистых аккордов — генерируется сама мелодия и закладывается в поле «Мелодия» по «N=размер» нот на такт как скрипт №3. Если размер создаваемой мелодии 8/8 — то на один аккорд будет создано 8 нот, если 3/8 — то на один аккорд будет 3 ноты.
Алгоритм генерации должен по входным параметрам выбрать Барабанные ритмы для вступления, куплетов, припевов, заключения. Были заложены несколько ритмов под размер, кратный двойке. Алгоритм просто выбирает один из них, стараясь делать вступления и куплеты по силе ритма меньше/равными припевам. Возможные стили показаны в фрейме «Стиль барабанов» (команда SDS): Рок 1, Рок 2, Спокойный ритм, Энергичный ритм.
Также есть галка «Выход» с полем с цифрой A — это пятый стиль, который подмешивается к любому из четырех вышеупомянутых, делая акцент в виде удара тарелок в конце такта (A=0) или даже в виде удара тарелок и нескольких ударов барабана (A=1). Конкретный стиль «выхода» (A=0 или 1) выбирается рандомно при генерации каждой следующей мелодии.
А еще номер «патча» — если там поставить 16, то snare-барабаны будут мощные (из power-набора). В зависимости от громкости и агрессивности инструментов аккомпанемента и мелодии — иногда алгоритм выбирает мощные барабаны.
При размере мелодии 8/8 ритм проигрывается целиком, остальные размеры рвут ритм, начиная в следующем такте его с первой ноты. При этом ритмы достаточно легко приспосабливаются «для вальса» или для экзотических размеров 5/8 или 7/8, и на слух все вроде бы отлично.
Т.к. есть три окраса мелодий «Грустные», «Нормальные», «Веселые», то для каждого из них заложен свой набор аккордов, из которых алгоритм выбирает и складывает последовательности аккордов.
Грустные:
Am, E, Dm — опорные, используются как для мелодии, так и для вступительного и заключительного аккорда куплетов/припевов/вступлений/заключений
E7, F, G, C, A7, A#7, B7 — обычные, используются вместе с опорными для генерации промежуточных аккордов в куплетах/припевах/вступлениях/заключениях
E6, Dm6 — очень грустные аккорды, используются редко, но метко.
К ним вдобавок поставляется таблица связей. Она сделана для исключения несозвучной постановки аккордов в песне. Таблица связей для грустных аккордов рекомендует:
после A7 — брать следующим аккордом Dm,
после A#7, B7, E6 и Dm6 — брать следующим аккордом E.
Алгоритм выполняет эти рекомендации для любого окраса мелодии лишь в 50% случаев, чтобы осталась «отдушина» в оставшихся 50% случаев сгенерировать что нибудь необычное и неординарное.
Нормальные:
Смесь из мажорных и минорных аккордов в прикуску с септами.
Am, E, Dm, G, C, F — опорные и они же основные.
A7, D7, E7, C7, G7, F7, A#7, B7 — редкоиспользующиеся.
Таблица связей:
после A7 — брать следующим аккордом Dm,
после D7 — брать следующим аккордом E,
после E7 — брать следующим аккордом Am,
после A#7, B7 — брать следующим аккордом E.
Веселые:
Мажоры как они есть.
C,F,G — опорные
C7, F7, G7 — основные
D — редкоиспользующийся
Таблица связей:
рекомендации отсутствуют
Чтобы создавать одинаковые куплеты и припевы на протяжении всей песни — была введена скрипт-команда Lx, позволяющая скопировать в данное место аккорд номер x и соответствующие ему ноты мелодии. Например, если есть 4 аккорда, то их легко повторить так:
1 Am
2 G
3 C
4 E
5 L1 (сюда встанет Am)
6 L2 (сюда встанет G)
7 L3 (сюда встанет C)
8 L4 (сюда встанет Am)
При генерации аккордов — каждый новый аккорд может быть взят вместе с мелодией из другого аккорда, причем в любой последовательности, например:
1 Am
2 G
3 C
4 E
5 L3 (сюда встанет С)
6 Dm
7 L1 (сюда встанет Am)
8 L5 (сюда встанет C, до этого скопированный в пятую строку)
Таким образом, формируется по одному образцу вступления, куплета и припева. Второе вступление/куплет/припев ссылаются на первый образец и при генерации «скрипта №2» они превращаются из Lx в нормальные аккорды (и мелодия перетаскивается из первого образца копированием).
Для аккомпанемента и мелодии нужно выбрать инструменты. В MIDI, на мой взгляд, бывают тихие инструменты, громкие инструменты и кривые инструменты. Была составлена на слух таблица, где 0 — тихий, 1 — громкий, 2 — кривой инструмент. Слушались чистые звуки из базы GM.dls, поставляемой с виндоусом. Может быть на других базах «кривые» звуки не такие и кривые, но мы рассчитываем на массового потребителя, слушающего миди с этой стандартной базой.
Алгоритм старается выбирать для припевов инструменты громче чем для куплетов. Также он старается избегать кривых инструментов (хотя не на 100%, чтобы иногда создать мелодию с необычным звучанием).
Последние два фрагмента таблицы по 8 инструментов — это ударные (Percussive) и звуковые эффекты (Sound effects, свистки, аплодисменты, крики, стрельба и т.п.), они вообще не используются для аккомпанемента и мелодий. Но на всякий случай в таблицу были добавлены тоже.
Инструменты выбираются отдельной для вступления, куплетов, припевов с увеличенной вероятностью быть одинаковыми для всех этих частей нашей мелодии. Выбранные значения выставляются служебными командами SAN (SetAccompNumber) и SMN (SetMelodyNumber) в скрипте №1 в начале каждой части мелодии (например, «Am:SMN30:SAN40»).
На данный момент в Muzz есть 6 стилей аккомпанемента, и алгоритм выбирает их случайно для вступления, куплетов и припевов с увеличенной вероятностью не менять их между вступлением, куплетами, припевами. Лежат эти стили во фрейме «Стиль аккордов (SAS)».
С помощью этих стилей может сгенерироваться как гитарная песня «постой, паровоз, не стучите колеса» (если повезет, и в качестве инструмента будет выбрана акустическая гитара, а барабаны будут пропущены), так и более жесткие ритмические мелодии или наоборот расслабляющие тропические ритмы.
Как было упомянуто выше, при добавлении чистого аккорда в скрипт №2 «Подготовленные» — параллельно с ним записываются N нот или пауз в скрипт №3 «Мелодия», где N — музыкальный размер от 2 (это 2/8) до 8 (это 8/8).
В нижней части окна есть много флажков, рандомно выставляемых при генерации каждой новой мелодии.
Ноты могут выбираться рандомно из гаммы текущего аккорда аккомпанемента, могут при включении флажка «Оставить 1,3,5,7 ноты из гаммы» — выбираться только эти четыре ноты (первая, третья, пятая, седьмая) из гаммы, также можно начинать все такты с основной первой ноты аккорда (флажок «Начинать все такты с акк.ноты»).
Также для частей мелодии (вступления, куплетов, припевов) выбирается случайная расстановка нот или расстановка по образцу длиной 8 цифр вида «00100101». Где 1 — там надо вставить ноту, где 0 там пропуск. Таким образом, иногда алгоритм делает мелодии вступления, куплеты и припевы с определенной ритмикой. Отвечает за это флажок «По образцу (P):» и поле рядом с ним, а в скрипте №1 — служебная команда «Pxxxxxxxx» (или просто «P», если нужно отключить мелодию по образцу). Сам образец в ходе генерации создается случайным способом, поэтому ритмика может быть какой угодно.
Если образец не задан, то выбор «вставить ноту или паузу» делается алгоритмом с учетом движка «Наполнение, % (SFC)», расположенного в нижней части окна. Наполнение также задается рандомно для каждой новой мелодии (от 20 до 40%).
Чтобы мелодии не звучали однообразно на одних и тех же частотах — рандомный фактор влияет на темп (время одного тика, игры одной ноты), задаваемый в поле «Пауза, мс (ST)» в миллисекундах, а также на транспонирование всей мелодии вместе с аккомпанементом на указанное в поле "+полутоны" количество полутонов (оно выбирается рандомно от 0 до 5, чтоб звуки не убегали далеко вверх).
Вот оно — сгенерирован первый скрипт, а на его основе — скрипт №2 (аккорды) и №3 (мелодия):
![](https://habrastorage.org/r/w1560/storage2/5de/3ef/624/5de3ef6243863a0929f91b64d9199476.png)
Интерфейс управления является простым подразделом меню «Экстра» в паинткаде.
Горизонтальное меню в паинткаде по умолчанию скрыто (чтоб не мешалось) — нажмите «ноль» на клавиатуре чтобы показать его (или мышкой кнопку «меню» в левом верхнем углу окна под значком кисти).
![](https://habrastorage.org/r/w1560/storage2/705/901/a96/705901a963089ae0b166c286e3909a92.png)
Чтобы запустить сочинение и проигрывание — жмем в меню «Играть» или Ctrl+P. Во время проигрывания на статус-панели главного окна паинткада отображается выбранный окрас песни, текущий такт и количество тактов:
![](https://habrastorage.org/r/w1560/storage2/24b/eac/4cd/24beac4cd869310c5fbcb7b0a662f498.png)
Чтобы остановить проигрывание — жмем тот же пункт (или то же сочетание клавиш). Следующий запуск проигрывания — уже новая сгенерированная мелодия.
Если играющая мелодия вам понравилась и вы хотите оставить ее себе на память — во время проигрывания выберите «Сохранить проигрываемую мелодию в MID» (или просто нажмите Alt+P). На время сохранения проигрывание будет приостановлено и продолжено только после сохранения (на том же месте, где была остановка).
Если хотите указать, какие мелодии генерировать и проигрывать, их окрас, размер и прочие параметры — выбираем в меню пункт «Настройки» или жмем «Ctrl+Shift+P». Настройки сохраняются после выхода из паинткада и будут подгружены при следующем запуске паинткада.
Если прослушивание мелодий в паинткаде вас не устраивает, нет времени — можно быстро сгенерировать от 1 до 100 мелодий и сохранить их в MID-файлы в выбранную папку, а потом уже в ручном режиме кликать файлы, слушать, удалять непонравившиеся. В этом вам поможет пункт «MIDI-бластер» (или сочетание клавиш Shift+P):
![](https://habrastorage.org/r/w1560/storage2/cdb/44f/093/cdb44f0937611daaa757f005c78a6876.png)
Из MIDI-песен можно с помощью любого музредактора (например, FruityLoops с плагином LSD) сгенерировать MP3 файлы, а уже потом использовать их хоть для озвучки роликов на youtube, хоть в собственных играх в качестве музыкального сопровождения.
Также можно их использовать как основу для создания своих собственных сочинений — все полученные MIDI файлы могут быть открыты любым MIDI-редактором, например, Cakewalk Sonar. Внутри MID-файла каждая партия «барабаны», «мелодия», «аккомпанемент» лежит в отдельном треке. Смена инструментов в пределах трека задается событиями («эвентами», см.event list), поэтому при желании можно вырезать из полученной музыки любой фрагмент, снести эвенты задания инструмента и утащить этот фрагмент в свою песню.
1) Скачайте последнюю версию бесплатного графического редактора PaintCAD 4Windows 1.2.2 по ссылке blackstrip.ru/pcw.rar (10 Мегабайт). Распакуйте в пустую папку.
2) Запустите paintcad.exe
3) Жмите Ctrl+P для запуска/остановки композитора Muzz до тех пор, пока он не выдаст вам нормальную мелодию. Или другие упомянутые выше сочетания клавиш. Или нажмите «0», а затем в меню выберите «Экстра»-«Генератор музыки Muzz» и там соответствующий пункт.
![](https://habrastorage.org/r/w1560/storage2/b2c/c2a/116/b2cc2a1167e7eb3fe2890a8875f4edde.png)
Сейчас в качестве барабанных ритмов используются простых ритмы по 8 тиков на такт. Поэтому есть идеи пустить параллельное тактирование по 32 тика на такт. И использовать рандомно-сгенерированные последовательности ритмов, где есть четкий стержень (например, 1 удар каждые 8 тиков), а остальное намазывается поверх случайным образом. Тогда должны получиться хип-хоп ритмы и другие необычные ритмы с плавающими акцентами.
И таблицы связей между аккордами, показанные выше, неидеальны. Хорошо бы иметь для каждого предыдущего аккорда набор вероятностей по постановке следующего. Тогда можно просканировать творчество (вручную прослушать и посчитать где сколько и каких аккордов, собрать из них набор аккордов, посмотреть с чего начинается и чем заканчивается каждый куплет, припев и проигрыш и т.д.) какой либо музыкальной группы, и вывести общую формулу что «после Am у них идет Dm в 40% случаев, а G в 10% случаев» и так для всех аккордов из набора. Получится туча аккордов с вероятностными связями между собой, свойственная творчеству именно этой музыкальной группы.
И тогда, наверное, можно будет выбирать «мне бы создать пару песен Арии, пару песен Агаты кристи и одну от Prodigy».
Я поклоняюсь великому непредвзятому рандому. Он то никогда не будет сочинять мелодии на основе уже услышанных на прошлой неделе, не будет, исходя из своих вкусов, выделять одни стили музыки и давить другие, у него нет эмоций и настроения. Он просто берет и делает музыку всех стилей, всех направлений, всех размеров (в пределах возможностей, заложенных в алгоритм).
![](https://habrastorage.org/storage2/60a/d71/f31/60ad71f31623199df2588ef5c36e0a47.jpg)
И мой рассказ будет посвящен алгоритму, работающему на основе такого рандома, и соответствующему фрагменту софта, проигрывающему свежесочиненные мелодии прямо в колонки или сохраняющему в MID-файлы.
Он был назван Muzz.
Изначально была идея создать генератор мелодий для графического редактора PaintCAD 4Windows. По задумке, он должен был быть одной из дополнительных возможностей, позволяющей генерировать и играть в колонки/наушники что нибудь расслабляющее для комфортного рисования в редакторе. Но в результате нескольких попыток создания мелодий обособленных стилей — алгоритм Muzz был приведен в универсальный вид, генерирующий совершенно случайную (в пределах своих возможностей) музыку различных стилей.
Примеры получающейся музыки (MIDI-файлы)
Грустный цирковой вальс
Таинственный вальс
Какой-то сектор газа без припевов
Рок
Флейта и музыкальная шкатулка
Колокола
Трагичный хор
И еще один легкий рок
Как «сочинить» музыку программно
Итак, если сгенерировать случайную последовательность нот, то с некоторой вероятностью она будет одной из мелодий уже придуманных, или даже тех, которые придумают через год, два, пять, десять лет.
Аналогично, кстати, и с картинками — если сгенерировать картинку из случайных пикселей, то с копеечной вероятностью вы получите еще не нарисованную картину или кадр из неснятого фильма с изображением еще не родившегося актера. Но даже в самой простой по цветности черно-белой картинке один пиксель это 1 бит, и придется сгенерировать порядочное количество пикселей, например, для картинки 100х100 — это 10000 пикселей или 2^10000 вариантов картинки. Из этого ясно, что вероятность получения красивой картинки весьма и весьма мала.
А в музыке все немного проще — каждая нота это число в пределах нескольких октав. Например, в MIDI — каждая нота это число от 0 до 127.
Сгенерировав случайную последовательность нот одинаковой длительности — получим музыкальный мусор. Чтобы получить что-то более красивое — надо задуматься: «а что же такое — музыка?».
Что же это такое?
В алгоритме Muzz я задумался и поделил музыку на три части:
Барабанный ритм — будем сочинять попсу, рок, что нибудь с четким ритмом. Иногда ритм может быть не включен в конечный результат.
Аккомпанемент — каждый такт играется определенный стиль аккомпанемента, в соответствии с текущим аккордом. Для этого сначала алгоритмом создается очередь аккордов. Играется аккомпанемент определенным инструментом.
Мелодия — в один момент времени активна одна нота, ноты могут иметь разные длительности. Также могут быть паузы различных длительностей. Ноты соответствуют текущему аккорду аккомпанемента. Инструмент может быть как тот же, что и в аккомпанементе, так и другой.
Входные параметры алгоритма
Чтобы получить что нибудь подальше от «какофонии» и поближе к «шедевру» — нужно задать определенные начальные условия. И формировать музыку в соответствии с ними.
Следующие параметры (начальные условия) были выбраны, как задаваемые пользователем и поступающие на вход алгоритма:
1) Окрас: грустная, нормальная, веселая.
2) Размер: от 2/8 до 8/8. Например, 3/8 это вальс, 6/8 (т.е. 3/4) — тоже вальс, но длинный, а 2/8, 4/8 или 8/8 — обычная попса, рок и т.п.
3) Набор инструментов: в MIDI существует 16 наборов инструментов (по 8 в каждом, например, клавишные или медные духовые). При создании музыки можно взять инструменты для мелодии и аккомпанемента из одного набора (как будто скрипач и бас-скрипач играют, или два пианиста). Но можно взять и из разных.
4) Наличие или отсутствие барабанов
5) Наличие вступления
6) Количество куплетов (от Минимального до Максимального значения, выбирается алгоритмом случайно между мин и макс)
7) Наличие припевов
8) Наличие заключения.
Вот так они выбираются и редактируются в окошке:
![](https://habrastorage.org/storage2/75b/806/5d3/75b8065d3c7c2a95b047c06bac677ca8.png)
Порядок генерации
Вот это служебное окно с «удобным» интерфейсом не показывается никому кроме тех, кто запустит PaintCAD 4Windows с ключом -muzz в командной строке. Предполагается, что пользователь просто запускает на проигрывание композитор Muzz и слушает музыку, не видя никаких его интерфейсов (см. раздел Управление композитором в конце статьи). Но алгоритм генерации использует как раз все эти флажки, поля, движки и прочие компоненты в своей работе:
![](https://habrastorage.org/storage2/5a3/c87/ccc/5a3c87ccc7a94317c45dcf08d0b17bb9.png)
Посередине этого окошка три поля: «Исходник», «Подготовленные» и «Мелодия».
Скрипт №1 записывается в поле «Исходник». В нем лежат и аккорды, и служебные команды («переключить ритм барабанов», «сменить инструмент», «сменить образец ритмики мелодии» и т.д.).
Затем очищенный от служебных команд он поступает в список «Подготовленные» — это получается Скрипт №2. Там лежит чистая последовательность аккордов. Один аккорд на один такт музыки.
Кроме того, при записывании в поле «Подготовленные» чистых аккордов — генерируется сама мелодия и закладывается в поле «Мелодия» по «N=размер» нот на такт как скрипт №3. Если размер создаваемой мелодии 8/8 — то на один аккорд будет создано 8 нот, если 3/8 — то на один аккорд будет 3 ноты.
Выбор барабанного ритма
Алгоритм генерации должен по входным параметрам выбрать Барабанные ритмы для вступления, куплетов, припевов, заключения. Были заложены несколько ритмов под размер, кратный двойке. Алгоритм просто выбирает один из них, стараясь делать вступления и куплеты по силе ритма меньше/равными припевам. Возможные стили показаны в фрейме «Стиль барабанов» (команда SDS): Рок 1, Рок 2, Спокойный ритм, Энергичный ритм.
Также есть галка «Выход» с полем с цифрой A — это пятый стиль, который подмешивается к любому из четырех вышеупомянутых, делая акцент в виде удара тарелок в конце такта (A=0) или даже в виде удара тарелок и нескольких ударов барабана (A=1). Конкретный стиль «выхода» (A=0 или 1) выбирается рандомно при генерации каждой следующей мелодии.
А еще номер «патча» — если там поставить 16, то snare-барабаны будут мощные (из power-набора). В зависимости от громкости и агрессивности инструментов аккомпанемента и мелодии — иногда алгоритм выбирает мощные барабаны.
При размере мелодии 8/8 ритм проигрывается целиком, остальные размеры рвут ритм, начиная в следующем такте его с первой ноты. При этом ритмы достаточно легко приспосабливаются «для вальса» или для экзотических размеров 5/8 или 7/8, и на слух все вроде бы отлично.
Выбор набора аккордов по окрасу
Т.к. есть три окраса мелодий «Грустные», «Нормальные», «Веселые», то для каждого из них заложен свой набор аккордов, из которых алгоритм выбирает и складывает последовательности аккордов.
Грустные:
Am, E, Dm — опорные, используются как для мелодии, так и для вступительного и заключительного аккорда куплетов/припевов/вступлений/заключений
E7, F, G, C, A7, A#7, B7 — обычные, используются вместе с опорными для генерации промежуточных аккордов в куплетах/припевах/вступлениях/заключениях
E6, Dm6 — очень грустные аккорды, используются редко, но метко.
К ним вдобавок поставляется таблица связей. Она сделана для исключения несозвучной постановки аккордов в песне. Таблица связей для грустных аккордов рекомендует:
после A7 — брать следующим аккордом Dm,
после A#7, B7, E6 и Dm6 — брать следующим аккордом E.
Алгоритм выполняет эти рекомендации для любого окраса мелодии лишь в 50% случаев, чтобы осталась «отдушина» в оставшихся 50% случаев сгенерировать что нибудь необычное и неординарное.
Нормальные:
Смесь из мажорных и минорных аккордов в прикуску с септами.
Am, E, Dm, G, C, F — опорные и они же основные.
A7, D7, E7, C7, G7, F7, A#7, B7 — редкоиспользующиеся.
Таблица связей:
после A7 — брать следующим аккордом Dm,
после D7 — брать следующим аккордом E,
после E7 — брать следующим аккордом Am,
после A#7, B7 — брать следующим аккордом E.
Веселые:
Мажоры как они есть.
C,F,G — опорные
C7, F7, G7 — основные
D — редкоиспользующийся
Таблица связей:
рекомендации отсутствуют
Повторы
Чтобы создавать одинаковые куплеты и припевы на протяжении всей песни — была введена скрипт-команда Lx, позволяющая скопировать в данное место аккорд номер x и соответствующие ему ноты мелодии. Например, если есть 4 аккорда, то их легко повторить так:
1 Am
2 G
3 C
4 E
5 L1 (сюда встанет Am)
6 L2 (сюда встанет G)
7 L3 (сюда встанет C)
8 L4 (сюда встанет Am)
При генерации аккордов — каждый новый аккорд может быть взят вместе с мелодией из другого аккорда, причем в любой последовательности, например:
1 Am
2 G
3 C
4 E
5 L3 (сюда встанет С)
6 Dm
7 L1 (сюда встанет Am)
8 L5 (сюда встанет C, до этого скопированный в пятую строку)
Таким образом, формируется по одному образцу вступления, куплета и припева. Второе вступление/куплет/припев ссылаются на первый образец и при генерации «скрипта №2» они превращаются из Lx в нормальные аккорды (и мелодия перетаскивается из первого образца копированием).
Выбор инструментов
Для аккомпанемента и мелодии нужно выбрать инструменты. В MIDI, на мой взгляд, бывают тихие инструменты, громкие инструменты и кривые инструменты. Была составлена на слух таблица, где 0 — тихий, 1 — громкий, 2 — кривой инструмент. Слушались чистые звуки из базы GM.dls, поставляемой с виндоусом. Может быть на других базах «кривые» звуки не такие и кривые, но мы рассчитываем на массового потребителя, слушающего миди с этой стандартной базой.
Вот эта таблица инструментов
Instvol:array [0..127] of Integer=(
1, 1, 1, 1, 0, 0, 0, 0,
0, 2, 1, 1, 0, 2, 1, 0,
1, 1, 1, 1, 1, 1, 1, 1,
0, 1, 1, 0, 1, 1, 1, 2,
1, 0, 0, 1, 1, 0, 1, 1,
1, 1, 1, 1, 0, 0, 1, 2,
1, 2, 0, 0, 1, 0, 0, 2,
1, 1, 1, 0, 1, 0, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
0, 1, 0, 0, 2, 2, 0, 0,
1, 1, 0, 2, 1, 0, 2, 1,
0, 2, 1, 1, 0, 2, 1, 2,
1, 2, 2, 1, 1, 2, 1, 1,
1, 1, 0, 1, 0, 1, 1, 0,
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1
);
1, 1, 1, 1, 0, 0, 0, 0,
0, 2, 1, 1, 0, 2, 1, 0,
1, 1, 1, 1, 1, 1, 1, 1,
0, 1, 1, 0, 1, 1, 1, 2,
1, 0, 0, 1, 1, 0, 1, 1,
1, 1, 1, 1, 0, 0, 1, 2,
1, 2, 0, 0, 1, 0, 0, 2,
1, 1, 1, 0, 1, 0, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1,
0, 1, 0, 0, 2, 2, 0, 0,
1, 1, 0, 2, 1, 0, 2, 1,
0, 2, 1, 1, 0, 2, 1, 2,
1, 2, 2, 1, 1, 2, 1, 1,
1, 1, 0, 1, 0, 1, 1, 0,
1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1
);
Алгоритм старается выбирать для припевов инструменты громче чем для куплетов. Также он старается избегать кривых инструментов (хотя не на 100%, чтобы иногда создать мелодию с необычным звучанием).
Последние два фрагмента таблицы по 8 инструментов — это ударные (Percussive) и звуковые эффекты (Sound effects, свистки, аплодисменты, крики, стрельба и т.п.), они вообще не используются для аккомпанемента и мелодий. Но на всякий случай в таблицу были добавлены тоже.
Инструменты выбираются отдельной для вступления, куплетов, припевов с увеличенной вероятностью быть одинаковыми для всех этих частей нашей мелодии. Выбранные значения выставляются служебными командами SAN (SetAccompNumber) и SMN (SetMelodyNumber) в скрипте №1 в начале каждой части мелодии (например, «Am:SMN30:SAN40»).
Выбор стиля аккомпанемента
На данный момент в Muzz есть 6 стилей аккомпанемента, и алгоритм выбирает их случайно для вступления, куплетов и припевов с увеличенной вероятностью не менять их между вступлением, куплетами, припевами. Лежат эти стили во фрейме «Стиль аккордов (SAS)».
С помощью этих стилей может сгенерироваться как гитарная песня «постой, паровоз, не стучите колеса» (если повезет, и в качестве инструмента будет выбрана акустическая гитара, а барабаны будут пропущены), так и более жесткие ритмические мелодии или наоборот расслабляющие тропические ритмы.
Генерация мелодии
Как было упомянуто выше, при добавлении чистого аккорда в скрипт №2 «Подготовленные» — параллельно с ним записываются N нот или пауз в скрипт №3 «Мелодия», где N — музыкальный размер от 2 (это 2/8) до 8 (это 8/8).
В нижней части окна есть много флажков, рандомно выставляемых при генерации каждой новой мелодии.
Ноты могут выбираться рандомно из гаммы текущего аккорда аккомпанемента, могут при включении флажка «Оставить 1,3,5,7 ноты из гаммы» — выбираться только эти четыре ноты (первая, третья, пятая, седьмая) из гаммы, также можно начинать все такты с основной первой ноты аккорда (флажок «Начинать все такты с акк.ноты»).
Также для частей мелодии (вступления, куплетов, припевов) выбирается случайная расстановка нот или расстановка по образцу длиной 8 цифр вида «00100101». Где 1 — там надо вставить ноту, где 0 там пропуск. Таким образом, иногда алгоритм делает мелодии вступления, куплеты и припевы с определенной ритмикой. Отвечает за это флажок «По образцу (P):» и поле рядом с ним, а в скрипте №1 — служебная команда «Pxxxxxxxx» (или просто «P», если нужно отключить мелодию по образцу). Сам образец в ходе генерации создается случайным способом, поэтому ритмика может быть какой угодно.
Если образец не задан, то выбор «вставить ноту или паузу» делается алгоритмом с учетом движка «Наполнение, % (SFC)», расположенного в нижней части окна. Наполнение также задается рандомно для каждой новой мелодии (от 20 до 40%).
Темп мелодии и транспонирование
Чтобы мелодии не звучали однообразно на одних и тех же частотах — рандомный фактор влияет на темп (время одного тика, игры одной ноты), задаваемый в поле «Пауза, мс (ST)» в миллисекундах, а также на транспонирование всей мелодии вместе с аккомпанементом на указанное в поле "+полутоны" количество полутонов (оно выбирается рандомно от 0 до 5, чтоб звуки не убегали далеко вверх).
Окно Muzz после окончания генерации
Вот оно — сгенерирован первый скрипт, а на его основе — скрипт №2 (аккорды) и №3 (мелодия):
![](https://habrastorage.org/storage2/5de/3ef/624/5de3ef6243863a0929f91b64d9199476.png)
Управление композитором
Интерфейс управления является простым подразделом меню «Экстра» в паинткаде.
Горизонтальное меню в паинткаде по умолчанию скрыто (чтоб не мешалось) — нажмите «ноль» на клавиатуре чтобы показать его (или мышкой кнопку «меню» в левом верхнем углу окна под значком кисти).
![](https://habrastorage.org/storage2/705/901/a96/705901a963089ae0b166c286e3909a92.png)
Чтобы запустить сочинение и проигрывание — жмем в меню «Играть» или Ctrl+P. Во время проигрывания на статус-панели главного окна паинткада отображается выбранный окрас песни, текущий такт и количество тактов:
![](https://habrastorage.org/storage2/24b/eac/4cd/24beac4cd869310c5fbcb7b0a662f498.png)
Чтобы остановить проигрывание — жмем тот же пункт (или то же сочетание клавиш). Следующий запуск проигрывания — уже новая сгенерированная мелодия.
Если играющая мелодия вам понравилась и вы хотите оставить ее себе на память — во время проигрывания выберите «Сохранить проигрываемую мелодию в MID» (или просто нажмите Alt+P). На время сохранения проигрывание будет приостановлено и продолжено только после сохранения (на том же месте, где была остановка).
Если хотите указать, какие мелодии генерировать и проигрывать, их окрас, размер и прочие параметры — выбираем в меню пункт «Настройки» или жмем «Ctrl+Shift+P». Настройки сохраняются после выхода из паинткада и будут подгружены при следующем запуске паинткада.
Если прослушивание мелодий в паинткаде вас не устраивает, нет времени — можно быстро сгенерировать от 1 до 100 мелодий и сохранить их в MID-файлы в выбранную папку, а потом уже в ручном режиме кликать файлы, слушать, удалять непонравившиеся. В этом вам поможет пункт «MIDI-бластер» (или сочетание клавиш Shift+P):
![](https://habrastorage.org/storage2/cdb/44f/093/cdb44f0937611daaa757f005c78a6876.png)
Куда девать все эти MIDI-песни?
Из MIDI-песен можно с помощью любого музредактора (например, FruityLoops с плагином LSD) сгенерировать MP3 файлы, а уже потом использовать их хоть для озвучки роликов на youtube, хоть в собственных играх в качестве музыкального сопровождения.
Также можно их использовать как основу для создания своих собственных сочинений — все полученные MIDI файлы могут быть открыты любым MIDI-редактором, например, Cakewalk Sonar. Внутри MID-файла каждая партия «барабаны», «мелодия», «аккомпанемент» лежит в отдельном треке. Смена инструментов в пределах трека задается событиями («эвентами», см.event list), поэтому при желании можно вырезать из полученной музыки любой фрагмент, снести эвенты задания инструмента и утащить этот фрагмент в свою песню.
Хочу послушать/погенерировать мелодии
1) Скачайте последнюю версию бесплатного графического редактора PaintCAD 4Windows 1.2.2 по ссылке blackstrip.ru/pcw.rar (10 Мегабайт). Распакуйте в пустую папку.
2) Запустите paintcad.exe
3) Жмите Ctrl+P для запуска/остановки композитора Muzz до тех пор, пока он не выдаст вам нормальную мелодию. Или другие упомянутые выше сочетания клавиш. Или нажмите «0», а затем в меню выберите «Экстра»-«Генератор музыки Muzz» и там соответствующий пункт.
![](https://habrastorage.org/storage2/b2c/c2a/116/b2cc2a1167e7eb3fe2890a8875f4edde.png)
Перспективы
Сейчас в качестве барабанных ритмов используются простых ритмы по 8 тиков на такт. Поэтому есть идеи пустить параллельное тактирование по 32 тика на такт. И использовать рандомно-сгенерированные последовательности ритмов, где есть четкий стержень (например, 1 удар каждые 8 тиков), а остальное намазывается поверх случайным образом. Тогда должны получиться хип-хоп ритмы и другие необычные ритмы с плавающими акцентами.
И таблицы связей между аккордами, показанные выше, неидеальны. Хорошо бы иметь для каждого предыдущего аккорда набор вероятностей по постановке следующего. Тогда можно просканировать творчество (вручную прослушать и посчитать где сколько и каких аккордов, собрать из них набор аккордов, посмотреть с чего начинается и чем заканчивается каждый куплет, припев и проигрыш и т.д.) какой либо музыкальной группы, и вывести общую формулу что «после Am у них идет Dm в 40% случаев, а G в 10% случаев» и так для всех аккордов из набора. Получится туча аккордов с вероятностными связями между собой, свойственная творчеству именно этой музыкальной группы.
И тогда, наверное, можно будет выбирать «мне бы создать пару песен Арии, пару песен Агаты кристи и одну от Prodigy».