изменение
здесь представлены все функции, которые можно использовать для управления и изменения ваших шаблонов. каждая функция представлена по одной и той же схеме:
- сигнатура типа: как функция объявлена на стороне Haskell.
- описание: словесное описание функции.
- примеры: небольшой список примеров, которые можно скопировать и вставить в редактор.
масштабирование
range
range принимает шаблон от 0 до 1 (например, sine) и масштабирует его до другого диапазона - между первым и вторым аргументами. в приведённом ниже примере range 1 1.5 сдвигает диапазон sine с 0 - 1 до 1 - 1.5.
rangex
rangex - это экспоненциальная версия функции range, описанной выше, которую удобно использовать для частот. например, range 20 2000 "0.5" даст 1010 — середину между 20 и 2000. но rangex 20 2000 0.5 даст 200 - середину между ними в логарифмической шкале. обычно это звучит лучше, если вы используете числа в качестве частот основного тона. rangex использует логарифмы, не пытайтесь масштабировать до нуля или ниже!
quantise
функция quantise полезна для округления набора чисел до определённой дроби. тип:
она округлит все значения до ближайшего (1/5)=0,2 и, таким образом, выведет список [0,0;1,2;2,6;3,2;4,8;5,0]. эту функцию можно использовать для приведения непрерывного шаблона, например, синуса, к заданным значениям. в примере:
все выбранные релизы округляются до ближайшей 0,1, а выбранные примечания - до ближайшей 1.
quantise с дробными входными данными выполняет последовательные действия: quantise 0.5 округляет значения до ближайших 2, quantise 0.25 округляет до ближайших 4 и т. д.
Degrade (снижение)
degrade
degrade случайным образом удаляет события из шаблона в 50% случаев. пример использования:
degradeBy
аналогично degrade, degradeBy позволяет контролировать процент удаляемых событий. например, чтобы удалять события в 90% случаев:
unDegradeBy
unDegradeBy - это degradeBy, но с процентом, описывающим, сколько событий в среднем следует сохранять, а не удалять.
repetitions (повторения)
ply
функция ply повторяет каждое событие заданное количество раз:
первый параметр может быть задан как шаблон, так что:
вот пример его условного использования:
stutter
stutter похоже на stut, которое не уменьшает громкость или ply, если вы контролируете временные отрезки. shutter n t повторяет каждое событие в шаблоне n раз, разделенное временем t (в долях цикла).
конкретные функции, которые используют shutter:
stripe
функция stripe повторяет шаблон со случайной скоростью. первый параметр задаёт количество циклов, которые необходимо выполнить. например, stripe 2 повторит шаблон дважды, за два цикла. каждый цикл будет воспроизводиться со случайной скоростью, но таким образом, чтобы общая длительность была одинаковой.
например, в следующем примере начало каждого третьего повторения шаблона d1 будет совпадать с хлопком в шаблоне d2.
slowstripe
функция slowstripe аналогична stripe, но результат также замедлен в n раз (где n - первый параметр функции). это означает, что средняя продолжительность полос составляет ровно один цикл, а каждая n-я полоса начинается на границе цикла. использование:
palindrome
функция palindrome применяет rev к шаблону каждый второй цикл, так что шаблон чередуется в прямом и обратном направлении:
Truncation
trunc
функция trunc обрезает паттерн, так что воспроизводится только его часть. в примере воспроизводятся только первые три четверти паттерна:
можно задать шаблон первого параметра, например, для циклического прохождения трех значений, по одному на цикл:
linger
linger похож на trunc, поскольку он обрезает паттерн, так что воспроизводится только его первая часть. однако, в отличие от trunc, linger повторяет эту часть, чтобы заполнить оставшуюся часть цикла.
например, здесь повторяется первая четверть, поэтому вы слышите только одну повторяющуюся ноту:
или немного интереснее, применяется только каждый четвертый цикл:
ещё можно задать шаблон первого параметра, например, для циклического прохождения трех значений, по одному на цикл:
chunk
chunk делит шаблон на заданное количество частей, а затем циклически проходит по этим частям, применяя заданную функцию к каждой части по очереди (одна часть за цикл):
тут заглавными буквами выделена часть шаблона, к которой в течение четырех циклов применена функция (# speed 2):
chunk'
chunk' делает то же самое, что и chunk, но циклически перебирает части в обратном направлении.
loopFirst
функция loopFirst принимает паттерн и лупит только его первый цикл. например, в следующем коде будет воспроизводиться только сэмпл большого барабана:
эта функция иногда комбинируется для случайной вставки событий из первого цикла в последующие циклы паттерна:
Shuffling and scrambling
bite
функция bite позволяет разбить каждый цикл на заданное количество битов одинакового размера, а затем воспроизводить эти биты по их номерам. похожа на функцию slice, но предназначена для нарезки паттернов, а не сэмплов. этот код разбивает шаблон на четыре бита, а затем воспроизводит их по очереди:
это по сути ничего не меняет, но вы можете изменить порядок этих частей:
shuffle
функция shuffle принимает на вход число и паттерн, делит паттерн на заданное количество частей и возвращает новый паттерн в виде случайной перестановки частей, выбирая по одному элементу каждой части за цикл. что-то типо «выборка без замены». например:
... иногда будет играть "sn bd hh" или "hh sn bd", но никогда не будет играть "bd sn bd" или "hh hh hh", потому что это не перестановка трех частей.
scramble
scramble принимает на вход число и паттерн, делит паттерн на заданное количество частей и возвращает новый паттерн, случайным образом выбирая из них части. = «выборка с заменой».:
... иногда будет воспроизводить "sn bd hh" или "hh sn bd", но также может воспроизводить "bd sn bd" или "hh hh hh", поскольку может составить любую случайную комбинацию из трех частей.
rot
функция rot «вращает» значения в паттерне, сохраняя его структуру. например, в следующем примере каждое значение сместится на позицию на один шаг влево, так что b займёт место a, a — место c, а c — место b:
первый параметр — количество шагов и может быть задан в виде шаблона, например:
это не будет вращать паттерн в течение первых двух циклов, вращать его на единицу в третьем цикле и на три в четвертом цикле.
Step sequencers
step
step действует как простой пошаговый секвенсор, использующий строки. Например, step "sn" "x x 12 " эквивалентен шаблону строк, заданному как "sn ~ sn ~ sn:1 sn:2 ~". step подставляет заданную строку вместо каждого x, вместо каждого числа - строку с двоеточием и числом, а вместо всего остального - добавляет паузу.
другими словами, step генерирует шаблон строк в точности с тем синтаксисом, который нужен для выбора сэмплов, и который можно передать непосредственно в функцию s.
step'
«step'» похож на «step», но имеет более общий характер и использует числа в строке последовательности шагов в качестве индексов в списке строк, которые вы ему даете.
lindenmayer
функция lindenmayer принимает в качестве входных данных целое число b, набор правил системы Lindenmayer и инициирующую строку для генерации строки дерева L-системы из b итераций. её можно использовать вместе со ступенчатой функцией для преобразования сгенерированной строки в воспроизводимый паттерн:
... генерирует L-систему с начальной строкой «0» и сопоставляет ее со списком образцов.
комплекмные деревья L-систем с множеством правил и итераций иногда могут приводить к большим строкам. использование take n для использования только первых n элементов строки, в сочетании с функцией slow, может сделать генерируемые значения более удобными для управления.
Higher-order
spread
функция распространения позволяет использовать преобразование паттерна, принимающее параметр, например, slow, и задать несколько параметров, между которыми можно переключаться. она типо «распространяет» функцию на несколько значений. тут на примере хайхетов:
можно ускорить в несколько раз. условно в 2:
но если юзать spread, то можем создать паттерн, который чередует две скорости:
многие функции такж поддерживают ввод шаблонов. это эквивалентно приведенному выше примеру:
если вы передадите ($) в качестве функции для распределения значений, вы можете указать другие функции в качестве списка значений. например:
к шаблону выше будут применены следующие преобразования, по одному за раз за цикл:
После (# speed "0.8") преобразования повторятся и снова начнутся с density 2.
spreadf
fastspread
fastspread работает так же, как и spread, но результат сжимается в один цикл. если вы зададите для spread четыре значения, то результат ускорится в четыре раза:
spreadChoose
функция spreadChoose (spreadr) работает так же, как и функция spread, но значения выбираются рандомным образом, по одному циклу за раз: