MimoMusic
MimoMusic
Description
MimoMusic is a single-turn symbolic-music-composition environment. Each task presents a natural-language brief — in English or Chinese — that asks for a short piece in ABC notation with a specified key, time signature, tempo, instrumentation and voice count, an approximate length in bars, and an explicit instruction to write every note out with no ornament symbols. The agent replies with a single ABC document. The reward combines a validity gate, deterministic checks of the notes against the brief, and a capped LLM musicality score.
The tasks are the music configuration of Xiaomi's MiMo-V2.6-RL-oss dataset, where the domain is described as symbolic music composition graded by rule checks. The upstream scorer is not published, so the grader here is a reconstruction by the General Reasoning team; see Reward Structure.
Capabilities
- Following a detailed compositional brief across two languages
- Producing well-formed ABC notation with correct header fields
- Respecting hard musical constraints (key, meter, tempo, voice count, length)
- Writing rhythmically valid ABC whose bars add up to the meter in every voice
- Writing coherent, idiomatic music: tonal harmony, cadences, instrument ranges, texture and dynamics as briefed
- Writing out every note rather than abbreviating with ornament symbols
Compute Requirements
The environment runs no sandbox. The ABC is parsed and checked in-process (a few milliseconds per submission, no music library), and one LLM judge call is made per submission that passes the validity gate. It works within the default OpenReward endpoint resources.
License
MIT.
Tasks
There are 1,000 tasks, exposed as two splits:
train— all 1,000 briefs.test— the first 32 briefs bysrc_id, a small smoke subset for quick checks (not a held-out evaluation set).
The corpus is evenly split between English and Chinese briefs, and spans solo through six-voice writing across a range of styles (chamber, folk-dance, solo instrumental, and others named by the brief's style tag).
Reward Structure
This is a single-turn environment. The agent's final message (or a submit call) is the ABC document; the grader reads the last fenced block that holds a K: field, or the tune from its X: line when there are no fences. The ABC is parsed note by note (abcparse.py): L:/M:/K:/V: fields including inline ones, note lengths, broken rhythm, tuplets, chords, rests and multi-bar rests, ties, grace notes, decorations, repeats, and key-signature and bar-local accidentals.
reward = gate x substance x judge_floor x (0.75 x content + 0.25 x judge / 10)
Validity gate (all-or-nothing). The document parses as ABC (a K: field, notes, and almost no characters that are not ABC; F# is not ABC, ^F is); it has the requested number of voices; every voice has the requested number of bars (±1 for a pickup or final bar, or ±5% when the brief says "about N bars"; repeats may be written out or marked) and the voices have the same length; and in every voice at least 90% of the bars, not counting the first and last, add up exactly to the meter. A header followed by C| barlines fails here.
Substance (multiplier in [0, 1]). Some pitched voice has at least 8 distinct bars, some pitched voice uses at least 8 distinct pitches, and at least 60% of all notes are in the brief's key (ramping to 0 at 2 distinct bars, 3 pitches or 45%). One bar or a two-bar figure on repeat scores 0.
Content (weighted mean of the checks that apply to the brief):
| Check | Weight | What it measures |
|---|---|---|
| Key | 0.08 | K: tonic and mode match the brief |
| Tempo | 0.06 | Q: beats per minute match the brief |
| Meter | 0.06 | M: matches the brief |
| Tonality | 0.10 | share of notes in the key's scale (minor also allows the raised 6th and 7th); full at 75%, 0 at 55% |
| Instrument ranges | 0.08 | share of pitched voices with at least 90% of notes in a plausible range for their instrument (matched by voice name, English or Chinese) |
| Variety | 0.08 | melodic interval variety and how much of the piece actually sounds |
| Development | 0.08 | distinct bars per bar in the most varied voice (full at 40%), so a short loop copied for the whole piece scores lower |
| Cadence | 0.06 | the lowest voice ends on the tonic |
| No ornaments | 0.05 | no trill, turn, mordent or roll symbols (!trill!, T, ~, ...). Dynamics, hairpins, articulations and fermatas are not ornaments |
| Dynamics | 0.15 | dynamics marks are present and stay in the brief's range; for "start at X, push to Y, settle back to Z" briefs the first mark is X, the loudest is Y and the last is Z |
| Opening | 0.05 | "N bars of accompaniment before the melody" or "N bars of X alone" is visible in when voices first sound |
| Texture | 0.15 | the brief's texture, where it maps to a check: predominant note value, chords, stepwise or third-based motion, arpeggios, sustained notes, dotted rhythms, triplets, pedal note, staggered entries |
Musicality judge. If the gate passes, an LLM judge (gpt-5.5 by name, low reasoning effort, through whatever OpenAI-compatible endpoint the session is configured with) reads the brief and the ABC (comments and free text removed) and scores 0–10: musical coherence (harmony, cadences, melody, voice leading, development; 6 points) and the parts of the brief no check covers (style, mood, form, harmonic loop; 4 points). The judge contributes 25% of the reward, and a judge score of 2 or less ("not music", e.g. arbitrary pitches) zeroes the reward, rising linearly to no penalty at 4. Only the numeric judge score is shown to the agent. If the judge fails after four attempts the tool raises rather than scoring 0. The completion cap is 16,000 tokens because reasoning models count their thinking against it, and a reply cut off before the score tag counts as a failed attempt.
The key, tempo, meter, bar count, voice instruments, dynamics plan, opening and texture checks for every brief are in data/constraints.json. They were extracted once by an LLM (prepare_constraints.py, temperature 0, strict JSON schema). Key, tempo, meter, voice count, bar count, dynamics and opening were cross-checked against the row metadata and the brief text, with full agreement. The texture checks were reviewed by hand and made consistent across briefs that share a texture description.
Data
The task briefs and their constraints are sourced from the music configuration of XiaomiMiMo/MiMo-V2.6-RL-oss on Hugging Face and vendored into the environment as a single parquet file. There is no external data dependency at run time.
data/constraints.json holds the grader's per-brief constraints, extracted from the briefs by prepare_constraints.py.
Tools
A single terminal tool, submit, takes the finished piece as an abc string. A harness may route the agent's final plain message into it. Submitting grades the document and ends the episode.
Other Environment Requirements
The musicality judge needs an API key for an OpenAI-compatible chat endpoint, passed as the openai_api_key session secret (or chat_api_key, with CHAT_BASE_URL for a dedicated endpoint; see openreward.chat_backends). A session without a key fails at start.
Safety
The environment only asks the model to compose music in a text notation and grades the result against musical rules and an LLM judge. It presents no direct safety risks.
Citations
The task briefs are from Xiaomi's MiMo-V2.6 open RL release:
@misc{MiMoV26RLoss,
author = {{LLM-Core Xiaomi}},
title = {MiMo-V2.6-RL-oss: Agentic RL Environments},
year = {2026},
publisher = {Hugging Face},
howpublished = {\url{https://huggingface.co/datasets/XiaomiMiMo/MiMo-V2.6-RL-oss}}
}The OpenReward environment and its reconstructed grader are by the General Reasoning team:
@dataset{GRMimoMusic,
author = {General Reasoning Inc. Team},
title = {MimoMusic},
year = {2026},
publisher = {OpenReward},
url = {https://openreward.ai/GeneralReasoning/MimoMusic}
}