# Jazz Half-Time Shuffle — Rosanna / Purdie Shuffle style # Reference: "Rosanna" (Toto, 1982, Jeff Porcaro), Bernard Purdie, arXiv 2411.06892 # The defining features: (1) snare hits ONLY on beat 3 — the half-time feel, # (2) dense ghost notes fill the gaps, (3) hi-hat plays a shuffle pattern (beat + swing "trip"), # (4) kick plays a Bo Diddley hemiola figure that crosses the beat. # With swing_hard enabled, odd steps (3, 7, 11, 15) are delayed ~0.085 beats, producing # the shuffle triplet feel: long gap (beat to trip) then short gap (trip to next beat). # GM notes: 36=kick, 38=snare+ghosts, 42=HH, 48=hi tom (fills), 49=crash # # ── Step grid notation ──────────────────────────────────────────────────────── # Each character in a step grid represents one subdivision of the bar. # Resolution controls how many steps per bar (16 = 16th notes in 4/4; 12 = 16th notes in 6/8). # # X Strong accent — velocity = base_velocity × 1.00 (full hit / downbeat) # x Medium accent — velocity = base_velocity × 0.75 (firm stroke / upbeat) # o Soft hit — velocity = base_velocity × 0.55 (brush / light touch) # g Ghost note — velocity = base_velocity × 0.28 (barely audible, mostly felt) # . Rest — no note fired at this step # # Beat positions — 4/4 at resolution 16 (one char per 16th note): # pos 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # 1 e1 +1 a1 2 e2 +2 a2 3 e3 +3 a3 4 e4 +4 a4 # (1/+/2/+/3/+/4/+ = quarter beats; e = "e of"; a = "and-a of") # # Beat positions — 6/8 at resolution 12 (one char per 16th note): # pos 0 1 2 3 4 5 6 7 8 9 10 11 # C1 . e1 . a1 . C2 . e2 . a2 . # (C1/C2 = compound beat downbeats; each compound beat = 3 eighth notes = 6 steps) # # Swing / feel: the 'feel' field shifts odd-indexed steps (1,3,5,7…) forward in time. # straight — no shift (all steps exactly on the grid) # swing_soft — odd steps delayed ~16 % of a step (light swing) # swing_hard — odd steps delayed ~34 % of a step (jazz/shuffle triplet feel) # laid_back — same as straight with slower humanisation envelope # ───────────────────────────────────────────────────────────────────────────── name: Half-Time Shuffle family: jazz bpm_range: [70, 130] time_signature: [4, 4] resolution: 16 feel: swing_hard instruments: kick: { note: 36, base_velocity: 100, velocity_range: 12, timing_jitter: 0.018, duration_beats: 0.14 } snare: { note: 38, base_velocity: 100, velocity_range: 16, timing_jitter: 0.020, duration_beats: 0.12 } hihat: { note: 42, base_velocity: 82, velocity_range: 12, timing_jitter: 0.018, duration_beats: 0.08 } tom_hi: { note: 48, base_velocity: 90, velocity_range: 15, timing_jitter: 0.018, duration_beats: 0.10 } crash: { note: 49, base_velocity: 98, velocity_range: 8, timing_jitter: 0.010, duration_beats: 0.25 } humanization: timing_jitter: 0.020 velocity_jitter: 16 velocity_drift: 0.08 sections: intro: type: count_in hits: 4 note: 42 groove: bars: 1 variations: - name: rosanna weight: 4 # Jeff Porcaro's Rosanna groove (transcribed): # HH: quarter beats (0,4,8,12, X) + swing "trip" at odd steps (3,7,11,15, x) # With swing_hard the "trip" steps are delayed, creating long-short triplet feel # Snare: ONLY on beat 3 (pos 8) — this is the half-time backbeat # Ghost: pos 3,5 (before beat 2), pos 11,13,15 (around beat 4) — fades in/out # Kick: Rosanna hemiola — pos 0, x at 4, X at 6, x at 12, X at 14 hihat: "X..xX..xX..xX..x" snare: "...g.g..X..g.g.g" kick: "X...x.X.....x.X." - name: purdie weight: 2 # Bernard Purdie's slightly simpler shuffle — fewer ghost notes hihat: "X..xX..xX..xX..x" snare: "......g.X....g.g" kick: "X.......X......x" - name: open_hat weight: 1 # Open hi-hat on the "trip" of beat 3 for a looser, more open sound hihat: "X..xX..xX..xX..x" snare: "...g.g..X..g.g.g" kick: "X...x.X.....x.X." fill: bars: 1 variations: - name: rosanna_outro # Rosanna-style fill: snare run with tom interjections kick: "X.......X.....X." snare: "X.xX.xX.xX.xXXXX" tom_hi: ".X..X..X..X....." - name: triplet_run # Simple triplet-feel snare fill leading to crash kick: "X..............." snare: "....x.x.x.x.XXXX" crash: bars: 1 variations: - name: standard crash: "X..............." kick: "X..............." hihat: "X..xX..xX..xX..x" structure: fill_every: 16 break_every: 0 break_length: 1 crash_after_fill: true dynamic_build: false