Algorave: Перший Сеанс

Strudel у flok.cc — код як інструмент

Beginner Практика-орієнтовано flok.cc / Strudel

Що тут відбувається

Algorave — це музичний перформанс, де звук народжується з коду в реальному часі. Нічого не записується заздалегідь: музикант пише рядки прямо на сцені, і вони одразу стають ритмом.

Strudel — це мова патернів для браузера. Замість того щоб клікати по нотах, описуєш послідовності текстом. flok.cc — спільний редактор, де два курсори можуть редагувати одночасно, як Google Docs, але для музики.

Ключова ідея
Код тут — це не програмування в звичному сенсі. Це як записати імпровізацію нотами, тільки набагато швидше і дивніше.

Словник

cycle / цикл
Основна одиниця часу в Strudel. Як такт у музиці — всі звуки розподіляються в межах одного циклу.
pattern / патерн
Послідовність звуків або значень, яка повторюється циклічно. Те що в "" лапках — це патерн.
mini-notation
Мова для запису ритму всередині "лапок". Пробіл = рівний розподіл, [] = підпатерн, * = прискорення.
s() / sound()
Функція вибору семплу. s("bd") грає бас-барабан, s("hh") — хай-хет.
note()
Нота або послідовність нот. note("c3 e3 g3") — акорд або мелодія.
Ctrl+Enter
Запустити виділений рядок (або блок). Головна команда. Все решта — деталі.
hush
Зупинити все. Пишеш hush, тиснеш Ctrl+Enter — тиша.
stack()
Запустити кілька патернів одночасно. Як мікшер — всі канали грають паралельно.

Flok: запуск

КРОК 1
Відкрити flok.cc
Зайти на flok.cc → натиснути "New session" → вибрати target: strudel
КРОК 2
Поділитися URL
Скопіювати адресу з браузера і надіслати другу. Він відкриє ту саму сесію — обидва бачать код одночасно.
КРОК 3
Дозволити аудіо
Браузер запитає дозвіл на звук при першому запуску. Натиснути Allow. Звук через WebAudio — встановлювати нічого не треба.
Важливо
Strudel у flok.cc не потребує SuperCollider і нічого встановлювати. Просто браузер. Але потрібен Chrome або Edge — Firefox може не підтримувати WebAudio повністю.

Гарячі клавіші

Ctrl+Enter запустити поточний блок
Ctrl+. зупинити все (hush)
Ctrl+/ закоментувати рядок

Перший звук

Написати, виділити, Ctrl+Enter. Звук має з'явитися одразу.

strudel
// Один бас-барабан, нескінченно
s("bd")

Тепер змінити звук — написати поруч і теж запустити:

strudel
// bd = bass drum, hh = hi-hat, sn = snare, cp = clap
s("hh")
Підказка
Можна пробувати будь-які назви всередині лапок: bd, sn, hh, cp, casio, metal, bass, arp, jazz. Якщо семпл є — почується. Якщо нема — мовчання.

Зупинити

strudel
// Зупинити все — написати і запустити:
hush

Ритм і патерн

Всередині лапок — міні-мова для ритму. Пробіл ділить цикл порівно.

strudel — 4 звуки рівно
// Чотири удари за цикл — рівно
s("bd hh sn hh")
strudel — підпатерн []
// [] — це підпатерн: два хай-хети на місці одного
s("bd [hh hh] sn [hh hh]")
strudel — зірочка *
// hh*4 = чотири хай-хети на місці одного слота
s("bd hh*4 sn hh")
strudel — пауза ~
// ~ = тиша (пауза)
s("bd ~ sn ~")

Вибір варіанту семплу

Кожна назва — це папка з кількома семплами. :0, :1, :2 — вибір конкретного.

strudel
// Різні варіанти bd
s("bd:0 bd:2 sn:1 hh")

Питання: що якщо елементів більше?

Більше елементів = щільніший ритм, бо цикл ділиться на більше частин:

strudel — щільний vs рідкий
// 8 елементів — в два рази швидше відчувається
s("bd hh sn hh bd hh sn hh")

// 2 елементи — широко і повільно
s("bd sn")

Трансформації — функції через крапку

Strudel будується як ланцюжок: патерн → перетворення → ще перетворення. Схоже на педалборд у гітариста.

strudel — швидкість і реверс
// .fast(2) — в два рази швидше
s("bd hh sn hh").fast(2)

// .slow(2) — в два рази повільніше
s("bd hh sn hh").slow(2)

// .rev() — патерн навпаки
s("bd hh sn hh").rev()
strudel — гучність і тон
// .gain() — гучність. 1 = норма, 0.5 = тихіше
s("bd hh sn hh").gain(0.7)

// .speed() — висота через швидкість семплу
s("bd").speed("1 2 0.5 1.5")
strudel — ефекти
// .room() — реверберація. 0–1
s("hh*8").room(0.6)

// .delay() — дилей. 0–1
s("sn ~ ~ sn").delay(0.4)

// .cutoff() — фільтр. 200–8000 Hz
s("bd*4").cutoff(800)

stack() — кілька ліній одночасно

strudel — повноцінний грув
// stack() запускає всі патерни одночасно
stack(
  s("bd ~ sn ~"),
  s("hh*8").gain(0.5),
  s("~ ~ ~ cp")
)
Лайфхак
Закоментуй одну лінію всередині stack() через Ctrl+/ і запусти — звук зміниться миттєво без перезапуску всього.

Як відчути музику в коді

Для природного музиканта найважливіше — почути де "бьє". В Strudel це пряме відображення структури.

Просте правило

Де стоїть bd — там сильна доля. Де sn — слабка. Де ~ — порожньо.

strudel — читання ритму вголос
// "бум ... чак ..." — класичний рок
s("bd ~ sn ~")

// "бум-бум чак бум-чак" — більш живе
s("[bd bd] sn [bd sn]")

// Еклектично: змінений sn через кожен такт
s("bd [~ sn] [bd ~] sn")

Ноти і мелодія

strudel — мелодія
// note() — ноти. c3, e3, g3 = до-мі-соль третьої октави
note("c3 e3 g3 a3").s("piano")

// Мінорний хід
note("a3 c4 e4 g4").s("piano").slow(2)

// Разом: ритм і мелодія
stack(
  s("bd ~ sn ~"),
  note("c3 ~ e3 g3").s("piano").room(0.4)
)

Змінювати BPM

strudel
// setcps(0.5) = ~120 BPM (0.5 циклів на секунду)
// setcps(1) = ~240 BPM (швидкий техно)
// setcps(0.3) = ~72 BPM (повільно)
setcps(0.5)
s("bd hh sn hh")
Нюанс
setcps і патерн — окремі блоки. Виділяти і запускати по черзі, або обидва в одному блоку.

Практика: спробувати разом

Завдання 1 — Перший звук

ДЛЯ ОБОХ
Кожен пише у свій слот: один — s("bd"), другий — s("hh*4"). Запустити по черзі. Почути разом.

Завдання 2 — Ритм на слух

ПРИРОДНИЙ МУЗИКАНТ
Прохлопати або проспівати ритм. Спробувати його записати через bd, sn, hh і ~. Не думати — просто хлопати і відразу писати що чуєш.

Завдання 3 — Обмін слотами

РАЗОМ
Один пише ритм (барабани), другий — мелодію через note(). Обидва грають одночасно у flok-сесії. Щось змінити, не зупиняючи.

Завдання 4 — every()

strudel — every: кожен N-й цикл щось міняється
// every(3, fast(2)) — кожен 3-й цикл: вдвічі швидше
s("bd hh sn hh").every(3, fast(2))

// every(4, rev) — кожен 4-й цикл: реверс
s("bd [hh hh] sn hh").every(4, rev)
Корисні семпли для дослідження

Вбудовані семпли Strudel (можна вставляти в s() ):

bd sn hh cp mt lt ht — ударні

bass bass2 bass3 — баси

piano casio arpy jvbass — тональні

jazz industrial rave voodoo — текстурні

Після назви ставити :0 / :1 / :2 щоб вибрати варіант.

Euclid: математичний ритм

Евклідові ритми — рівномірний розподіл N ударів по K кроках. Записуються через (N, K) після назви звуку.

strudel
// (3,8) = 3 удари по 8 кроках — типовий кубинський ритм
s("bd(3,8)")

// (5,8) = 5 по 8 — відчувається як 5/8
s("hh(5,8)")

Hydra: візуали bonus

Hydra — відеосинтезатор у браузері. В flok.cc можна додати слот з target hydra і малювати поруч зі звуком.

Як додати слот

У FLOK
Кнопка Command (або +) у верхньому правому куті → Add Pane → вибрати target: hydra

Перший патч

hydra — осцилятор
// Простий осцилятор → на екран
osc().out()

// З параметрами: частота, синхронізація, колір
osc(20, 0.1, 1.5).out()
hydra — трансформації
// Ланцюжок: джерело → ефект → ефект → out()
osc(10, 0.1)
  .rotate(0.5)
  .kaleid(6)
  .out()

// noise() + color
noise(4, 0.1)
  .color(2, 0, 1)
  .out()
hydra — анімація через time
// () => ... = функція, що виконується кожен кадр
// time = секунди з моменту запуску
osc(
  () => 10 + Math.sin(time) * 5,
  0.1
).out()

// Обертання з часом
shape(4)
  .rotate(() => time * 0.5)
  .out()
Як мислити Hydra
Hydra — як аналоговий відеосинтезатор. Джерело (osc, noise, shape) → ефекти через крапку → .out() на монітор. Ті самі принципи що й у Strudel, тільки замість звуку — картинка.
Зупинити Hydra

Написати в слоті Hydra і запустити: solid().out() — чорний екран.


Що варто запам'ятати

Наступні теми

every() і when()
Умовні перетворення — "кожен третій цикл роби інакше"
n() і scale()
Мелодичне мислення: автоматичні гами і акорди
rand і choose()
Випадковість як інструмент — ймовірнісний вибір звуків
Tidal Cycles
Оригінальна мова на Haskell — більше можливостей, складніший setup
Hydra глибше
modulate(), feedback loops, аудіо-реактивність через a.fft