Foley

A sound foundry

tap
press the waveform to hear it

The kittwenty-four sounds, one key, one material — press any of them

The checkwhat the engine's own validator says about this table

Layers sum, and WebAudio hard-clips above 1.0 — a chord adding to 1.4 does not play forty percent louder, it plays distorted, and differently distorted depending on what happens to overlap it. This is the engine's own validateSounds, run against the exact table below, so the answer arrives before you have played the sound rather than after somebody complains about it. Nothing the sliders can do will fail it: a sound whose own worst instant would cross the ceiling is scaled down as a whole before it ever reaches the engine. Edit a layer by hand, though, and you are on your own — which is the point of leaving the check here rather than hiding it once it goes green.

The recipepaste it into a project and it plays there too


        

Seven things that make a sound an interface soundand not a sound effect

  • 01 Short. A tap is thirty to fifty milliseconds. Anything a user hears more than twice a minute has to be over before they have finished the gesture that caused it; two hundred milliseconds is a sound they are still hearing when they reach the next control, and that is what "the app feels slow" actually is.
  • 02 Quiet. Every sound here peaks well under a quarter of full scale. An interface sound competes with music, a call, a room — and the one that wins that fight is the one that gets the whole app muted, alarms included.
  • 03 Direction is pitch. Rising means forward, done, sent, on. Falling means back, closed, deleted, off. No user has ever been taught this and every user knows it.
  • 04 Pairs are reversals. Open and close, on and off, send and receive: the same two notes in the other order. Half a kit teaches the other half, and a user who has heard one already knows what its opposite will sound like.
  • 05 Everything in one key. This is the whole difference between a designed kit and a folder of downloads. Every sound on this page is an interval over one root, so two of them landing at once make a chord instead of a mess — and nobody notices it consciously, and everybody notices when it is missing.
  • 06 Nothing bright. Every layer goes through a low-pass. Brightness is what cuts through, and cutting through is precisely what you do not want on the four hundredth press of the day.
  • 07 The important ones are rare. Success and error have to stay expensive. A sound that fires on every action means nothing by lunchtime, which is why the biggest sound in this kit has the longest minimum gap.

How it is made

Jack Foley stood in a room with a box of gravel and a pair of shoes and made a footstep that was better than a footstep. Everything on this page is the opposite method and the same job: there is no gravel, no microphone and no file — every sound is a handful of numbers turned into oscillators in this tab, and the WAV you download is rendered here too.

A sound is ten numbers, not a node graph. One fixed chain per layer — source, high-pass, low-pass, gain envelope, pan — and the only things you can vary are which of five sources it is, one starting pitch, one sweep target, one peak gain, one decay, one delay, one attack, two filter corners and a pan. You cannot reorder the chain, add a second filter, or modulate anything with anything. That refusal is what makes the check above possible: the moment routing is up to the author, a feedback delay at 0.9 turns a quiet chord into a runaway and no static check can see it coming.

The five materials are not five presets. They differ in the one thing no slider can reach: which partials are there at all. Glass has harmonic partials at two and three times the fundamental, which is why the ear hears one pitch. Metal has them at 2.76 and 5.4 — the ratios of a real bell, belonging to no scale — and that inharmonicity, not brightness, is why a bell sounds struck. Wood is near-misses at 2.4 and 3.9. Rubber has none at all. Move every slider to its limit on Glass and you will not arrive at Metal, and that is the point: the sliders are how hard you hit it, and the material is what you hit.

The kit is tuned rather than assembled. No sound here stores a frequency — each is written as intervals over the kit's root, so moving the key moves all twenty-four together and they stay a family. Everything that means yes rises through a major triad; everything that means no falls by a minor second or a tritone, which are the two intervals a listener reads as wrong without being able to name them.

And the file is the same engine. The WAV is not a re-implementation of what you just heard — it is the identical synthesiser pointed at an offline context and asked to render faster than real time, which is why the two cannot drift apart. The kit you are working on is in the address bar as you work on it, so the link is the save file.

Everything you make with it is yours, with no conditions. Built on @latticekit/audio. It is one of the Plausible Ventures.

The roll every voice the engine schedules — no analyser, no device needed
uisfxmusic

The patternpress a step; drag up or down on it to move the note

The padsyour kit, over the top — the keyboard row plays them

These are the same twenty-four sounds you designed on the bench, on the same buses, throttled the same way. Arm a take and every hit is recorded against the bar it landed on, so the export is the performance rather than a quantised copy of it.

What is actually running

Three things at once, and they are three different mechanisms rather than three tracks. The sequencer schedules notes a second and a half ahead of the clock and pins them to it, so the pattern does not stutter when you change tab — a scheduler driven by animation frames runs at zero hertz in a hidden tab and the music simply stops. The bed is not a track at all: it is a handful of oscillators that never stop, whose gain, filter and pitch follow two numbers. And the pads are one-shots with a minimum gap each, on the interface bus, which is why hammering one gives you a run up the scale rather than twenty stacked copies of the same blip.

The roll above is drawn from the engine's own onScheduled callback rather than from an analyser. Every mark is one voice the engine decided to build: its height is the pitch, its width the length, its colour the bus. It is the same feed a test would assert against with no sound card present, which is why it stays in step with what you hear instead of lagging a frame behind it.

A loop survives an hour by resting, staying under the information, and not repeating exactly. Two cheap mechanisms do the last one here without a composer: a track can sit out some bars of the progression, and it can drop notes at a rate decided by a seeded hash rather than by chance — so the same seed is the same twenty minutes on every machine, and muting one track cannot shift what any other track plays.