August 12, 2025

время

тут все фулл тайп фич по ченджу времени: замедление, ускорение, реверс времени, смещение времени и ещё. каждую функцию распишу структорой:

  • сигнатура типа: как функция объявлена на стороне Haskell.
  • описание: словесное описание функции.
  • примеры: небольшой список примеров, которые можно скопировать и вставить в редактор.

ускорение, замедление:

fast (ускореный тейк):

fast ускоряет паттерн. например, следующий код воспроизведет звуковую последовательность «bd sn kurt» в два раза быстрее (т.е. она повторится дважды за цикл), а последовательность гласных - в три раза быстрее:

первый параметр может быть паттернизирован, например, чтобы воспроизвести шаблон в два раза быстрее в первой половине каждого цикла, а затем в четыре раза быстрее во второй половине:

также можно вызывать функцию density

fastGap (ускоренный пробел):

fastGap (такж и densityGap) ускоряет паттерн, как и fast, но вместо того, чтобы воспроизводить его в несколько раз быстрее, он оставляет пробел в оставшемся пространстве цикла. например, следующий код воспроизведёт звуковой паттерн «bd sn» только один раз, но сжатым в первую половину цикла, то есть вдвое быстрее:

slow (замедленный тейк)

slow замедляет звучание паттерна. условно, следующий код воспроизведёт звуковой паттерн «bd sn kurt» в два раза медленнее (то есть он будет повторяться каждые два цикла), а гласный паттерн - в три раза медленнее:

sparsity

sparcity применимо так же как и slow

hurry

hurry похожа на fast, поскольку ускоряет паттерн, но также увеличивает контроль скорости во столько же раз, поэтому при запуске сэмплов звук становится выше:

slowSqueeze

slowSqueeze замедляет паттерн в соответствии с заданным паттерном времени. это медленный аналог fastSqueeze. если паттерн времени содержит только одно значение в цикле, slowSqueeze становится = slow:

это = на:

и:

=:

fastSqueeze

fastSqueeze ускоряет паттерн на заданный временной интервал, сжимая полученный паттерн в один цикл и воспроизводя исходный паттерн при каждом повторении.

вообще, можно сравнить его с fast:

у нас будет bd, сыгранный в первой половине цикла, и bd sn — во второй. с другой стороны, используя fastSqueeze;

исходный паттерн будет воспроизводиться в первой половине, а два его повторения - во второй. т.е. каждое повторение содержит весь паттерн.

если временной паттерн имеет единственное значение, он становится = fast:

увеличение, уменьшение масштаба (zi, zo)

compress

функция compress (сжатия) берёт шаблон и сжимает его в заданный временной интервал (типо «дугу»). полученный шаблон представляет собой ускоренную версию исходного.

в приведённом выше примере паттерн будет воспроизводиться по дуге, охватывающей от 25% до 75% длительности цикла. это эквивалентно:

в этом примере все заданные события разные:

он отличается от zoom тем, что сохраняет исходный рисунок, но ускоряет события, чтобы соответствовать новому периоду времени.

zoom

воспроизводит фрагмент паттерна, определяемый началом и концом временного интервала ("дуги"). новый паттерн воспроизводится в течение того же периода времени, что и исходный паттерн:

в приведённом выше шаблоне масштабирование используется по дуге от 25% до 75%. это эквивалентно:

вот пример использования с условным предложением:

within (предел)

юзайте within, чтобы применить функцию только к части шаблона. функция within принимает два аргумента: начальное и конечное время, заданные в виде чисел с плавающей точкой от 0 до 1, которые применяются к соответствующему шаблону. ну и, чтобы функция имела какой-либо эффект, второй аргумент должен быть больше первого.

условно, чтобы применить fast 2 только для первой половины паттерна:

или, чтобы применить (# speed "0.5") только для последней четверти паттерна:

stretch

Stretch берет шаблон, и если в начале или конце текущего цикла есть паузы, он увеличивает масштаб, чтобы их избежать.

вы можете создавать паузы в крайних точках цикла, чтобы вносить изменения в ритм:

shifting time (движение времени)

off

функция off похожа на superimpose тем, что применяет функцию к шаблону и накладывает результаты поверх исходного. разница заключается в том, что off тратит дополнительное время (в циклах) на сдвиг преобразованной версии шаблона.

следующий пример воспроизводит шаблон поверх самого себя, но смещенный на одну восьмую цикла, с применением искажающего эффекта bitcrush:

следующий код создает арпеджио путем добавления смещенных шаблонов, которые перемещаются вверх по шкале:

press

press задерживает звук на половину времени в слоте. если кратко, это превращает каждый знак «a» в [~ a]. каждая доля становится вне бита, и, таким образом, общий эффект заключается в синкопировании тейка паттерна.

в этом примере вы можете услышать, как аккорды фортепиано звучат между малым барабаном и большим. в размере 4/4 они звучат на 2,5 и 4,5 доли.

здесь аккорд C мажор играет перед аккордом G мажор. поскольку слот, занимаемый аккордом С, равен 1/8, press смещает его всего на шестнадцатую ноту.

pressBy

pressBy похож на press, но принимает один дополнительный параметр - смещение шаблона от 0 (включительно) до 1 (исключая). pressBy 0.5 эквивалентен press.

вы можете задавать шаблон смещения, чтобы создавать интересные ритмические эффекты:

rotL

rotL сдвигает шаблон назад во времени на указанное количество циклов. при вычислении происходит переход к четвёртому циклу:

полезно при построении и тестировании длинных последовательностей

rotR

rotR является противоположностью rotL, поскольку сдвигает паттерн вперед во времени.

spin

spin воспроизводит заданное количество копий заданного шаблона управления одновременно. при использовании n копий каждая последующая копия смещается по времени на дополнительную 1/n цикла, а также панорамируется в пространстве на дополнительную n1. эта функция особенно хорошо работает в многоканальных системах.

weave

weave применяет один шаблон управления к списку других шаблонов управления с последовательным смещением по времени:

в приведенном выше примере шаблон управления панорамированием синусоидой замедляется на заданное количество циклов, в частности, на 16, и применяется ко всем заданным звуковым паттернам. прикольно, что шаблон управления панорамированием последовательно смещается для каждого из заданных звуковых паттернов; поскольку панорамирование сужается на 16 циклов, а паттернов четыре, они «распространены», то есть с промежутком в четыре цикла. по этой причине четыре паттерна как будто следуют друг за другом по стереополю. в наушниках это прямо слышно.

можно даже сделать наоборот, чтобы параметры эффекта следовали друг за другом вокруг звукового параметра:

weaveWith

weaveWith аналогичен предыдущему, но использует список функций, а не элементов управления:

Reversing time

rev

rev возвращает «обратную» версию заданного паттерна

условно, rev "1 [~ 2] ~ 3" = rev "3 ~ [2 ~] 1"

важно, что rev меняет цикл за циклом. это означает, что обороты rev (slow 2 "1 2 3 4") на самом деле дадут (slow 2 "2 1 4 3"). это связано с тем, что slow 2 заставляет повторяющийся узор длиться два цикла, каждый из которых меняется независимо.

на практике rev обычно используется с условными предложениями, например с every:

или jux:

jux

jux создаёт странные стереоэффекты, применяя функцию к шаблону, но только в правом канале. например, следующий код переворачивает шаблон в правой части:

при передаче функций в функции вроде jux и every можно связать несколько преобразований вместе с помощью ., например, это одновременно меняет направление и вдвое уменьшает скорость воспроизведения шаблона в правом канале:

juxBy

В Jux исходная и обработанная версии паттерна панорамируются влево и вправо (то есть на 0 и 1). это может показаться слишком резким, оч заметно в наушниках. вариант JuxBy имеет дополнительный параметр, который приближает канал к центру:

Swing

swingBy

Функция swingBy x n разбивает каждый цикл на n фрагментов, а затем задерживает события во второй половине каждого фрагмента на величину x, которая зависит от размера (половины) фрагмента. таким образом, если x равен 0, то ничего не происходит, 0,5 задерживает на половину длительности ноты, а 1 возвращает к нулевому состоянию:

задерживает каждый второй "hh" на 1/3 пути до следующего "hh".

swing

swing - это условное название для swingBy (1/3).

ghost

ghost добавляет более тихие, смещенные по высоте тона копии события за событием, имитируя призрачные ноты, которые часто встречаются в барабанных паттернах.

ghost'

ghost' — это вариация ghost выше, в которой вы также можете указать базовую задержку, используемую для создания шаблона призрачных нот.

Inside/outside

inside

inside выполняет операцию «внутри» цикла. Например, while rev «0 1 2 3 4 5 6 7» = «7 6 5 4 3 2 1 0», inside 2 rev «0 1 2 3 4 5 6 7» даёт «3 2 1 0 7 6 5 4».

фактически эта функция «замедляет» шаблон в заданное число раз, применяет к нему заданную функцию, а затем «ускоряет» его в то же число раз. другими словами, это:

=>

... поэтому вместо целых циклов происходит обратное прохождение каждой половины цикла.

outside

outside является обратной к функции inside. outside применяет свою функцию вне цикла. допустим, у вас есть шаблон, который повторяется 4 цикла, и вы применяете функцию rev:

=>

но если вы возьмёте тейк outside:

=>

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

это сжимает идею в один цикл перед rev, а затем замедляет его до исходной скорости.

Delay functions

echo

функция echo применяет к шаблону своего рода задержку. у неё есть три параметра: depth, time и feedback. depth — целое число, а time и feedback - числа с плавающей запятой.

это добавляет немного эха:

в результате получаются 4 эха, каждое из которых на 50% (то есть 0,5) тише предыдущего, с интервалом в 1/5 (то есть 0,2) цикла между ними.

это ревёрсит эхо:

echoWith

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

в этом случае имеются два наложения, задержанных на 1/3 цикла, к каждому из которых применен фильтр гласных.

каждый шаг становится выше по тону, поскольку последовательно применяется |* speed "1.5".

stut

stutWith

Time shorthands

При работе с функциями времени часто возникает необходимость указывать время, меньшее периода, используя дроби или десятичные числа.

В качестве альтернативы, для обозначения наиболее распространённых длительностей можно использовать текстовые сокращения.

Например, можно заменить 0,25 или 1/4 на сокращение q, которое обозначает четверть периода.

Эти три примера эквивалентны:

вот применимые шорткаты:

мы можем добавлять к этим сокращениям число, чтобы получить кратные. эти два примера звучат одинаково:

для 32, в можете юзать 0.5s:

можно через шорткаты:

но

.