Progress you listen to
Filtered noise makes a convincing knock, and moving the filter cutoff with progress turns a status readout into something you feel. The finished state is warmer, not louder.
In Feltling there is no progress bar, no percentage and no number counting up towards a goal. You find out how far along you are by tapping the seal on the belly and listening to the sound it makes. Bare skin answers bright and sharp. A finished coat answers soft and low.
This started as a design conceit and turned out to be the most reliable part of the game, because audio carries a gradient that a bar cannot: you hear the difference between stage four and stage five without knowing that stages exist.
No audio files
There are no sound files in this game. Every sound is synthesised in the browser at the moment it plays, which keeps the game a single self-contained file with no external requests — the same constraint that produced the drawing approach in the rendering note.
That is less of a sacrifice than it sounds, because the sounds this game needs are percussive and dull, and percussive and dull is what filtered noise does naturally. Knocking on wool is not a pitch. It is a burst of broadband noise with the high end taken off and a fast decay:
const thud = (freq, dur, damp, vol) => {
const n = Math.floor(ac.sampleRate * dur);
const buf = ac.createBuffer(1, n, ac.sampleRate);
const d = buf.getChannelData(0);
for (let i = 0; i < n; i++) {
d[i] = (Math.random() * 2 - 1) * Math.pow(1 - i / n, damp);
}
const src = ac.createBufferSource(); src.buffer = buf;
const lp = ac.createBiquadFilter();
lp.type = 'lowpass'; lp.frequency.value = freq;
const g = ac.createGain(); g.gain.value = vol;
src.connect(lp); lp.connect(g); g.connect(ac.destination);
src.start();
};
Four numbers: filter cutoff, duration, decay exponent and volume. That is the entire percussion engine, and every knock in the game is a different set of four numbers.
The meadow is an instrument
Every object in the world can be knocked on, whether or not it has anything to give. That is the central bet of the design: if tapping is only worth doing when it yields a reward, the game is a slot machine. If tapping is worth doing on its own, it is cozy. The only way to make an action worth doing for itself is to make it feel and sound good.
So each material answers differently, and the numbers describe real physics:
| Material | Cutoff | Length | Decay | Reads as |
|---|---|---|---|---|
| Felt | 430 Hz | 0.16s | 5 | soft, muffled thump |
| Wood | 820 Hz | 0.12s | 7 | hollow knock |
| Stone | 1900 Hz | 0.06s | 13 | sharp click |
| Water | 1200 Hz | 0.20s | 3 | wet, slow release |
| Grass | 2500 Hz | 0.09s | 9 | dry rustle |
Hard and dense means high cutoff and fast decay; soft and porous means low cutoff and slow decay. Wood and water each get a quiet oscillator tone underneath as well, because a hollow object has a resonant pitch and water has a plink, and noise alone cannot supply either.
The belly, which is the progress bar
The seal's belly uses the same function with the parameters stepping once per coat:
belly: (stage) => {
const i = Math.min(stage, 5);
thud([2600, 1900, 1400, 1000, 720, 520][i],
[0.10, 0.11, 0.13, 0.15, 0.17, 0.21][i],
[10, 8, 7, 6, 5, 4 ][i], 0.5);
}
Read down those columns and the physics is right: as wool builds up, the high frequencies are absorbed, the decay slows because there is more soft material to keep vibrating, and the sound gets longer rather than louder. Cutoff falls by a factor of five from bare to finished.
The choice that makes it feel like a reward rather than a readout is that volume never rises. The obvious instinct is to make the finished state bigger — louder, brighter, more triumphant. Wool does the opposite, and so does the game. The evidence of completion is warmth, not volume, and a game about someone being made comfortable should not shout at the end.
Two rewards, at two rates
There are two positive sounds and they are deliberately unequal.
The frequent one fires every time a thread comes loose: a low hollow thud plus a single clear tone. The tone climbs a pentatonic scale if you keep finding threads in quick succession, and resets after a few seconds idle. A five-note scale was chosen because there is no wrong note in it — whatever order you tap in, it sounds intentional. It is a compliment the game can pay you without words, which matters for a game meant to work with the sound off in one country and on in another.
The rare one fires maybe six times in the life of a save, when a coat completes: three descending thuds with a warm major triad rising underneath, about a second and a half in total. In the fiction, this is the seal patting the cat — the one moment the roles reverse and the animal that has been receiving gives something back. It is the only celebratory sound in the game, and it is rare on purpose. A sound you hear constantly stops being a reward within about ninety seconds.
Everything is doubled visually
A loose thread is visible as a strand hanging off the object and audible as a hollow knock. It is deliberately both, for four separate reasons: a lot of people play with sound off, some players cannot hear it at all, short video clips of games are watched muted, and once you know the sound you can find threads without looking directly at them. Any one of those would justify the redundancy. Together they make it obvious.
The same logic applies to the belly sound: the coat is visible too. The audio is not the only channel for progress, it is the pleasurable one.
Two practical notes
Browsers will not let a page make noise before the user interacts with it, so the audio context
is created lazily on the first tap and resumed if it is suspended. Building it at load time gives
you a context stuck in suspended and a game that is silent until something happens to
nudge it.
And the mute control says SOUND ON rather than showing a speaker icon with a line
through it. A crossed-out speaker is genuinely ambiguous — half of players read it as the current
state and half as the action. Two words are not elegant and they are never misread.