
Photo by Anne Nygård on Unsplash
A few weeks ago I published a post that was, in hindsight, a little smug. I told you Strataris shipped with no asset files — no textures, no sprites, no audio, no fonts — everything generated in code, maths all the way down, the whole thing small enough to fit on a floppy disk. I meant every word. I’m still proud of it.
This is the post where I tell you I have now broken that rule.
Strataris was built on a constraint I set myself for no sensible reason: nothing could be loaded from a file. If I wanted a sound, I had to build a sound — sit down with a synthesiser I’d written and work out, properly, how a laser or an explosion or a crackly distress call is actually made of waveforms. It was slower and harder, and that was the point. Constraints make you understand a thing instead of importing it.
So when I started on the next game — currently a work in progress — I assumed the rule would carry over untouched. This game — I’ll tell you more about it another day — is a Doom-shaped thing: on foot this time, down through an occupied subterranean structure, room by room. Dark. Claustrophobic. The kind of game where what you can’t see often matters more than what you can.
That, it turned out, is exactly where my lovely rule fell apart.
First, the good news, because the rule mostly won. The world of this game is, if anything, more extreme than Strataris. There isn’t a single texture or 3D model anywhere in it — the walls, the floors, the pipework, the rust, and even the creatures themselves are pure maths, drawn in real time on the GPU. The ‘everything in code’ rule didn’t just survive the move to a shooter; it got more stubborn. Visually, I never had to compromise at all.
It was sound that broke me.
Here’s what I learned, sitting in the dark with headphones on: you can synthesise a gun. A laser, a thump, a pickup chime — those are honest little sounds, and a synthesiser does them proudly. What you cannot synthesise, at least not with the tools I have, is a living thing. The awful noise a predatory creature makes when it notices you. The gap between “that’s a sound effect” and “there is something in here with me” is enormous, and my from-scratch creature noises landed firmly, embarrassingly, on the wrong side of it. The synthesised sounds said ”video game”. I needed them to say ”run”.
This sort of game lives and dies on atmosphere — on dread, on the half-second before you see the thing. And I’d built myself a rule that actively prevented me from delivering the single most important ingredient. That’s not a principle any more. That’s a man losing an argument with himself.
So I relented. There are now real recorded samples in the game. Actual throats. I’m at peace with it.
But I didn’t just buy a sound library and bolt it on, because that would have been a betrayal — and because everything I make is free, public domain, no catch, and I wasn’t about to ship something I couldn’t give away clean. So two rules held over the rule I’d broken.
First: every sample is Creative Commons or public domain, properly credited, free for me to ship and free for you to have. Not one borrowed byte I don’t have the right to give away.
Second — and this is the part I’m actually pleased with — the code still does nearly all the work. The sample is only the seed.
Take the worst thing in the game. Her voice is a handful of short, mammalian growls — a few seconds of audio, all told. But you never hear them as they were recorded. Every time she snarls, the game pitches the clip down — she’s enormous, she should sound enormous. We also shift the pitch and speed by a random nudge each time, so no two snarls are ever quite the same. A few seconds of source becomes a creature that never repeats herself. The maths is still running; it’s just running on top of a real throat instead of trying to be one itself.
The lesser horrors get the same trick from the other direction. When one is right behind you, you hear it clean. When one is far off down a corridor you haven’t reached yet, you hear it muffled and drenched in echo, as though it’s carrying through a hundred metres of steel — the same clip, run through reverb and a filter, turned into a thing you can hear but not yet find. None of that is in the sample. That’s code, doing what code is good at.
And the ‘soundtrack’? There isn’t one, not really — there’s no track. There’s a stack of looping layers (a low room-tone, a pulse, a dissonance…) and a live signal that measures how much trouble you’re in and quietly crossfades between them. The music doesn’t play at you; it responds to you. It thickens as the things close in and thins out when you’re safe, and most players will never consciously notice it’s happening. Which is exactly the point.
Oh — and the synthesiser I was so proud of, the one I built for Strataris? It’s still in there. It didn’t die. It became the fallback: if a sample is ever missing, the game quietly synthesises a stand-in so it never falls silent. The old religion got a job as the safety net. I find that quite funny.
The mistake people make with constraints — the mistake I made — is letting them curdle from a tool into a dogma. The floppy-disk rule was the best creative decision on Strataris. It would have been the worst decision on this one, if I’d held it like scripture. The craft was never in the rule. It’s in knowing which afternoon to keep it and which afternoon to break it — and then, when you do break it, breaking it with enough discipline that the result still feels like yours.
Playability beats fidelity. I’ll die on that hill. But atmosphere beats purity — and it took a monster in a dark room to teach me the difference.
I’ll tell you when you can play it. For now, just know that when you finally hear her in the dark, that wasn’t a synthesiser. That was the one time maths wasn’t enough — and I’m glad I stopped arguing with myself and listened.