Stepwise patterning 🌀 Bulka

Stepwise patterning (экспериментально)

Это развивающаяся область strudel, и поведение может измениться или быть переименовано в будущих версиях. Отзывы и идеи приветствуются!

Введение

Обычно в strudel единственной точкой отсчета для большинства преобразований patterns является cycle. Теперь также возможно работать с шагами (steps) через растущий набор функций.

Например, обычно когда вы используете fastcat для объединения двух patterns, cycles будут сжаты в половину cycle каждый:

fastcat("bd hh hh", "bd hh hh cp hh").sound()

С новой stepwise функцией stepcat, шаги двух patterns будут равномерно распределены по cycle:

stepcat("bd hh hh", "bd hh hh cp hh").sound()

По умолчанию шаги подсчитываются в соответствии с ‘верхним уровнем’ в mini-notation. Например, "a [b c] d e" имеет пять событий в cycle, но считается как четыре шага, где [b c] считается как один шаг.

Однако вы можете отметить другой метрический уровень для подсчета шагов, используя ^ в начале sub-pattern. Если мы сделаем это с subpattern в нашем примере: "a [^b c] d e", то pattern теперь будет считаться имеющим восемь шагов. Это потому, что ‘b’ и ‘c’ каждый считаются как отдельные шаги, а события в pattern в два раза длиннее, и поэтому считаются как два шага каждое.

Управление темпом шагов

Некоторые stepwise функции сами по себе не кажутся делающими много, например, эти два примера функции expand звучат абсолютно одинаково, несмотря на разные значения расширения:

"c a f e".expand(2).note().sound("folkharp")
"c a f e".expand(4).note().sound("folkharp")

Количество шагов на cycle изменяется за кулисами, но само по себе это ничего не делает. Однако вы услышите разницу, когда используете другую stepwise функцию вместе с ней, например stepcat:

stepcat("c a f e".expand(2), "g d").note()
.sound("folkharp")
stepcat("c a f e".expand(4), "g d").note()
.sound("folkharp")

Вы должны услышать, что expand увеличивает длительность шагов первого subpattern пропорционально второму.

Вы также можете изменить скорость pattern в соответствии с заданным количеством шагов на cycle с помощью функции pace:

stepcat("c a f e".expand(2), "g d").note()
.sound("folkharp")
.pace(8)
stepcat("c a f e".expand(4), "g d").note()
.sound("folkharp")
.pace(8)

Первый пример имеет десять шагов, а второй пример - 18 шагов, но затем оба воспроизводятся со скоростью 8 шагов на cycle.

Аргумент expand также может быть pattern, и будет обрабатываться в stepwise манере. Это означает, что patterns из изменяющихся значений в аргументе будут объединены с помощью stepcat:

note("c a f e").sound("folkharp").expand("3 2 1 1 2 3")

Это приводит к плотному pattern, потому что разные расширенные версии сжаты в один cycle. pace снова удобен здесь для замедления pattern до определенного количества шагов на cycle:

note("c a f e").sound("folkharp").expand("3 2 1 1 2 3").pace(8)

Ранние версии многих из этих функций имели префикс s_, а функция pace ранее была известна как steps. Они все еще существуют как псевдонимы, но поведение могло измениться, и скоро они будут удалены. Пожалуйста, обновите ваши patterns!

Stepwise функции

pace

Экспериментальная

Ускоряет или замедляет паттерн, подгоняя его под заданное число шагов на цикл.

    sound("bd sd cp").pace(4)
    // The same as sound("{bd sd cp}%4") or sound("<bd sd cp>*4")

    stepcat

    Synonyms: timeCat, timecat

    «Склеивает» паттерны, как fastcat, но пропорционально числу шагов за цикл. Шаги могут либо выводиться из паттерна, либо задаваться парой [length, pattern]. Имеет псевдоним timecat.

      stepcat([3,"e3"],[1, "g3"]).note()
      // the same as "e3@3 g3".note()
      stepcat("bd sd cp","hh hh").sound()
      // the same as "bd sd cp hh hh".sound()

      stepalt

      Экспериментальная

      Стыкует паттерны пошагово, согласно выведенному числу «шагов на цикл». Похоже на stepcat, но если аргумент — список, весь паттерн будет чередоваться между элементами списка.

        stepalt(["bd cp", "mt"], "bd").sound()
        // The same as "bd cp bd mt bd".sound()

        expand

        Экспериментально

        Увеличивает размер шага паттерна на заданный множитель.

          sound("tha dhi thom nam").bank("mridangam").expand("3 2 1 1 2 3").pace(8)

          contract

          Экспериментальная

          Сжимает размер шага паттерна на заданный коэффициент. См. также expand.

            sound("tha dhi thom nam").bank("mridangam").contract("3 2 1 1 2 3").pace(8)

            extend

            Экспериментальная

            extend похожа на fast тем, что увеличивает плотность, но при этом соответственно увеличивает и число шагов. Поэтому stepcat("a b".extend(2), "c d") будет эквивалентно "a b a b c d", тогда как stepcat("a b".fast(2), "c d") будет эквивалентно "[a b] [a b] c d".

              stepcat(
                sound("bd bd - cp").extend(2),
                sound("bd - sd -")
              ).pace(8)

              take

              Экспериментально

              Берёт заданное число шагов из паттерна (отбрасывая остальные). Положительное число берёт шаги с начала паттерна, отрицательное — с конца.

                "bd cp ht mt".take("2").sound()
                // The same as "bd cp".sound()
                "bd cp ht mt".take("1 2 3").sound()
                // The same as "bd bd cp bd cp ht".sound()
                "bd cp ht mt".take("-1 -2 -3").sound()
                // The same as "mt ht mt cp ht mt".sound()

                drop

                Экспериментально

                Убирает заданное число шагов из паттерна. Положительное число убирает шаги с начала паттерна, отрицательное — с конца.

                  "tha dhi thom nam".drop("1").sound().bank("mridangam")
                  "tha dhi thom nam".drop("-1").sound().bank("mridangam")
                  "tha dhi thom nam".drop("0 1 2 3").sound().bank("mridangam")
                  "tha dhi thom nam".drop("0 -1 -2 -3").sound().bank("mridangam")

                  polymeter

                  Synonyms: pm

                  Экспериментально

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

                    // The same as note("{c eb g, c2 g2}%6")
                    polymeter("c eb g", "c2 g2").note()

                    shrink

                    Экспериментально

                    Постепенно сокращает паттерн на 'n' шагов, пока ничего не останется, или же, если задано второе значение (через синтаксис списка мининотации с :), указанное число раз. Положительное число постепенно убирает шаги с начала паттерна, отрицательное — с конца.

                      "tha dhi thom nam".shrink("1").sound()
                      .bank("mridangam")
                      "tha dhi thom nam".shrink("-1").sound()
                      .bank("mridangam")
                      "tha dhi thom nam".shrink("1 -1").sound().bank("mridangam").pace(4)
                      note("0 1 2 3 4 5 6 7".scale("C:ritusen")).sound("folkharp")
                         .shrink("1 -1").pace(8)

                      grow

                      Экспериментально

                      Постепенно наращивает паттерн по 'n' шагов, пока не проиграется весь паттерн, либо, если задано второе значение (через синтаксис списков мининотации с :), столько раз. Положительное число постепенно наращивает шаги с начала паттерна, отрицательное — с конца.

                        "tha dhi thom nam".grow("1").sound()
                        .bank("mridangam")
                        "tha dhi thom nam".grow("-1").sound()
                        .bank("mridangam")
                        "tha dhi thom nam".grow("1 -1").sound().bank("mridangam").pace(4)
                        note("0 1 2 3 4 5 6 7".scale("C:ritusen")).sound("folkharp")
                           .grow("1 -1").pace(8)

                        tour

                        Экспериментальная

                        Вставляет паттерн в список паттернов. На первом повторении он вставляется в конец списка, затем на последующих повторениях сдвигается по списку назад. Паттерны складываются пошагово, причём все повторения укладываются в один цикл. Поэтому обычно рекомендуется задавать число шагов на цикл с помощью pace.

                          "[c g]".tour("e f", "e f g", "g f e c").note()
                             .sound("folkharp")
                             .pace(8)

                          zip

                          Экспериментально

                          «Сшивает» (zip) шаги переданных паттернов вместе. Это может создать длинное повторение, укладывающееся в один плотный цикл. Поэтому обычно рекомендуется задавать число шагов на цикл с помощью pace.

                            zip("e f", "e f g", "g [f e] a f4 c").note()
                               .sound("folkharp")
                               .pace(8)