Notes on the output: notes are mapped to the nearest scale degree — chromatic passing
tones get snapped, they aren't rejected. Chords (notes sharing a quantized start) are stacked as
[a,b,c] degree groups rather than named — no Cmaj7 guessing. Held notes use
-, silence uses ~. Each bar is its own pattern, chained with cat()
so one bar plays per cycle. Any bar that repeats — anywhere across the whole piece, even in a different
track — is hoisted into a single shared const and reused by reference, since Strudel reads
mini-notation as literal source text rather than a runtime string, so ${} interpolation
inside it doesn't work. setcpm() is derived as bpm / beatsPerBar so one cycle
equals one bar. Tracks on the MIDI percussion channel (🥁) skip scale mapping entirely — each pitch
is looked up in the standard GM drum key map (e.g. 36→bd, 42→hh, 46→oh) and rendered with
s(...) and .bank("RolandTR909") instead.