Skip to content

/compose#

/compose generates music from a text description. You describe the song in words, optionally hand it lyrics, and get back a real audio file that plays inline in Discord.

/compose prompt: dreamy lofi with rhodes piano, female vocals, 85bpm

Like every generation command it works in servers, in DMs, and through a user install in servers where Eimi is not added. It shares the access rules, the 15-job concurrent limit and the queue card with /imagine.


The model#

Everything runs through MiniMax Music 3, on Eimi's own GPU. It writes complete songs -- arrangement, performance and vocals in one pass -- from a single natural-language caption plus optional lyrics. Output is 32 kHz stereo, and the model can run up to five minutes.

It is pure text-to-music. There is no reference-track input on the command: you cannot upload a song and ask for more of it. To act on an existing audio file, right-click it and use the tweak menu instead.

What it handles well#

Area What lands
Genre and subgenre Named styles work, including hybrids, as long as they are not contradictory
Tempo A bpm written into the prompt text is read and used
Key Named keys ("in D-flat major") are read from the prompt text
Instrumentation Specific instruments, not just families. "Rhodes piano" beats "keyboard"
Vocals Gender, timbre, delivery, harmonies and effects. It sings real words
Production feel "Warm analog", "tape-saturated", "polished modern" and similar all register
Structure Section tags in the lyrics, and instrumentals when you ask for one

Where it falls down#

Limitation Detail
No numeric controls Tempo, key and meter are read from prose. There is no bpm parameter to force one, and nothing validates that the model obeyed
Duration is a ceiling, not a target The model decides when the song is finished. See duration
Contradictions get resolved arbitrarily Mixing incompatible genres or moods in one prompt gives you one of them, not a blend
Vague prompts give vague music "A nice chill song" produces something generic. The vocabulary you use is most of the result
Nothing is reproducible across changes The seed fixes the run, but changing one word in the caption changes the whole track
No editing There is no way to regenerate one section of a finished track. Every run is a fresh song

All 5 parameters#

Only prompt is required.

Parameter Type Default What it does
prompt text (required) -- Describe the song: genre, mood, bpm, key, vocals, instruments
lyrics text none (instrumental) Optional lyrics. Section tags structure the song
enhance true/false from your AI features setting Expands your description into a full caption with AI
duration number weighted random Maximum song length in seconds, 1 to 300
seed number random Seed for reproducible results

prompt#

The caption. This is the whole song specification, because Music 3 has no other controls.

It responds to the vocabulary a musician would use, and the more of these you cover the closer the result lands:

  1. Global -- genre and subgenre, tempo in bpm, key and scale, mood, production feel.
  2. Vocals -- gender, timbre, performance style, harmonies and effects. Or say "instrumental, no vocals" outright.
  3. Arrangement -- lead and secondary instruments, groove, bass, percussion, textures, spatial effects.

Write tempo and key as words inside the sentence rather than expecting a parameter to carry them:

/compose prompt: dreamy lo-fi hip-hop, around 78 BPM in D-flat major, nostalgic and laid-back with warm tape-saturated production; soft breathy female vocals with light reverb; mellow Rhodes piano lead, vinyl crackle, deep sub-bass, lazy boom-bap drums

That is roughly what enhance turns a short description into, and you can write it yourself.

dreamy lofi with rhodes piano, female vocals is a workable short prompt. nice chill song is not.

lyrics#

Leave it empty and you get an instrumental. Fill it in and the model sings it.

Section tags tell the model where the sections are, and they are worth using even on short songs. The tags the enhancer works with are:

Tag Purpose
[Intro] Opening, usually instrumental
[Verse] Verse
[Chorus] Chorus
[Bridge] Bridge
[Instrumental] An instrumental passage, or the whole track when it is the only tag
[Outro] Ending

The command's own help text mentions only [Verse], [Chorus], [Intro] and [Outro]. A typical full arrangement is [Intro][Verse][Chorus][Verse][Chorus][Bridge][Chorus][Outro].

Rough pacing: about 2 to 3 words of sung content per second of track, allowing for intros, instrumental breaks and outros. A 120-second song holds somewhere around 240 to 360 words. Write far more than that and the song either rushes or runs out before your lyrics do.

Lyrics are cut at 6000 characters

Anything past 6000 characters is dropped before the model ever sees it. There is no error, no note on the card and no indication in the result -- the song simply ends up missing the tail of what you pasted. Trim long lyrics yourself so you control where the cut lands.

enhance#

Rewrites your short description into a full structured caption, and writes or improves lyrics alongside it. The default follows your ai_features setting in /settings.

Situation What enhancement does
You gave a short caption, no lyrics Writes a full caption. Decides from the description whether the track should have vocals, and either writes lyrics scaled to your duration or outputs [Instrumental]
You gave lyrics Keeps your meaning and story, improves flow and singability, and adds section tags if you had none. It will not reorder tags you already wrote
You gave a long, detailed caption already Mostly reformats. Turning enhancement off is reasonable here

Enhancement is tried on Gemini first and falls back to the local LLM. It runs inside the queue worker when your job starts, not when you press enter, so it does not delay the queue card appearing. The card keeps showing what you typed, not the rewritten caption -- the full text is in the details panel.

Both the caption and the lyrics are scaled to the duration your job is running at, which is one reason setting duration explicitly is worth doing.

duration#

The maximum length of the song in seconds, clamped to 1 to 300.

Duration is a ceiling, not a target

Music 3 decides when the song is finished. duration: 240 means "stop by four minutes", not "give me four minutes". A song that wants to end at 90 seconds will end at 90 seconds, and there is no setting that forces it to keep going.

Leave duration off and Eimi draws one at random, but not evenly. The draw is weighted towards album-track lengths:

Length Weight Share of draws
30 s 5 5%
60 s 10 10%
90 s 20 20%
120 s 30 30%
180 s 25 25%
240 s 10 10%

The weights sum to 100, so each weight is its percentage directly. Three runs in four land between 90 and 180 seconds, and the single most likely draw is 120 seconds. The very short and very long ends are deliberately rare.

The consequence is that two identical /compose commands with no duration are not comparable. They may be running at 60 seconds and 180 seconds, which changes the arrangement, the lyric length the enhancer writes, and how long you wait. Set it explicitly whenever you are comparing prompts or iterating on one.

There is no bpm, key or time signature parameter

/compose used to expose bpm, key, time_signature, cfg_scale, temperature, top_p, denoise and reference_audio. None of them exist on the command any more. Put tempo, key and meter in the prompt text instead -- the model reads them from there.

seed#

Fixes the run. Same caption, same lyrics, same duration, same seed gives the same track. Out-of-range values (below 0 or above 4294967295) are replaced with a random one rather than rejected.

The seed is shared by the text encoding and the sampler, so it genuinely pins the whole generation. It does not survive a caption change: a one-word edit gives you a different song even on the same seed.


Output format#

The file format follows your audio preferences in /settings, falling back to mp3 at high quality.

Format Quality setting What you actually get
mp3 high VBR quality V0 (roughly 220-260 kbps)
mp3 medium VBR quality V2 (roughly 170-210 kbps)
mp3 low VBR quality V4 (roughly 140-185 kbps)
opus high 320 kbps
opus medium 192 kbps
opus low 128 kbps
flac -- Lossless. The quality row disappears from the settings panel

Music is the one result Eimi does not send as a modern card. It goes out as a plain message with the audio as a real attachment, because Discord's inline audio player only appears that way. The trade is that the file is a genuine attachment you can scrub and download, and the buttons sit in an ordinary row underneath.

The filename is randomised, so it carries nothing about your prompt.


While it runs#

The progress bar on a /compose card does not track the song being written.

Stage What the bar shows
Model loading and text encoding 0%
The whole sampling run Still 0%
Results being packaged Jumps to somewhere between 93% and 97%, then ticks up towards 99%
Done The progress message is deleted and replaced by the track

The bar is stuck, not frozen

The progress wiring for /compose is looking for node numbers that the current music model's graph does not have, so no real step updates ever reach it. A bar sitting at 0% for two minutes and then leaping to the mid-nineties is the normal, expected appearance of a working job. Judge progress by the elapsed time, not the bar.

The jump near the end is the generic "finishing" animation every job type uses, and it starts from a randomised cap between 93% and 97% rather than from wherever the job actually was.

How long it takes scales with the length you asked for. With no history to go on, Eimi estimates roughly 0.8 seconds of wall time per second of requested song, with a 30-second floor, and refines that estimate from real timings as jobs complete. A 120-second track is therefore a couple of minutes rather than seconds.

A compose job also evicts the image models from the GPU before it starts, and it runs without the GPU power cap other jobs get throttled by. That means the job queued after yours has to reload its model from disk.


The result card#

Music results carry a six-button row:

Button What it does
🔄 Re-roll -- same settings, new seed
🎲 Remix -- opens a panel to change the prompt before regenerating
Cover Opens the "Cover / Restyle" modal on this track. See the caveat below
Repaint Opens the "Repaint a section" modal on this track. See the caveat below
🔍 Details -- the full parameter and timing dump
🗑️ Delete the result
📤 Replaces 🗑️ on private results, and re-posts the song publicly

Cover and Repaint are text-labelled buttons rather than emoji. There is no ⬆️ upgrade, no 🎨 edit and no ✨ detailer.

The parameters line above the file shows 🎵, then your duration only if you set one explicitly, then your seed if you set one. A track generated with everything defaulted shows just the 🎵.

What Remix offers#

The remix panel is heavily stripped down for music. You get the Prompt row with its 📝 Edit button, then ↩️ Reset and ✅ Generate. There is no duration control, no lyrics field and no seed field on this panel -- rewriting the caption is the only thing it does.


Working on an existing track#

Right-clicking a message with an audio file (or a video with an audio track) and choosing tweak opens the audio operations menu, documented on the tweak page. It presents four options: Cover, Repaint, Style Tags and Transcribe. The first two also appear on music result cards.

Cover and Repaint may not do what their names suggest

Style Tags and Transcribe read your track and reply with text, and behave as described.

Cover and Repaint queue an ordinary compose job. The audio-specific machinery they were written for does not appear to be wired up on the current build: the uploaded track, the analysed bpm and key, the repaint time range and the cover strength are all collected and then ignored by the graph that actually runs. What comes back is a fresh text-to-music generation from the description you typed in the modal, at a 120-second cap.

Treat their output as a new song rather than a version of your track, and check it before relying on it.


Troubleshooting#

What you see What it means
Access Denied / You don't have access to use the bot in DMs. Your access does not extend to DMs
Access Denied / You don't have access to use the bot in this server. Ask the server owner to add you with /manage add A delegated server whose owner has not added you
Access Denied / You are blacklisted. or You are not whitelisted. Bot-wide access. See Access
Job Limit Reached / You have N job(s) in the queue. Your limit is L. You already have the maximum number of jobs queued. The default limit is 15
Failed to prepare compose workflow. Please try again. The workflow could not be built. Usually a ComfyUI-side problem
Workflow system not available. Please try again later. ComfyUI is not reachable at all
The bar sits at 0% for the whole job Normal. See While it runs
The song is much shorter than your duration Normal. Duration is a ceiling
Two runs of the same prompt came out very different lengths You left duration off, so each run drew its own
The last third of your lyrics is missing You went past 6000 characters
The track is instrumental when you wanted vocals Either you left lyrics empty and the caption did not imply singing, or the enhancer decided the description was instrumental. Say "female vocals" or similar in the prompt, or write lyrics
It sang words you did not write Enhancement wrote them. Turn enhance: false off, or supply your own lyrics
The quality row is missing from your settings Your audio format is FLAC, which is lossless and has no quality tiers

See also#

  • tweak -- the audio operations menu, and what audio files Eimi accepts
  • /render -- the other non-image generator, for video with audio
  • /settings -- where the audio format and quality preference lives
  • Enhancement -- how the prompt rewriter works across the bot
  • /history -- songs land in your job history like everything else
Categories: Commands | Tweak | Render | Settings