arkennemasis fal · MiniMax Music 3 · $0.002/s
Two cents a second for a full song, and lyrics is not a suggestion
- audio
- audio_path
- seed
- duration
- info
Local music generation has a real answer - ACE-Step, which does instrumental work genuinely well on a 4GB card and has a weak spot exactly where songs are hard: vocals. If what you need is a song with lyrics that scan and a vocal that sounds like a human decided to sing, the open options still aren't there, and MiniMax Music 3 is the hosted shortcut. Up to five minutes, $0.002 per second, which means a full minute of finished audio costs twelve cents.
That pricing is the pitch. Twelve cents per minute of song makes iteration cheap enough that you can generate four takes of a chorus and keep one, which is not true of any per-image or per-second video model in this pack.
How it works
The node is a straight wrapper: FAL_KEY from the install's .env, input validation, cost estimate held against max_cost_usd, one submit, poll while the node shows status, then the file lands in output/fal/minimax_music-3/ and is shown on the node. Cancel in ComfyUI cancels the job on fal as well.
Inputs that matter
prompt is the music description - style, mood, vocals, instrumentation, arrangement. For anything you care about, write it as a structured caption: genre and BPM and key up front, then vocal details, then the arrangement section by section. Genre-only prompts get you genre-typical mush.
lyrics is where most people lose an hour. Structure tags - [intro], [verse], [pre-chorus], [chorus], [post-chorus], [bridge], [instrumental], [solo], [outro] - must each sit on their own line. The tooltip is explicit that text on the same line as a leading tag gets dropped by the model's input contract. So this is wrong:
[verse] I woke up in the city
and this is right:
[verse]
I woke up in the city
duration is a float up to 300 seconds and it's an upper bound, not a promise - the model can stop earlier, and the real length comes back on the duration output. Set 60 and get 43 seconds; that's normal, not broken. Plan your edit around the returned value, not the requested one.
num_inference_steps (default 30) is flow-matching steps per 8-second denoising chunk - more steps, better quality, slower. guidance_scale (default 1.7) is the classifier-free guidance scale; nudge it up if the prompt is being ignored, down if the result sounds over-cooked and harsh. seed at -1 lets the model pick, and the seed that was actually used comes back on the seed output - grab it if you want the same take again.
The pack-wide four: max_cost_usd ($20 default cap, 0 = off), reuse_identical_run, extra_json, max_concurrent.
Outputs: audio (wire it into the pack's assembly nodes or a Save Audio), audio_path, seed, duration, info (request id, cost estimate, saved files, fal's answer). Keep the seed; you'll want it.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis
pip install httpx
Manager → search arkennemasis. Then the key:
FAL_KEY=your-key-from-fal.ai/dashboard/keys
in the .env next to run_nvidia_gpu.bat. Restart ComfyUI.
Where it bites
- Tags sharing a line with their lyrics. Silent, and it eats the first phrase of every section.
- Expecting
durationto be respected exactly. It's a ceiling. - Repeat runs handing back the old file:
reuse_identical_runis on by default, and identical settings plus identical inputs means no new call. Change the seed for a new take. - Everything queues behind
max_concurrent: 1. If you're generating ten variations, raising it on these nodes is worth it - and if one fal node in the run fails, the ones still waiting don't start, so a failure can't run up a tab.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | Music description: style, mood, vocals, instrumentation and arrangement. For precise control use a Structured Caption with global metadata (genre, BPM, key, emotional progression), vocal details, and a section-by-section arrangement. | |
| lyrics | STRING | The lyrics to sing. Structure tags such as [intro], [verse], [pre-chorus], [chorus], [post-chorus], [bridge], [instrumental], [solo] and [outro] must each be on their own line; text on the same line as a leading tag is dropped by the model's input contract. | |
| duration | FLOAT | 60.001–300 | Upper bound on the generated audio length in seconds. The model may stop earlier; the actual duration is returned in the output. |
| seed | INT | -1-1–2147483647 | Random seed for reproducibility. If not provided, a random seed will be used. -1 leaves it to the model. |
| num_inference_steps | INT | 301–100 | Number of flow-matching Euler steps per 8-second denoising chunk. More steps improve quality at the cost of speed. |
| guidance_scale | FLOAT | 1.700–20 | Classifier-free guidance scale of the flow-matching stage. |
| max_cost_usdopt | FLOAT | 20.00–100000 | Safety cap. If the estimated cost of this run is above this many US dollars the node stops BEFORE sending anything to fal. 0 = no cap. |
| reuse_identical_runopt | BOOLEAN | true | If these exact inputs (the settings AND the same pictures/clips/audio) were already paid for and the files are still in output/fal, return them instead of paying again - also after a ComfyUI restart. Turn off for a fresh take with the same settings. |
| extra_jsonopt | STRING | Advanced: a JSON object merged into the request last, for any fal field this node has no box for. Example: {"seed": 7}. Leave empty normally. | |
| max_concurrentopt | INT | 11–32 | How many paid fal calls may run at the same time in one run, across every fal node. 1 (default) = one after another. This node starts its paid part only while fewer than this many fal calls are running. Once any fal node fails, the ones still waiting are not started, so nothing more is billed. |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |
| audio_path | STRING | — |
| seed | INT | — |
| duration | FLOAT | — |
| info | STRING | JSON: request id, cost estimate, saved files and fal's full answer. |