Начало работы 🌀 Bulka

Добро пожаловать

🍞

Добро пожаловать в документацию 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.

Начинаем

Лучший способ начать изучение — пройти воркшоп. Если вы готовы погрузиться, начните с ваших первых звуков