This library has only one compiler. Backends are data, not skills.
ARR-SPEC(唯一 IR)
↓ mc-render-compile ← 只有这一个,管共性
├─→ backends.yaml: yue2 ★ 可直接吃 ABC 乐谱,控制力最强
├─→ backends.yaml: suno 散文 prompt + 段落标签,成品最润
├─→ backends.yaml: minimax-music-3
├─→ backends.yaml: ace-step-1.5
├─→ backends.yaml: stable-audio-3 (无人声)
└─→ backends.yaml: symbolic MIDI/MusicXML,完全确定
Adding a new model = adding a block in
backends.yaml, without touching any skill. This is the compiler front-end/back-end separation setup.
Which sections to read by task
| Task | Read |
|---|---|
| Which backend to choose | §2 Capability comparison |
| Compile a spec | §3 Compilation order (do it in order, don't skip) |
| Write style_prompt | §4 |
| Paragraph tags don't match up | §5 |
| The backend ignores my spec | §6 honors contract + §7 degradation |
| Need to output ABC/MIDI | mc-symbolic-score |
| Hand the compilation result to the backend for execution | §8 |
| Add a new backend | §9 |
| Generation is done | mc-ai-tell-audit |
Boundaries
| Not covered here | Where it belongs |
|---|---|
| How to come up with the content in ARR-SPEC | L1/L2 skills |
| How to generate ABC / MusicXML / MIDI | mc-symbolic-score |
| Whether the generated result looks like AI | mc-ai-tell-audit |
| How the compliance rate is calculated | Defined in mc-ai-tell-audit §3.1; §6 of this skill only covers how the three honors tiers affect scoring |
| Where a specific backend's weights go and what the nodes are called | backends.yaml(Data) |
| What style words should be written in the style description | mc-style-*(L3) |
1. Must fill in before starting
| Required | Question |
|---|---|
| ① Target backend | At least one.If multiple, you need to do the degradation table in §7 |
| ② What is to be verified this time | Is it producing a final product, or running an AB?For AB, you must lock down the other variables |
| ③ Seed strategy | Fixed seed for comparison, or best-of-N selection |
| ④ Which fields this backend cannot do | Check honors。This determines that you shouldn't waste prompt budget on those fields |
2. Backend capability comparison
| YuE2 | Suno | MiniMax | ACE-Step | Stable Audio | Symbol | |
|---|---|---|---|---|---|---|
| Input | Style + lyrics + optional ABC | Prose + paragraph tags | Prose + lyrics + reference | Tags + prose | Prose | Score |
| Key/harmony | ★ Exact(ABC) | Can only hint | Hint | Hint | — | Exact |
| Form/number of measures | ★ Exact | Can't be controlled | Hint | Hint | — | Exact |
| Vocals | Yes | Yes | Yes | Yes | No | No |
| Reproducible | seed + best-of-8 | Weak | — | seed | seed | Fully |
| Tone quality/finish level | High | Highest | High | Medium | High | Depends on the sound source |
| Commercial use | ★ License CC-BY-NC, non-commercial use only | Depends on the subscription tier | To be verified | Check the license | Check the license | Allowed |
Selection recommendations:
| Purpose | Choose |
|---|---|
| Verify whether the spec is enforced | YuE2(the only one that can "enforce" rather than "suggest") |
| Want a finished-quality sound | Suno |
| Want a fully reproducible control baseline | Symbolic path |
| Pure instrumental/ambient | Stable Audio |
| Commercial release | ★ Settle licensing first——YuE2 weights are CC-BY-NC-4.0, non-commercial use only |
3. ★ Compilation order
Do it in order. Skipping steps causes the problem of "contradictory prompts."
| # | Step | Description |
|---|---|---|
| 0 | Go through mc-workflow the 20 self-checks in §3.0 |
For any items that fail, fix them or state the reason before compiling——not an admission threshold, but one last chance to discover that "the spec isn't finished" |
| 1 | Read the backends.yaml in honors |
Mark the none fields——they don't go into the prompt, and they don't count toward scoring |
| 2 | mix_intent.mood Put at the very front |
It has veto power over the remaining decisions, so it must be placed near the front of the prompt |
| 3 | Compile style_prompt | §4 |
| 4 | Compile the section tag sequence | §5。★ The count must equal the form number of sections(lint #13) |
| 5 | Compile the lyric chunks | §5.3 |
| 6 | Symbolic path(if the backend supports it) | → mc-symbolic-score |
| 7 | Compile exclude / negative prompts | §4.4 |
| 8 | Set the seed and batch | §7.3 |
| 9 | Write back to render.<backend> |
ARR-SPEC records the result of this compilation itself |
★ Don't miss step 9:render The section is part of the spec,
if it isn't written back, the next AB round won't know what was actually fed in last time.
4. style_prompt: compress structured fields into prose without losing information
4.1 Priority order of information sources
Extract from the following fields, arranged in this order(the earlier, the more likely the model is to adopt it):
mix_intent.mood(one sentence)meta.style_layerthe corresponding style word (→ L3 skill)meta.tempo、meta.keyarrangement.roster[].instrument+timbregroove.feel+ push_pull'sdirection(don't write milliseconds, write "bass playing ahead of the beat")vocal.persona+vocal.delivery- Era/production-quality words
4.2 ★ Three hard rules
- Ban information-free adjectives:
epic/emotional/beautiful/amazing/masterpiece/perfect(lint #13 soft warning). They carry no executable information and only take up space - Numbers must be converted into audible descriptions:
push_pull: bass −12ms→bass playing slightly ahead of the beat(Don't write −12ms) - Every word must point to a roster item or a spec field。 ★ Self-check action:Circle every word of style_prompt one by one; delete any word whose source cannot be traced
4.3 A measured sample (City Pop)
1980s Japanese city pop, 112 BPM, D major, Rhodes electric piano,
16th-note muted clean guitar, electric bass playing ahead of the beat,
gated reverb snare, analog saw synth lead riff,
tenor saxophone solo in the bridge and outro,
female vocal with breathy tone mixed back, warm tape saturation
Note its construction:era + style → tempo and key → each instrument with playing technique → vocals → production texture. Not a single adjective is empty.
4.4 exclude (negative prompt)
Write from "what this song is not", not from "don't make it unpleasant."
Measured sample:
["EDM drop", "trap hi-hats", "modern sidechain pumping",
"orchestral epic", "fade out ending"]
★ The last item fade out ending is worth noting——
Fade-out is the default ending of generative models, and if you don't exclude it, you will definitely get a fade-out
(→ mc-arrangement-arch §8 Three kinds of endings).
5. Section tags and lyrics
5.1 Mapping table
form[].name → backend tag:
| ARR-SPEC | Suno / most backends |
|---|---|
| Intro | [Intro] |
| Verse | [Verse] |
| Pre-Chorus | [Pre-Chorus] |
| Chorus | [Chorus] |
| Bridge | [Bridge] |
| Instrumental | [Instrumental] |
| Outro | [Outro] |
★ Two mapping traps:
- 大サビ maps to
[Bridge], not[Chorus](→mc-form§7). If mapped wrong, the backend will give you a high-energy chorus at the introspective position - 落ちサビ (a chorus with sparse arrangement) still maps to
[Chorus], write the sparse requirement into style_prompt or the section annotation,don't express it by changing the tag
5.2 The counts must be equal
The full statement of this rule is in §3 Step 4 (the count must equal the form number of sections, lint #13), and it also appears once in the §11 must-pass checklist. It is given its own section because it is the place most prone to error at compile time: after manually changing lyric sections, it is very easy to forget to synchronously add or remove tags, and if one is missing the backend will decide for itself what that section is; when an error occurs, check here first.
5.3 Lyric chunking
- Lyrics are split by section,corresponding one-to-one with the tags
- ★ Line breaks within a sectionaffect phrasing——it is not just layout; the backend reads them as phrase boundaries
- Where the lyrics come from:This skill only compiles this package's side (section tags, style description, exclusion words, symbolic paths); the lyrics side is read from
meta.upstream.lyrics.sections, where theidis theform[].id, and by id each section's lines are placed under the corresponding tag. It can also be the lyric spec sheet for the same song: find it bymeta.upstream.lyrics.source, take lines by section id, and use the lines as-is, without changing words or re-splitting lines - Section ids don't match (the lyrics have sections that
formdoesn't have, or vice versa) → don't guess, compile according toform[], write the unmatched sections intochecks.exemptions, then write amessagesfor the lyricist (to: lyrics). When lyrics come before music, the section ids are determined by the lyrics side (mc-workflow§5.1), so change this package'sform[]to align - When there are no lyrics, handle it according to the three cases in
mc-workflow§2.3 (no lyrics, placeholder syllables to indicate vocal rhythm, or this package writes lyrics and records an exemption) - For the format when the divided chunks are sent to the backend (the consequences of line breaks, breath, melisma, punctuation and parentheses, annotations not entering the lyric field, purely instrumental sections, which backends accept lyrics, what to check before submitting), see reference-lyrics.md
6. ★ honors contract: the most important rule of this skill
Each backend declares in backends.yaml its execution capability for each ARR-SPEC field:
| value | Meaning | How it counts during acceptance |
|---|---|---|
| exact | Can be executed precisely | Scored, and if it doesn't meet the standard, that means it failed to do it |
| hint | Can only serve as a hint affecting generation | Scored, but with a discounted weight |
| none | Does not accept this field at all | ★ Excluded from scoring, marked "this backend does not support it" |
6.1 Why none must be excluded rather than given 0
Suno was never told the exact chords; docking it points for "the chords didn't keep up" is punishing it for something it cannot do.
★ An even more serious consequence: if none is given 0 points, then a backend that honestly declares "I can't do stereo imaging" will score lower than a backend that pretends it can—— the scoring system would reward misreporting capabilities.This is a correctness bug, not a matter of interpretation.
6.2 How to use it at compile time
nonefieldsdo not go into the prompt——writing them is useless and also takes up space that could hold useful informationhintfieldsshould be written, but don't count on them——pair with best-of-Nexactfieldsmust be written accurately, this is where you spend money to buy control
7. Degradation strategy
7.1 One spec, multiple backends
Don't write a separate spec for each backend. Write one, and degrade according to honors:
| Field | YuE2 (exact) | Suno (none) | How to degrade |
|---|---|---|---|
form.harmony |
Compile to ABC | — | Degrade to mode/color words in the style description("contains a lot of subdominant minor color") |
form.bars |
Compile to ABC measures | — | Degrade to a length hint in the section label sequence, and accept that it cannot do it |
groove.push_pull |
— | hint | Degrade to "playing ahead of the beat" |
mix_intent |
none | none | ★ Neither side can do it → go through post-processing, or go through the symbolic path |
7.2 Degradation must be recorded
For the recording format, see §10 (write into checks.exemptions), and for the delivery checklist, see §8.1 (write back to render.<backend>). What needs to be made clear here is the motivation: ★ in render.<backend> record which fields were degraded this time; otherwise, next round when you see a low compliance rate, you won't be able to tell whether the spec was written wrong or the backend simply couldn't do it. Low scores caused by degradation and low scores caused by spec errors look the same in the compliance rate; only the person who compiled it at the time knows the difference, so it must be recorded on the spot.
7.3 Seeds and batching
| Purpose | Method |
|---|---|
| AB comparison | Fixed seed, change only one field. If you change two, nothing can be proven |
| Produce finished output | best-of-N(YuE2 recommends 8), sort by compliance rate (use a measurement tool if available; otherwise compare field by field),then use your ears to pick from the top 3 |
| Exploration | Release the seed, but record which seed produced what |
8. Handing off to the backend for execution
The output of this skill isthe input values for each backend: Suno's style description and section labels, YuE2's ABC and parameters,
ACE-Step / MiniMax / Stable Audio's prompt and parameters.
★ Which tools are used to feed these values into the model is determined by the user's environment——command line, Python API,
or a node-based carrier like ComfyUI; this skill does not presuppose or manage it.
backends.yaml 's transport only records "where this backend usually runs"; it is data, not a premise.
8.1 What to deliver to the user
| Backend | What is handed over |
|---|---|
| Suno | style_prompt, exclude, lyrics with section tags or placeholder syllables (§4, §5) |
| YuE2 | ABC text (mc-symbolic-score) + genre / tempo parameters;and note: feed this ABC directly into the synthesis step, skipping the model's own symbolic planning |
| ACE-Step / MiniMax / Stable Audio | prompt and parameters such as duration, according to their respective accepts lists |
write each item back to render.<backend>; the user can take it and fill it into their own tools.
8.2 The key way to connect YuE2
YuE2 has two steps:symbolic planning (the model writes ABC itself) → synthesize audio from ABC。
★ bypass the first step, and send the ABC compiled by mc-symbolic-score directly into the second step.
This is the highest point of this library's control—the spec is no longer a "hint" here, but is executed.
Any carrier that supports YuE2 can be connected this way (the official repository has scripts, ComfyUI has native nodes); how exactly to wire it is a matter for the user's environment.
The official YuE2 repository comes with
skills/yue2-music/(including "check music invariants"). ★ do not rewrite it—we only write the ARR-SPEC→ABC adapter; for knowledge of model operations, reference theirs.
9. Adding a new backend
- In
backends.yamladd a block:id / name / transport / accepts / honors / license - ★
honorsmust be honest—rather marknonethan markhintjust to fill the slot (for the reason see §6.1) - fill in
transport(hosted / local)—this only records where it usually runs, it is not a requirement - run
example-01-citypop.yamland see whether the compiled output is reasonable - does not change any skill
10. Correspondence with ARR-SPEC fields
| Field | This skill |
|---|---|
render.suno |
§4、§5 |
render.yue |
§4、§5、§8.3 |
render.midi |
→ mc-symbolic-score |
checks.exemptions |
★ Degradation records are also written here |
11. Must pass after compilation
-
mc-workflowThe 20 items in §3.0 have been gone through; for any that fail, the reason is written - checked the target backend's
honors,nonefieldsdid not enter the prompt -
moodis in the promptnear the front - in style_promptevery word points to a spec field
- there is no
epic/emotional/beautifulsuch empty words - numeric parametersconverted into audible descriptions, without writing milliseconds into the prompt
- section tagscount ==
formnumber of sections - 大サビ is mapped to
[Bridge] -
excludeinexcluded the fade-out ending(unless a fade-out is really wanted) - seed strategy is clear; if doing AB,only one variable was changed
- degradation records were written back to
render.<backend> - after generation, first compare field by field against the spec (compliance rate),Then use your ears
Appendix: Sources
- Backend data:
backends.yaml - ⚠ MiniMax Music commercial API has been closed to new users, see the profile in backends.yaml
- ⚠ Unconfirmed: the ABC dialect accepted by the YuE2 synthesis step; its correspondence between musical invariants and the 20 self-checks
- Stem separation: Vocal AI-tell auditing requires first separating the vocal track; any stem separation tool will do (something like demucs, or the one built into the user's platform), see
mc-ai-tell-audit§6.1