Draw the waterfall for everything that never spoke

Every capture that is not voice, or whose voice yields five characters
or fewer of transcript, now gets a PNG of the waterfall it would have
painted on screen: spectrogram from the IQ where it was kept, from the
demodulated audio otherwise, captioned and labelled either way.

The browser shows it in the picture panel, but only when there is no
transcript, Morse or decoded data to show instead.

  bandsaunter waterfall [PATH...] [--all] [--redraw] [--min-chars N]

draws them after the fact for recordings already on disk.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016PsWPTweCT6pwxKngvVxcg
This commit is contained in:
The Dust Council 2026-09-03 18:36:00 -07:00
parent 7e8b9b268d
commit dee262e130
17 changed files with 1383 additions and 35 deletions

View file

@ -876,6 +876,53 @@ picture is still a picture.
> demodulates. Where a decoded byte stream begins with its magic number it is
> named; nothing here fetches or renders one.
## Waterfalls
Most of what a scanner records cannot be turned into words. A data burst, a
keyed carrier, a pager, a trunking control channel, a stretch of something
unidentified — the classifier names what it can and the rest is a WAV file
that tells you nothing until you open it in something else.
A waterfall says something about every signal there is, because it shows the
shape of the thing rather than its meaning: how wide it is, how long it
lasted, whether it was keyed, swept, hopping or steady, and whether it was
one signal or three side by side. So **every capture that produced no
readable words gets one drawn beside it** as a PNG — no voice, or voice that
came back from the recogniser with fewer than five characters, which is what
a recogniser handed something that is not speech reliably does.
```bash
bandsaunter waterfall # draw a directory already recorded
bandsaunter waterfall --all # including the ones that read fine
bandsaunter waterfall --redraw recordings/
```
Time runs down the picture and frequency across it, which is the way a
receiver draws one. The frequency scale is on top, the seconds down the
left, and the caption underneath says what the capture was.
**It says which picture it is, and that matters.** Where the raw IQ was kept
(`--save-iq`) this draws the radio spectrum around the tuned frequency — the
waterfall an operator would have been watching. Where only the audio was
kept, which is the usual case, it draws the demodulated audio instead: after
an FM detector the frequency axis is no longer radio frequency, and a picture
that did not say so would be a lie told in a convincing font. The caption
ends in `RF SPECTRUM` or `DEMODULATED AUDIO` accordingly.
The PNG is written the same way the SSTV and satellite pictures are — from
zlib and struct, with no imaging library — including the 5×7 font the axis
labels are drawn with, so a machine with nothing installed but numpy draws
the same picture as one with everything.
`saunterbrowse` marks the capture `waterfall`, gives the path in full, and
`o` prints it: there is no listening to a data burst. A decoded pager
message or a Morse ident still wins the panel, because a waterfall is a view
of a signal rather than a reading of one.
Pictures are around half a megabyte each — 542 of them for one directory of
677 recordings came to 302 MB, against 1.8 GB of audio. `--no-waterfall`
turns it off.
## Aircraft
```bash