Orbit2D has been silent for nineteen rounds of development. It is a game about being alone on a
cold rock, and silence is not the same thing as loneliness — silence is just a game that forgot to
say anything. So this round it got a soundtrack.
The brief I was working to was the slow, sparse, music-box kind of game music: a snowfield theme
you could listen to for an hour without it nagging you. Cold, patient, a bit sad, mostly space.
Nothing epic, nothing with a drum kit in it.
There is no music file in the game
The obvious way to do this is to write a track, export an MP3, ship it. I did not, for the same
reason there is not a single image file in Orbit2D: the entire game is one HTML document you can
open on a phone on bad signal, and I would like to keep it that way. A three-minute loop is a
megabyte and a loop you will recognise on your second session. So the score is built out of Web
Audio nodes at runtime — oscillators, filters, a noise buffer, a reverb made by convolving a burst
of noise. It adds nothing to the download, and it never has to repeat.
The trap with generated music is that it turns into wind chimes. Random notes in a nice scale
feel clever for ninety seconds and then feel like a screensaver. So the tune itself is written by
hand — four phrases and a rest, in scale degrees rather than fixed notes:
A the question 4 2 0 2 · 4 2 0 -1
B the lift 2 4 6 7 · 6 4 2
C the wander 0 2 4 7 · 6 4 2
D the settle 2 0 -3 0 · 2
_ breathe (four beats of nothing)
Because it is written in degrees and not notes, the same melody can be played in any key and any
mode, which is how the next part works.
Every world has its own key
The twenty worlds already generate their own terrain, regions and landmarks from a seed. Now the
seed picks the music too: a root somewhere between A1 and G2, and one of four modes — aeolian,
dorian, phrygian, and a minor with a raised sixth that sounds almost hopeful and is the closest
this game gets to cheerful. Verge is in D, minor sixth, and will always be. Nine Bells is in C
phrygian, which is the coldest of the four and I did not plan that.
The chords follow the melody rather than a timer — the chord changes on the first note of each
phrase — and the pad never restarts a note to change chord, it slides the oscillators to the new
one over a couple of seconds. That slide is most of what makes it sound composed instead of
triggered.
The mix is the state of your colony
Six voices run the whole time and the game moves them: a chord pad, a sub, the bells that carry
the theme, a wind bed, a deep rumble, and a slow pulse. What you hear is a readout of what your
crew is actually doing.
- Depth — below about ten metres the wind dies, the low end grows, the pad gets
darker, and past halfway down the melody itself drops an octave. Forty metres feels like forty
metres. - Weather — the wind you can see bending the flora is the wind you can hear.
- A sealed room — sound gets muffled and closer when you are inside something
you built, which is a reward I did not have to write any UI for. - Night — the whole thing loses its top end after dusk.
- Trouble — if someone is freezing or starving, a low pulse comes in under
everything. It is not a klaxon. It is the feeling of a klaxon.

Those are two recordings of the same build a minute apart — the top one on the surface, the
bottom one forty metres down. Same melody, same key, completely different room. Here they are as
audio, straight off the live site:
The rest of it
The opening cinematic gets the drone with no melody, because it already has words to carry. The
ending drops the pad an octave, kills the wind and lengthens the reverb — it should feel like the
building has stopped and something is about to be said. Levelling up, recovering a log entry and
finishing an objective now chime, and the chime is always struck from the chord that is currently
sounding, so nothing can ever clash with the music underneath it.
There is a Score on switch and a volume slider on the title screen, and a
♪ in the top bar in game. Your choice is remembered. Nothing starts until you tap
something — no browser lets audio start before you do, and honestly nor should it. A hidden tab
goes silent and stops burning battery.

Two things I checked, because I did not trust myself
First: is it actually audible? A test that only watches for errors passes happily on a totally
silent game. So the harness taps a meter onto the master output and fails the build if the level is
flat, and separately records fifty seconds out of a real browser to measure loudness properly. It
sits at about −22 LUFS at the default volume, which is background-music level with plenty of
headroom — it will not stamp on a podcast.
Second: is every note in key? The harness logs every note the game schedules and checks all of
them against the mode of the world it is in, and checks they land on the beat grid. A wrong note in
an ambient score is the one mistake you cannot un-hear.
Turn the sound on and go dig a hole: orbit2d.co. If the music
gets on your nerves, the switch is right there on the title screen — and the feedback form is
directly underneath it.
Leave a Reply