ACE Song Variation Director (Nukun)
Get ACE-Step to write a real song structure, not one 60-second blob
- tags
- lyrics
- report
- plan_json
ACE-Step is genuinely good at instrumentals and famously bad at lyrics - the community says it plainly, and so does the author of this pack. So the first thing you'll want once you've made a song you like is a way to make it structured: verse, chorus, verse, with actual contrast between sections, instead of one coherent but monotonous blob. That's what ACE Song Variation Director (Nukun) is for. It takes your ACE-Step tags and your rough, sectioned lyrics, hands them to a local LLM running through Ollama, and gets back a real arrangement plan plus rewritten lyrics - before you ever hit the sampler.
It's the first of a two-node pipeline: this one plans, ACE Song Timeline Conditioning (Nukun) executes (wire the plan_json output straight into that node's plan_json input and you barely have to retype anything).
How it works
Under the hood this is a prompt-rewriting node with a very narrow, structured job. It sends your tags, sectioned lyrics, and must_keep phrases to whatever model you've got loaded in a local Ollama server (default URL http://127.0.0.1:11434, no API key, nothing leaves your machine), and asks it to return strict JSON: a global arrangement, one production direction per section, rewritten lyrics, and optionally new sections. The system prompt is unusually disciplined - every direction must describe a concrete change in instrumentation, dynamics, rhythm, or vocal delivery, and never just "Chorus." The LLM is told to create purposeful contrast between sections, not random drift, and to keep your exact must_keep phrases verbatim.
The pack defaults to a niche model, autoren-darkidol-llama-3-1-8b:latest - you don't need that specific one. Any decent local chat model (a Llama 3.x or Qwen 8B-class) will do; the node lists your installed models in the dropdown, and it recovers from malformed JSON with one repair pass. Note the tooltip on tags: the original ACE-Step tags are treated as the fixed style anchor and passed through unchanged.
The inputs that actually matter
tags- your existing ACE-Step tags. They stay fixed; they're the style anchor.lyrics- with[Intro],[Verse],[Chorus]headers. Section detection is real: it parses those headers and falls back to blank-line stanza detection.must_keep- one exact word or phrase per line that must survive the rewrite. This is the difference between "my song" and "a song vaguely inspired by mine." Use it for your hook line or a chorus identity.- The seven sliders -
variation_strengthis the master dial (0.65 default), then per-axis controls forenergy,rhythm,instrument_rotation,vocal,harmonic, andtransition_strength. Push them up for a louder, more contrast-y song; keep them low if you want a restrained arrangement.max_new_sectionslets the model add up to four new ones, say a bridge you didn't write. lyrics_language-auto,de, oren. German source is detected and handled; the default is fine for English.
Outputs
Four of them: tags (unchanged), lyrics (rewritten, in order), report (what actually happened), and plan_json - the machine-readable arrangement that ACE Song Timeline Conditioning (Nukun) consumes. That plan carries per-section IDs, directions, and lyrics, so the whole pipeline stays deterministic per seed instead of you pasting text around.
Install and gotchas
Install the pack the normal way - ComfyUI Manager (search Nukun_ComfyUI_Nodes), or:
cd ComfyUI/custom_nodes
git clone https://github.com/OnekoSL/Nukun_ComfyUI_Nodes.git
Restart ComfyUI. The pack's requirements.txt is tiny (numpy, Pillow, scipy, PyWavelets) - this node needs no extra Python package, because it talks to Ollama over plain HTTP with the stdlib. What it does need is Ollama installed and running with a model pulled, or the node just errors on connect. If the model dropdown looks empty, refresh it and make sure the model is actually pulled (ollama list).
Where people get burned: forgetting Ollama is a separate process (start it before queueing), and expecting the rewritten lyrics to sound like Suno. It won't - that ceiling is ACE-Step's, not this node's. And keep fallback_mode on passthrough if you're iterating: on a failed generation it returns your original tags and lyrics instead of crashing the workflow. strict is there when you'd rather know loudly.
Inputs (21)
| Name | Type | Default | Description |
|---|---|---|---|
| tags | STRING | Original ACE-Step tags. They remain the fixed style anchor. | |
| lyrics | STRING | Lyrics with optional [Intro], [Verse], [Chorus], or similar section headers. | |
| must_keep | STRING | One exact word or phrase per line that must remain in the rewritten lyrics. | |
| ollama_url | STRING | http://127.0.0.1:11434 | Base Ollama URL, usually http://127.0.0.1:11434. |
| ollama_model | COMBO | autoren-darkidol-llama-3-1-8b:latest | Local Ollama model used for arrangement and lyric rewriting. |
| seed | INT | 00–18446744073709550000 | — |
| variation_strength | FLOAT | 0.650–1 | — |
| energy_variation | FLOAT | 0.750–1 | — |
| rhythm_variation | FLOAT | 0.550–1 | — |
| instrument_rotation | FLOAT | 0.750–1 | — |
| vocal_variation | FLOAT | 0.550–1 | — |
| harmonic_variation | FLOAT | 0.250–1 | — |
| transition_strength | FLOAT | 0.450–1 | — |
| max_new_sections | INT | 10–4 | — |
| lyrics_language | COMBO | auto | 3 options: auto, de, en |
| temperature | FLOAT | 0.650–2 | — |
| top_p | FLOAT | 0.900.01–1 | — |
| timeout_seconds | INT | 1801–600 | — |
| context_length | COMBO | 8192 | 7 options: 2048, 4096, 8192, 16384, 32768, 65536, +1 |
| fallback_mode | COMBO | passthrough | 2 options: passthrough, strict |
| unload_after_run | BOOLEAN | true | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| tags | STRING | — |
| lyrics | STRING | — |
| report | STRING | — |
| plan_json | STRING | — |