Синтаксис кодирования
Давайте сделаем шаг назад и разберемся, как работает синтаксис в 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!