Mini-notation
Так же как и Tidal Cycles, Strudel использует так называемый “Mini-Notation”, который представляет собой специальный язык, предназначенный для записи ритмических patterns с использованием небольшого количества текста.
Примечание
Эта страница объясняет весь синтаксис Mini-Notation целиком. Если вы только начинаете работать со Strudel, вы можете изучить основы Mini-Notation более практичным способом в workshop. После этого вы можете вернуться сюда, если хотите понять каждую мелочь.
Пример
Прежде чем углубляться в детали, вот как выглядит Mini-Notation:
note(`< [e5 [b4 c5] d5 [c5 b4]] [a4 [a4 c5] e5 [d5 c5]] [b4 [~ c5] d5 e5] [c5 a4 a4 ~] [[~ d5] [~ f5] a5 [g5 f5]] [e5 [~ c5] e5 [d5 c5]] [b4 [b4 c5] d5 e5] [c5 a4 a4 ~] , [[e2 e3]*4] [[a2 a3]*4] [[g#2 g#3]*2 [e2 e3]*2] [a2 a3 a2 a3 a2 a3 b1 c2] [[d2 d3]*4] [[c2 c3]*4] [[b1 b2]*2 [e2 e3]*2] [[a1 a2]*4] >`)
Формат Mini Notation
Приведенный выше фрагмент заключен в обратные кавычки (`), что позволяет писать многострочные строки.
Вы также можете использовать обычные двойные кавычки (") для однострочного mini-notation, как мы уже делали.
Если вы хотите получить обычную строку, которая не парсится как mini-notation, используйте одинарные кавычки (').
Последовательности events в cycle
Мы можем воспроизвести больше нот, разделив их пробелами:
note("c e g b")Здесь эти четыре ноты сжаты в один cycle, поэтому каждая нота длится четверть секунды. Попробуйте добавить или удалить ноты и обратите внимание, как меняется темп!
note("c d e f g a b")Обратите внимание, что общая продолжительность времени не меняется, вместо этого уменьшается длительность каждой ноты. Это ключевая идея, так как она иллюстрирует ‘Cycle’ в TidalCycles!
Каждая нота, разделенная пробелом в этой последовательности, является event. Продолжительность времени каждого event зависит от скорости или темпа cycle и от того, сколько events присутствует. Возьмем два приведенных выше примера: у нас четыре и восемь events соответственно, и поскольку у них одинаковая длительность cycle, каждому нужно вместить свои events в одно и то же количество времени.
Это, возможно, противоречит интуиции, если вы привыкли добавлять ноты в секвенсор или piano roll, и общая длина увеличивается. Но это начнет иметь смысл, когда мы рассмотрим больше элементов mini-notation.
Умножение
Последовательность можно ускорить, умножив ее на число с помощью символа звездочки (*):
note("[e5 b4 d5 c5]*2")Умножение на два здесь означает, что последовательность будет воспроизводиться дважды за cycle.
Умножения также могут быть десятичными (*2.75):
note("[e5 b4 d5 c5]*2.75")Деление
В противоположность умножению, деление может замедлить последовательность, заключив ее в скобки и разделив на число (/2):
note("[e5 b4 d5 c5]/2")Деление на два означает, что последовательность будет воспроизводиться в течение двух cycles.
Вы также можете использовать десятичные числа для любого темпа, который вам нравится (/2.75).
note("[e5 b4 d5 c5]/2.75")Угловые скобки
Используя угловые скобки <>, мы можем определить длину последовательности на основе количества events:
note("<e5 b4 d5 c5>")Приведенный выше фрагмент аналогичен:
note("[e5 b4 d5 c5]/4")Преимущество угловых скобок в том, что мы можем добавлять больше events без необходимости изменять число в конце.
note("<e5 b4 d5 c5 e5>")note("<e5 b4 d5 c5 e5 b4>")Это более похоже на традиционные музыкальные секвенсоры и piano rolls, где добавление ноты увеличивает воспринимаемую общую продолжительность. Мы также можем воспроизводить определенное количество нот за cycle, используя угловые скобки с умножением:
note("<e5 b4 d5 c5 a4 c5>*8")Теперь мы воспроизводим 8 нот за cycle!
Подразделение времени с вложенными скобками
Чтобы создать более интересные ритмы, вы можете вложить или заключить последовательности (поместить последовательности внутрь последовательностей) с помощью скобок [], вот так:
Сравните разницу между следующими:
note("e5 b4 c5 d5 c5 b4")note("e5 [b4 c5] d5 c5 b4")note("e5 [b4 c5] d5 [c5 b4]")note("e5 [b4 c5] d5 [c5 b4 d5 e5]")note("e5 [b4 c5] d5 [c5 b4 [d5 e5]]")Что здесь происходит? Когда мы вкладываем/заключаем несколько events внутри скобок ([]), их длительность становится равной длине одного event во внешней последовательности.
Это очень простое изменение, но оно имеет глубокие последствия. Помните, что мы говорили ранее о том, как cycles в tidal остаются одинаковой длины, а длительности отдельных events делятся в этом cycle? Что ж, это означает, что в TidalCycles вы не только можете делить время любым способом, но и можете подразделять время любым способом!
Паузы
Символ ”~” представляет паузу и создаст тишину между другими events:
note("[b4 [~ c5] d5 e5]")Параллельность / полифония
Используя запятые, мы можем воспроизводить аккорды. Следующие примеры одинаковы:
note("[g3,b3,e4]")note("g3,b3,e4")Но чтобы воспроизвести несколько аккордов в последовательности, нужно обернуть их в скобки:
note("<[g3,b3,e4] [a3,c3,e4] [b3,d3,f#4] [b3,e4,g4]>*2")Удлинение
С помощью символа ”@” мы можем указать временной “вес” дочернего элемента последовательности:
note("<[g3,b3,e4]@2 [a3,c3,e4] [b3,d3,f#4]>*2")Здесь первый аккорд имеет вес 2, что делает его в два раза длиннее других аккордов. Вес по умолчанию — 1.
Повторение
Используя ”!” мы можем повторять без ускорения:
note("<[g3,b3,e4]!2 [a3,c3,e4] [b3,d3,f#4]>*2")Случайность
Events с ”?” после них будут иметь 50% шанс быть удаленными из pattern:
note("[g3,b3,e4]*8?")Добавление числа между 0 и 1 после ”?” повлияет на вероятность удаления event. Например, events с “?0.1” после них будут иметь 10% шанс быть удаленными:
note("[g3,b3,e4]*8?0.1")Events, разделенные ”|”, будут выбраны случайным образом:
note("[g3,b3,e4] | [a3,c3,e4] | [b3,d3,f#4]")Обзор mini-notation
Чтобы подытожить то, что мы узнали до сих пор, сравните следующие patterns:
note("<g3 b3 e4 [a3,c3,e4] [b3,d3,f#4]>*2")note("<[g3,b3,e4] [a3,c3,e4] [b3,d3,f#4]>*2")note("<[g3,b3,e4]/2 [a3,c3,e4] [b3,d3,f#4]>*2")note("<[g3,b3,e4]*2 [a3,c3,e4] [b3,d3,f#4]>*2")note("<[g3,b3,e4] _ [a3,c3,e4] [b3,d3,f#4]>*2")note("<[g3,b3,e4]@2 [a3,c3,e4] [b3,d3,f#4]>*2")note("<[g3,b3,e4]!2 [a3,c3,e4] [b3,d3,f#4]>*2")note("<[g3,b3,e4]? [a3,c3,e4] [b3,d3,f#4]>*2")note("<[g3|b3|e4] [a3,c3,e4] [b3,d3,f#4]>*2")Euclidian rhythms
Используя круглые скобки после event, мы можем создавать ритмические подразделения на основе трех параметров: beats, segments и offset.
Этот алгоритм можно найти во многих различных типах музыкального программного обеспечения, и он часто называется секвенсором Euclidean rhythm, в честь компьютерного ученого Годфрида Туссена.
Почему это интересно? Рассмотрим следующий простой пример:
s("bd(3,8,0)")Звучит знакомо? Это популярный Euclidian rhythm, известный под различными названиями, такими как “Pop Clave”. Эти ритмы можно найти во всех музыкальных культурах, и алгоритм Euclidian rhythm позволяет нам выразить их чрезвычайно легко. Написание этого ритма полностью требует описания:
s("bd ~ ~ bd ~ ~ bd ~")Но используя нотацию Euclidian rhythm, нам нужно выразить только “3 удара на 8 сегментов, начиная с позиции 1”.
Это упрощает написание patterns с интересными ритмическими структурами и вариациями, которые все еще звучат знакомо:
note("e5(2,8) b4(3,8) d5(2,8) c5(3,8)").slow(2)Обратите внимание, что поскольку в приведенном выше примере не используется третий параметр offset, его можно записать просто как "(3,8)".
s("bd(3,8)")Давайте подробно рассмотрим эти три параметра.
Beats
beats: первый параметр контролирует, сколько ударов будет воспроизведено.
Сравните эти:
s("bd(2,8)")s("bd(5,8)")s("bd(7,8)")Segments
segments: второй параметр контролирует общее количество сегментов, по которым будут распределены удары:
s("bd(3,4)")s("bd(3,8)")s("bd(3,13)")Offsets
offset: третий (необязательный) параметр контролирует начальную позицию для распределения ударов.
Нам нужен вторичный ритм, чтобы услышать разницу:
s("bd(3,8,0), hh cp")s("bd(3,8,3), hh cp")s("bd(3,8,5), hh cp")Упражнение по mini-notation
Самое интересное в mini-notation — это то, что все, что вы только что изучили, можно комбинировать различными способами!
Начиная с этого одного n, можете ли вы создать строку pattern, которая использует каждый отдельный элемент mini-notation, упомянутый выше?
n("60")Далее: Как Samples вписываются в это?