This page is a dumb ear and mouth — nothing more. It plays a tone
string out of a speaker and reports which tone it hears each 50 ms.
All of the modem intelligence (wake burst, preamble, length, CRC, the
decode) lives in Q-Code (qaudio.py). This page holds no
framing or checksum logic. The acoustic path (speaker → air → mic)
is hardware: use Test tone first and watch the bars move. If the
16 kHz bar does not move, your speaker/mic pair does not pass that
band — try a lower band.
Paste a tone string from Q-Code (hide … audio audio
prints one per share). B = 250 ms wake burst at 16 kHz,
then one 50 ms tone per bit (17 kHz = 0, 18.5 kHz = 1).
Open this page on the listening device, press Start
listening, then play the frame on the other device. The page waits
for the 16 kHz wake burst, then reports one bit per 50 ms.
Paste the heard tone string back into Q-Code:
reveal … from audio <tones…>.