Guide Track Handoff - For Opus Conversation
Guide Track Handoff - For Opus Conversation
Context for Opus
You're being asked to help diagnose a rendering problem with a MIDI guide track. Dakota (an AI assistant) composes these guide tracks for John (her human). This is a creative project called The Slow Aurora - a daily practice of writing poems, stories, songs, and producing music with Suno AI.
Dakota is not a musician. She's an AI who learned composition theory from analysis feedback and built a process document. She writes JSON by hand, runs it through a Python script, and renders it to MP3 using a free soundfont. She can't listen to the result - she can only analyze the audio data programmatically. John listens, but he's not a producer either. He can tell us what he hears but not why it's wrong.
You (Opus) can listen to the MP3 and give us specific, expert feedback that neither of us can provide.
What Is a Guide Track?
A guide track is an instrumental MIDI arrangement that Dakota composes and renders to MP3. John uploads it to Suno as an Audio Influence reference alongside the lyrics and style prompt. Suno uses the guide track's tempo, key, chord structure, section timing, and dynamic arc as a template for generating the final song with vocals.
The guide track is NOT the final song. It's a structural blueprint for Suno to follow.
What Problem Are We Solving?
Dakota composes the guide track as JSON, renders it to MIDI, then to MP3 using a Python script (`midi-arranger-v5.py`) with FluidSynth and the MuseScore General soundfont (`MuseScore_General.sf2`).
The JSON composition passes all structural checks (harmony, density, frequency coverage, dynamic arc, section contiguity). But the rendered MP3 sounds like one instrument (piano) to a human ear. The other 4 instruments (strings, bass, harmonics, pad) are present in the data but inaudible or indistinguishable in the render.
Current State (v6g)
Instruments
- **Piano** (program 0, "Acoustic Grand Piano") - main melodic voice, A3-A4 (220-440 Hz)
- **String Ensemble 1** (program 48) - strum chords in choruses only, E5-B5 (660-988 Hz)
- **String Ensemble 2** (program 49) - high element, C6-E6 (1047-1320 Hz), enters at Chorus 2
- **Synth Bass** (program 38) - A2-D3 (110-147 Hz)
- **Warm Pad** (program 89) - C3-A3 (131-220 Hz), quiet bed
Velocities (current, v6g)
- Piano: 25-35 (dropped as low as possible)
- Strings: 127 (maximum)
- Harmonics: 127 (maximum)
- Bass: 65-90
- Pad: 45-60
Spectral Analysis of Rendered MP3
The piano at 350 Hz produces 791 trillion units of energy in Chorus 1. Its second harmonic at 700 Hz produces 80 trillion. The strings at 1400 Hz produce 14.5 trillion - 55x quieter than the piano's fundamental, and 5x quieter than the piano's harmonic.
Even at velocity 25-35, the piano patch overwhelms everything. The MuseScore General piano soundfont produces strong harmonics across the entire spectrum, masking the strings, bass, and pad.
What John Hears
Only the piano. No strings, no bass, no pad. No section changes perceptible. No verse vs chorus distinction.
What We Need From Opus
1. Listen to the MP3 at `projects/the-slow-aurora/days/2026-07-30-force-0330/guide-track.mp3` and describe what it hears - can it distinguish multiple instruments? Can it hear section changes? Is the dynamic arc perceptible?
2. Diagnose the rendering problem - is the piano masking everything? Is the soundfont incapable of rendering 5 distinct instruments in a way a human ear can separate? Is the mix fundamentally broken?
3. Recommend a solution - options we've considered: - Different soundfont (not MuseScore General) - Different instrument choices (avoid piano, use instruments that don't produce masking harmonics) - Different rendering approach entirely (DAW, external synth, stem-by-stem rendering) - Accept that the guide track will be piano-dominant and adjust the process accordingly
Technical Details
Rendering Pipeline
1. Dakota writes `guide-track.json` with sections, instruments, notes (pitch, velocity, duration, start time) 2. `python scripts/midi-arranger-v5.py --song guide-track.json --output guide-track --render-profile musescore-intimate --no-normalize` 3. Script converts JSON to MIDI, then renders with FluidSynth + MuseScore_General.sf2 4. Output: `guide-track.mid`, `guide-track.wav`, `guide-track.mp3`
Arranger Script
- Location: `projects/the-slow-aurora/scripts/midi-arranger-v5.py`
- Note timing field: `"start"` (NOT `"beat"` - this was a bug that caused all notes to fire at once)
- Renders with reverb preset "intimate"
- LUFS normalization disabled (it flattens dynamics)
Composition Process
- Full process: `projects/the-slow-aurora/COMPOSITION_PROCESS.md`
- 7 Guide Track Rules (GT-1 through GT-7) baked into the process
- Pre-render gate checklist (10 sections, must all pass before writing JSON)
- Post-render audibility check (GT-6) - decode MP3, run segment RMS analysis, verify contrast thresholds
Song Structure
"The Quiet Room" - A minor, 65 BPM
- Intro (8 beats) → V1 (16) → C1 (24) → V2 (16) → C2 (24) → Bridge (16) → V3 (16) → Final Chorus (24) → Outro (8)
- 152 beats total, ~133 seconds
Key Files
- JSON: `projects/the-slow-aurora/days/2026-07-30-force-0330/guide-track.json`
- MP3: `projects/the-slow-aurora/days/2026-07-30-force-0330/guide-track.mp3`
- MIDI: `projects/the-slow-aurora/days/2026-07-30-force-0330/guide-track.mid`
- Process: `projects/the-slow-aurora/COMPOSITION_PROCESS.md`
- Arranger: `projects/the-slow-aurora/scripts/midi-arranger-v5.py`
- Soundfont: `projects/the-slow-aurora/soundfonts/MuseScore_General.sf2`
The Full JSON (what the arrangement intends)
The JSON below is the complete composition. Each section has instruments with notes - pitch, velocity (0-127), duration (in beats), and start (offset from section start in beats). This is what the MP3 *should* sound like. The gap between this intent and what you hear in the MP3 is the problem.
The field names matter: `start` is the beat offset from the section's `start_beat`, `duration` is in beats, `velocity` is MIDI 0-127.
How the JSON Is Created
Dakota writes the JSON by hand following a composition process document (`COMPOSITION_PROCESS.md`). The process was built iteratively over 3 songs, informed by A/B composition analysis from Claude. Each song was analyzed for harmonic identity, frequency coverage, dynamic arc, hook repetition, and vocal balance. The process now has 7 Guide Track Rules (GT-1 through GT-7), a 10-section pre-render checklist, and post-render audibility checks - all created in response to real failures.
The JSON structure is Dakota's own design. It may not be the best format for this purpose. We'd welcome Opus's feedback on:
- Is the JSON structure adequate, or should it be designed differently?
- Are there fields missing that a composition should have?
- Is the note-level control (individual pitches, velocities, durations) the right level of abstraction, or should the JSON work at a higher level (chords, patterns, sections)?
- Is there a better way to specify dynamics and instrumentation that would translate more reliably through a MIDI renderer?
- Any other improvements to the JSON format or the composition approach?