Skip to content

spec: drums as arrangements — type:"drums" + per-arrangement drum_tab pointer (1.17.0) - #63

Merged
byrongamatos merged 2 commits into
mainfrom
fep/drums-as-arrangements
Jul 21, 2026
Merged

spec: drums as arrangements — type:"drums" + per-arrangement drum_tab pointer (1.17.0)#63
byrongamatos merged 2 commits into
mainfrom
fep/drums-as-arrangements

Conversation

@ChrisBeWithYou

@ChrisBeWithYou ChrisBeWithYou commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

Drum charts become first-class arrangements, so a pack can carry more than one — two drummers recorded separately, a programmed layer beside an acoustic kit, or an aux-percussion part. Until now drums were a single song-level drum_tab sidecar, the one part that wasn't an arrangements[] entry.

The change

A drum part is now an arrangement entry with type: drums and a drum_tab pointer (no file, no notation) — mirroring how a keys part is an entry with a notation pointer. Additive MINOR (§4.2), fully back-compatible:

  • Older Reader (no per-arrangement drum_tab): reads the one song-level drum_tab, treats each type: drums entry as a file-less arrangement it can't render → silently ignores the extras. Graceful degradation to one drummer, never an error.
  • Newer Reader: takes its drum parts from the type: drums arrangements and MUST NOT also load the song-level key (it's the compat alias of the primary). No type: drums arrangements ⇒ the song-level drum_tab is the single drum part, unchanged.
  • Single-drum packs are unchanged — Writers keep emitting only the song-level key.
  • Normative: a type: drums arrangement MUST NOT be selected/scored as a pitched/fretted arrangement (it carries piece hits, not string·fret or notated pitch).

Lands together (§4.2)

  • spec/feedpak-v1.md — §5.1 (drum_tab key now the primary/alias), §5.2 (the drums type value + a drum_tab arrangement field), §7.5 (new Multiple drum parts section with the reader/writer rules + the grading invariant), §4.1 version prose.
  • schemas/manifest.schema.jsondrum_tab on arrangementEntry + added to its file/notation anyOf (so a drums-only entry validates).
  • examples/extended.feedpak — a primary Drums arrangement (aliasing the song-level drum_tab) + a second Drums (Live) with its own drum_tab_live.json.
  • CHANGELOG.md, README + spec version → 1.17.0.
  • Editorial drive-by: a pre-existing broken changelog anchor (#1-conventions#1-conformance).

Checks (all pass locally)

check_versions.py · validate.py (both packs, dir and zip) · pytest (57) · mkdocs build --strict · ruff.

Coordination

  • Version: concurrent with spec: MIDI-voiced sound sources — soundfont engine, source role, GM floor, tones binding (1.18.0) — FEP #61 #62 (also 1.17.0). Whichever lands second is a mechanical rebase to 1.18.0 (version strings + CHANGELOG heading + the §4.1 history sentence).
  • Editor side: this is the "spec leads" step for the drums-as-arrangement work already open in feedback-plugin-editor (the editor already models drums as a type:"drums" session arrangement and keeps the song-level drum_tab as primary — this blesses that shape). Next: the core loader reads type: drums arrangements, then the editor's N-drums build path.
  • Distinct from the still-in-discussion parts[] overlay — this is the focused, settled drums piece.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • Drum charts are now supported as first-class arrangements, enabling multiple drum parts within a feedpak.
    • Arrangements may reference per-arrangement drum chart data, with backward compatibility to the existing song-level drum chart.
    • Added a “Drums (Live)” example with timestamped hits.
  • Documentation
    • Updated the spec and feedpak versioning to 1.17.0, including selection/compatibility rules.
    • Corrected a documentation cross-reference.
  • Schema & Validation
    • Extended the manifest schema and validation to support optional per-arrangement drum_tab references.
  • Tests
    • Added a regression test ensuring per-arrangement drum chart references are properly resolved and schema-validated.

… pointer (1.17.0)

Drum charts become first-class arrangements, so a pack can carry more than one — two
drummers recorded separately, a programmed layer beside an acoustic kit, or an aux-
percussion part. Until now drums were a single song-level `drum_tab` sidecar, the one
part that was not an `arrangements[]` entry.

A drum part is now an arrangement entry with `type: drums` and a `drum_tab` pointer (no
`file`, no `notation`) — mirroring how a keys part is an entry with a `notation` pointer.
Purely additive (MINOR) over the song-level `drum_tab`, which stays the PRIMARY drum part
and its back-compat alias:

- Older Reader (no per-arrangement `drum_tab`): reads the one song-level `drum_tab`, treats
  each `type: drums` entry as a `file`-less arrangement it can't render → silently ignores
  the extras. Graceful degradation to one drummer, never an error.
- Newer Reader: takes its drum parts from the `type: drums` arrangements and MUST NOT also
  load the song-level key (the compat alias of the primary). No `type: drums` arrangements
  ⇒ the song-level `drum_tab` is the single drum part, unchanged.
- Single-drum packs are unchanged (Writers keep emitting only the song-level key).
- Normative: a `type: drums` arrangement MUST NOT be selected/scored as a pitched/fretted
  arrangement (piece hits, not string·fret or notated pitch).

Together (§4.2 process): spec §5.1/§5.2/§7.5 (new "Multiple drum parts"),
`schemas/manifest.schema.json` (`drum_tab` on `arrangementEntry` + its file/notation `anyOf`),
`examples/extended.feedpak` (a primary `Drums` arrangement aliasing the song-level `drum_tab`
plus a second `Drums (Live)` with its own `drum_tab_live.json`), CHANGELOG, and the 1.17.0
version bump. Editorial drive-by: fix a pre-existing broken changelog anchor
(`#1-conventions` → `#1-conformance`).

Checks (local): check_versions, validate.py (both packs, dir + zip), pytest (57),
mkdocs build --strict, ruff — all pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017xGPjDBF8NTwTK7VQvizix
Signed-off-by: ChrisBeWithYou <chris@rifflarr.local>
@coderabbitai

coderabbitai Bot commented Jul 20, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: bef0c128-4de0-4cf7-84e5-5a3da4191a0f

📥 Commits

Reviewing files that changed from the base of the PR and between 0c32c75 and e68bc55.

📒 Files selected for processing (3)
  • spec/feedpak-v1.md
  • tests/test_validate.py
  • tools/validate.py
🚧 Files skipped from review as they are similar to previous changes (1)
  • spec/feedpak-v1.md

📝 Walkthrough

Walkthrough

Feedpak 1.17.0 defines drum charts as first-class arrangements with per-arrangement drum_tab references, schema and validator support, compatibility behavior, selection constraints, examples, tests, and updated release metadata.

Changes

First-class drum arrangements

Layer / File(s) Summary
Drum arrangement specification
spec/feedpak-v1.md
Defines type: drums, per-arrangement drum_tab, song-level compatibility aliasing, chart references, and exclusion from pitched/fretted selection.
Schema and validation support
schemas/manifest.schema.json, tools/validate.py, tests/test_validate.py
Allows drum_tab as an arrangement requirement, validates referenced chart files safely against the drum-tab schema, and tests invalid per-arrangement charts.
Example drum arrangements
examples/extended.feedpak/manifest.yaml, examples/extended.feedpak/drum_tab_live.json
Adds primary and additional drum-chart arrangements with separate chart files and updates the example package version.
Version and changelog updates
README.md, CHANGELOG.md
Updates displayed version references to 1.17.0, documents the drum arrangement change, and corrects an earlier cross-reference.

Estimated code review effort: 2 (Simple) | ~10 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Reader
  participant Manifest
  participant Validator
  participant DrumChart
  participant ArrangementSelector
  Reader->>Manifest: Read type: drums arrangements
  Manifest->>Validator: Resolve drum_tab references
  Validator->>DrumChart: Validate referenced JSON
  DrumChart-->>Validator: Return validation result
  Reader->>ArrangementSelector: Exclude drum arrangements from pitched/fretted selection
Loading

Suggested reviewers: topkoa

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately highlights the main change: first-class drum arrangements with per-arrangement drum_tab support in spec 1.17.0.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fep/drums-as-arrangements

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

…e validator

tools/validate.py resolved only file/notation in the arrangements loop, so the
new per-arrangement drum_tab pointer got no existence/within-root/schema check
(the shipped drum_tab_live.json example passed CI only because nothing opened
it). Route it through the same check_pointer_exists + validate_json_file
machinery as file/notation, against SIDE_FILE_SCHEMAS[drum_tab]. Also bump the
spec Date header to 2026-07-20 to match the CHANGELOG 1.17.0 entry.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@byrongamatos
byrongamatos merged commit b19e771 into main Jul 21, 2026
7 of 8 checks passed
@byrongamatos
byrongamatos deleted the fep/drums-as-arrangements branch July 21, 2026 11:27
gionnibgud added a commit that referenced this pull request Jul 21, 2026
…e the drum sound-binding precedence

Reconciles this PR with #63, which landed while in review and took 1.17.0:

- version retarget 1.17.0 -> 1.18.0 everywhere check_versions.py guards
- drum sound binding composed with drums-as-arrangements, stated not implied:
  a type:drums arrangement binds sound through its entry tones (precedence);
  top-level drum_tones binds the song-level primary part and is the fallback
  for packs without drum arrangements; a Reader MUST NOT apply both to the
  same part, and a Writer SHOULD keep drum_tones mirroring the primary —
  the exact alias pattern #63 established for drum_tab
- intent.gm kit absent => 0 (Standard), closing the asymmetry with the
  bank/program absent-=>-0 rule (review follow-up)
- example: the primary drums arrangement carries entry tones; drum_tones
  mirrors it as the alias

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: gionnibgud <gionnibgud@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants