Дзень добрый, комрады.

Решил я как-то упростить себе часть музыкальной жизни, а именно автоматизировать выбор сэмплов для музыки (или, скорее, для «битов»).

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


Чтобы быстрее получить результат, упростим наши требования к музыке.

Будем строить наш трэк из трёх компонентов:

  • Перкуссия
  • Бас
  • Мелодия

И будем сравнивать компоненты по двум параметрам:

  • Тональность
  • Темп

В целом, с этими «правилами» музыка уже будет достаточно гармоничной.



Что нам нужно, чтобы всё работало? Исходники — разные сэмплы для каждого из трёх компонентов. И программа, которая будет эти исходники рандомно комбинировать и показывать результат.

Алгоритм такой:

  • Выбираем рандомное число от 50 до 180 (темп; вполне могут быть другие границы, по хорошему, нужно задать минимальный и максимальный темпы имеющихся аудио сэмплов)
  • Далее выбираем рандомную букву от A до G (тональность)
  • С вероятностью 40% добавляем к букве # (более мелкая подстройка тональности)
  • С вероятностью в 50% добавляем к тональности букву m (определяем, если тональность будет минорная — грустная, или останется мажорной — весёлой)
  • И потом парсим уже подготовленные файлы (перкуссия, бас и мелодия у нас лежат в корне по папкам drums, bass и melody)

    **Здесь я воспользовался хитростью, темп и тональность сэпмла указывается в названии файла, но, на деле, это один из лучших незатратных способов передать данные о сэмпле в код.

  • Для удобства я добавил три кнопки:

    • Save — если комбинация понравилась, можно сохранить все дорожки раздельно в папку и потом уже использовать в DAW или где угодно
    • Next/Prev — чтобы передвигаться по истории сгенерированных «комбинаций»

Из-за имеющегося опыта, в плане кода я остановился на связке Kotlin+Swing (для UI)+JSyn (для воспроизведения аудио).

На выходе у нас получается простенькое окно со всей нужной информацией:





Пример работы программы:




Из улучшений, запланированных и незапланированных, вполне можно добавить более умный выбор темпа (не рандом между А и Б, а пройти по всем папкам и динамически выбрать рамки). Ещё можно использовать не три дорожки, а больше. На FX, на эффекты. Можно сделать генерацию миди мелодий, скармливать «инструментам», накладывать какие-то тоже рандомно выбранные фильтры и эффекты — и в итоге у нас получится практически бесконечное процедурное радио.





Исходники программы:

shorturl.at/wCGR9
Структура директории:

root
— data
— — drums
— — bass
— — melody
— Kaleidophone.jar
— Kaleidophone.exe

Всем спасибо за внимание! Жду и надеюсь на идеи и комментарии. Хорошего дня!