Generate song · MiniMax / YuE2
The One Node That Expands Into a Whole Music Pipeline
- audio
- sampler_name
- scheduler
- generation_json
Everything above this node in the workflow is preparation. MusicGeneration is where audio appears - and it does that without sampling anything itself. It's a subgraph emitter: hand it a model profile, a settings record, a Style and a Lyrics field, and it builds the handful of native ComfyUI nodes that load the weights and run the sampler.
Two things to know before you touch it. It needs a ComfyUI build new enough to expose the native nodes underneath - YuE2GenerateABC, YuE2GenerateMusic and EmptyYuE2LatentAudio for YuE2, the MiniMaxMusic3* pair, KSamplerWithConfig and the safe audio decoder for MiniMax. And it only ever expands the engine you selected. The other engine's nodes are never built, so a MiniMax run never touches your YuE2 checkpoint.
What you wire in
profile_json and settings_json come from the two nodes upstream and must agree, or you get a blunt "Song model and generation settings disagree" error. style and lyrics come from the parser (for YuE2, the parser's "caption" socket carries Style). Then the model filenames, which are plain local names, not URLs:
yue2_checkpoint- defaultyue2_3b_bf16.safetensors, resolved from ComfyUI'scheckpointscategoryminimax_model,minimax_encoder,minimax_vae- the DiT, the pruned int8 text encoder and the DAV VAE, fromdiffusion_models,text_encodersandvaetiled_decode- on by default, useful when a full-track decode is the thing that runs you out of memory
For covers, also wire the two optional inputs: cover_source_json from the source node and cover_abc from the transcription node. Outputs are audio (the generated track, into your processing chain), sampler_name and scheduler (what actually ran, after any host-side fallback), and generation_json, the record that feeds the production JSON.
How it works
For YuE2 it builds the native path: load the checkpoint, plan an ABC score with YuE2GenerateABC (skipped entirely in cover mode - your transcription takes its place, unchanged, by design), pass Style, Lyrics and the score to YuE2GenerateMusic, size the latent from the model's own returned duration, then sample with the settings group the profile selected. MiniMax is a different shape: separate UNET/CLIP/VAE loaders, MiniMaxMusic3TextEncode doing the caption-plus-lyrics heavy lifting with its own text cfg and top-k, a zeroed negative, then sampling.
One validation is worth knowing: when a Length has been requested, the YuE2 Style must begin with the matching duration line - the node refusing to generate a five-minute arrangement after the two halves of the prompt drifted apart.
Expectations, honestly
This is a young, heavy corner of a young, heavy category - the audio layer is the last thing bolted onto ComfyUI, and it's still node packs fighting transformers and torch versions. The first YuE release earned a rough local reputation: a real thread from February 2026 has someone with 32 GB of VRAM finally getting runs out of YuE in ComfyUI and producing "90 seconds of silence," with the top reply pointing them at ACE-Step instead - "leagues better... runs natively in comfy." That's the baseline YuE2 has to beat.
Its developers report competitive September 2026 evaluation results - treat that as their claim. What's certain: a full song through a 3B model plus a score planner is minutes of GPU time, not seconds, and community signal on YuE2 is close to nonexistent. You're an early adopter here.
When it breaks
- Non-finite latents. With the official fp16 MiniMax DiT, some seed/prompt/length combinations write non-finite values for the whole track. It's seed-dependent and no node can fix it - ComfyUI picks the dtype at checkpoint load.
--bf16-unetis the cheap experiment;--fp32-unetis the documented one (and doubles VRAM, so switch the artwork branch off if you're on 16 GB). Mostly, just queue again with a new seed. - Incoherent-but-finite audio. A CUDA graph / allocation-compiler interaction with the MiniMax text encoder.
MINIMAX_MUSIC3_RUNTIME_SAFETY=autodisables capture only on backends flagged as risky,=onforces it everywhere. - Short writes on export. If saving dies with a blank
AssertionErrorfrom SoundFile, that's invalid samples, not a disk problem. The pack validates samples in both savers and retries decoding once with smaller tiles, but it won't replace garbage with silence.
cd ComfyUI/custom_nodes
git clone https://github.com/jplenio/ComfyUI-MiniMax-Music-Production-Toolkit.git
cd ComfyUI-MiniMax-Music-Production-Toolkit
python -m pip install -r requirements.txt # same Python as ComfyUI
The Python requirements are light - numpy, scipy, soundfile, imageio-ffmpeg, mutagen, Pillow. The weight is the models: MiniMax Music 3's DiT, text encoder and VAE, or the YuE2 3B BF16 checkpoint, plus FLUX.2 Klein and FlashSR if you leave those stages on. The model-check node reports exactly what's missing before you pull anything.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| profile_json | STRING | Configuration input 'profile json'. This value is passed directly to the node's processing logic; keep it at the workflow default unless you intentionally want to change that part of the production chain. | |
| settings_json | STRING | Configuration input 'settings json'. This value is passed directly to the node's processing logic; keep it at the workflow default unless you intentionally want to change that part of the production chain. | |
| style | STRING | Configuration input 'style'. This value is passed directly to the node's processing logic; keep it at the workflow default unless you intentionally want to change that part of the production chain. | |
| lyrics | STRING | Final MiniMax Music Lyrics/structure field. For pure instrumentals this should contain only supported structural tags; for vocal tracks it contains tags plus singable lyrics. | |
| yue2_checkpoint | STRING | yue2_3b_bf16.safetensors | Configuration input 'yue2 checkpoint'. This value is passed directly to the node's processing logic; keep it at the workflow default unless you intentionally want to change that part of the production chain. |
| minimax_model | STRING | minimax_music3_dit_fp16.safetensors | Configuration input 'minimax model'. This value is passed directly to the node's processing logic; keep it at the workflow default unless you intentionally want to change that part of the production chain. |
| minimax_encoder | STRING | minimax_music3_text_encoder_pruned_int8_convrot.safetensors | Configuration input 'minimax encoder'. This value is passed directly to the node's processing logic; keep it at the workflow default unless you intentionally want to change that part of the production chain. |
| minimax_vae | STRING | minimax_music3_dav.safetensors | Configuration input 'minimax vae'. This value is passed directly to the node's processing logic; keep it at the workflow default unless you intentionally want to change that part of the production chain. |
| tiled_decode | BOOLEAN | true | Configuration input 'tiled decode'. This value is passed directly to the node's processing logic; keep it at the workflow default unless you intentionally want to change that part of the production chain. |
| cover_source_jsonopt | STRING | Source audio identity and shared transcription mode from Cover song / Source audio. Used only for YuE2 Cover; the filename owns the final title. | |
| cover_abcopt | STRING | Original SheetSage2 transcription. YuE2 Cover passes this score unchanged to music generation and uses it to guide the LLM arrangement. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |
| sampler_name | STRING | — |
| scheduler | STRING | — |
| generation_json | STRING | — |