Nodes/Kinburg-Nodes/Satyr Music (Guided YuE2) 🐐
ComfyUI Node

Satyr Music (Guided YuE2) 🐐

The guidance scale ComfyUI forgot to expose

By KinburgΒ·Created 4 months agoΒ·Updated 11 days agoΒ· 2
Satyr Music (Guided YuE2) 🐐
  • clip
  • conditioning
  • seconds
β—„styleβ€”β–Ί
β—„lyricsβ€”β–Ί
β—„abcβ–Ί
β—„seed0β–Ί
β—„modeβ–Ύβ–Ί
β—„max_duration360.00β–Ί
β—„cfg_scale1.00β–Ί
β—„temperature1.00β–Ί
β—„top_p0.95β–Ί
β—„top_k100β–Ί
β—„repetition_penalty1.20β–Ί

YuE2's own reference implementation takes a guidance scale, and validates it 0–20. ComfyUI's YuE2 Generate Music never passes one, so guidance sits switched off and the second branch is never even built. This node is a drop-in replacement with the knob on the front - and it's worth knowing what the knob actually does before you turn it, because it isn't what the person who built it hoped.

What the scale amplifies

The negative branch is built from the instruction alone, with [Tags] and [Lyrics] removed, and the plan (the ABC) is appended to both branches. So the score cancels out of the difference entirely. Raising the scale does not weaken the plan - it pushes the style string and the lyrics harder against a plan whose authority is unchanged.

Measured, that buys diction. Words the model tends to swallow come through; the clearest case is a line in round brackets, which it otherwise sings too quietly or drops altogether. Raise it when the take is right and one phrase is mumbled.

What it does not do is change who sings. That was the hypothesis the node was built on, it was tested, and it doesn't hold. Which fits the mechanism: amplifying the words makes the model articulate what it was given, not rearrange it. If you want two singers, the style field is where that decision lives - "dual vocals, powerful melodic female vocal, gritty male vocal" is what puts two voices in the song at all.

Inputs and outputs

  • clip - the YuE2 checkpoint's CLIP output, same one the core node takes.
  • style - language, genre, vocal character, tempo, instruments. One description for the whole song; YuE2 has no way to say the style changes partway. This is the field cfg_scale amplifies, so it's the field to be precise in.
  • lyrics - the words with plain [Verse] / [Chorus] tags. Wire Satyr Score's lyrics output here: YuE2 sings round brackets and has no field for a singer's name, so a marker left in the text isn't ignored, it's sung.
  • abc - the plan. Empty, and the node falls back to off mode exactly as the core node does.
  • mode - full (plan carries chords) or melody (melody only, for covers). Empty abc ignores it.
  • max_duration - a ceiling in seconds, not a target. Generation usually stops earlier, because the plan's own length is what decides. Trimming a song is Satyr Trim's job, not this widget's.
  • cfg_scale - default 1.0, which is off. seed, temperature, top_p, top_k and repetition_penalty are the same knobs the core node has.

Outputs are conditioning, into your YuE2 sampler with an empty audio latent sized from the plan, and seconds - the plan's duration. Wire seconds into the latent-length node rather than typing a number; a plan and a latent that disagree is the classic YuE2 mistake.

The cost, and the honest guardrail

Anything other than 1.0 runs two branches, so call it twice the VRAM and twice the time. On a long song that's the difference between fitting and not, which is an argument for trimming the plan before you go hunting for clarity in the guidance.

The node also refuses to run if the tokenizer hands the argument back unchanged - it raises rather than generating with guidance silently off while reporting otherwise. If you hit that, your ComfyUI's YuE2 tokenizer doesn't support the parameter yet; use the core node instead of pretending.

Installing it

The node ships in Kinburg-Nodes; the YuE2 side is ComfyUI's own, so the model files come from wherever you got those core nodes. Install the pack through ComfyUI Manager (search Kinburg-Nodes) or:

cd ComfyUI/custom_nodes
git clone https://github.com/Kinburg/Kinburg-Nodes

Restart ComfyUI. The pack's install.py pulls a CUDA build of llama-cpp-python for its local-LLM nodes, but this node needs nothing beyond the pack and your YuE2 checkpoint.

Where people get burned

Expecting a voice control. The most common disappointment, and the node's own docs are unusually blunt about it: tested, doesn't work, move on.

Turning it up to fix a muddled mix. Guidance can't fix an arrangement. If the vocal is buried, that's a style string and a plan problem.

Forgetting the doubling. Guidance of 4 on a four-minute song is where the OOM errors come from. If you're near your card's limit, A/B at low values on a fixed seed, or trim first.

CategoryKinburg-Nodes/Bestiary/Satyr

Inputs (12)

NameTypeDefaultDescription
clipCLIPThe YuE2 checkpoint's CLIP output β€” the same one 'YuE2 Generate Music' takes.
styleSTRINGLanguage, genre, vocal character, tempo, instruments. One description for the whole song: YuE2 has no way to say that the style changes partway through. This is the field 'cfg_scale' amplifies, so it is the field to be precise in. 'dual vocals, powerful melodic female vocal, gritty male vocal' is what puts two singers in the song at all β€” without it a plan written for two registers still tends to come back in one voice.
lyricsSTRINGThe words. Wire the 'lyrics' output of 'Satyr Score' here: by default that is the text as written, square-bracket markers and all, and they are worth keeping β€” the model takes the performance from them. Round brackets are the exception: YuE2 sings whatever is inside them. Amplified by 'cfg_scale' along with the style.
abcSTRINGThe plan. Leave it empty and the node falls back to 'off' mode exactly as the core node does. Note that the ABC is NOT amplified by 'cfg_scale': it sits in both branches of the guidance and cancels out. Raising the scale therefore pushes the style and the words harder while leaving the plan's own authority where it was.
seedINT00–18446744073709550000β€”
modeCOMBOfull: the plan carries chords. melody: melody only, for covers. An empty 'abc' ignores this and uses 'off'.
max_durationFLOAT360.000.04–900Ceiling in seconds. Generation usually stops earlier β€” the plan's own length is what decides, which is why 'Satyr Trim' is the node that actually shortens a song.
cfg_scaleFLOAT1.000–20How hard to push the style and the lyrics. 1.0 is off, and off is what the core node hardwires β€” this is the only reason this node exists. What it measurably does is DICTION. Words the model tends to swallow come through; the clearest case is a line in round brackets, which it otherwise sings too quietly or drops altogether. Raise this when the take is right but a phrase is mumbled. What it does not do is change who sings. That was the hope, and it was tested, and it does not. Why diction and not voices: the negative branch is the instruction plus the ABC, with [Tags] and [Lyrics] removed, so the plan sits in both branches and cancels out of the difference. The scale amplifies the words and the style description against a plan whose authority is unchanged β€” it makes the model articulate what it was given rather than rearrange it. Cost: anything other than 1.0 runs two branches, so roughly twice the VRAM and twice the time.
temperatureFLOAT1.000–5β€”
top_pFLOAT0.950.01–1β€”
top_kINT1001–32768β€”
repetition_penaltyFLOAT1.200.01–10β€”

Outputs (2)

NameTypeDescription
conditioningCONDITIONINGβ€”
secondsFLOATβ€”