1. What you need
- A Windows PC. No GPU: the render uses four CPU cores.
- REAPER, a paid audio workstation with a long evaluation period that keeps working after it runs out; if you like it, buy it. The method needs three of its traits: plain-text project files, a command-line start with its own configuration folder, and Lua scripts.
- SINE Player by Orchestral Tools with the Berlin Free Orchestra, both free (an account is needed).
- Numa Player by Studiologic, free, for Tantad.
sfizz_render(open source) with the Salamander Grand Piano V3 by Alexander Holm (free, CC BY 3.0), for the quiet piano pieces.- ffmpeg, for the EBU R128 loudness meter.
- Python 3 with numpy, scipy, soundfile and psutil.
- A coding agent that writes and runs files (Claude Code, Codex CLI).
2. Make the instruments writable by a language model
- The coding agent starts an isolated REAPER test session by script, adds a track and inserts SINE Player (VST3) through REAPER's API. It opens the plug-in window, finds it in the Windows window list and sends it mouse clicks as Windows messages to open the Berlin Free Orchestra in SINE's browser and pick Violins a8, sustains. A screenshot and the plug-in's parameter list confirm the instrument, eight test notes are rendered, and the track's state chunk is saved as a track template through the API (
reaper.GetTrackStateChunk). The file is plain text; the plug-in's state sits in it as a base64 block. - Decoded, the state contains JSON: instrument and articulation ids, key range, legato and round-robin flags. All ids are in SINE's database,
SINELibrary.db, under%LOCALAPPDATA%\Orchestral Tools\SINE Player. - A short Python function rewrites those fields and re-encodes the block at exactly the same byte length, so the one template becomes any instrument of the library. No plug-in window is opened again.
- Probe each instrument with a short headless test render and measure it. The findings became rules in the brief: legato changes only the joins; horns and trumpets are 6 to 10 dB louder than strings; timpani are silent below MIDI note 48; round robin makes the harp play wrong samples.
- Numa Player: a saved REAPER project with Numa's Model D loaded, made the same way by the agent; only the MIDI item and the length are replaced per piece.
- Salamander:
sfizz_renderturns the MIDI and the SFZ file into a WAV; Python adds a convolution reverb and a peak limiter.
3. What the model writes
From a brief (setting, length, instruments, devices, checks; the road's is the brief the composers got) the model writes three files:
compose.py: the notes as text, a tempo map, one part per instrument;score_io.pyturns it into a score MIDI and MusicXML.render.py: the REAPER project text, one track per part with its instrument state, fader gain and a MIDI item carrying the performance (slur overlaps, velocities, mod-wheel and expression lanes, tempo map), plus the Lua render script.checks.py: the brief's checks, run on the score MIDI.
4. The render, step by step
- Python makes a throw-away REAPER configuration folder: a
REAPER.iniselecting Dummy Audio at 48 kHz with zero inputs, plus the plug-in list, nothing else. - Python starts a new hidden REAPER instance with that folder, the project and the Lua script (
-newinst -nosplash -noactivate -cfgfile), pinned to four CPU cores. - The Lua script aborts unless the audio device is Dummy Audio, waits 40 to 75 seconds for the samples, renders one WAV per track, writes a log and quits.
- Python counts the note onsets in each stem against the score, sums the stems and applies one gain: −18 LUFS, true peak at or below −1.5 dBFS, no compression or limiting (only the Salamander chain has a peak limiter).
- Python writes the WAV, the MP3 and the listening page.
A 3:20 orchestral render takes about two minutes, half of it loading samples. Renders run one at a time.
5. Checks and listening
The model runs the brief's checks on its score and notes the numbers; the road had ten, such as "the second phrase is the first one a step higher". A failed check is fixed or explained. Then the owner listens and writes one verdict line, kept off this site.
One brief, three composers
Two Claude models composed the road as fresh agents on the same brief, allowed to read only the brief, the method notes, the reference shelf and the instrument tests, never each other's folder or the earlier songs. The key saying which model wrote which folder stayed sealed until the owner had listened. A third composer, OpenAI's gpt-6-astra through the Codex CLI, was added afterwards under the same rules.
6. References
References are studied for devices (how a tune is lifted a step, how a pulse moves around the bar), never for material: a note per sheet, one page of devices, a chosen direction, a brief forbidding any quoted tune, bass, chord map or figure, and an interval check against the reference tunes. The IMSLP and Mutopia composers died before 1956: public domain in the EU.
- Slow piano (Cendre tiède): Bourgault-Ducoudray, Debussy, Fauré, Ravel, Satie (IMSLP, Mutopia; CC BY-SA on some Mutopia editions covers those files only).
- Lively piano (Dilun, Dimeurzh): about 40 pieces, Bach to Bartók, leaning on Mendelssohn, Liszt and Rachmaninoff. Tantad took only its scene from Liza Lehmann's Breton Folk-Songs (1909).
- Orchestra (the road): 17 IMSLP scores (Mahler, Debussy, Grieg, Dvořák, Holst and others) and, for the game idiom, piano arrangements from NinSheetMusic:
- Final Fantasy, Main Theme (NES), composed by Nobuo Uematsu, arranged by Yug Guy
- Final Fantasy, Prelude, Nobuo Uematsu, arranged by Thomas Wilson
- Final Fantasy VI, Terra's Theme, Nobuo Uematsu, arranged by G-Han, edited by Maelstrom
- Final Fantasy VII, Flowers Blooming in the Church, Nobuo Uematsu, arranged by Brassman388
- Final Fantasy X, To Zanarkand, Nobuo Uematsu, arranged by WiiMan96
- The Legend of Zelda: Ocarina of Time, Great Fairy Fountain, composed by Koji Kondo, arranged by The Deku Trombonist
These arrangements were study material: devices, not notes. Nothing from them is quoted or sampled in any piece, and every road piece's notes carry the freshness check against the tunes of Terra's Theme and the Final Fantasy Main Theme. NinSheetMusic allows this kind of use and asks for a credit to the arranger and the site, given above. The game music itself remains its composers' copyright, which is why no note of it is in any piece. The sheets are not redistributed here.
7. What it cost
| Piece | Composer | API calls | Wall time | Cost at list prices |
|---|---|---|---|---|
| Tantad | Claude Opus 5.5 | 13 | 16 min | $2.69 |
| Cendre tiède | Claude Fable 5.1 | 26 | 46 min | $7.79 |
| Dilun, Dimeurzh | Claude Fable 5.1 | 22 | 38 min | $12.43 |
| The road, A: Over the Rise | Claude Opus 5.5 | 48 | 53 min | $8.24 |
| The road, B: A Day to the Mountains | Claude Fable 5.1 | 21 | 31 min | $7.69 |
| The road, C: Where the Mileposts Turn | gpt-6-astra (Codex CLI) | 29 | 15 min | $5.02 |
The piano figures are windows of longer working sessions and include the render and the listening page; the road figures cover the composing alone. Claude costs are at Anthropic's list prices and at the cache rate each run actually used (the usage records say which: the road composers wrote to the 5-minute cache, the piano sessions to the 1-hour cache); gpt-6-astra's is at OpenAI's listed rates from the Codex session's own token counts. The road figures were corrected for a double count on 19 October 2026 and then re-verified by an independent count per API request.