Skip to content

# Signal Lab

An oscillator bank and a signal analyzer, pointed at each other: generate a tone, a touch-tone digit, a Bell System MF pulse, or the 2600 Hz that once told a trunk it was idle, and watch the decoder name it back. That round trip is the point.

Audio is off until you ask for it. Nothing here starts an audio context, let alone makes a sound, before you press Enable audio; the level ramps in gently and a limiter sits across the output. Headphones can still be loud, so start quiet.

Rendered when the site was built, from the same frequency table the decoder uses. No JavaScript required, and no audio. With JavaScript on, the interactive lab replaces this.

## DTMF: the touch-tone grid

Every key is one row tone plus one column tone. Two frequencies, deliberately not harmonically related, so no voice sound could imitate a digit by accident.

DTMF keypad frequencies
Row \ column | 1209 Hz | 1336 Hz | 1477 Hz | 1633 Hz
--- | --- | --- | --- | ---
697 Hz | 1 | 2 | 3 | A
770 Hz | 4 | 5 | 6 | B
852 Hz | 7 | 8 | 9 | C
941 Hz | * | 0 | # | D

## Bell System MF (R1): between the switches

The digits switches sent each other, framed by `KP` (key pulse, start of a number) and `ST` (start, end of it). These travelled in the same channel as the call.

Bell MF symbols
Symbol | Low tone | High tone | What it meant
--- | --- | --- | ---
1 | 700 Hz | 900 Hz | inter-office MF digit
2 | 700 Hz | 1100 Hz | inter-office MF digit
3 | 900 Hz | 1100 Hz | inter-office MF digit
4 | 700 Hz | 1300 Hz | inter-office MF digit
5 | 900 Hz | 1300 Hz | inter-office MF digit
6 | 1100 Hz | 1300 Hz | inter-office MF digit
7 | 700 Hz | 1500 Hz | inter-office MF digit
8 | 900 Hz | 1500 Hz | inter-office MF digit
9 | 1100 Hz | 1500 Hz | inter-office MF digit
0 | 1300 Hz | 1500 Hz | inter-office MF digit
KP | 1100 Hz | 1700 Hz | key pulse: opens an MF digit string
ST | 1500 Hz | 1700 Hz | start: closes an MF digit string

## Supervisory, coin and call-progress tones

`2600` is the famous one: a single tone that said this trunk is idle, in band, where anyone on the call could put it.

Supervisory, coin and call-progress tones
Symbol | Class | Frequencies | What it meant
--- | --- | --- | ---
COIN | COIN | 1700 + 2200 Hz | coin-acceptance tone; the count of bursts is the denomination
2600 | SF | 2600 Hz | trunk idle / supervisory: control sharing the voice channel
2400 | SF | 2400 Hz | the 2400 Hz half of two-frequency SF signalling
DIAL | PROGRESS | 350 + 440 Hz | dial tone: the switch is ready for digits
RINGBACK | PROGRESS | 440 + 480 Hz | audible ringing: the far end is being rung
BUSY | PROGRESS | 480 + 620 Hz | busy: the far end is off-hook
1004 | TEST | 1004 Hz | milliwatt test tone: the reference level of a circuit

## Coin cadences

All three denominations are the same 1700 + 2200 Hz pair. Only the number and length of the bursts differ, which is exactly what a red box imitated, and exactly what the decoder counts.

Red-box coin cadences at 1700 + 2200 Hz
Coin | Bursts | Burst length | Gap
--- | --- | --- | ---
nickel | 1 | 66 ms | none
dime | 2 | 66 ms | 66 ms
quarter | 5 | 33 ms | 33 ms

Offline, `signal-cli` does both halves: `signal-cli coin nickel --out n.wav` then `signal-cli decode n.wav`.

About this toy2 paragraphs

Why it is worth knowing: 2600 Hz was control signalling sharing a channel with the conversation. Anyone who could make the sound could speak the network's own language: the audible ancestor of SQL injection and prompt injection. One channel, two kinds of meaning.

It runs offline via `signal-cli`, which synthesizes a WAV and decodes one back to symbols.

Use it locally This toy has a native command line twin. Build `signal-cli` from the site's source with:

    cargo build --release --bin signal-cli

Source and licence terms