ComfyUI Node

Song Sheet

The One Place You Can See — and Overrule — What the Model Is About to Be Told

By jplenio·Created a day ago·Updated about 13 hours ago· 2
Song Sheet
  • sheet_state
  • timeline
  • reference_audio
  • brief
  • engine
  • title
  • style
  • lyrics
  • score
  • artwork_prompt
  • planning_mode
  • score_seconds
  • report
  • section_tags
◄reviewcontinue►
◄title—►
◄style—►
◄lyrics—►
◄score—►
◄artwork_prompt—►
◄context_style—►
◄context_lyrics—►
◄context_score—►

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 review to 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.
CategoryPlenio/Song

Inputs (14)

NameTypeDefaultDescription
reviewCOMBOcontinuestop for review: the documents are released only after you approve them in the editor.
sheet_statePLENIO_SHEET_STATEYour edits and manual documents (edit them with the Song Sheet editor).
titleoptSTRINGSong title draft.
styleoptSTRINGStyle / caption draft for the music model.
lyricsoptSTRINGLyrics draft with [Tag] sections.
scoreoptSTRINGScore draft (native two-voice ABC).
artwork_promptoptSTRINGCover image prompt draft.
context_styleoptSTRINGStyle owned by another sheet; shown and used for the token budget.
context_lyricsoptSTRINGLyrics owned by another sheet; shown and used for the token budget.
context_scoreoptSTRINGScore owned by another sheet; shown, used for the budget and to check the lyrics' sections.
timelineoptPLENIO_TIMELINEFrom Transcribe Score: shows bar and section times of the source in the editor.
reference_audiooptAUDIOThe 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.
briefoptPLENIO_BRIEFVocal mode and length for validation.
engineoptPLENIO_ENGINERules and exact token counts of the loaded music model.

Outputs (9)

NameTypeDescription
titleSTRINGFinal title.
styleSTRINGFinal style.
lyricsSTRINGFinal lyrics.
scoreSTRINGFinal score.
artwork_promptSTRINGFinal artwork prompt.
planning_modeCOMBORender mode derived from the final score (chords -> full).
score_secondsFLOATRender ceiling derived from the final score.
reportPLENIO_REPORTFinal documents, states and validation.
section_tagsSTRINGThe final score's section tags (the lyrics of an instrumental cover).