Параметры управления
Помимо функций, которые контролируют время, мы видели ранее, что функции вроде note и cutoff контролируют различные параметры (короткие params) события.
Теперь давайте более внимательно посмотрим, как работают эти функции param(eter).
Функции параметров
Очень мощная особенность tidal patterns - это то, что каждый параметр может контролироваться независимо:
В этом примере параметры note, cutoff, gain и s контролируются независимо либо patterns, либо обычными значениями (числами / текстом).
После нажатия play мы можем наблюдать время и значения параметров каждого события (hap) в выводе, созданном .log().
Обычные vs параметризованные значения
Patterns, которые не обёрнуты в функцию param, будут содержать немаркированные обычные значения:
Это не создаст звукового вывода, потому что Strudel мог бы только догадываться, какой param имеется в виду этими буквами.
Теперь сравните это с версией, обёрнутой в note:
Теперь ясно, что эти буквы предназначены для воспроизведения как ноты.
Под капотом функция note (как и все другие функции param)
обернёт каждое обычное значение в объект. Если бы функции note не существовало, нам пришлось бы писать:
Это будет иметь тот же вывод, хотя это довольно неудобно читать и писать.
Обёртывание функций параметров
Чтобы избежать слишком большой вложенности, функции param также можно связывать в цепочку вот так:
Это эквивалентно note(cat('c','e','g')).log().
Вы можете использовать это с любой функцией, которая объявляет тип (как n, s, note, freq и т.д.), просто убедитесь, что оставляете скобки пустыми!
Модификация обычных значений
Patterns обычных значений могут быть изменены с помощью любого из следующих операторов:
Здесь функция add изменяет числа слева. Снова нет вывода, потому что эти числа не имеют смысла без param.
Модификация значений параметров
Чтобы изменить значение параметра, вы можете либо:
-
Использовать оператор на pattern обычных значений внутри функции param:
-
Аналогично, использовать оператор на pattern обычных значений и обернуть его позже:
-
Указать, какой param должен быть изменён внутри функции оператора:
Помните, что выполнение связанных функций идёт слева направо.
Операторы
Эта группа функций позволяет изменять значение событий.
add
Предполагается pattern из чисел. Добавляет заданное число к каждому элементу в pattern.
// Здесь трезвучие 0, 2, 4 смещается на разные величины
n("0 2 4".add("<0 3 4 0>")).scale("C:major")
// Без add эквивалент был бы:
// n("<[0 2 4] [3 5 7] [4 6 8] [0 2 4]>").scale("C:major")// Вы также можете использовать add с нотами:
note("c3 e3 g3".add("<0 5 7 0>"))
// За кулисами ноты преобразуются в midi-номера:
// note("48 52 55".add("<0 5 7 0>"))sub
Как add, но заданные числа вычитаются.
n("0 2 4".sub("<0 1 2 3>")).scale("C4:minor")
// См. add для получения дополнительной информации.mul
Умножает каждое число на заданный множитель.
"<1 1.5 [1.66, <2 2.33>]>*4".mul(150).freq()
div
Делит каждое число на заданный делитель.
round
Предполагается числовой pattern. Возвращает новый pattern со всеми значениями, округлёнными до ближайшего целого.
n("0.5 1.5 2.5".round()).scale("C:major")floor
Предполагается числовой pattern. Возвращает новый pattern со всеми значениями, установленными в
их математический floor. Например, 3.7 заменяется на 3, а -4.2
заменяется на -5.
note("42 42.1 42.5 43".floor())ceil
Предполагается числовой pattern. Возвращает новый pattern со всеми значениями, установленными в
их математический ceiling. Например, 3.2 заменяется на 4, а -4.2
заменяется на -4.
note("42 42.1 42.5 43".ceil())range
Предполагается числовой pattern, содержащий униполярные значения в диапазоне 0 .. 1. Возвращает новый pattern со значениями, масштабированными в заданный диапазон min/max. Наиболее полезно в сочетании с непрерывными patterns.
s("[bd sd]*2,hh*8")
.cutoff(sine.range(500,4000))rangex
Предполагается числовой pattern, содержащий униполярные значения в диапазоне 0 .. 1 Возвращает новый pattern со значениями, масштабированными в заданный диапазон min/max, следуя экспоненциальной кривой.
s("[bd sd]*2,hh*8")
.cutoff(sine.rangex(500,4000))range2
Предполагается числовой pattern, содержащий биполярные значения в диапазоне -1 .. 1 Возвращает новый pattern со значениями, масштабированными в заданный диапазон min/max.
s("[bd sd]*2,hh*8")
.cutoff(sine2.range2(500,4000))ratio
Позволяет делить числа через list-нотацию, используя ":". Возвращает новый pattern только с числами.
ratio("1, 5:4, 3:2").mul(110)
.freq().s("piano")as
Устанавливает свойства в пакетном режиме.
- mapping (String|Array): названия контроллеров, которые устанавливаются
"c:.5 a:1 f:.25 e:.8".as("note:clip")"{0@2 0.25 0 0.5 .3 .5}%8".as("begin").s("sax_vib").clip(1)Пользовательские параметры
Вы также можете создавать свои собственные параметры:
Несколько params также можно создать более лаконичным способом, используя createParams:
Обратите внимание, что эти params ничего не будут делать, пока вы не придадите им смысл в вашем пользовательском выводе!
От модификации параметров мы переходим к концепции Signals.