Параметры управления 🌀 Bulka

Параметры управления

Помимо функций, которые контролируют время, мы видели ранее, что функции вроде 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.