# Write songs for MiniMax Music 3

How to write the caption and lyrics MiniMax Music 3 sings best from, cast singers, control a song's length, and hear it as it renders.

MiniMax Music 3 makes a finished song with vocals, up to six minutes long, from two pieces of text:

| Field | What it is | Limit |
| --- | --- | --- |
| `lyrics` | The words to sing, in tagged sections. Required. | 12,000 characters |
| `prompt` | The caption: how the song sounds, from tempo and genre to the singer and the mix. | 6,000 characters |

Together the two must fit in about 5,000 tokens, roughly 20,000 characters. Everything else is optional: `duration` caps the length, `seed` makes a take repeatable, and `response_format` picks the file type. [Its model page](/docs/models/minimax-music3) has every field and the price.

A song is an [async job](/docs/concepts/async-jobs): you create it, then listen to it as it renders, poll it, or get a webhook. The first audio arrives about 5 seconds in, and a song takes a little less time to render than it lasts: about two minutes for a three-minute song.

## Make a song

This short song is capped at 30 seconds, so it renders in about 20.

```bash
# Create the song and wait up to 60 seconds for it (Prefer: wait); it answers 200 when the song is done, 202 if it is still rendering
curl -s https://api.vultrinference.com/v1/music \
  -H "Authorization: Bearer $VULTR_INFERENCE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Prefer: wait=60" \
  -d '{
    "model": "minimax-music3",
    "prompt": "Global Metadata\nBasic Attributes: bpm is 96. key is G, and scale is major. Indie Folk / Acoustic Pop.\nVocal Details\nVocal Gender & Timbre: Singer A (Female). A warm, close alto.\nArrangement\nInstrument Lifecycle Description (Primary/Secondary Layering):\nPrimary: A fingerpicked acoustic guitar from the first bar.",
    "lyrics": "[Intro]\n\n[Verse]\nMorning light on the kitchen floor\nCoffee cups and an open door\n\n[Chorus]\nStay a while, stay a while\nThe day can wait for us\n\n[Outro]",
    "duration": 30,
    "seed": 7
  }' | tee song.json | jq '{id, status, warnings}'

# Download it once its status is completed
curl -s -o song.mp3 "https://api.vultrinference.com/v1/music/$(jq -r .id song.json)/content" \
  -H "Authorization: Bearer $VULTR_INFERENCE_API_KEY"
```

```python
import os
import time

import requests

API = "https://api.vultrinference.com/v1"
headers = {"Authorization": f"Bearer {os.environ['VULTR_INFERENCE_API_KEY']}"}

caption = "\n".join([
    "Global Metadata",
    "Basic Attributes: bpm is 96. key is G, and scale is major. Indie Folk / Acoustic Pop.",
    "Vocal Details",
    "Vocal Gender & Timbre: Singer A (Female). A warm, close alto.",
    "Arrangement",
    "Instrument Lifecycle Description (Primary/Secondary Layering):",
    "Primary: A fingerpicked acoustic guitar from the first bar.",
])
lyrics = "\n".join([
    "[Intro]",
    "",
    "[Verse]",
    "Morning light on the kitchen floor",
    "Coffee cups and an open door",
    "",
    "[Chorus]",
    "Stay a while, stay a while",
    "The day can wait for us",
    "",
    "[Outro]",
])

# Create the job; it answers 202 at once
job = requests.post(f"{API}/music", headers=headers, json={
    "model": "minimax-music3",
    "prompt": caption,
    "lyrics": lyrics,
    "duration": 30,
    "seed": 7,
}).json()

# Poll at the pace the API asks for (openai-poll-after-ms), until the job is final
wait_ms = 2000
while job["status"] in ("pending", "in_progress"):
    time.sleep(wait_ms / 1000)
    response = requests.get(job["polling_url"], headers=headers)
    job = response.json()
    wait_ms = int(response.headers.get("openai-poll-after-ms", wait_ms))

print(job["status"], job.get("usage"))
if job["status"] == "completed":
    with open("song.mp3", "wb") as f:
        f.write(requests.get(f"{API}/music/{job['id']}/content", headers=headers).content)
```

The rest of this page is about what to put in `prompt` and `lyrics`. Everything below was learned by rendering hundreds of songs.

## The caption

MiniMax trained Music 3 on captions written one way, and the model sings best from that layout. There are three headings, each followed by its labelled fields, one field to a line, always in the same order, with no blank lines:

```text
Global Metadata
Basic Attributes: bpm is 116. key is F, and scale is minor. Nu-Disco / Dark Funk-Pop.
Global Emotional Progression: Opens cool and watchful over a filtered groove, tightens through the verses, and breaks into a defiant, euphoric chorus. The bridge drops to a near-whisper before the last chorus lands harder than the first.
Application Scenarios & Imagery: Late-night city drives, the first peak hour in a club, the closing titles of a neon-lit thriller.
Sonics & Production Profile: A wide, polished mix with a tight, punchy low end and a glossy top. Bass and kick sit forward, side-chained so the pads breathe on every beat; the choruses are compressed into a wall of sound while the verses stay dry and close.
Vocal Details
Vocal Gender & Timbre: Singer A (Female). A smoky alto with a breathy low register and a bright, ringing upper range.
Vocal Style: Cool and rhythmic in the verses, half-spoken on the downbeats; full-voiced and belted in the choruses, with long held notes on the hook.
Harmony/Backing Vocals: Stacked octave doubles and a call-and-response backing line in the choruses; none in the verses.
Vocal FX: A short plate reverb, with quarter-note delay throws on the last word of each chorus line and light saturation in the bridge.
Arrangement
Instrument Lifecycle Description (Primary/Secondary Layering):
Primary: A slap-and-pick electric bass drives the song from the first bar to the last, with a muted funk guitar chopping sixteenths against it from the first verse.
Secondary: Warm analog string pads enter at the pre-chorus and swell through each chorus; a bright synth lead answers the vocal hook in the second chorus and carries the solo.
Groove & Foundation Progression: A four-on-the-floor kick with open hi-hats on the off-beats. The verses keep kick and bass alone, the choruses add claps on two and four and a tambourine, and the bridge drops to kick and bass before a snare roll rebuilds it.
Embellishments, Textures & Spatial FX: Filter sweeps into every chorus, a reverse cymbal before the bridge, and a final chorus that opens the low-pass filter all the way.
```

What each field holds:

| Field | Write |
| --- | --- |
| Basic Attributes | Always this sentence: `bpm is N. key is K, and scale is major` (or `minor`), then the genre and subgenres as `Genre / Subgenre.` Give one exact tempo and one key, not a range. |
| Global Emotional Progression | How the feeling moves from the opening to the end. |
| Application Scenarios & Imagery | Where the music would play: scenes, settings, moments. Not the story of the lyrics. |
| Sonics & Production Profile | The mix: soundstage, frequency balance, dynamics, compression. |
| Vocal Gender & Timbre | Who sings, as `Singer A (Male)`, `Singer B (Female)`, and each voice's timbre and register. See [singers](#singers). |
| Vocal Style | The delivery, and how it changes from section to section. |
| Harmony/Backing Vocals | Harmonies and backing vocals, or that there are none. |
| Vocal FX | The effects, named concretely: reverb, delay, doubling, saturation, or none. |
| Primary | The instruments carrying the song, and what they do through it. |
| Secondary | The supporting instruments: where each enters, changes and leaves. |
| Groove & Foundation Progression | Drums and bass: the groove, and how it builds and drops through the sections. |
| Embellishments, Textures & Spatial FX | Fills, transitions and effects, and where each one marks a change. |

Primary and Secondary go under the `Instrument Lifecycle Description (Primary/Secondary Layering):` line, as in the example.

What makes a caption work:

- **Describe only the music.** Leave out the story, the title and lines from the lyrics. The only scenery belongs under Application Scenarios.
- **Be concrete.** The model follows named instruments, effects and section changes. A vague word becomes a default: when one writer asked every song for "restrained vocal effects", 128 of 140 songs came out with the same clean, dry voice. Ask for "a short plate reverb with delay throws" instead.
- **Fill every field with a sentence or a few.** About 250 to 450 words across the whole caption is plenty.
- **Vary what you vary on purpose.** Over many songs, a caption that repeats its singer, tempo and effects gives you the same song again with new words.

> [!NOTE]
> The layout is how the model was trained, not a rule the API enforces. A caption in free prose is accepted and still sounds like what it describes, but the layout gives the model every detail in the form it learned.

### Start from MiniMax's style references

MiniMax publishes the references its own caption writer works from, in [`skills/music-caption-rewriter`](https://github.com/MiniMax-AI/MiniMax-Music3/tree/main/skills/music-caption-rewriter) of the MiniMax-Music3 repository:

| Part | What it holds |
| --- | --- |
| A genre router | 18 genre families, the words that point to each, and how to read a fusion |
| A family index each | Compact style cards: genre, tempo and key, mood, lead singer and core instruments |
| 1,000 captions | Complete captions in the layout above, one per style card |

The captions are the useful part. A caption written next to real examples of its genre names what the genre actually sounds like ("brushed snare on 2 and 4, ride kept low in the verses"), where one written from a short description falls back on phrases like "a driving rhythm". To use them:

1. Find your genre's family in the router, and a second family only for an explicit fusion.
2. In that family's index, pick two or three cards close to the song you want: the tempo, the mood and the lead singer.
3. Read those captions in full, then write yours in the same layout, taking their concrete language for instruments, grooves and production. Write your own song, not a copy of one of theirs.

For a fusion, keep the first genre as the foundation and take only one dimension from the second, such as its instruments or its groove. A song built on the second genre's card sounds like the second genre.

The folder is also an agent skill: `npx skills add MiniMax-AI/MiniMax-Music3 --skill music-caption-rewriter` installs it into Claude Code, Codex or Cursor, which can then write captions this way for you. Its default asks for restrained vocal effects; over many songs that gives every song the same voice, so tell it which effects you want.

### Tempo, key and time signature as fields

`bpm`, `key` (such as `"F minor"`) and `time_signature` are also accepted as fields. Music 3 has no exact tempo or key control. These fields are hints, written into the caption as its Basic Attributes line, and the job's `warnings` says so with `advisory_control`. If your caption already has a Basic Attributes line, the fields are not applied and `warnings` says that instead. Either way the song lands near the tempo and key, not exactly on them, so it is simplest to write them in the caption yourself.

## The lyrics

The lyrics are sections in order, each a tag in square brackets followed by its lines:

```text
[Intro]

[Verse]
The streetlights hum a minor key
I count the blocks back home to you
The city never sleeps for free
And neither, darling, do we two

[Pre-Chorus]
Turn it up, turn it up

[Chorus]
Dance like the lights won't hold
Dance till the night runs cold
We were born for the after-hours
We were born, we were born to glow

[Instrumental]

[Outro]
```

The tags Music 3 knows:

| Tag | Use |
| --- | --- |
| `[Intro]`, `[Outro]` | The start and end. Usually instrumental: leave them without lines. |
| `[Verse]`, `[Pre-Chorus]`, `[Chorus]`, `[Post-Chorus]`, `[Bridge]` | The sung sections. Each needs at least one line. |
| `[Instrumental]`, `[Solo]` | A break with no singing: no lines. |

The API rewrites common spellings to the model's own, so `[pre chorus]` becomes `[Pre-Chorus]`, and `[Inst]` or `[Interlude]` becomes `[Instrumental]`. Other tags are passed through as written and work as loose instructions; MiniMax's own examples use some, such as `[bass-quartet-rumbles-in]`. The model treats them as suggestions, not commands.

What makes lyrics work:

- **Every word is sung.** Music 3 sings exactly what it is given. A singer's name in front of a line (`Mara: I held the iron cold`) is sung too, and the rest of the line is crushed to fit around it. Leave out names, labels, stage directions and notes in parentheses. Who sings what goes in the caption.
- **Write the whole song.** Give at least four sections, in the order they are sung. A full song usually has ten to twelve.
- **Don't count on repeats inside a section.** A line written three times in a row may be sung once. To repeat a hook, repeat its section: a second `[Chorus]` with the same lines.
- **There is no instrumental-only song.** Music 3 always sings, and `lyrics` is required; `instrumental: true` is refused with a 400. For instrumental passages, use `[Intro]`, `[Instrumental]`, `[Solo]` and `[Outro]` with no lines.

## Singers

One lead singer is the default. For a duet:

- **Cast two leads, at most three.** Music 3 keeps two voices apart reliably, sometimes three. A song that cast nine characters, each described in prose, came out with one singer.
- **Name them the way the model learned:** `Singer A (Male)`, `Singer B (Female)`, each with a contrasting timbre and register in Vocal Gender & Timbre. Character names mean nothing to the model as voices.
- **Trade whole sections, not lines.** In Vocal Style, say which sections each singer has alone and which they share, and give each a section of their own before a shared one.
- **For a man and a woman, let the man open.** In a test of the same duet both ways round, every song the male singer opened switched singers as cast (8 of 8); when the female singer opened, he came in only 1 time in 4.
- **Voice tags in the lyrics don't help.** Adding `[male vocal]`, `[female vocal]` or `[duet]` after the section tags made no difference anyone could hear. The caption decides who sings.

## Length

`duration` is a ceiling, not a target: 30 to 360 seconds, 300 by default. The lyrics set how long the song actually is, and a song with few sections ends early. With the default ceiling, songs in our testing came out like this:

| Lyrics | Sections | Song |
| --- | --- | --- |
| A few lines | 3 or 4 | under a minute |
| 750 to 1,000 characters | about 10 | about 3 minutes |
| 1,000 to 1,500 characters | about 11 | 3 to 3.5 minutes |
| 1,500 to 2,000 characters | about 11 | 3.5 to 4 minutes |
| about 2,750 characters | about 26 | about 4.5 minutes |
| 4,000 characters or more | 35 or more | 6 minutes |

More sections make a song longer than more words in the same sections. For a long song, raise `duration` to 360 and write more sections. Six minutes is the most the model renders: lyrics that would run longer are cut, and their last lines are not sung.

You pay for the audio produced: each song is rounded up to a whole second and never billed past the `duration` you asked for. Asking for a long ceiling costs nothing extra if the song ends sooner.

See the Music models: /docs/models.md

## Takes and seeds

The same request with the same `seed` makes the same song, so a seed lets you keep a take you like and change only one thing, such as a line of lyrics or the Vocal FX. Change the seed, or leave it out, for a new take. Music 3 makes one song per request (`n` is 1); for several candidates, send several requests, each billed on its own.

## Hear it as it renders

While a song renders, its job has a `stream_url`, and `GET /v1/music/{id}/stream` plays the song as a WAV from its first second. That makes it cheap to judge a take: listen to the opening, and if it is not right, cancel the job with `DELETE /v1/music/{id}`. A cancelled song is not billed. [Async jobs](/docs/concepts/async-jobs#hear-a-song-as-it-renders) has the details.

The finished song comes from `GET /v1/music/{id}/content`, as mp3 (the default, 256 kbps), wav, flac, opus, aac or raw pcm, at 32 kHz in stereo. It is kept for 7 days.

- [`POST /v1/music`](/docs/reference/create-music.md): Create Music
- [`GET /v1/music/{id}/stream`](/docs/reference/get-music-stream.md): Stream Music
- [`GET /v1/music/{id}/content`](/docs/reference/get-music-content.md): Download Music
- [`DELETE /v1/music/{id}`](/docs/reference/delete-music.md): Cancel or Delete Music

## When something sounds wrong

| You hear | Why | Do |
| --- | --- | --- |
| A name or a stage direction sung | Everything in `lyrics` is sung | Keep only the sung words in the lyrics; put who sings what in the caption |
| One singer where you cast several | Too many singers, or singers named by character | Cast two leads as Singer A and Singer B, trading whole sections |
| Every song has the same voice | The caption's vocal fields are vague or identical from song to song | Name the timbre, delivery and effects concretely, and vary them |
| A song ends well before `duration` | Length comes from the lyrics; `duration` only caps it | Write more sections |
| The last lines of a long song are missing | The lyrics run past six minutes | Cut sections, or split the song in two |
| A repeated line is sung once | Repeats inside one section may be merged | Repeat the section instead |
| The tempo or key is a little off | Tempo and key are hints to this model | Expected; for a near match, state one exact bpm and key in Basic Attributes |
| A 400 naming `instrumental`, `language` or `input_references` | Music 3 does not take these fields | Leave them out; see [errors](/docs/concepts/errors) |

## Credit

MiniMax Music 3's license asks that the model's name be shown with it. `attribution` in `GET /v1/music/models` gives the name to use: MiniMax-Music3.
