DEV Community

OnePassApps
OnePassApps

Posted on

Every Ambient Noise WAV We Export Is One 12-Second Loop, Repeated Five Times

I work on OnePassApps, the team behind app.onepassapps.com, so this is our own build and our own file. Everything below was measured on 8 November 2026, in one signed-out Chrome session on our own machine, from WAV files the Ambient Noise Mixer wrote to disk.

We have written about this route before - the panel and the first three layers - and about what the level sliders do to the exported file. This post is about something else that is in the same file: the sixty seconds you download are not sixty seconds of audio. They are one twelve-second loop, played five times, and the bytes prove it.

The file itself

Every export is the same container. A one-minute file is 5,292,044 bytes, and that number is exact rather than rounded: 44 bytes of RIFF header plus 60 seconds x 44,100 samples x 16 bits x 1 channel = 44 + 5,292,000.

Field Value
RIFF / WAVE RIFF, WAVE
fmt chunk size 16 bytes, PCM format 1
Channels 1
Sample rate 44,100 Hz
Byte rate 88,200
Block align 2
Bits per sample 16
data chunk 5,292,000 bytes
RIFF size field 5,292,036 (file size minus 8, as it should be)
File 5,292,044 bytes

The loop, byte for byte

Cut a 60-second export into five blocks of 12.000 seconds - 529,200 samples each - and compare them as bytes.

Blocks two, three and four are identical to each other, byte for byte, in every one of the six files we exported. Block one differs from block two only in its first 22,047 to 22,049 samples (0.500 s), and block five differs from block two only in its last 131,988 to 132,184 samples (2.993 s to 2.997 s).

Export Bytes Blocks 2-4 identical Block 1 differs over Block 5 differs over Correlation at 12.000 s Correlation at 24.000 s Largest absolute correlation at any other lag
White only 5,292,044 yes first 22,049 samples (0.500 s) last 132,044 samples (2.994 s) 1.0000 1.0000 0.0019
White only, second export 5,292,044 yes first 22,047 samples (0.500 s) last 132,083 samples (2.995 s) 1.0000 1.0000 0.0008
Pink only 5,292,044 yes first 22,047 samples (0.500 s) last 132,065 samples (2.995 s) 1.0000 1.0000 0.0264
Brown only 5,292,044 yes first 22,047 samples (0.500 s) last 131,988 samples (2.993 s) 1.0000 1.0000 0.0208
Rain-like only 5,292,044 yes first 22,048 samples (0.500 s) last 132,184 samples (2.997 s) 1.0000 1.0000 0.0044
Fan-like only 5,292,044 yes first 22,048 samples (0.500 s) last 132,036 samples (2.994 s) 1.0000 1.0000 0.0621

The last column is the check that the loop is the reason. We correlated each file against itself at several lags: at exactly 12.000 seconds and at exactly 24.000 seconds the correlation is 1.0000 to four decimals, and at every other lag we tried - 6.0 s, 11.5 s, 12.25 s, 13.0 s - the absolute correlation stays at or below 0.0621. A file that repeated on some other period would not do that.

So the shape of every exported file is the same: a 0.500 s fade in, one 12.000-second loop repeated until the length is reached, and a fade out over the final 2.99 s or so. The panel's own copy says the file has "a short fade in and out"; that is true, and now we can say exactly how long both are.

Where the twelve seconds comes from

Our own shipped code explains it. The route loads one chunk for the mixer, https://app.onepassapps.com/assets/AmbientNoiseMixer-CTRWpPOA.js, which is 17,862 bytes of plain JavaScript, and the loop is built there: a 12-second loop length, a 1.5-second crossfade blended into the head of the loop with an equal-power sine and cosine pair, and a 4,096-sample warm-up discarded before the samples are kept.

The crossfade is why blocks two, three and four can be identical without a click at the join - the join sits inside the loop, already smoothed. The renderer then writes the file in 30-second OfflineAudioContext chunks and concatenates them into one WAV blob, which is why a 60-second export is two chunks of the same 12-second material.

A fresh noise every time, the same loop every time

The two white exports above were taken minutes apart and are not the same file - their SHA-256 values differ - because the seed is random on every render. But the structure is identical in both: the same block sizes, the same fade lengths, the same correlation figures. You get a different twelve seconds each time, in a file that is still one loop.

What we did not check

One build, one day, one signed-out Chrome session on one machine, and six one-minute exports with a single layer at 100% and the master volume at 100%. The five-minute and ten-minute lengths were not exported, so the claim that a five-minute file is the same twelve seconds twenty-five times is read from the code - a 12-second loop and 30-second render chunks - and was not measured. The correlation figures are from our own script over the decoded samples, not from the app, which prints no spectrum. Nothing here is a claim about how the file sounds to listen to.

If you want the file yourself, the mixer is on our home page, and the step-by-step guide is in the app guides. The Standard plan is free during the current promotional period and no card is needed.

Top comments (0)