Mondo Notation 🌀 Bulka

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