Generate Mashup Music · V4.5
Two MP3s into a hybrid, no DAW
- audio
- url
- all_urls_json
- task_id
- raw_json
- credits_consumed
- credits_left
Mashup is the odd corner of Suno's API: two tracks in, one that borrows from both out. This node is the V4.5 flavour, and it's the one node in this family where the inputs aren't what you'd expect - you supply URLs in a JSON list, not audio you feed through a socket.
How the swap works
The source tracks are upload_url_list, a required text widget containing a JSON array:
[
"https://example.com/track-a.mp3",
"https://example.com/track-b.mp3"
]
Both URLs must be publicly fetchable by KIE - the provider pulls the audio itself, so localhost, a local file path, or a Google Drive preview link all fail. The docs are explicit that upstream uses only the first two entries; a third is ignored. If the tracks came out of a Generate Music node in this same graph, push them somewhere public first (the pack's upload helpers live under KIE Next / Utility).
Once submitted, the node blocks and polls the job until it completes or timeout_seconds (default 1200 seconds) expires. KIE's transport model is ai-music-api/mashup, and V4_5 rides along as the version in the payload.
The rest of the controls
style, title and prompt are all required widgets here, unlike the generation node where they're optional. prompt behaves as lyrics only when lyrics is empty; lyrics takes priority when both are filled. style is what steers the blend - it's the closest thing to a "how should these two coexist" control you get, so be specific rather than typing "pop".
variety is the interesting dial: 0 locks the output to one style, 1 is the balanced default, 2 produces distinctly different takes, 3 pushes for exploration, and 4 is described as maximum diversity where results may differ very significantly. If you're generating mashups for a moodboard, 2 or 3; if you need one consistent sound for a series, stay at 0 or 1.
style_weight, weirdness_constraint and audio_weight are 0–1 nudges, vocal_gender shifts the odds rather than dictating them, and persona_id / persona_model are persona plumbing - clear persona_id if you're not using one, since its default is the literal placeholder persona_123. duration and persona_model are documented as V5.5/V6-family-only, so they do nothing on V4.5.
Output
audio is the mashup, decoded into a standard ComfyUI AUDIO object - SaveAudio, a preview node, or straight into a video pipeline. all_urls_json preserves every URL the response contained (multiple takes are normal; audio is the first), url is the primary link, task_id is the KIE job ID, and raw_json is the whole provider response for when something sounds wrong and you want to see the request that produced it. credits_consumed and credits_left report the spend, and the node shows both on its face after each run.
Getting it running
ComfyUI Manager, search ComfyUI-KIE-Nodes-Next, or clone it:
cd ComfyUI/custom_nodes
git clone https://github.com/felipederosilva/ComfyUI-KIE-Nodes-Next
Restart, then set the key once in Settings → KIE.ai Nodes Next → Connection → Paste / replace KIE.ai API key. It's validated before saving, kept out of your workflow JSON, and displayed as a masked fingerprint. For a headless box, KIE_API_KEY in the environment overrides the saved key. Dependencies are requests, Pillow, numpy, PyYAML; there are no model downloads.
Gotchas that matter
This node does no uploading for you. That's the whole difference between it and the generation nodes, which quietly convert your IMAGE/AUDIO sockets to hosted URLs. Here the URL is your problem.
Rejections are cheap to avoid, expensive to debug. A 404, a redirect to an HTML page, or an expired link shows up as a task failure after the credits are committed. Open both URLs in a browser first.
It's a legacy version. KIE's docs sort V4.5 in with the (Discontinued) models; V6, V6_MINI and V6_WILD are current. Fine to experiment with, not the one to build a pipeline on.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| upload_url_list | STRING | [ "https://example.com/audio1.mp3", "https://example.com/audio2.mp3" ] | Array of audio file URLs to mashup. Provide 2 audio URLs. Upstream uses only the first 2. Each URL must be publicly accessible. |
| prompt | STRING | A calm and relaxing piano track with soft melodies | A description of the desired audio content. Optional. - Used as lyrics only when `lyrics` is not provided. If `lyrics` is present, `prompt` is not used as lyrics. - V6, V6_MINI, and V6_WILD: Maximum 5000 characters. |
| style | STRING | Jazz | Music style specification for the generated audio. Required. - Character limits by model: - **V4** (Discontinued): Maximum 200 characters - **V4_5 & V4_5PLUS** (Discontinued): Maximum 1000 characters - **V4_5ALL** (Discontinued): Maximum 1000 characters - **V5 & V5_5** (Discontinued): Maximum 1000 characters - **V6, V6_MINI & V6_WILD**: Maximum 1000 characters - Common examples: Jazz, Classical, Electronic, Pop, Rock, Hip-hop, etc. |
| title | STRING | Relaxing Piano | Title for the generated music track. Required. - Character limits by model: - **V4** (Discontinued): Maximum 80 characters - **V4_5 & V4_5PLUS** (Discontinued): Maximum 100 characters - **V4_5ALL** (Discontinued): Maximum 80 characters - **V5 & V5_5** (Discontinued): Maximum 100 characters - **V6, V6_MINI & V6_WILD**: Maximum 100 characters - Will be displayed in player interfaces and filenames. |
| vocal_genderopt | COMBO | m | Vocal gender preference for the singing voice. Optional. Use 'm' for male and 'f' for female. Based on practice, this parameter can only increase the probability but cannot guarantee adherence to male/female voice instructions. |
| style_weightopt | FLOAT | 0.610–1 | Strength of adherence to the specified style. Optional. Range 0–1, up to 2 decimal places. |
| weirdness_constraintopt | FLOAT | 0.720–1 | Controls experimental/creative deviation. Optional. Range 0–1, up to 2 decimal places. |
| audio_weightopt | FLOAT | 0.650–1 | Balance weight for audio features vs. other factors. Optional. Range 0–1, up to 2 decimal places. |
| lyricsopt | STRING | [Verse] Keep the melody flowing Into a gentle bridge [Chorus] Let the piano rise and fall | Lyrics for the mashup. Optional. - Takes priority over `prompt` as lyrics. If omitted, `prompt` is used as lyrics when provided. - V6, V6_MINI, and V6_WILD: Maximum 5000 characters. |
| varietyopt | INT | 10–4 | Controls the diversity and stylistic variation of generated results. Optional. Integer range 0–4, default 1. - **`0`**: off (exact style) — fully off, strictly the same style - **`1`**: normal (balanced variety) — default, balances stability and diversity - **`2`**: high (distinct styles) — produces results with clearly different styles - **`3`**: extra (bold exploration) — higher variation, encourages bold exploration of different styles - **`4`**: max (unreasonably varied) — maximum diversity; results may differ in style very significantly |
| persona_idopt | STRING | persona_123 | Persona ID or Voice ID to apply to the generated music. Optional. Use this to apply a specific persona style to your music generation. To generate a Persona ID, use the [Generate Persona](https://docs.kie.ai/suno-api/generate-persona) endpoint to create a personalized music Persona based on generated music. To generate a Voice ID, use the [Generate Voice](https://docs.kie.ai/suno-api/suno-voice-generate) endpoint. |
| persona_modelopt | COMBO | style_persona | Persona model. Optional. Use `style_persona` for Generate Persona IDs, or `voice_persona` for Suno Voice IDs. Default: `style_persona`. Available for V5 (Discontinued), V5_5 (Discontinued), V6, V6_MINI, and V6_WILD. |
| durationopt | INT | 2010–360 | Audio duration in seconds. Optional. Range 10–360, default 20. Valid when `model` is ~~V5_5~~ (Discontinued), V6, V6_MINI, or V6_WILD. |
| timeout_secondsopt | INT | 120030–7200 | — |
| callback_urlopt | STRING | Optional KIE callback URL. Leave empty for normal ComfyUI use. |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |
| url | STRING | — |
| all_urls_json | STRING | — |
| task_id | STRING | — |
| raw_json | STRING | — |
| credits_consumed | FLOAT | — |
| credits_left | FLOAT | — |