Groove CLI patterns are strings where each symbol represents one step. Track timing is controlled by div (tokens per beat) and the song bpm.
The easiest form is track-first:
kick x...x...x...x...
For patterns that include spaces or more complex group syntax, use pattern … "…":
pattern kick "x... x... x... x..."
- Hit:
x(also1and*are accepted as hits) - Accent:
X(louder hit) - Rest:
. - Bar separator:
|(ignored, visual only) - Comment:
# ...to end of line (ignored)
Examples:
x... x... x... x... # four on the floor
....x.......x... # backbeat
x.x.x.x.x.x.x.x. # 8ths
_ ties a hit into following steps (no retrigger). Ties matter most in gate playback mode.
x___. # one hit, sustained across 3 ties
Modifiers are written immediately after a hit (order doesn’t matter).
x+7 x-5 x+12
You can also write note tokens directly (useful for melodies and chord progressions):
c d# eb bb
c4 d#4 eb4 bb4
Notes:
- Sharps and flats are both accepted (
d#==eb). - If the octave is omitted (e.g.
c), it defaults to the track’s detected root octave. - Note tokens need a track root note. Groove will try to detect this from the sample (shown in the TUI
NOTEcolumn). You can override it withroot <track> <note>or re-run detection withanalyze <track>.
Modifiers still work the same way:
c+12v80
(c e g)?50%
xv64
xv127
X # accent (uses an “accent velocity” when no explicit vN is present)
Xv50 # explicit velocity wins over accent
x?50% # percent form
x?0.25 # 0..1 form
{N} subdivides a single step into N evenly-spaced triggers.
x{3} # triplet-style roll in one step
x{4}
Gate shortens (or lengthens) the first step’s hold time in gate mode.
x=1/2
x=3/4
x=0.25
Ties still extend the total hold:
x=1/2__ # half-step first, then ties extend additional full steps
x+(0,4,7) # major triad
x+(0,3,7) # minor triad
(x x+4 x+7)
(c e g)
Groups can be repeated with *N:
(x.)*4 # expands to x.x.x.x.
The parser recognizes some additional modifiers (nudges, cycle conditions, param locks), but playback currently ignores them. If you see syntax like @-5ms, @1/4, or [delay.time=…], it will parse but won’t affect audio yet.