Mondo Notation
“Mondo Notation” - это новый вид нотации, похожий на Mini Notation, но с достаточными возможностями, чтобы работать как самостоятельный язык patterns. Вот пример:
$ note (c2 # euclid <3 6 3> <8 16>) # *2 # s "sine" # add (note [0 <12 24>]*2) # dec(sine # range .2 2) # room .5 # lpf (sine/3 # range 120 400) # lpenv (rand # range .5 4) # lpq (perlin # range 5 12 # * 2) # dist 1 # fm 4 # fmh 5.01 # fmdecay <.1 .2> # postgain .6 # delay .1 # clip 5 $ s [bd bd bd bd] # bank tr909 # clip .5 # ply <1 [1 [2 4]]> $ s oh*4 # press # bank tr909 # speed.8 # dec (<.02 .05>*2 # add (saw/8 # range 0 1))
Mondo в REPL
Пока что вы можете использовать mondo в repl только так:
mondo`s hh*8`
Остальная часть этого сайта будет использовать только саму mondo нотацию. В будущем REPL может получить способ использовать mondo нотацию напрямую.
Вызов функций
По сравнению с Mini Notation, наиболее заметной особенностью Mondo Notation является возможность вызывать функции с помощью круглых скобок:
(s hh*8)
Первый элемент внутри скобок - это имя функции. В JS это выглядело бы так:
s("hh*8")Внешние скобки не нужны, поэтому мы можем их опустить:
s hh*8
Возможности Mini Notation
Помимо вызова функций с круглыми скобками, Mondo Notation имеет много общего с Mini Notation:
Скобки
[]для 1-cycle последовательностей<>для multi-cycle последовательностей{}для ступенчатых последовательностей (подробнее об этом позже)
Инфиксные операторы
- * => fast
- / => slow
- ! => extend
- @ => expand
- % => pace
- ? => degradeBy (в настоящее время требует правого операнда)
- : => tail (создает список)
- .. => range (между числами)
- , => stack
- | => chooseIn
Пример
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 ~] >
Цепочка функций
Подобно тому, как работает ”.” в javascript (JS), мы можем связывать вызовы функций с оператором ”#”:
n <0 2 4 [3 1] -1>*4 # scale C4:minor # jux rev # dec .2 # delay .5
Вот то же самое, написанное на JS:
n("<0 2 4 [3 1] -1>*4")
.scale("C4:minor")
.jux(rev)
.dec(.2)
.delay(.5)Локальная цепочка функций
Функцию можно применить к одному элементу, обернув его в круглые скобки:
s [bd hh bd (cp # delay .6)] # bank tr909
в этом случае delay .6 будет применен только к cp. сравните это с версией JS:
s(seq("bd", "hh", "bd", "cp".delay(.6))).bank('tr909')здесь мы видим, сколько мы можем сэкономить, когда нет границы между mini notation и вызовами функций!
Цепочка инфиксных операторов
Инфиксные операторы существуют как обычные функции, поэтому их также можно связывать:
s [bd hh] # bank tr909 # *2
В этом случае *2 будет применен ко всему pattern.
Lambda функции
Некоторые функции в strudel ожидают функцию в качестве входных данных, например:
n("0 .. 7").scale("C:minor").sometimes(x=>x.dec(.1))в mondo x=>x. можно сократить до:
n 0..7 # scale C:minor # sometimes (# dec .1)
цепочка работает как ожидается:
n 0..7 # scale C:minor # sometimes (# dec .1 # jux rev)
Строки
Вы можете использовать “двойные кавычки” и ‘одинарные кавычки’, чтобы получить строку:
n 0..7 # scale 'C minor'
Несколько Patterns
Знак $ может использоваться для разделения нескольких patterns:
$ s [bd rim [~ bd] rim] # bank tr707 $ chord <Dm9!3 Db7> # voicing # struct[x ~ ~ x ~ x ~ ~] # delay .5
Знак $ является псевдонимом для ,, поэтому он создаст stack за кулисами.
переменные
используя ключевое слово def, вы можете определять переменные:
$ def melody [0 1 2 3] $ n melody # scale C:minor