условия
на этой странице представлены все функции, которые можно использовать для добавления условий в ваши шаблоны. Каждая функция представлена по одной и той же схеме:
- Сигнатура типа: как функция объявлена на стороне Haskell.
- Описание: словесное описание функции.
- Примеры: небольшой список примеров, которые можно скопировать и вставить в редактор.
условия по номерам циклов
every
every позволяет применять другую функцию по условию. она принимает три входных параметра: частоту применения функции (например, 3 - каждые 3 цикла), применяемую функцию и шаблон, к которому она применяется.
например: чтобы инвертировать шаблон каждые три цикла (а для двух других циклов воспроизводить его как обычно).
если что-то не так каждая функция будет считать, что ей передано слишком много параметров
every'
every' - это обобщение функции every, принимающее один дополнительный аргумент. дополнительный аргумент позволяет сместить применяемую функцию.
например, every' 3 0 (fast 2) ускорит цикл на циклах 0, 3, 6,…, тогда как every' 3 1 (fast 2) преобразует шаблон на циклах 1, 4, 7,…
c учётом этого, установка второго аргумента every' to 0 даёт эквивалент функции every. типо, every 3 эквивалентно every' 3 0.
foldEvery
функция foldEvery аналогична объединению нескольких функций every в цепочку. она преобразует шаблон с помощью функции один раз за любой из заданного количества циклов. если конкретный цикл является началом более чем одного из заданных периодов цикла, то он применяется более одного раза.
первые сэмплы Moog настроены на C2, C3 и C4. Обратите внимание, что на циклах, кратных 3 или 5, высота звука на октаву выше, а на циклах, кратных 15, высота звука на две октавы выше, поскольку преобразование применяется дважды.
when
преобразование шаблона применяется только тогда, когда заданная тестовая функция возвращает значение True. тестовая функция будет вызвана с текущим циклом в качестве числа:
выше применит лайн 4 к паттерну только в том случае, если номер текущего цикла содержит число 4. таким образом, четвёртый цикл будет лайновый, четырнадцатый и так далее. после 399 дико начинается...
whenT
преобразование заданного шаблона применяется только тогда, когда заданная тестовая функция возвращает true. оно отличается от when тем, что передаёт непрерывное значение времени вместо номера цикла. условно, это Rational версия when.
вышеуказанное будет применять # speed 2 только тогда, когда остаток текущего time, деленный на 2, меньше 0,5.
whenmod
whenmod имеет схожую форму и поведение с every, но требует дополнительного числа. функция применяет её к паттерну, когда остаток от деления номера текущего цикла на первый параметр больше или равен второму параметру. например, следующий код fast каждый второй блок из четырёх циклов вдвое:
ifp
ifp решает, применять ли ту или иную функцию, в зависимости от результата тестовой функции, которая передаётся в текущий цикл как число:
это применит striate 4 для каждого четного цикла и # coarse "24 48" для каждого нечетного цикла.
Conditions on ControlPatterns
fix
fix применяет другую функцию для сопоставления событий в шаблоне элементов управления. fix - это контраст, в котором функция ложного ветвления установлена на идентификатор id:
тут добавляется управление crush только в том случае, если параметр n установлен на 1 или 4.
unfix
unfix — это fix, но оно применяется только в случае несовпадения паттерна тестирования.
contrast
contrast похож на оператора if-else над шаблонами. для contrast t f p можно представить t как истинну, f - как ложь, а p как проверочный элемент.
для сравнения, вы можете использовать любой управляющий паттерн для проверки равенства: n "<0 1>", speed "0.5" и т.п. это позволяет выбрать конкретные свойства паттерна, который вы преобразуете, для проверки:
где каждая нота, не являющаяся до первой октавы, будет смещена на октаву вниз, а до первой октавы - вверх до до5.
поскольку тест на контрастность также является паттерном, можно, чередовать опции:
если послушаете это, то услышите, как попеременно между циклами происходит смещение инструмента вверх и инструмента вниз.
contrastBy
contrastBy — это более общая версия функции contrast, в которой можно указать произвольную булеву функцию, которая будет использоваться для сравнения контрольных паттернов. например, сама функция contrast определяется как contrastBy (==), что позволяет проверять равенство.
выбор шаблонов и функций
choose
choose выдает поток случайно выбранных значений из заданного списка в виде непрерывного паттерна:
wchoose
функция wchoose похожа на функцию choose, но позволяет «взвешивать» варианты, чтобы вероятность выбора некоторых вариантов была выше, чем вероятность выбора других. этот пример похож на предыдущий, но вероятность выбора числа 2 в два раза выше, чем у чисел 0 или 3:
wchooseby
функция wchooseBy похожа на wchoose, но вместо случайного выбора элементов списка она использует заданный шаблон для выбора элементов.
select
выбирает между списком шаблонов, используя шаблон чисел с плавающей точкой (от 0 до 1).
selectF
выбирает между списком функций, используя шаблон чисел с плавающей точкой (от 0 до 1)
pickF
выбирает между списком функций, используя шаблон целых чисел.
squeeze
выбирает между списком шаблонов, используя шаблон целых чисел.
inhabit
inhabit позволяет привязывать паттерны к определенным Strings, или, другими словами, давать паттернам имена и затем вызывать их из других паттернов Strings.
можно создать собственную установку из бас-барабана, хай-хэта и малого барабана:
inhabit может быть очень полезен при использовании драм-машин, управляемых по MIDI, поскольку вы можете дать понятные названия барабанным паттернам нот.
булевы условия
struct
struct добавляет ритмическую «булеву» структуру к заданному вами шаблону:
структура основана на булевом шаблоне, то есть на двоичном шаблоне, содержащем значения «истина» или «ложь». выше использовано только значения «истина», обозначенные как t. Также возможно включение значений «ложь» в f, структура будет воспринимать как молчание. это даст тот же результат, что и предыдущий пример:
эти бинарные шаблоны «истина/ложь» становятся полезными, когда вы условно манипулируете ими, например, «инвертируя» значения с помощью every и inv:
в приведенном выше примере булевы значения будут «инвертироваться» каждый третий цикл, так что структура будет исходить из fs, а не из t. обратите внимание, что евклидовы шаблоны также создают значения типа «истина/ложь», например:
в приведённом выше примере евклидов шаблон создаёт последовательность «t f t f t f f t», которая инвертируется в «f t f t f t t f» каждый третий цикл. ваще вы можете использовать 1 и 0 вместо t и f.
mask
mask принимает логический (то есть бинарный) шаблон и «маскирует» им другой шаблон. То есть события переносятся только в том случае, если они совпадают с «истинным» событием в бинарном шаблоне. например, рассмотрим такой беспорядочный ритм без пауз:
Из-за использования cat эта же маска сначала применяется к «sn*8», а в следующем цикле - к «[cp4 bd4, hc*5]».
Того же эффекта можно добиться, добавляя паузы в cat паттерны, но с маской это сделать проще. она сохраняет ритмическую структуру, и вы можете менять используемые сэмплы независимо друг от друга:
sew
sew использует шаблон булевых значений (истина или ложь) для переключения между двумя другими паттернами. например, следующий пример будет воспроизводить первый паттерн в первой половине цикла, а второй - во второй половине:
вышеприведённый код объединяет два паттерна строк и передаёт результат звуковой функции. также можно сконнектить два шаблона управления:
stitch
stitch используется первый (бинарный) узор для переключения между двумя следующими узорами. результирующая структура формируется из бинарного узора, а не из исходных. это отличается от шва, где результирующая структура формируется из исходных паттернов:
евклиды
euclid
euclid создаёт Евклидову ритмическую структуру. результат тот же, что и у евклидовой строки:
euclid принимает два параметра, которые могут быть паттернами:
euclidInv
инвертирует шаблон, заданный euclid:
слышно, что ивент хай-хэта срабатывает на каждом из восьми четных ударов, чего не делает бас-барабан.
euclidFull
euclidFull - удобная функция для воспроизведения одного рисунка в евклидовом ритме и другого рисунка в затакте.
fix
с помощью fix можно применить ControlPattern в качестве условия и применить функцию, соответствующую элементам управления. первый параметр - это применяемая функция, а второй - условие.
fixRange
ifp
ifp решает, применять ли ту или иную функцию, в зависимости от результата тестовой функции, которая передаётся в текущий цикл как число:
это применит striate 4 для каждого четного цикла и # coarse "24 48" для каждого нечетного цикла.