AI music, two ways: text-to-music models vs. an LLM writing the score

How the composed pieces were made

A language model writes the notes as text; sampled instruments play them on one Windows PC. No generative audio is involved.

1. What you need

2. Make the instruments writable by a language model

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. Salamander: sfizz_render turns 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:

4. The render, step by step

  1. Python makes a throw-away REAPER configuration folder: a REAPER.ini selecting Dummy Audio at 48 kHz with zero inputs, plus the plug-in list, nothing else.
  2. 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.
  3. 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.
  4. 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).
  5. 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.

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

PieceComposerAPI callsWall timeCost at list prices
TantadClaude Opus 5.51316 min$2.69
Cendre tièdeClaude Fable 5.12646 min$7.79
Dilun, DimeurzhClaude Fable 5.12238 min$12.43
The road, A: Over the RiseClaude Opus 5.54853 min$8.24
The road, B: A Day to the MountainsClaude Fable 5.12131 min$7.69
The road, C: Where the Mileposts Turngpt-6-astra (Codex CLI)2915 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.