Published 2026-09-08
Apple lists the whole game at 8.6 MB and not one byte of it is a recording. The twelve effects, the out of tune waltz, the combat track and the five second countdown are all formulas evaluated the first time you hear them. Here is the recipe for each, with the numbers, and the three crashes it cost.
Open the REELS bundle and you will find a folder of fonts and nothing else you could call an asset for the ear. No wav, no caf, no mp3. Apple's own lookup for the US storefront lists version 1.0 at 8,635,392 bytes today, 8 September 2026, and none of those bytes is a recording. Everything you hear in the game is a formula evaluated when the app starts: twelve effects, a 90 second waltz, a 29 second combat track, and a five second countdown.
This was never a manifesto. On 12 August 2026 it was the cheapest way to get a slot machine to click, and it stayed because a computed sound is adjusted by changing one number, while a re-exported wave file has to be regenerated, re-imported and listened to again. A fairground fits in a handful of sine waves. This is what the machine sounds like, and why.
Every effect goes through the same routine. Given a duration, sample 44,100 times per second, ask a closure what the amplitude is at time t, and write the answer into a mono buffer. Around each one sits an envelope, which is nothing more than e to the minus t times a decay constant. Big constant, short sound. The whole set:
Every haptic in the game has a sound twin: one function fires both. The sound fires before the check that can switch the haptic off, because setting haptics to None should not mute the machine. The Effects slider does that, and it has its own bus, separate from the music, so the two sliders in Settings each command their own.
The audio session is declared ambient and mixes with others. The game respects the silent switch and whatever you were already listening to. The machine accompanies, it does not requisition.
In combat, the lever on the plate is decorative. It falls on its own at the rhythm of the reels, and making it tappable would reopen the door to the false touches the screen forbids. There is no spin button in REELS, and the lever is not secretly one.
The one place you pull it yourself is the payout, at the end of a run. The machine owes you tokens, a base earned from souls and the toll you reached, and one pull multiplies it: nothing, times one; a pair, times one and a half; a triple, times three. The pull can never lose you anything, the base is due. The lever there is simulated rather than animated: a bakelite handle with a position and a velocity, a 110 point stroke, it triggers at 70 percent of the travel and springs back if you let go early. It sits on the side of your dominant hand, and there is an accessibility action called Pull for anyone who cannot drag it.
Its sound is one of the shortest and plainest of the twelve: a tenth of a second of a downward slide, and nothing after it. That is deliberate in the sense that the reward, when there is one, belongs to the token drops and the two note chord that follow, not to the gesture. A lever that sounded like a prize would be teaching you to pull for the pull's sake, and the only lever in the game that you pull is the one that cannot cost you anything.
The same 100 ms opens and closes the descent between floors. The lantern lights, the lever clicks, the cage drops for 2.6 seconds along an elevator curve, and the plate announcing the next toll stays up for almost two seconds, because seven tenths were not enough to read two lines.
The menu music is a music box waltz in A minor, 72 beats per minute, 36 bars, a 90 second loop rendered once at startup and looped without a seam. Under it, a drone of A at 55 Hz and E at 82.4 Hz with a tremolo so slow, one cycle every twelve seconds, that the code describes it as the pit breathing. Each note of the box is a sine with two harmonics, a sharp attack and a decay of about two seconds.
The loop is in three movements so that it does not wear out: the theme, its response an octave higher leaning towards the dominant, then the theme again harmonised a diatonic third below on the downbeats, and a cadence on the A minor chord in the last bar. Behind it a fairground drum pattern, boom, tick, tick: a 62 Hz bass drum on the downbeat and two mechanical ticks after it.
Every pitch is multiplied by 1.004, which is about seven cents sharp. The comment says old, not wrong, and then the sentence I would keep: it is the detuning that makes the fairground, not the melody. An in tune music box sounds like a phone ringtone.
The first version, committed at 2 in the afternoon on 12 August, was a 30 second loop. Two hours later it was the 90 second version above, and the rendering had moved off the main thread, because 90 seconds at 44.1 kHz is about four million samples and the sign should light up without a hiccup. The waltz enters a few tenths of a second after it.
The combat track arrived on 14 August. Same key, same theme, 132 beats per minute, 16 bars, about 29 seconds, seamless. A kick on every beat whose pitch dives from 120 Hz to 46 Hz, a snare on two and four made of noise and a 190 Hz body, hats on the off eighths, a bass pulsing in eighths on A with leans on E, F and G, and the menu theme played staccato and higher, every second repeat an octave up.
Four layers stacked can exceed full scale, so the last step of the render finds the peak and, if it is above 0.95, scales the whole buffer under it. The track switches on when the arena opens and off when it closes, so the machine revs up for the run and falls back to the music box in the menus.
Each toll in REELS is a clock. On 20 August the last five seconds of that clock got their own piece: a fill of exactly five seconds at 132 beats per minute, eleven beats of carousel. The first four keep the pump. From 2.7 seconds the snare leaves the square rhythm and answers on the off beats, which is where the piece tips. The last second tightens to sixteenths with a rising roll, and a final impact lands 120 ms before zero.
While it plays, the main track drops to 52 percent and the fill sits at 135, so the effect is not a beep added on top but the piece itself changing its breathing. If you pause with three seconds left, it resumes at the point matching the clock, so the impact always falls on zero. It also lives on its own node, separate from the effects, because turning the effects down must not remove the information that the toll is about to end. Endless mode never hears it: there the clock runs up, not down.
Three crashes, all in the audio, all recorded in the commit history.
14 August, twelve seconds to a crash. Picking up soul fragments played one sound per fragment, and a good run picks up ten a second. Stop, schedule, play, in bursts on eight rotating players, saturated the link with the audio daemon and AURemoteIO gave up. A SIGABRT, reproducible in twelve seconds. The fix is a 40 ms minimum between two plays of the same effect, 25 per second, more than the ear separates, and it lives at the single point every sound passes through, so the next system that plays a sound in a loop does not have to remember it.
Same day, fifteen to twenty seconds to a crash. The music player was being attached to the engine at the end of the 90 second render, which means attaching to a running engine. Reconfiguring a running engine rebuilds the audio unit, and on the simulator the connection did not survive it. The crash came fifteen to twenty seconds after launch, exactly the render time, whatever you were doing in the game. The player is now connected cold, before the engine starts, and the render only has to schedule its buffer.
17 August, in build 4, backgrounding during the launch screen killed the app. The message was player did not see an IO cycle. Activating the audio session fails in the background, and the failure was being swallowed. The engine still reported itself running, so the guard let the music through and play threw an exception that Swift cannot catch. It had to be prevented, not handled: the session, not the engine, is now the authority on whether a sound can play. An incoming call leaves the game mute for a second instead of dead. Fixing that exposed a second defect the code had admitted in its own comments: after any interruption the music stayed silent for the rest of the session. It resumes now.
A slot machine's entire soundscape that weighs nothing, ships with the code, and is tuned by editing a constant. The trade is real: nothing is sampled, there is no room, no reverb, no recorded brass. It sounds like a music box in a tin, which was the brief, and it will sound exactly the same on the day this game turns ten, because there is no file to go missing.
REELS is on the App Store, with a trial that runs through toll 5 and carries every sound above, then one purchase that unlocks everything for good. No ads, no lives, no continues, and no audio folder. Get REELS.