Everything kept sounding sad.

I’m building original music for a game spanning Abraham to modern Israel. The score needs triumphant Bronze Age marches, intimate tent-scene conversations, tense Sodom evacuations. But every “orchestral” + “emotional” prompt landed in the same place: minor-key cinematic elegy. Gorgeous, and completely wrong.

The Schindler’s List Diagnostic

Caraxes — one of my OpenClaw AI assistants, running locally with an RTX A1000 8GB GPU — figured out the pattern. Suno’s “orchestral” cluster has a dominant attractor: D minor + solo violin + duduk = grief. That’s the Schindler’s List / Gladiator zone. Any prompt combining “orchestral” with an emotional descriptor gets pulled there by training-data gravity.

The fix wasn’t better positive descriptions. It was negative constraints: “not mournful, not funereal, no solo violin.” And pushing toward specific non-elegy reference points: “Einaudi × Rahman, kanun-forward” names a different region of Suno’s latent space than “emotional orchestral” does.

This reframes how to think about music AI entirely. You’re not instructing a composer. You’re navigating a latent space. The prompt is a coordinate, and small wording changes jump you to completely different clusters. The skill is cartography — mapping the space, knowing which words move you where, learning the escape velocities from dominant attractors.

[DIAGRAM: Suno’s latent space as a 2D map with labeled clusters — “Grief/Elegy” (dominant attractor), “Wonder/Discovery”, “Tension”, “Pastoral” — showing how prompt keywords shift your position]

The Hatikvah Problem — When the Cloud Says No

I wanted the game’s title theme to be Hatikvah — the Israeli national anthem. The emotional shape of the Zubin Mehta / Israel Philharmonic recording.

The copyright situation:

  • Melody: public domain (composed 1888)
  • Any specific arrangement: NOT public domain
  • Any recording: separate copyright

Suno’s Cover mode refused outright. Its fingerprint filter recognized the melody and blocked generation. We tried multiple framings. All bounced.

So we built our own arrangement from scratch. Every note under our control.

I sketched a 3-part MIDI — French horn melody, strings, cello — 69.5 seconds, 302 notes, ~76 BPM. Caraxes took that sketch and wrote orchestrate_hatikvah.py: a script that takes a 3-part input and reharmonizes it into a 12-track orchestral arrangement.

Four versions:

v1 — First pass. Sounded like a church organ. Stacked root-3-5 chord tones on each beat without real voice leading. A wall of sound with no line.

v2 — Tempo pulled to 55-65 BPM (76 was too fast for traditional Hatikvah feel).

v3 — Ritardando added, brass balance tweaked.

v4 — The real one. Two breakthroughs:

First, Caraxes found a bug in my source MIDI. Bar 18: I’d written C-C-C-F-F, but the standard melody is G-G-G-F-F (matching bar 20’s repeat). He wrote fix_hatikvah_midi.py to patch it.

Second, a real voice-leading engine replaced the stacked pads. Per-voice picker chooses the closest chord tone to the previous pitch. Parallel-motion blocker prevents parallel 5ths and octaves. Passing tones auto-inserted for inner-voice leaps. Bass walks root→5th in the climax.

My contribution that turned it from a loop into a piece: differentiating the first versus repeat of “Eretz Tziyon.” First time: Em→A7 (introspective). Repeat: G→A7 (brighter lift). Without that distinction, the repeat is copy-paste. With it, it’s emotional escalation.

Rendered via FluidSynth with FluidR3_GM.sf2 → wav → ffmpeg mp3. Deterministic. Legally clean. Reusable for any public-domain melody in the game.

The Lesson: The Refusal Was a Gift

If Suno had generated a passable version, I’d have a cloud-dependent asset with unclear legal status. Instead we have a pipeline that produces exactly what we want, every time, for any public-domain melody. The wall you hit tells you what to build.

Failure Modes Worth Knowing

Five failure modes I’ve hit repeatedly:

  1. Elegy cluster gravity — “Orchestral” + emotion = sad. Escape with negative constraints and specific non-default references.
  2. Cover mode refusal — Fingerprint filter can’t distinguish “public domain melody” from “copyrighted song.” Sidestep with MIDI-first pipelines.
  3. Detuned drift — Tracks generated days apart drift in pitch. Batch your generations per scene.
  4. Church organ voicing — “Majestic + ancient” = organ. Fix: “brass and woodwind, Middle Eastern modes, no organ, no choir.”
  5. Lyric phonetics — Hebrew lyrics get mangled. Write English graphemes that sound Hebrew instead of correct transliteration.

The Unsexy 30%

About 30% of Caraxes’s time on this project isn’t creative. It’s downloading Suno tracks, renaming them, copying them into the right game directories, cutting loops to format (60-second beds, 90-second cues), wiring them into the resource system.

That’s the pipeline friction removal that makes the creative loop fast. The gap between “I like this take” and “it’s playing in-game” shrinks to seconds. Not glamorous. Essential.


I write about building with AI agents, the stuff that actually works and the stuff that breaks. Follow me on LinkedIn for more.

Updated: