Nodes/Nukun_ComfyUI_Nodes/ACE Song Variation Director (Nukun)
ComfyUI Node

ACE Song Variation Director (Nukun)

Get ACE-Step to write a real song structure, not one 60-second blob

By OnekoSL·Created 3 months ago·Updated a day ago· 1
ACE Song Variation Director (Nukun)
    • tags
    • lyrics
    • report
    • plan_json
    tags
    lyrics
    must_keep
    ollama_urlhttp://127.0.0.1:11434
    ollama_modelautoren-darkidol-llama-3-1-8b:latest
    seed0
    variation_strength0.65
    energy_variation0.75
    rhythm_variation0.55
    instrument_rotation0.75
    vocal_variation0.55
    harmonic_variation0.25
    transition_strength0.45
    max_new_sections1
    lyrics_languageauto
    temperature0.65
    top_p0.90
    timeout_seconds180
    context_length8192
    fallback_modepassthrough
    unload_after_runtrue

    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_strength is the master dial (0.65 default), then per-axis controls for energy, rhythm, instrument_rotation, vocal, harmonic, and transition_strength. Push them up for a louder, more contrast-y song; keep them low if you want a restrained arrangement. max_new_sections lets the model add up to four new ones, say a bridge you didn't write.
    • lyrics_language - auto, de, or en. 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.

    CategoryNukun/Audio/ACE

    Inputs (21)

    NameTypeDefaultDescription
    tagsSTRINGOriginal ACE-Step tags. They remain the fixed style anchor.
    lyricsSTRINGLyrics with optional [Intro], [Verse], [Chorus], or similar section headers.
    must_keepSTRINGOne exact word or phrase per line that must remain in the rewritten lyrics.
    ollama_urlSTRINGhttp://127.0.0.1:11434Base Ollama URL, usually http://127.0.0.1:11434.
    ollama_modelCOMBOautoren-darkidol-llama-3-1-8b:latestLocal Ollama model used for arrangement and lyric rewriting.
    seedINT00–18446744073709550000
    variation_strengthFLOAT0.650–1
    energy_variationFLOAT0.750–1
    rhythm_variationFLOAT0.550–1
    instrument_rotationFLOAT0.750–1
    vocal_variationFLOAT0.550–1
    harmonic_variationFLOAT0.250–1
    transition_strengthFLOAT0.450–1
    max_new_sectionsINT10–4
    lyrics_languageCOMBOauto3 options: auto, de, en
    temperatureFLOAT0.650–2
    top_pFLOAT0.900.01–1
    timeout_secondsINT1801–600
    context_lengthCOMBO81927 options: 2048, 4096, 8192, 16384, 32768, 65536, +1
    fallback_modeCOMBOpassthrough2 options: passthrough, strict
    unload_after_runBOOLEANtrue

    Outputs (4)

    NameTypeDescription
    tagsSTRING
    lyricsSTRING
    reportSTRING
    plan_jsonSTRING