Как стать автором
Обновить

Ещё немного автоматической генерации музыки

Время на прочтение3 мин
Количество просмотров25K

Недавно на хабре мы видели несколько интересных подходов к автоматическому написанию музыки. Позвольте представить ещё один. Сразу оговорюсь: я не буду здесь пользоваться никакими правилами гармонии. Сложной математики тоже не будет. Решим задачу наиболее простым способом. Если вам не очень интересно, как это всё делалось, можете пролистать вниз, там есть несколько примеров, можно сразу оценить, как звучит результат.

Итак, мы хотим написать нечто достаточно музыкальное.

С чего начать?


Здесь можно пойти несколькими путями – опираться на мелодию или на последовательность аккордов. Само по себе построение красиво звучащей мелодии – достаточно нетривиальная задача, поэтому подойдём со стороны аккордов.

Как выбирать аккорды?

Очевидно, в нашей будущей композиции (да, композиции, не меньше) должны принимать участие не всевозможные аккорды, мы ведь не хотим, чтобы результат звучал аляповато? Поэтому придумаем правило, по которому будем их выбирать. Все наши аккорды состоят из нескольких музыкальных звуков (нот). Из 12 полутонов A,A#,B,C,C#,D,D#,E,F,F#,G,G# мы выберем, например: A,B,C,D,E,F,G и дальше будем работать лишь с теми аккордами, которые можно составить из выбранных нот.



Начнём самое интересное?


Теперь мы имеем всё, что нам нужно, чтобы начать написание нашей нетленки. Представим, что бы сделал в этом случае, например начинающий гитарист, который только что научился брать аккорды и больше ничего не умеет. Он берёт гитару или другой его любимый музыкальный инструмент и начинает перебирать всевозможные сочетания полученных аккордов. Иногда, когда ему везёт, он берёт карандаш и записывает на листке в клетку удачные сочетания аккордов, а потом пробует соединить их разными способами. Иногда у него получается.

Примерно таким же образом к проблеме должна подходить и наша программа. Мы проиграем пользователю некую короткую последовательность аккордов и спросим, что он думает по этому поводу. Затем запишем все полученные оценки и попробуем из этих данных собрать нечто стоящее.

Что и как оценивать?


Для начала нам придётся решить, какой длины отрывки мы должны выдавать пользователю для оценки. Полагаю, двух аккордов будет маловато. Значит, следует опираться на что-то от 3 до 5 аккордов за раз. Просто потому, что у нас нет армии людей, оценивающих звучание, которая бы потребовалась для более длинных последовательностей. Аппликатуры аккордов я использовал гитарные. Мне этот инструмент наиболее близок.



Всё готово?

Пусть мы потратили последние несколько суток на обучение нашей программы и имеем обширную базу. Как же объединить всё это для получения чего-то по-настоящему красивого. Нет ничего проще! Пусть мы хотим получить хорошую последовательность 12 аккордов. Напишем какую-нибудь последовательность, разрежем её на много кусочков по 3-5 аккордов. А каждый (или почти каждый) из этих кусочков мы уже оценили! Просто сложим все полученные оценки и вуаля, мы оценили всю последовательность. Остаётся лишь найти последовательность с максимальной оценкой. Это можно сделать тысячей разных способов. Я применил генетический алгоритм. Просто потому, что работает быстро и есть множество готовых реализаций для разных языков программирования.

Мелодическая часть

Конечно, полученная последовательность аккордов сама по себе ещё не является законченным произведением, но, если записать её мелодически, может звучать достаточно красиво. Для своих первых тестов я использовал очень простой метод записи. Берём гитарную аппликатуру аккорда, сначала записываем на стане нижнюю и верхнюю ноты, а затем остальные последовательно снизу вверх. В общем, смотрите сами:



Программная реализация


Всё описанное выше было мной реализовано полгода назад, в новогоднюю ночь. Алгоритм в некоторых местах был немного сложнее, но это несущественно. Позднее появилась веб-версия, в которой каждый желающий мог помочь с наполнением базы. На данный момент веб-версия недоступна в связи с аппаратными проблемами на сервере.

Локальная версия: ссылка.
Советую запускать локальную версию не на дефолтовом синтезаторе Gervill. От звучания синтезатора очень сильно зависит оценка последовательностей. В архиве лежит файлик chord_weigths.txt – уже обученная база, в которую можно добавлять свои записи (копировать из окна программы trainee). Автоматически ничего не сохраняется.

Примеры работы

1,2,3,4,5,6
Слушаем и наслаждаемся (ну, или проклинаем автора как вариант).
Так или иначе, жду ваших отзывов :)
Теги:
Хабы:
+33
Комментарии42

Публикации

Изменить настройки темы

Истории

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн