Software is the ultimate force multiplier for curiosity. You notice something, and a few lines later you can measure it. A few hundred lines later, you can play with it. This is one day of that, start to finish, written down while it is fresh.
A sky that came out rust
The wingsuit game in the arcade had a flat sky, so it got a real one. It is a dome drawn by a shader, with a gradient, a sun, drifting clouds and three ranges of snowy mountains round the horizon. The first frame came back with the Valley's sky rust where it should have been peach.
Nothing errored, and it looked like a sunset. The seam gave it away: the fogged valley walls faded into one colour and the sky behind them was another. The shader was showing linear colour as if it were screen colour, and one line fixed it. Two Numbers Make a Wingsuit has the rest.
A tool that cuts to a beat
I wanted videos of the games set to music, cut on the beat, with the footage always at the game's real speed. So I wrote a small composer. It takes captured frames and a list of shots measured in beats, and lays them on a grid: punch-ins on the beat, flashes on the cuts, words that land on a beat.
Given a song, it finds the tempo, the beats, the bars and the drop, using only numpy. On a test track built at 128 BPM it found 127.99, with every beat within 4.2 milliseconds and the drop within three thousandths of a second of where it was put. Then it moves the whole edit so the big moment lands on the drop.
A question about surfing
Making the surf video meant watching the ghost rider a lot, and that raised a question: where does its speed actually come from? So I kept books on it, tick by tick. About nine tenths of it is falling. The keys add a tenth, and every course loses more than the keys put in. That became its own post, because the answer was better than the question.
Two captures that died
The game footage is filmed on a virtual clock, one frame at a time. Two long captures ran side by side on a busy machine, and both died when a single frame took longer than two minutes to draw. The worse part was that their logs were only written at the end, so the 749 frames one of them had saved could not say when they were taken.
The fix was two changes: wait longer, and write the log as you go. Without the second, a half-finished capture is half a capture you cannot use.
Three things on the Services page
- SEO and LLM visibility. This site already serves structured data, a sitemap, crawler rules that let AI assistants in by name, and an llms.txt for language models. Now it says so, and offers the same to clients.
- Website and security audits. A crawl of every page from outside, and, with the code, a scan of its whole history for leaked keys, its dependencies, and the code that handles money and sign-in. We ran that on ourselves first.
- Simulations and games. The arcade has 41 of them, and From a Physics Engine to an Arcade says how each one is checked. Now we build them for other people too.
What the day was
It started with a sky and a question about a surfer, and ended with a new tool, a published finding and three new services. That is the multiplier: the curiosity costs nothing, and the software turns it into something you can show somebody.