d = Dictionary.with(*[
\x -> (buf: "buffer x"),
\s -> (buf: "buffer s")
]);
// using a dictionary for lookups here but currentEnvironment is used by default
c = Compile("x--s--x-", repeats: inf, lookup: d);
Pbindf(c, \instrument, \sampleSynth).trace.play;
Compile's lookup arg is used to map the alphabetical tokens in the rhythm string you want to compile to events
for example you might want to use a sample player that has a 'buf' argument, so you can gather some different events with the buffers into a kind of 'drum machine' dictionary d, and look them up in it.
Compile returns a Routine that yields events so you can easily plug it into a pbind, or use it inside a Task or other Routine.
"x---" this is a note that lasts 4 'ticks' (ticks are deliberately kept vague)
brackets: "[x--x--]" brackets group things together for binops / unops
spaces: "x--- x--- x--- x---" spaces are ignored so this is just a 4/4 beat
dashes: "-- -- -- x-" this is 3 rests then a beat
-
%:"[x--x--]%4"pads the lhs to next multiple of the rhs so this will be transformed to"x--x-- --"(8 ticks in total) -
|: truncates the lhs so"[x--x--]|4" -> "x--x" -
!: duplicate lhs"x--x-!3" --> "x--x- x--x- x--x-" -
*: multiply --"x--- x--- * 1.5" --> "x----- x-----" -
/: does what you might think
:scrambles the lhs and embeds it in the routine (it will scramble it again each time if repeated)
I recommend to use myLib for useful extensions to the Symbol class, and for using modules with Import