Write a compose function, press Ctrl+Enter, and the plugin publishes whatever MIDI it returns as a loop. The script lives in the project, so it travels with the session.
# one bar of a minor arpeggiodefcompose(ctx):
scale = ctx.scale("A minor")
for step inrange(8):
ctx.add(scale[step], start=step / 2)
return ctx.loop(length_beats=4)
14 events · 8.0 beatsCtrlEnter
One function, one contract
Every script defines compose(ctx). The plugin calls it when you run, and loops the schedule it hands back. There is nothing else to learn.
Theory built in
Scales, chord symbols, roman-numeral progressions, arpeggios and humanising ship as helpers — so a script says what you mean instead of what the note numbers are.
The console tells you why
Runs, restores and failures all log with a timestamp. A traceback appears where you are looking, not in a log file somewhere else.