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.
| 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.
| 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.
| 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.
| 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.
signal-cli from the site's source with:
cargo build --release --bin signal-cliSource and licence terms