время
тут все фулл тайп фич по ченджу времени: замедление, ускорение, реверс времени, смещение времени и ещё. каждую функцию распишу структорой:
- сигнатура типа: как функция объявлена на стороне Haskell.
- описание: словесное описание функции.
- примеры: небольшой список примеров, которые можно скопировать и вставить в редактор.
ускорение, замедление:
fast (ускореный тейк):
fast ускоряет паттерн. например, следующий код воспроизведет звуковую последовательность «bd sn kurt» в два раза быстрее (т.е. она повторится дважды за цикл), а последовательность гласных - в три раза быстрее:
первый параметр может быть паттернизирован, например, чтобы воспроизвести шаблон в два раза быстрее в первой половине каждого цикла, а затем в четыре раза быстрее во второй половине:
densityfastGap (ускоренный пробел):
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 и 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, которое обозначает четверть периода.
мы можем добавлять к этим сокращениям число, чтобы получить кратные. эти два примера звучат одинаково: