Circuit Atlas · HUSH M4 · Rev 2027.4 draft · Simulation
D Browser model audio specification (simulation)
Simulation results for the browser model, not measurements of the analogue mixer.
IN DEVELOPMENT · REV 2027.4 (DRAFT) · DESIGN TARGETS, NOT MEASUREMENTS
HUSH M4 is in development. This draft is published on zakkhutoretsky.com; it has no price and no ordering. Figures marked design target are goals for the finished product. Figures marked calculated come from the published formulas. No value on these pages was measured on a built unit. Interviews are cited as the design brief, not as an endorsement.
See this control Play the browser model
D Browser model audio specification (simulation)
These are simulation results for the browser model, not measurements of the analogue mixer and not hardware measurements. They were produced by running the same AudioWorklet code in Node at 48 kHz (Float64 inside the filters, Float32 at the module boundaries) with the script tests/dsp_test.js. They describe the software on /mixer; the circuits in this manual are design targets and have no measured figures.
| Test | Condition | Result (simulation) |
|---|---|---|
| THD+N | 1 kHz (999.76 Hz, exactly on an FFT bin), −6 dBFS, 20 Hz to 20 kHz, clean path | −153.8 dB. With the oversampling filters forced on: −147.7 dB. The Float32 test tone alone: −153.8 dB, so this is the limit of the measurement |
| Null test, bypass against input | Noise at about −18 dBFS rms, low-passed at 16 kHz, through EQ, filter, texture, both saturators and the limiter, all at rest | Output equals the input delayed 288 samples, bit for bit. With the oversampling filters forced on: residual −76.3 dB of the input |
| Noise floor | Digital silence in; then a −60 dBFS 1 kHz tone with the filters forced on | Silence in gives exactly 0 out on every sample. With the tone, everything else from 20 Hz to 20 kHz is at −206.3 dBFS (Float32 rounding) |
| Aliasing, texture drive | 15 kHz sine at −6 dBFS, drive at maximum, everything from 20 Hz to 20 kHz except the tone, relative to the tone | No oversampling −12.6 dB; 2× −29.2 dB; 4× −54.6 dB |
| Aliasing, saturator | 15 kHz sine at +6 dBFS into the knee | No oversampling −58.8 dB; 2× −113.4 dB; 4× −117.0 dB |
| Frequency response | All knobs at 12:00, 14 tones from 20 Hz to 20 kHz at −12 dBFS | Clean path: 0.0000 dB deviation. With the oversampling filters forced on: worst 0.006 dB at 20000 Hz |
| Limiter, true peak | White noise to Nyquist at −3 dBFS rms, read by an independent 16-phase true-peak meter | −1.1 dBTP against the −1.0 dBTP ceiling. The detector carries a +0.3 dB margin, so loud programme is held at about −1.3 dBTP |
| 24-bit export | Quantisation error of the dithered export against its theory | Error 0.499 LSB rms against 0.500 expected for triangular dither; mean 0.0020 LSB; clipped samples are counted and reported to the user |
| CPU, desktop only | One channel in Node on the build machine, multiples of real time | Saturator 2× 157, 4× 76; texture ladder 2× 24, 4× 14. No phone was measured |
What the engine does
- Sample rate. The audio context runs at the device’s rate by default (48 kHz or 96 kHz where the device offers it) or at a rate the user picks; nothing is resampled inside the engine. The latency hint is the user’s choice (interactive, balanced or playback).
- Precision. 32-bit float at the module boundaries. The recorder writes 32-bit float WAV at the context rate; the optional 24-bit file uses triangular (TPDF) dither and reports any samples that were over full scale.
- Nonlinear stages. The texture drive, the strip saturators and the master saturator are oversampled 4× (2× in the efficient mode) with half-band filters. The saturator is the identity below 0 dBFS, so below that level nothing is shaped and the bypass is bit-exact; above it the curve bends smoothly towards +18 dB of internal headroom. The spatial FX’s own tape, spring and BBD saturators are not oversampled yet; they run at the base rate inside feedback loops.
- Smoothing, DC and denormals. EQ gains and filter positions are smoothed over about 12 ms; the texture wet path has a 5 Hz DC blocker; the texture filter states are flushed to zero below 1e-25 so no denormals arise.
- Limiter. A look-ahead true-peak limiter at −1 dBTP on the output only, using an 8× detector. It does not touch the signal below its threshold. Channel strips have no limiter.
- CPU. The master watches whether render callbacks keep up with real time. If they fall behind three windows in a row the engine switches itself from 4× to 2× and says so on the page. Phones and machines with four cores or fewer start at 2×.
- Track decks. Each of the four decks takes a lossless file from the user’s own device: WAV (16, 24, 32-bit integer or 32-bit float), AIFF or AIFF-C (PCM, little-endian “sowt” or float) and FLAC. Anything else, including MP3 and other compressed formats, is refused by reading the file’s header, not its name. WAV and AIFF are decoded by the page’s own reader into 32-bit float without rounding (a 16 or 24-bit sample divided by 2bits−1 is exact in Float32); FLAC is decoded by the browser. The file stays in the browser tab: nothing is uploaded and the page makes no request that carries it. A loaded deck replaces its test signal and runs through the strip’s EQ, filter, texture and saturator, the FX sends, the master and the recorder. The strip processes a stereo track with two identical chains. The deck’s panner is centred for a track, so a stereo track enters the master at unity on each side, while the mono test signals sit at −3 dB per side. When a file’s sample rate differs from the engine’s, the browser converts it as it plays (the deck says so); there is no “no resampling” claim for decks. Rates from 8 to 96 kHz are accepted.
- The radio. The site’s radio player uses the highest-quality stream each provider officially offers; some provider previews are lossy and the site does not re-host them.
Limits of this table: a simulation of the code, a single noise seed, ideal 32-bit and 64-bit arithmetic rather than a browser’s audio stack, and no converter or analogue stage. Nothing here supports a claim about how it sounds.