Beyond Voice is a 14-part deep dive into everything GopherTrunk decodes that is not a trunked voice call. Every earlier series on this blog followed a voice call from carrier to WAV; this one follows the rest of the band — the AFSK/FFSK signalling that rides under analog fleets (MDC1200, Kenwood FleetSync), two-tone fire paging, POCSAG and FLEX pager networks, APRS and the location layer that feeds the map, ADS-B aircraft squitters, AIS ship reports, marine DSC, a pure-Go LoRa chirp receiver, the open M17 link layer, and the amateur digital-voice family (D-STAR, System Fusion, dPMR).

The running thread is a single shape. Each decoder is the same eleven-place pattern — front end, framer, bus event, storage table, REST route, web panel, config builder, field help, doctor preflight, config.example.yaml, and the tests that police them — so the series teaches the pattern once (with the FleetSync landing as the worked example) and then walks it through twelve different physical layers. Along the way it collects the traps that cost real rounds: a WAV reader that assumed 16-bit PCM, a carrier estimator that only looked at the first few milliseconds, and a slicer threshold that drifted toward a run of space tone.

Every post reads three ways: a TL;DR + cheat-sheet for skimmers, bold headers, tables, and diagrams for the medium read, and full prose with real code for the deep read.

New here? Start with Other signals in the RF & SDR module for what else lives on the band, then come back for how each one is decoded.<ol class="post-list series-list"><li class="post-card"> <h2 class="post-card__title">Beyond Voice, Part 1: Why a Scanner Decodes Data — The Eleven-Place Pattern</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">Why a trunking scanner decodes in-band data at all, and the one wiring shape every non-voice decoder in GopherTrunk shares — front end, framer, bus event, SQLite log, REST route, web panel, config editors, doctor preflight and example config — eleven places and three policing tests, walked through FleetSync’s landing.</p></li><li class="post-card"> <h2 class="post-card__title">Beyond Voice, Part 2: AFSK & FFSK — Two Tones, One Bit</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">How GopherTrunk turns an FM voice channel into a bit stream for MDC1200, FleetSync and APRS — the FM discriminator, the resample to 9600 Hz, demod.FFSK’s mix-filter-discriminate tone detector, Mueller-Müller timing at eight samples per bit, and the slicer lesson that made FleetSync slice at a fixed zero while APRS tracks DC.</p></li><li class="post-card"> <h2 class="post-card__title">Beyond Voice, Part 3: MDC1200 — The Template Decoder</h2> <p class="post-card__meta"> Deep dives </p><p class="post-card__desc">The Motorola MDC1200 burst from sync word to web panel — the 40-bit sync hunted with five errors of tolerance and its complement for inverted polarity, the 16×7 column interleave, the reflected CRC-16, the opcode table, double packets, the receiver → bus → mdc1200_log → REST → panel chain later decoders were cloned from, and what its tests do not yet prove.</p></li></ol><p class="blog-feed-link"> See all deep dives or subscribe via RSS. </p>