Strudel лайв-кодинг: создавайте музыку с помощью кода

Пишите музыкальные паттерны как код и сразу слушайте их во встроенном редакторе Strudel — TidalCycles для браузера.

Выберите стартовый паттерн ниже, нажмите воспроизведение в редакторе, затем меняйте код во время звучания. Это лайв-кодинг: музыка обновляется сразу после повторного вычисления.

Strudel лайв-кодинг: создавайте музыку с помощью кода
Пишите музыкальные паттерны как код и сразу слушайте их во встроенном редакторе Strudel — TidalCycles для браузера.
Стартовые паттерны

Паттерн: Ударные

sound("bd hh sd hh")

Звук начнётся только после нажатия воспроизведения в редакторе. Нужна полная среда с браузером сэмплов и визуализацией? Открыть в полной версии Strudel

Краткая справка по мини-нотации Strudel

Десять конструкций, открывающих большую часть языка паттернов. Всё в двойных кавычках — мини-нотация; одна последовательность в кавычках длится ровно один цикл.

КонструкцияПримерДействие
sound() / s()sound("bd hh sd hh")Воспроизводит именованные сэмплы или синтезаторы: bd = бас-барабан, sd = малый барабан, hh = хай-хэт. Четыре события поровну делят один цикл.
note()note("c4 e4 g4").sound("piano")Воспроизводит высоты по имени (c4, eb3) или MIDI-номеру и отправляет их следующему в цепочке звуку.
* (повтор)sound("hh*8")Вмещает 8 хай-хэтов в длительность одного события — стандартный способ записывать быстрые деления.
~ (пауза)sound("bd ~ sd ~")Тихая ячейка. Сетка событий сохраняет тайминг; тильда просто ничего не воспроизводит.
[ ] (группа)sound("bd [sd sd] bd sd")Квадратные скобки помещают несколько событий в одну ячейку, деля её время; здесь два быстрых малых барабана занимают долю 2.
< > (чередование)note("<c2 eb2 g2>")Угловые скобки проигрывают по одному элементу за цикл, перебирая их по кругу, — мгновенная аккордовая последовательность.
stack()stack(sound("bd*4"), sound("hh*8"))Накладывает паттерны для одновременного звучания — так собирают полную ударную установку или добавляют бас под ударные.
fast() / slow()sound("bd sd").fast(2)Ускоряет или растягивает паттерн: fast(2) помещает два повтора в цикл, slow(2) растягивает один на два цикла.
rev()note("c4 e4 g4 b4").rev()Разворачивает паттерн внутри каждого цикла — мелодическая вариация одним словом.
.euclid(k, n)sound("bd").euclid(3, 8)Распределяет k ударов как можно равномернее по n шагам. euclid(3,8) — ритм tresillo, лежащий в основе множества латиноамериканских и танцевальных грувов.

О Strudel и лайв-кодинге

Лайв-кодинг — это исполнение музыки путём написания и переписывания кода прямо во время звучания. Вместо расстановки нот на временной шкале вы описываете паттерны: бас-барабан на каждую четверть, аккорд, меняющийся с каждым циклом, хай-хэты, сжатые в триоли; язык немедленно превращает эти описания в звук. Измените строку, повторно вычислите её — и музыка преобразится на следующем цикле, не останавливаясь. Вокруг этой практики выросли algorave — клубные вечера, на которых код исполнителей проецируют для танцующей публики. Strudel — JavaScript-воплощение TidalCycles, языка паттернов, созданного Алексом Маклином на Haskell около 2009 года и ставшего общим языком лайв-кодированной музыки. Strudel заново реализует идеи Tidal так, чтобы они полностью работали во вкладке браузера: без инструментария Haskell, аудиосервера SuperCollider и установки. На этой странице во фрейме встроен официальный REPL Strudel с strudel.cc, поэтому вы получаете настоящий редактор — вспышку при вычислении, сообщения об ошибках, встроенные звуки — прямо на странице, а стартовые кнопки загружают рабочие паттерны. Ссылка на полную версию Strudel переносит текущий паттерн в среду с браузером сэмплов и визуализациями. Сердце языков семейства Tidal — цикл: повторяющийся временной отрезок, по умолчанию около двух секунд, которым измеряются все паттерны. Мини-нотация между двойными кавычками разрезает этот цикл. Напишите bd hh sd hh — и получите четыре равных события за цикл: бочка, хэт, малый барабан, хэт. Небольшие правки дают большие музыкальные изменения: звёздочка умножает события, тильда вставляет тишину, квадратные скобки дробят одну ячейку на более быстрые события, а угловые скобки чередуют значения в следующих циклах. Так правка из двух символов становится аккордовой последовательностью. Языки паттернов так увлекают потому, что преобразования сочетаются. Добавьте rev(), чтобы перевернуть мелодию, fast(2), чтобы удвоить скорость, или euclid(3,8), чтобы перераспределить удары в кубинский ритм tresillo. Каждое из них применяется к целым паттернам, а не отдельным нотам, поэтому одна правка меняет всю фактуру. Начните с Ударных, смените имя сэмпла, добавьте звёздочку — и вы уже занимаетесь лайв-кодингом.

Рецепты паттернов для редактора

Скопируйте любой пример во встроенный редактор, нажмите воспроизведение и меняйте их по одному токену.

КодЧто вы услышитеДемонстрируемая идея
sound("bd hh sd hh")Базовый бэкбит: бочка, хэт, малый барабан, хэт, один раз за циклЧетыре события равномерно делят цикл — hello world мини-нотации.
sound("bd*4, hh*8")Бочка four-on-the-floor под потоком восьмых хай-хэтовЗапятая внутри кавычек накладывает последовательности, как компактный stack().
note("<c2 eb2 g1 bb1>").sound("sawtooth").lpf(500)Тёмная фильтрованная басовая линия, меняющая основной тон каждый циклУгловые скобки чередуют по циклам; lpf(500) — низкочастотный фильтр 500 Hz, смягчающий пилу.
sound("bd").euclid(3, 8)Tresillo: удары на шагах 1, 4 и 7 из 8Евклидовы ритмы распределяют 3 удара по 8 шагам как можно равномернее — от кубинского son до EDM.
note("c4 e4 g4 b4").rev().fast(2)Нисходящее арпеджио, сыгранное дважды за циклПреобразования соединяются слева направо: сначала разверните паттерн, затем удвойте скорость.

Как начать лайв-кодинг

  1. Нажмите стартовый паттерн — Ударные, Мелодия, Басовая линия или Полиритмия — чтобы загрузить код во встроенный редактор Strudel.
  2. Нажмите кнопку воспроизведения в редакторе (браузерам нужен щелчок до начала любого звука).
  3. Редактируйте код во время звучания: смените имя сэмпла, добавьте *2 к событию или замените ноту, затем нажмите Ctrl+Enter (Cmd+Enter на Mac) для повторного вычисления.
  4. Наложите больше паттернов с stack() и сформируйте их fast, slow, rev или euclid, используя таблицу выше.
  5. Когда паттерн перерастёт набросок, откройте полную версию Strudel со звуковым браузером и визуализацией.

FAQ по лайв-кодингу в Strudel

Чем Strudel отличается от TidalCycles?
TidalCycles — исходный язык паттернов, написанный на Haskell и обычно используемый с синтезаторным движком SuperCollider. Strudel — официальный родственный проект, переносящий ту же систему паттернов на JavaScript и Web Audio API, поэтому он работает в любом современном браузере без установки. Паттерны и концепции переносятся между ними почти один к одному.
Почему стартовые кнопки перезагружают редактор?
Strudel принимает целую программу через URL: исходник паттерна кодируется base64 в адресе после символа #. Каждая стартовая кнопка направляет встроенный редактор на новый URL с этим паттерном; поэтому ссылка на полную версию Strudel также переносит текущий паттерн.
Почему нет звука, пока я не нажму воспроизведение в редакторе?
Браузеры блокируют любой звук, пока пользователь не взаимодействует со страницей, которая его создаёт; это защита от автозапуска. Фрейм Strudel — отдельная страница, поэтому первое нажатие воспроизведения нужно сделать внутри редактора. После этого повторное вычисление кода обновляет музыку без остановки.
Что такое цикл?
Цикл — единица музыкального времени Tidal и Strudel: повторяющийся отрезок примерно в две секунды при темпе по умолчанию, относительно которого измеряются все паттерны. Последовательность в кавычках, например bd hh sd hh, делит цикл на равные части; fast(2) помещает два цикла в один, а угловые скобки выдают по одному значению за цикл.
Что такое algorave?
Algorave — музыкальное событие, где исполнители создают музыку, а часто и визуализации, вживую, написанием кода; экран обычно проецируют, чтобы зрители видели изменения исходника. Термин появился около 2012 года в сообществе TidalCycles, и теперь algorave проходят по всему миру.
Strudel бесплатен? Почему он встроен во фрейм?
Да. Strudel — бесплатное ПО с открытым исходным кодом, выпущенное сообществом Strudel/TidalCycles по лицензии AGPL-3.0. Встраивание официального редактора strudel.cc сохраняет кодовую базу на её собственном источнике, чётко отделяя её от этого сайта, но даёт вам настоящий постоянно обновляемый REPL, а не копию.