ComfyUI Node

T8 编曲规划器 / Arrangement Planner

Decide the arrangement in text instead of rerolling the song

By T8mars·Created 2 months ago·Updated 2 days ago· 347
T8 编曲规划器 / Arrangement Planner
  • provider_config
  • arrangement_plan_json
  • arrangement_summary
  • arrangement_report_json
◄music_idea►
◄bpm0►
◄target_duration_seconds0►
◄quality_mode标准 / Standard►
◄seed0►
◄api_mode贞贞平价小屋(推荐)►
◄ai_workshop_modelgemini-3.5-flash►
◄llm_max_tokens16384►
◄local_modelQwen3.8-27B-Q4_K_M.gguf►
◄local_context_size32768►
◄local_max_tokens16384►
◄local_think_mode关闭(推荐,速度优先)►
◄local_reasoning_effortmedium►
◄local_unload_policy执行后卸载(推荐)►
◄local_comfy_memory_policyAUTO(显存不足时释放)►
◄genre►
◄instruments►
◄meterAUTO►
◄key_scale►
◄structure►
◄constraints►
◄lyric_plan►
◄custom_model►
◄openai_base_url►
◄api_key►

What it is

A text planner for the part of a song that isn't the words: sections, tempo, meter, key, which instruments enter and leave and when, the energy curve across the track, vocal delivery, mix intent. It outputs one versioned plan, t8-arrangement-plan/v1, and a human-readable summary of it. It does not generate audio, ABC or MIDI.

Why you'd want that as a separate node: the local music models are where the arrangement gets mushy. ACE-Step is the strongest open option - Suno-adjacent instrumental quality on a small card, plus LoRA training - but its structure stays fairly generic unless you steer it, and the fix people reach for is better prompting, i.e. rerolling the song. Planning the arrangement in text first makes those decisions explicit and reviewable, and it costs one text call instead of a render. Reroll the plan, not the track.

How it works

The model is given a strict contract: return one JSON object containing arrangement, make the plan compact and actionable, and - this is the part that matters - distinguish what you explicitly specified from what it inferred. It's also forbidden from emitting ABC, MIDI, audio, copyrighted lyrics or a living-artist imitation.

The node then assembles the plan locally. Your explicit values are carried into the contract fields (genre, instruments, bpm, meter, key_scale, target_duration_seconds, structure), a plan_id is computed as a content hash of the plan, and a report is written. One honest detail: the plan records its source as inferred - so a BPM you typed and a BPM the model proposed look the same once they're in the JSON. Treat the numbers as the plan's proposal, not as something that was verified.

If you connect a lyric plan, the node reads it, validates it, and records only its plan_id. The lyrics themselves aren't re-sent, which keeps the arrangement plan small and keeps one source of truth for the words.

The projection bit - the actual reason it's built this way

Music 3 and YuE2 both accept an arrangement_plan socket, but they don't dump your plan text into the caption. They read an allow-list - genre, instruments, bpm, meter, key_scale, structure - and only fill in node fields you left empty, AUTO or 0. If both the plan and the node specify a different value for the same field, the receiving node raises a conflict error instead of silently picking one. So the plan is a controlled projection, not free text injection, and when it collides with your own settings it tells you rather than guessing.

Inputs worth setting

music_idea is required. genre, instruments, structure and constraints are where you do the actual work - instruments especially, since the plan is supposed to sequence entries and exits, not just list a band.

bpm is 0 for AUTO, up to 300. target_duration_seconds is 0 for AUTO, up to 3600, and it shapes how much arrangement gets planned rather than forcing a render length. meter defaults to AUTO and key_scale is free text. Note the semantics: zero means "you decide", not zero.

quality_mode is 标准 / Standard or 仅文本审校 / Text review, which adds one extra review request. lyric_plan is the optional socket described above. seed, llm_max_tokens, the local GGUF settings and the channel choice (api_mode, plus a provider_config socket) are plumbing.

Outputs

arrangement_plan_json is the machine contract - that's the one you wire into Music 3 or YuE2. arrangement_summary is the prose plan, and honestly it's the output you'll read: it's the section-by-section energy map and instrument schedule in sentences you can argue with before committing a render. arrangement_report_json carries provider, model, stages, the review text, and two flags that keep you honest - audio_verified: false and abc_generated: false.

Installation

Same pack:

cd ComfyUI/custom_nodes
git clone https://github.com/T8mars/comfyui-minimax-h3-prompt-enhancer-T8.git

Restart ComfyUI, then Ctrl+F5 the browser. Or search ComfyUI-Manager for MiniMax H3 / Seedance 2.0 / Music 3 Prompt Enhancer (T8). Cloud mode needs no extra dependencies; local GGUF needs an LLM in ComfyUI/models/LLM plus a runtime, and this node is text-only, so no vision projector.

Gotchas

The conflict error is the main one, and it's by design: if your Music 3 node already has a BPM set and the plan says something different, you'll get an error naming the field. Fix it by clearing the node's field to AUTO/0 and letting the plan own it, or by dropping the plan connection.

The review is not a listening test. audio_verified: false and abc_generated: false are in the report specifically so nobody reads a passing text review as approval of the audio.

And the pack-wide install wart: ComfyUI-Manager can reinstall an older Registry version while reporting success if the newer one is pending or flagged. Update from GitHub, never keep two copies of the pack in custom_nodes, and always Ctrl+F5 after a restart - otherwise you'll be reading documentation for a version you aren't running.

CategoryT8/Music

Inputs (26)

NameTypeDefaultDescription
music_ideaSTRING—
bpmINT00–300—
target_duration_secondsINT00–3600—
quality_modeCOMBO标准 / Standard2 options: 标准 / Standard, 仅文本审校 / Text review
seedINT00–18446744073709550000—
api_modeCOMBO贞贞平价小屋(推荐)4 options: 贞贞平价小屋(推荐), 贞贞的AI工坊(图片/视频), OpenAI兼容接口(备用), 本地 GGUF(llama.cpp / Qwen,离线)
ai_workshop_modelCOMBOgemini-3.5-flash2 options: gemini-3.5-flash, Custom(自定义)
llm_max_tokensINT16384256–61440—
local_modelCOMBOQwen3.8-27B-Q4_K_M.gguf1 options: Qwen3.8-27B-Q4_K_M.gguf
local_context_sizeINT327688192–65536—
local_max_tokensINT16384256–61440—
local_think_modeCOMBO关闭(推荐,速度优先)2 options: 关闭(推荐,速度优先), 开启(质量优先)
local_reasoning_effortCOMBOmedium3 options: low, medium, xhigh
local_unload_policyCOMBO执行后卸载(推荐)3 options: 执行后卸载(推荐), 保持驻留, 空闲10分钟后卸载
local_comfy_memory_policyCOMBOAUTO(显存不足时释放)2 options: AUTO(显存不足时释放), 不主动释放 ComfyUI 模型
genreoptSTRING—
instrumentsoptSTRING—
meteroptSTRINGAUTO—
key_scaleoptSTRING—
structureoptSTRING—
constraintsoptSTRING—
lyric_planoptSTRING—
custom_modeloptSTRING—
openai_base_urloptSTRING—
api_keyoptSTRING—
provider_configoptT8_LLM_PROVIDER_CONFIG—

Outputs (3)

NameTypeDescription
arrangement_plan_jsonSTRING—
arrangement_summarySTRING—
arrangement_report_jsonSTRING—