Синтаксис кодирования 🌀 Bulka

Синтаксис кодирования

Давайте сделаем шаг назад и разберемся, как работает синтаксис в Strudel.

Взгляните на этот простой пример:

note("c a f e").s("piano")
  • У нас есть слово note, за которым следуют скобки () с некоторыми словами/буквами/цифрами внутри, окруженными кавычками "c a f e"
  • Затем у нас есть точка ., за которой следует еще один похожий фрагмент кода s("piano").
  • Мы также видим, что эти тексты подсвечены с использованием цветов: слово note фиолетовое, скобки () серые, а содержимое внутри "" зеленое. (Цвета могут отличаться, если вы изменили тему по умолчанию)

Что произойдет, если мы попытаемся “сломать” этот паттерн разными способами?

note(c a f e).s(piano)
note("c a f e")s("piano")
note["c a f e"].s{"piano"}

Хорошо, кажется, ни один из них не работает…

s("piano").note("c a f e")

Этот работает, но теперь мы слышим только первую ноту…

Так что же здесь происходит?

Функции, аргументы и цепочки

До сих пор мы видели следующий синтаксис:

xxx("foo").yyy("bar")

В общем, xxx и yyy называются функциями, в то время как foo и bar называются аргументами или параметрами функции. До сих пор мы использовали функции для объявления того, каким аспектом звука мы хотим управлять, а их аргументы - для фактических данных. Функция yyy называется цепной функцией, потому что перед ней стоит точка (.).

В общем, идея цепочек заключается в том, что код вроде a("this").b("that").c("other") позволяет функциям a, b и c выполняться в определенном порядке, без необходимости писать их как три отдельные строки кода. Вы можете думать об этом как о соединении аудиоэффектов вместе с помощью гитарных педалей или цифровых аудиоэффектов.

Strudel активно использует цепные функции. Вот более сложный пример:

note("a3 c#4 e4 a4")
.s("sawtooth")
.cutoff(500)
//.delay(0.5)
.room(0.5)

Напишите свою собственную цепную функцию

Вы можете написать свою собственную цепную функцию, используя register. Вот приведенная выше цепочка, зарегистрированная как переиспользуемая цепная функция.

const effectChain = register('effectChain', (pat) => pat
  .s("sawtooth")
  .cutoff(500)
  //.delay(0.5)
  .room(0.5)
)
note("a3 c#4 e4 a4").effectChain()

Попробуйте добавить .rev() после effectChain(), чтобы услышать дополнительные эффекты.

Комментарии

// в приведенном выше примере - это строчный комментарий, в результате которого функция delay игнорируется. Это удобный способ быстро включать и выключать код. Попробуйте раскомментировать эту строку, удалив // и обновив паттерн. Вы также можете использовать сочетание клавиш cmd-/ для переключения комментариев.

Вы могли заметить, что некоторые комментарии в примерах REPL содержат слова, начинающиеся с ”@”, например @by или @license. Это всего лишь соглашение для определения некоторой информации о музыке. Мы поговорим об этом в разделе Метаданные музыки.

Строки

Хорошо, а что насчет содержимого внутри кавычек (например, "c a f e")? В JavaScript, как и в большинстве языков программирования, это содержимое называется строкой. Строка - это просто последовательность отдельных символов. В TidalCycles строки в двойных кавычках используются для написания patterns с использованием mini-notation, и время от времени вы можете услышать фразу pattern string. Если вы хотите создать обычную строку, а не паттерн, вы можете использовать одинарные кавычки, например, 'C minor' не будет интерпретироваться как Mini Notation.

Хорошая новость в том, что это охватывает большую часть синтаксиса JavaScript, необходимого для Strudel!