Why Your Waveform Image Is Missing the Drums

14 September 2026 · 8 min read

Drawing a waveform is a reduction problem: several million numbers have to become a few hundred columns of pixels. Almost every tool answers it the same way, in one line, and that line is wrong in a way you can measure exactly.

Here is the arithmetic that makes it a problem at all. A three-minute track at 44.1 kHz is 7,938,000 samples. Drawn 800 px wide, each pixel column has to stand for 9,922.5 of them. Something has to decide what a column's height means.

The common answer is to take one sample from each column and draw its height. That reads 800 samples out of 7,938,000 — 0.0101 % of the file. It is not a summary of the column. It is a point sample of it, at a rate thousands of times below the signal's own, which is the textbook setup for aliasing.

A full-scale tone drawn as a flat line

The cleanest way to see it is to draw audio whose correct picture you already know. We generated 180 seconds of a constant tone at amplitude 1.0 — full scale from the first sample to the last. The true drawing is a solid block of height 1.000, at every column, with no argument about it.

Here is what one-sample-per-column returns, as the only thing that changes is the frequency:

ToneOne sample per columnEvery sample (peak)
100 Hz0.00361.0000
220 Hz0.00781.0000
261.63 Hz0.63611.0000
440 Hz0.01571.0000
441 Hz0.63521.0000
1000 Hz0.03561.0000
2000 Hz0.07101.0000
5000 Hz0.17441.0000

Identical audio, at identical volume, and the answers run from 0.0036 to 0.6361. A hundred and eighty seconds of a tone that never once leaves full scale draws as a flat line at 440 Hz — and at 441 Hz, one hertz away, as a waveform at 64 % height.

Nothing about that is a property of the audio. It is a property of how the tone's period divides into the column stride: 440 Hz at 44.1 kHz is 100.227 samples per cycle, and 9,922.5 samples per column is 99.0 of those cycles — so column after column lands on almost the same phase. The picture is of the arithmetic, not of the sound.

Resize the image and the waveform changes shape

This is the tell most people have already seen without naming it. Take that one 440 Hz file and redraw it at different widths, changing nothing else:

WidthSamples per columnOne sample per columnEvery sample
600 px13,230.00.00001.0000
700 px11,340.00.62591.0000
800 px9,922.50.01571.0000
900 px8,820.00.00001.0000
1000 px7,938.00.61551.0000
1200 px6,615.00.00001.0000
1920 px4,134.40.51141.0000

One file, one tone, seven pictures — three of them blank. If you have ever exported a waveform at two sizes and thought the second one looked wrong, you were right, and this is why. A drawing that changes when you change the canvas is not describing the audio.

A drum track with no drums

The frequency case is a clean demonstration, but the case that costs people real work is transients. A 2 ms burst at 44.1 kHz is 88 samples — 0.89 % of a 9,922-sample column. One-sample reading lands on it about 0.89 % of the time.

We built a click track: 360 full-scale bursts, one every 500 ms, across three minutes. Then we drew it both ways.

MeasurementOne sample per columnEvery sample (peak)
Columns showing a burst0 of 800360 of 800
Tallest column0.00000.8973
Single full-scale sample found (200 random positions)0 / 200200 / 200
2 ms full-scale burst found (200 random positions)3 / 200200 / 200

Zero. Not quieter drums — no drums. Every one of 360 full-scale hits fell between the samples that were looked at, and the drawing came back a flat line. Hidden a single full-scale sample in a quiet file and moved it to 200 random positions, the shortcut found it none of the 200 times; widen it to a 2 ms burst and it found it three.

Why nobody notices

Because it never fails loudly. A waveform that is 65 % too short, or missing its transients, or a different shape at a different size, still looks like a waveform. It has peaks and troughs, it starts where the audio starts and ends where it ends, and it is broadly louder in the loud parts. There is no error, no warning, and nothing to compare it against — which is exactly the shape of the other defects we keep finding in small creative tools: a ring drawn at half the width you asked for reads as a thinner ring, not as a bug, and a carousel slice offset by half a pixel reads as a slightly soft photo.

The reason to care is not aesthetic. If you are cutting to a waveform, aligning a caption to a beat, or trimming silence by eye, you are making decisions from a picture that has thrown away 99.99 % of the evidence.

The fix, and what it costs

Keep the minimum and the maximum of every column. That is all. It cannot miss a sample because it reads every sample, it is stable under resizing because it does not depend on which samples happen to be looked at, and it catches an 88-sample transient for the same reason.

The cost: reducing all 7,938,000 samples to 800 columns took 4.70 ms, best of five runs, in an ordinary browser. The shortcut took 0.00 ms. That is the entire saving being defended, and it buys a picture that is not of your audio.

RMS is a different question, not a wrong answer

There is a third option worth naming, because tools mix it in silently. RMS is the average energy of the column rather than its loudest sample. For a sine wave, RMS is 0.7071 against a peak of 1.0000 — an RMS waveform is 29.29 % shorter than a peak waveform of the very same audio.

Neither is wrong. Peak shows you transients; RMS tracks perceived loudness and looks smoother. What is wrong is not knowing which one you are looking at, or a tool that uses one for the preview and the other for the export.

Confirmed on a real file, after the tool shipped

Synthetic signals prove the mechanism; a real file proves it survives contact with real audio. We dropped a 20-second speech clip — 960,000 samples, mono, 48 kHz — into the finished waveform image maker and read the numbers back out of the page itself rather than a reimplementation of it.

WidthTrue peak (every sample)Peak found by one sample
600 px0.29640.2387
800 px0.29640.2172
1000 px0.29640.1886
1200 px0.29640.2387
1920 px0.29640.2343

The true peak is 0.2964 at every width, because it is a fact about the file. The shortcut's answer wanders between 0.1886 and 0.2387 depending only on how wide you asked for the image. On the same clip, 88 of 480 columns reach half the true peak; one-sample reading finds 10. Its drawing is 65.42 % shorter on average.

The tool draws your file both ways, side by side, and prints those numbers for whatever you give it — so the comparison is something you run, not something you take on trust.

FAQ

Is this a real defect or a purist complaint?

It is a defect with numbers attached. On a synthetic click track the shortcut drew 0 of 360 drum hits and returned a tallest column of 0.0000 for audio that repeatedly hits full scale. On a real 20-second speech clip it reported the peak as anywhere between 0.1886 and 0.2387 depending only on the image width, against a true peak of 0.2964. Neither of those is a matter of taste.

Why would anyone read one sample per column?

Because it is free and it looks fine. Reducing 7,938,000 samples properly took 4.70 ms in a browser; the shortcut took 0.00 ms. And the output still looks like a waveform, so nothing ever complains — there is no error and nothing obvious to compare it against.

Does this affect short files too?

Much less. The damage scales with how many samples a column has to stand for. A 10-second file at 800 px is 551 samples per column and a 10-minute file is 33,075. Short clips drawn wide are the safest case; long files drawn narrow are the worst.

What about averaging the column instead?

Averaging the signed samples is worse than either — a symmetric waveform averages toward zero, so loud audio draws as a flat line for a different reason. Averaging the absolute values or taking RMS is defensible, but both are quieter than peak by construction: RMS of a sine is 0.7071 against a peak of 1.0000.

Does reading every sample make the page slow?

No. 4.70 ms for a three-minute track is imperceptible, and it happens once per redraw rather than continuously. The dominant cost in the browser is decoding the compressed file into samples, which every approach has to do anyway.

Where can I try the comparison on my own audio?

The waveform image maker draws your file both ways on the same page and reports the true peak, the peak the shortcut found, how many columns each method shows above half the true peak, and how much shorter the shortcut’s drawing is. Nothing is uploaded — the decoding and the drawing happen in your browser.