Algorave: Перший Сеанс
Strudel у flok.cc — код як інструмент
Що тут відбувається
Algorave — це музичний перформанс, де звук народжується з коду в реальному часі. Нічого не записується заздалегідь: музикант пише рядки прямо на сцені, і вони одразу стають ритмом.
Strudel — це мова патернів для браузера. Замість того щоб клікати по нотах, описуєш послідовності текстом. flok.cc — спільний редактор, де два курсори можуть редагувати одночасно, як Google Docs, але для музики.
Словник
Flok: запуск
Гарячі клавіші
Перший звук
Написати, виділити, Ctrl+Enter. Звук має з'явитися одразу.
// Один бас-барабан, нескінченно
s("bd")
Тепер змінити звук — написати поруч і теж запустити:
// bd = bass drum, hh = hi-hat, sn = snare, cp = clap
s("hh")
Зупинити
// Зупинити все — написати і запустити:
hush
Ритм і патерн
Всередині лапок — міні-мова для ритму. Пробіл ділить цикл порівно.
// Чотири удари за цикл — рівно
s("bd hh sn hh")
// [] — це підпатерн: два хай-хети на місці одного
s("bd [hh hh] sn [hh hh]")
// hh*4 = чотири хай-хети на місці одного слота
s("bd hh*4 sn hh")
// ~ = тиша (пауза)
s("bd ~ sn ~")
Вибір варіанту семплу
Кожна назва — це папка з кількома семплами. :0, :1, :2 — вибір конкретного.
// Різні варіанти bd
s("bd:0 bd:2 sn:1 hh")
Питання: що якщо елементів більше?
Більше елементів = щільніший ритм, бо цикл ділиться на більше частин:
// 8 елементів — в два рази швидше відчувається
s("bd hh sn hh bd hh sn hh")
// 2 елементи — широко і повільно
s("bd sn")
Трансформації — функції через крапку
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()
// .gain() — гучність. 1 = норма, 0.5 = тихіше
s("bd hh sn hh").gain(0.7)
// .speed() — висота через швидкість семплу
s("bd").speed("1 2 0.5 1.5")
// .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() — кілька ліній одночасно
// stack() запускає всі патерни одночасно
stack(
s("bd ~ sn ~"),
s("hh*8").gain(0.5),
s("~ ~ ~ cp")
)
Як відчути музику в коді
Для природного музиканта найважливіше — почути де "бьє". В Strudel це пряме відображення структури.
Просте правило
Де стоїть bd — там сильна доля. Де sn — слабка. Де ~ — порожньо.
// "бум ... чак ..." — класичний рок
s("bd ~ sn ~")
// "бум-бум чак бум-чак" — більш живе
s("[bd bd] sn [bd sn]")
// Еклектично: змінений sn через кожен такт
s("bd [~ sn] [bd ~] sn")
Ноти і мелодія
// 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
// setcps(0.5) = ~120 BPM (0.5 циклів на секунду)
// setcps(1) = ~240 BPM (швидкий техно)
// setcps(0.3) = ~72 BPM (повільно)
setcps(0.5)
s("bd hh sn hh")
Практика: спробувати разом
Завдання 1 — Перший звук
Завдання 2 — Ритм на слух
Завдання 3 — Обмін слотами
Завдання 4 — every()
// 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) після назви звуку.
// (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 і малювати поруч зі звуком.
Як додати слот
Перший патч
// Простий осцилятор → на екран
osc().out()
// З параметрами: частота, синхронізація, колір
osc(20, 0.1, 1.5).out()
// Ланцюжок: джерело → ефект → ефект → out()
osc(10, 0.1)
.rotate(0.5)
.kaleid(6)
.out()
// noise() + color
noise(4, 0.1)
.color(2, 0, 1)
.out()
// () => ... = функція, що виконується кожен кадр
// time = секунди з моменту запуску
osc(
() => 10 + Math.sin(time) * 5,
0.1
).out()
// Обертання з часом
shape(4)
.rotate(() => time * 0.5)
.out()
Зупинити Hydra
Написати в слоті Hydra і запустити: solid().out() — чорний екран.
Що варто запам'ятати
- Пробіл у лапках = рівний поділ циклу. Більше елементів — щільніший ритм.
- [] підпатерн, * повторення, ~ пауза — три знаки для 90% ритмів.
- Функції через крапку: .fast(), .slow(), .room(), .delay() — як педалі.
- stack() = мікшер. Все що всередині — грає одночасно.
- Ctrl+Enter запускає. Ctrl+. зупиняє все. hush — теж зупинка.