spec: drums as arrangements — type:"drums" + per-arrangement drum_tab pointer (1.17.0) - #63
Merged
Merged
Conversation
… 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>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (3)
🚧 Files skipped from review as they are similar to previous changes (1)
📝 WalkthroughWalkthroughFeedpak 1.17.0 defines drum charts as first-class arrangements with per-arrangement ChangesFirst-class drum arrangements
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
Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
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. Comment |
This was referenced Jul 20, 2026
…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>
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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_tabsidecar, the one part that wasn't anarrangements[]entry.The change
A drum part is now an arrangement entry with
type: drumsand adrum_tabpointer (nofile, nonotation) — mirroring how a keys part is an entry with anotationpointer. Additive MINOR (§4.2), fully back-compatible:drum_tab): reads the one song-leveldrum_tab, treats eachtype: drumsentry as afile-less arrangement it can't render → silently ignores the extras. Graceful degradation to one drummer, never an error.type: drumsarrangements and MUST NOT also load the song-level key (it's the compat alias of the primary). Notype: drumsarrangements ⇒ the song-leveldrum_tabis the single drum part, unchanged.type: drumsarrangement 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_tabkey now the primary/alias), §5.2 (thedrumstype value + adrum_tabarrangement field), §7.5 (new Multiple drum parts section with the reader/writer rules + the grading invariant), §4.1 version prose.schemas/manifest.schema.json—drum_tabonarrangementEntry+ added to itsfile/notationanyOf(so a drums-only entry validates).examples/extended.feedpak— a primaryDrumsarrangement (aliasing the song-leveldrum_tab) + a secondDrums (Live)with its owndrum_tab_live.json.CHANGELOG.md, README + spec version → 1.17.0.#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
feedback-plugin-editor(the editor already models drums as atype:"drums"session arrangement and keeps the song-leveldrum_tabas primary — this blesses that shape). Next: the core loader readstype: drumsarrangements, then the editor's N-drums build path.parts[]overlay — this is the focused, settled drums piece.🤖 Generated with Claude Code
Summary by CodeRabbit
drum_tabreferences.