# Fart Sound Generator — a fart sound generator that is actually a synthesiser URL: https://fart-sound-generator.skillsafe.ai/ Category: audio synthesis toy / novelty sound generator Price: free. No AI model, no metering, no credits, no sign-in required. ## What it is A fart sound generator, built as a real (small) synthesiser rather than as a soundboard of clips. The bundle contains no audio files whatsoever. Every noise is computed sample by sample in the visitor's browser from eight numeric parameters and a seed, then played through the Web Audio API. The joke is the honest one: it is a genuine little synthesiser doing an extremely stupid job. ## Why there are no recordings Two reasons, and the second is the interesting one. 1. The SkillSafe release pipeline accepts base64 only for raster images, so an `.mp3` or `.wav` asset cannot ship in the bundle at all. Synthesis is not a stylistic preference here; it is the only way this app can exist. 2. Because everything is computed from this app's own code, nothing it emits is anyone else's recording. There is no sample library, no clip licence and no provenance question. The output is arithmetic. ## How the synthesis works The DSP is plain JavaScript writing into a `Float32Array`; Web Audio is used to play the finished buffer rather than to build it out of nodes. That choice buys three things: exact determinism (an AudioNode graph is scheduled against a clock and its noise sources are the browser's, so a shared link could only be approximately honoured), numeric testability offline, and the ability to run a feedback model that no combination of built-in nodes expresses. Two engines ship, and they differ in mechanism, not in preset: - **buzz** — a variable-width raised-cosine pulse train mixed with a noise bed gated by the pulse, driven through a resonant state-variable filter standing in for a body cavity. Pitch is an INPUT: it runs at the frequency you ask for. - **flap** — a stick-slip relaxation oscillator. Pressure builds against a membrane until tension gives way; air escapes; pressure falls; below a lower threshold the membrane recloses. Nothing tells it a frequency. Pitch is an OUTPUT — the period is however long that cycle takes, so it drifts downward as the pressure sags within each flap and goes genuinely irregular when driven hard. Downstream of either engine: an envelope-modulated resonant lowpass, a rational soft-saturator, a DC blocker, and a Schroeder reverb (four damped comb filters into two allpass filters) for the room. Amplitude is normalised to a fixed peak. ## The controls duration (0.15–3 s) · pitch (40–320 Hz) · tightness · wetness · burstiness · glide (−1 to +1) · room · grit. All the unitless ones run 0–1. Burstiness is the one that carries the comedy: it raises the number of flaps AND shortens each relative to its slot, so silence grows as they multiply. Raising only the count produces a continuous tone with a tremolo on it, which sounds like a fault rather than a joke. ## The interface limit, stated rather than hidden `pitch` is an input to the buzz engine and an emergent output of the flap engine. There is no honest way to make one control mean both: forcing a commanded frequency onto the stick-slip oscillator means switching the model off while still calling it the model. So on the flap engine the Pitch control is disabled, and the app measures and reports what the model actually did — as a RANGE, not a point, because a single flap genuinely sweeps. In one measured case the periods ran from 53 Hz to 150 Hz within one noise. ## Reproducibility Every noise is a pure function of (engine, parameters, seed). None of the synthesis touches the browser's random number generator. A 27-character code carries the whole thing: 1 b 8f3k00zz... -cushion1 ^ ^ \____________/ \__ seed | \__ engine: b = buzz, f = flap \____ format version The code travels in the address bar, so a parp is a link. A truncated code still yields whatever parameters survived, with the rest falling back to defaults and the page reporting which; a code from an unknown format version is refused outright rather than guessed at. ## What it can produce for you - A 16-bit mono WAV, computed on your own machine and downloaded. - A ~400-byte JSON recipe that reproduces the noise anywhere this page runs, and which the page will read back in (drag and drop). - A share link. ## Storage Saved parps go to a declared collection (`parps`) on the visitor's SkillSafe account, with a localStorage mirror for instant paint and signed-out use. Rows store the code, not audio: about 400 bytes against roughly 350 KB of samples, against a 64 KB per-document cap. Search over the shelf is vector similarity on name, note and engine, with a word-matching fallback when the free daily vector-operation budget is spent. Preferences (volume, engine, play-on-change) live in `ss.data`, which caches for about ninety seconds — harmless for a volume slider, which is why the shelf does not live there. ## Autoplay Browsers keep audio switched off until the visitor interacts with the page, and an AudioContext built before that gesture is born suspended: the sound is silently discarded. This app therefore creates its audio device only on the first press and shows the state on screen ("waiting for a click", then "ready") rather than appearing broken. The first render on load draws the waveform and fills in the report without playing anything. ## Cost Nothing, in credits — there is no model, so there is no run to meter. The app reports the cost that does exist: the milliseconds of arithmetic your own processor spent, the number of samples computed, and the fact that no audio was downloaded. Typical renders measure roughly 10–46 ms depending on length and room size. ## Developer surface - `/api.html` — the data API: mint an identity, save, list, search, delete, plus the share-code format documented well enough to build one from a script. - `/tokens.html` — session and token panel (noindex). ## Tone Schoolyard silly, never crude. Preset names are things like "Whoopee cushion", "Squeaky balloon", "The long goodbye", "Motorboat", "Tuba solo" and "Duck call".