Привет, Хабр! В прошлой статье «бесконечный узор на основе простых чисел» я рассказал про алгоритм, который позволяет генерировать бесконечные красивые узоры, похожие то ли на инопланетные рисунки, то ли на нечто технологическое, подобно устройству микросхем. Однако, алгоритм для генерирования 2D узоров можно так же использовать и для создания мелодий. Подробнее под катом.
Алгоритм генерации мелодий
Для создания мелодий я сделал простой генератор меандра с затухающим сигналом. При этом можно накладывать несколько генераторов меандра друг на друга. Далее задаем периоды генераторов меандра в соответствии с частотами нот, а амплитуду генераторов задаем в зависимости от наличия «зажатой» клавиши. В качестве сигнала на нажатие клавиши я использовал значение пикселя 2D картинки, взятой из вертикального столбца, который можно перемещать по изображению. Столбец содержит 14 пикселей, что соответствует 7 нотам 2-й и 3-ей октавы. Клавиша имеет только два состояния — нажата или нет.
Генератор меандра и функции для сохранения результата в WAV файл я реализовал как отдельную библиотеку для работы со звуком. Находится она здесь.
Программу для генерации музыки можно просмотреть здесь. Она называется simple_sound. Готовый exe можно найти в архиве. На выходе программа создает WAV файл «example».
Примеры мелодий
Одна из самых интересных мелодий, example_dx1000_dy1000_x2018_y8. В названии мелодии указан размер сдвига по координатам X и Y, а так же начальные координаты. Остальные мелодии:
example_dx_dy_x5678_y7768
example_dx_dy_y776897123
example_y47
example
По идее можно доработать алгоритм и использовать его для примитивных игр, чтобы мелодии в игре никогда не повторялись.
Комментарии (16)
hippus
15.08.2018 00:20>> чтобы мелодии в игре никогда не повторялись
А хорошо ли это, вообще говоря?
Сама идея занятная, но мелодии-то как раз и нет. Мелодия — это осмысленное высказывание, музыку создает композитор, а не закономерность. Музыка — это слишком человеческое, увы )bioxakep
15.08.2018 18:05А зачем на фоне игр «осмысленное высказывание композитора»?
А чем хуже «осмысленное высказывание» программиста?
mwizard
15.08.2018 03:22+1Если у кого не получается скачать из-за хабраэффекта — добавьте файлы к себе в google drive и скачайте zip-архив, тогда гугл не проверит ограничения.
POPSuL
15.08.2018 03:50Да, гуглу не понравился хабраэффект. Перезалейте пожалуйста в более надежное место. :(
mwizard
15.08.2018 04:15Или мой совет про скачивание всего как .zip из своего drive, либо gist.githubusercontent.com/toriningen/79510e6e5a5b94e4943dabf50c08b1ad/raw/11fd289a89d5e7fcbb6a22ca426ca241fff890b8/files.7z.b64 — не знаю, насколько долго гитхаб продержится.
но вообще мне не понравилось. Просто случайный набор звуков, без гармонии, без сюжета, без ничего.POPSuL
15.08.2018 06:07Спасибо! В целом интересно, но до Mubert конечно далеко, очень далеко… Хотя, это скажем так, немного разные вещи...
Заголовок спойлераНе нажимайте на ссылку! Там 13 MB 7z архива закодированного в base64! Только curl/wget, только хардкор!
igordata
15.08.2018 16:41Забавно, даже можно какое-то время слушать.
а можешь не отдельные ноты, а кусочки музыки посмешивать?
bioxakep
15.08.2018 18:28Чтобы мелодию рандома было интересно слушать, рандом должен оперировать не нотами, аккордами или какими-то еще отдельными структурами, а всем пространством структур музыки, воспринимаемых человеком, и исследовать новые. Т. е. например, есть жанр симфонии или оперы с частично повторяющимися темами, как у Аргонова. Аргонов — не ИИ и музыку преимущественно пишет сам, но стремится к инновациям, таким как пиксельная музыка или модернизация «классического» саунда 80-х или 90-х. Есть проекты намеренно сверхзатяжных произведений, воспринимаемых человеком опосредованно; но тут вся инновация — в масштабе и только. А вот когда рандом сделает рандомный общий паттерн повторяемости/уникальности мелодий (на уровне структуры оперы или чего-то более масштабного, но «не-оперу»), рандомную, но гармоничную (не обязательно для нового слушателя, но обладающую внутренними закономерностями) схему этих мелодий и отличий в их вариациях, тональностях, темпах и т. д., и наконец нафарширует это рандомными базовыми элементами мелодий — вот тогда будет Настоящая Рандомная Музыка:)
Иными словами: берем несколько кирпичиков, составляем из них несколько более сложных элементов, из этих элементов — тоже немного вторичных структур, третичных, четвертичных… сколько всего будет уровней организации, хз, можно замутить и процедурно генерируемую «музыкальную Вселенную» типа Space Engine, полное прослушивание которой займет миллиарды лет или вообще потребует нелинейного времени, но для любой заданной локации будет выдаваться детерминированная схема «звезд», т. е. аккордов и прочих структур. И все это потребует не такого уж большого кода.
mokhin-denis
16.08.2018 12:53+1Да, имеет место быть. Однако, в эту музыку нужно добавить побольше музыки, чем просто звучание бипера.
Посмотрите, а главное — послушайте, как звучит число Пи, или как звучат голы футбольных матчей.
DjSens
Не прёт. Практически рандомные ноты, какофония. А вообще тема интересная — как мозг отличает красивые мелодии от некрасивых. Вот где поле для будущих забав с нейросетями.
lizarge
в основах давно все уже расписано, и схемы и все такое. Но вдохновляет пока то что нейросети сделать не могут, различные выходы за рамки.
DjSens
А где софт? Такой чтоб сам уникальные мелодии сочинял в заданном стиле, и басы и ударники и прочее. Чтоб выгрузить в midi формате, а дальше во FrootyLoops'e подобрать инструменты и эффекты
Shmaiser
Есть такая штука, только онлайн: муберт.ком
ELEKTRO_YAR Автор
Попробуйте рандом, там будет действительно какафония. Здесь есть мелодии, они конечно встречаются островками, ну и к тому же, это какой-то 8-ми битный звук по звучанию. Но статья изначально не была ориентирована на гурманов музыки, а им, как известно, и человеком созданная электронная музыка не нравится. Сама идея тут главное, можно улучшить звучание, найти хорошие начальные позиции.
sticks
Можно попробовать использовать не две полные октавы, а какие-нибудь гаммы (натуральный минор, натуральный мажор и т.д.), должно получиться мелодично.