← GSLF / ProjectsRadio · -.-. --.-

Radio

CW and text over analog radio, from the terminal.

Two terminal programs for radio operators. CWtty sends, receives and teaches Morse code. BlackSquelch sends short text messages through an analog handheld radio, acoustically coupled to the computer.

C11Linux · macOS · Windowsminiaudio

↳ Morse · 15 WPM

01 / CW

CWtty

Morse telegraphy in the terminal.

Modes
Transmit, receive, transceiver with break-in, training (copy and send, letter by letter), Morse table.
Keying
Straight key on Space, paddles on the arrows: Iambic A, Iambic B, Ultimatic, Bug. USB paddles that act as mouse buttons.
Key events
Press and release through the kitty keyboard protocol (Linux, macOS) or the console API (Windows); auto-repeat fallback in other terminals.
Keyer
Runs in the audio callback: element and space lengths are sample-accurate. Raised-cosine sidetone envelope.
Receiver
8 kHz chain: quadrature mixer, 4th-order Butterworth, quantile noise tracking, squelch. Dit and dah lengths by k-means, speed tracking, AFC, 512-point FFT waterfall.
SDR
ptt_on() / ptt_off() hooks for keying; dsp_process() takes any 8 kHz stream.
Build
C11, CMake, miniaudio. MIT.

02 / AFSK

BlackSquelch

Text messages over analog handheld radios.

Link
Computer speaker and microphone held against the radio; PTT operated by hand. No cable or interface.
Modulation
AFSK, 1200 / 2200 Hz, continuous phase, 5 ms edge ramps.
Rate
10, 25 or 50 bit/s. The receiver detects it from the preamble.
Frame
32-bit preamble and sync word, 6-character callsign, 1–512 characters in a 6-bit alphabet, CRC.
Airtime
"CIAO" from IU2ABC, 160 bits: 16 s at 10 bit/s, 3.2 s at 50 bit/s.
PTT
2 s countdown before playback; release prompt once the audio has drained, output latency included.
Offline
Encode to and decode from WAV (48 kHz, mono, 16-bit).
Not included
ACK, FEC, encryption, VOX, automatic PTT.
Build
C11, CMake, miniaudio.

↳ Source