Добро пожаловать
🍞
Добро пожаловать в документацию Bulka! Вы попали в нужное место, если хотите научиться создавать музыку с помощью кода.
Что такое Bulka?
С Bulka вы можете выразительно писать динамические музыкальные произведения.
Это порт языка паттернов Tidal Cycles на JavaScript.
Вам не нужно знать JavaScript или Tidal Cycles, чтобы создавать музыку с Bulka.
Этот интерактивный туториал проведёт вас через основы.
Лучшее место для создания музыки — Bulka REPL
Что можно делать с Bulka?
- лайв-кодинг музыки: создавайте музыку кодом в реальном времени — никаких установок, работает прямо в браузере
- алгоритмическая композиция: бесконечные вариации из нескольких строк кода благодаря уникальному подходу Tidal к паттернам
- тысячи звуков из коробки: драм-машины 808/909, синтезаторы, оркестровые инструменты, фолк со всего мира — всё уже готово к использованию
- AI-ассистент: не знаешь с чего начать? Встроенный агент напишет трек по твоему описанию (OpenAI, Anthropic, Google — на выбор)
- визуализация Hydra: аудио-реактивные визуалы прямо в редакторе — твоя музыка оживает на экране
- шеринг одной ссылкой: скинул ссылку — друг слышит твой трек, без регистрации и скачивания
- обучение: низкий порог входа делает Bulka идеальным для обучения музыке и программированию одновременно
- интеграция: MIDI, OSC — используй Bulka как секвенсор в своём сетапе с железом и DAW
Примеры
Вот несколько примеров того, как может звучать Bulka:
// "coastline" @by eddyflux
// @version 1.0
samples('github:eddyflux/crate')
setcps(.75)
let chords = chord("<Bbm9 Fm9>/4").dict('ireal')
stack(
stack( // DRUMS
s("bd").struct("<[x*<1 2> [~@3 x]] x>"),
s("~ [rim, sd:<2 3>]").room("<0 .2>"),
n("[0 <1 3>]*<2!3 4>").s("hh"),
s("rd:<1!3 2>*2").mask("<0 0 1 1>/16").gain(.5)
).bank('crate')
.mask("<[0 1] 1 1 1>/16".early(.5))
, // CHORDS
chords.offset(-1).voicing().s("gm_epiano1:1")
.phaser(4).room(.5)
, // MELODY
n("<0!3 1*2>").set(chords).mode("root:g2")
.voicing().s("gm_acoustic_bass"),
chords.n("[0 <4 3 <2 5>>*2](<3 5>,8)")
.anchor("D5").voicing()
.segment(4).clip(rand.range(.4,.8))
.room(.75).shape(.3).delay(.25)
.fm(sine.range(3,8).slow(8))
.lpf(sine.range(500,1000).slow(8)).lpq(5)
.rarely(ply("2")).chunk(4, fast(2))
.gain(perlin.range(.6, .9))
.mask("<0 1 1 0>/16")
)
.late("[0 .01]*4").late("[0 .01]*2").size(4)Эти примеры не могут полностью охватить всё разнообразие возможностей. Посмотрите showcase с видео от пользователей Strudel.
Начинаем
Лучший способ начать изучение — пройти воркшоп. Если вы готовы погрузиться, начните с ваших первых звуков