Дзень добрый, комрады.
Решил я как-то упростить себе часть музыкальной жизни, а именно автоматизировать выбор сэмплов для музыки (или, скорее, для «битов»).
Результат я творчески решил назвать Калейдофон. По аналогии с калейдоскопом, который создаёт боесконечные новые рисунки из уже имеющихся объектов.
Чтобы быстрее получить результат, упростим наши требования к музыке.
Будем строить наш трэк из трёх компонентов:
И будем сравнивать компоненты по двум параметрам:
В целом, с этими «правилами» музыка уже будет достаточно гармоничной.
Что нам нужно, чтобы всё работало? Исходники — разные сэмплы для каждого из трёх компонентов. И программа, которая будет эти исходники рандомно комбинировать и показывать результат.
Алгоритм такой:
Из-за имеющегося опыта, в плане кода я остановился на связке Kotlin+Swing (для UI)+JSyn (для воспроизведения аудио).
На выходе у нас получается простенькое окно со всей нужной информацией:
Пример работы программы:
Из улучшений, запланированных и незапланированных, вполне можно добавить более умный выбор темпа (не рандом между А и Б, а пройти по всем папкам и динамически выбрать рамки). Ещё можно использовать не три дорожки, а больше. На FX, на эффекты. Можно сделать генерацию миди мелодий, скармливать «инструментам», накладывать какие-то тоже рандомно выбранные фильтры и эффекты — и в итоге у нас получится практически бесконечное процедурное радио.
Исходники программы:
shorturl.at/wCGR9
Структура директории:
root
— data
— — drums
— — bass
— — melody
— Kaleidophone.jar
— Kaleidophone.exe
Всем спасибо за внимание! Жду и надеюсь на идеи и комментарии. Хорошего дня!
Решил я как-то упростить себе часть музыкальной жизни, а именно автоматизировать выбор сэмплов для музыки (или, скорее, для «битов»).
Результат я творчески решил назвать Калейдофон. По аналогии с калейдоскопом, который создаёт боесконечные новые рисунки из уже имеющихся объектов.
Чтобы быстрее получить результат, упростим наши требования к музыке.
Будем строить наш трэк из трёх компонентов:
- Перкуссия
- Бас
- Мелодия
И будем сравнивать компоненты по двум параметрам:
- Тональность
- Темп
В целом, с этими «правилами» музыка уже будет достаточно гармоничной.
Что нам нужно, чтобы всё работало? Исходники — разные сэмплы для каждого из трёх компонентов. И программа, которая будет эти исходники рандомно комбинировать и показывать результат.
Алгоритм такой:
- Выбираем рандомное число от 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
Всем спасибо за внимание! Жду и надеюсь на идеи и комментарии. Хорошего дня!
k12th
А почему 40%?
k12th
И не проще ли тогда выбирать из 12 полутонов?
GavriKos
Причем с весами. А то да, будет ми диез и фа бемоль…
NonGrate Автор
40%, потому что навскидку «чистые» тональности немного чаще используются.
Если выбирать из 12 полутонов — то потом всё равно нужно будет переводить их в буквенное обозначение, потому что в аудио сэмплах в названии файла именно буквы.
Плюс, могут потеряться «странные» тональности типа E# и B# (но это уже притягивание за уши).
Плюс нужно учитывать миноры-мажоры — и для правильного рандома нужно выбирать из 24х вариантов.
Для PoC я решил, что будет достаточно просто rand(A..G).map(/*add #*/).map(/*add m*/).
myrrc
А еще можно взять строи, в которых не 12 полутонов.
NonGrate Автор
Однозначно. С помощью JSyn достаточно только иметь список "дозволенных" частот — а это рассчитать несложно