Song Sheet
The One Place You Can See — and Overrule — What the Model Is About to Be Told
- sheet_state
- timeline
- reference_audio
- brief
- engine
- title
- style
- lyrics
- score
- artwork_prompt
- planning_mode
- score_seconds
- report
- section_tags
What it is
Song Sheet is the reason to use this pack over wiring the native nodes together yourself. Every text that conditions the music model - title, style, lyrics, score, artwork prompt - passes through a sheet, gets shown to you, and leaves unchanged. The writer's draft, YuE2's ABC plan, SheetSage2's transcription, the ASR lyrics: all drafts. The sheet decides which text is real.
That's a bigger deal than it sounds. Everywhere else in this ecosystem, inspecting what actually reached the model means reading a console or hoping. Here you get an editor with state badges, a diff against the draft, the engine's rule findings updating as you type, and a hard rule that manual text is never replaced silently.
How it works
Each document on the sheet is in one of three states:
- auto - the newest draft is used, and a new draft overwrites it. Fine for exploration.
- edited - your text is used, but the sheet remembers which draft you edited. If the draft changes underneath you, the run stops with a conflict instead of guessing: keep your edit (it becomes manual), take the new draft, or merge by hand.
- manual - your text, full stop. The draft isn't even computed when nothing else needs it, so manual lyrics on a cover means Transcribe Lyrics doesn't run.
Precedence is manual > edited-while-unchanged > draft, and it holds across the pack. That conflict stop is the feature: it's the difference between "my chorus edit disappeared" and being asked a question.
review decides whether a run pauses. as the brief says (the default in the templates) stops when the path is set up as one song/cover with review, and continues for series runs; stop for review always stops; continue never does. A stopped run waits after the sheet until you press Approve, and the approval is fingerprinted against exactly the documents you saw - change something and it asks again.
The sheet also knows the budget. With engine connected you get the exact token count of YuE2's context or MiniMax's 5,000-token prompt budget, checked with the model's own tokenizer; with score connected you get the render ceiling the score implies.
Inputs and outputs that matter
Draft inputs are optional and lazy: title, style, lyrics, score, artwork_prompt - wired from Parse Song Draft, Score Tools or Transcribe Score depending on the path. brief and engine are what turn the sheet from a text box into a validator. timeline and reference_audio come from the cover path: the timeline draws source bar and section times in the editor, and reference_audio lets you A/B the notation against the recording you transcribed. Neither reaches the model.
The context_* inputs (context_style, context_lyrics, context_score) exist because each path has two sheets: the text sheet owns title/style/lyrics/artwork, the score sheet owns the score, and each shows the other's documents read-only while counting them for the budget.
Outputs are the finals - title, style, lyrics, score, artwork_prompt - plus planning_mode (derived from the final score; chords present means full mode), score_seconds (the render ceiling), section_tags (the score's section tags, which is the lyrics text an instrumental cover gets) and report. section_tags and planning_mode are the ones people miss; they're how a graph stays in sync with your score edits without you re-deriving anything.
Install
# ComfyUI Manager → search "Plenio Music Production System" → Install → restart
# or:
cd ComfyUI/custom_nodes
git clone https://github.com/jplenio/Plenio-Music-Production-System
Requires ComfyUI 0.37.0+. No Python packages installed by the pack. Open a template before building by hand - the sheets in the templates already have their context_* wires, the brief and engine wired, and the review settings set, and reproducing that wiring from memory is a waste of an evening.
Common issues
- The run sits there with no error. It's waiting for approval. Open the sheet (in App mode, the sheet's button), check the documents, press Approve, run again - or set
reviewto continue if you don't want the pause. - "Song Sheet conflict - lyrics: …" Exactly what it says: you edited a document and its draft changed afterwards. Resolve it in the editor.
- Conflicts on every run of a batch. A series writes a new draft each run, so an edited document can't stay valid. Make it manual to keep it for the whole series.
- "The Song Sheet documents are not valid." A document broke the model's rules - vocal words in instrumental lyrics, a score that isn't in the native two-voice ABC dialect, mismatched sections. The findings name the line and bar.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| review | COMBO | continue | stop for review: the documents are released only after you approve them in the editor. |
| sheet_state | PLENIO_SHEET_STATE | Your edits and manual documents (edit them with the Song Sheet editor). | |
| titleopt | STRING | Song title draft. | |
| styleopt | STRING | Style / caption draft for the music model. | |
| lyricsopt | STRING | Lyrics draft with [Tag] sections. | |
| scoreopt | STRING | Score draft (native two-voice ABC). | |
| artwork_promptopt | STRING | Cover image prompt draft. | |
| context_styleopt | STRING | Style owned by another sheet; shown and used for the token budget. | |
| context_lyricsopt | STRING | Lyrics owned by another sheet; shown and used for the token budget. | |
| context_scoreopt | STRING | Score owned by another sheet; shown, used for the budget and to check the lyrics' sections. | |
| timelineopt | PLENIO_TIMELINE | From Transcribe Score: shows bar and section times of the source in the editor. | |
| reference_audioopt | AUDIO | The recording the score was transcribed from: the editor plays it from the selected bar (A/B with the notes). Display only; it never reaches the model. | |
| briefopt | PLENIO_BRIEF | Vocal mode and length for validation. | |
| engineopt | PLENIO_ENGINE | Rules and exact token counts of the loaded music model. |
Outputs (9)
| Name | Type | Description |
|---|---|---|
| title | STRING | Final title. |
| style | STRING | Final style. |
| lyrics | STRING | Final lyrics. |
| score | STRING | Final score. |
| artwork_prompt | STRING | Final artwork prompt. |
| planning_mode | COMBO | Render mode derived from the final score (chords -> full). |
| score_seconds | FLOAT | Render ceiling derived from the final score. |
| report | PLENIO_REPORT | Final documents, states and validation. |
| section_tags | STRING | The final score's section tags (the lyrics of an instrumental cover). |