Morse code looks deceptively simple: dots and dashes. But the actual encoding is a timing protocol, not just two symbols. A dot is one unit. A dash is three units. The gap between symbols of the same letter is one unit. The gap between letters is three units. The gap between words is seven units. Get any one of those wrong and the message becomes ambiguous — "SOS" turns into "VGI" or "EEEMMMEEE" depending on which timing rule you broke. This guide walks the encoding itself, the prosigns and Q-codes that working operators actually used, why SOS isn't an abbreviation, the audio synthesis math behind the 600 Hz tone, and Farnsworth timing — the trick that makes learning Morse at 20 WPM actually possible.
The Timing Protocol, Not Just Two Symbols
The International Morse Code spec defines five durations relative to one base unit:
| Element | Duration |
|---|---|
| Dot (dit) | 1 unit |
| Dash (dah) | 3 units |
| Intra-character gap (between dots/dashes within one letter) | 1 unit |
| Inter-character gap (between letters within one word) | 3 units |
| Inter-word gap (between words) | 7 units |
The base unit is set by the sending speed. At 12 words per minute (WPM), one unit ≈ 100 ms. At 20 WPM, ≈ 60 ms. The standard "PARIS" calibration word — chosen because it contains exactly 50 units when spelled in Morse including the trailing word gap — gives you the conversion: WPM = 60000 / (50 × unit_ms), so 20 WPM = 60 ms per unit, 30 WPM = 40 ms per unit.
The Morse Code Translator generates audio using exactly these proportions. A "C" (dah-dit-dah-dit, −·−·) at 20 WPM is: 180 ms tone, 60 ms silence, 60 ms tone, 60 ms silence, 180 ms tone, 60 ms silence, 60 ms tone — total 660 ms for the character, then a 180 ms inter-character gap before the next letter. The math is fixed; what changes is the base unit.
Why Two Symbols Aren't Enough — Prosigns and Pro-Words
The 26-letter alphabet + 10 digits + punctuation only gets you the literal message. Real telegraph operators needed protocol-level signaling for things like "I'm starting", "I made a mistake", "wait", "end of message". They invented prosigns: characters sent without the normal inter-character gap, so two letters fuse into one operational signal. By convention, prosigns are written with an overline (CT) or in angle brackets (
| Prosign | Morse | Meaning |
|---|---|---|
−·−·− |
Starting signal — "I'm about to send" | |
−···− |
Pause / new paragraph (also used as = between sentences) |
|
·−·−· |
End of message | |
···−·− |
End of contact (literally "silent key") | |
·−··· |
Wait | |
···−−−··· |
Distress — fused, no gaps | |
········ |
Eight dots | Error — "scratch that, repeating from last word" |
SOS is the famous one. It's not an abbreviation for "Save Our Souls" or "Save Our Ship" — those backronyms came later. It was chosen in 1906 specifically because the fused prosign ···−−−··· is unmistakable: three of the shortest element followed by three of the longest followed by three short again, with no gaps that could be misheard as letter boundaries. Try parsing it as letters and you get nonsense: SOS as S-O-S would be ··· −−− ··· (with inter-character gaps); the actual distress signal collapses those gaps to make it a single 19-unit blob no other character collides with.
Q-codes — The Three-Letter Shorthand That Saved Hours
Sending "what is your location" letter by letter takes ~30 units in Morse. Sending "QTH?" takes ~14. Q-codes are three-letter abbreviations beginning with Q that radio operators standardized in 1909. Each works as both a question (with ? appended) and a statement (with content following).
| Q-code | Question form | Statement form |
|---|---|---|
| QRA | What's your station name? | My station is ___ |
| QRG | What's my exact frequency? | Your exact frequency is ___ kHz |
| QRM | Is interference from other stations strong? | Interference is severity ___ |
| QRN | Is atmospheric static strong? | Atmospheric static is ___ |
| QRT | Should I stop sending? | Stop sending. |
| QRZ | Who is calling me? | You are being called by ___ |
| QSB | Is my signal fading? | Your signal is fading. |
| QSL | Can you confirm receipt? | I confirm receipt. |
| QSO | Can you communicate with ___? | I can communicate with ___ |
| QTH | What is your location? | My location is ___ |
Two of these escaped into general English. "QSL" is still used by amateur radio operators worldwide as a verb ("I'll QSL you on that") and on physical postcards confirming a contact. "QRT" sometimes shows up in old-school operator chat as "I have to QRT" — i.e., stop. These compress the protocol enormously: a 1920s shipboard operator could carry a five-minute weather exchange in maybe 200 characters of Morse instead of 1500.
The Letter Distribution Wasn't Random
Samuel Morse and Alfred Vail designed the code in the 1830s by walking into a Morristown print shop, counting the letters in the type cases, and assigning short Morse sequences to the most common letters. The frequency table they used:
- E was the most common in English text → assigned the shortest possible Morse symbol:
· - T was second →
− - A, I, N → three-element sequences (
·−,··,−·) - Q, J, X, Z → least common → four or five elements each
This is a hand-rolled Huffman coding 100 years before David Huffman published the algorithm. It's not optimal by Huffman's exact metric (which also factors in tree balance for prefix-free decoding), but it's close enough that the average English message in Morse is about 8% longer than the theoretical lower bound — remarkable for an engineer in 1838 with no information theory to reference.
The cost is that Morse code is brittle for languages with different letter frequencies. Russian, German, and French each got their own variants extending the basic code; CCITT eventually standardized "International Morse" by trimming American Morse to a cleaner subset that worked across European languages. American Morse — the original — used "spaced" letters (some letters had internal gaps the same length as inter-character gaps), which made it faster but unreliable over noisy radio. By 1912 nearly every navy and merchant marine had switched to International.
Farnsworth Timing — How Beginners Actually Learn
Here's the problem with learning Morse at, say, 5 WPM: the characters are slow enough to count individually. New operators learn each letter by counting dots and dashes ("dot-dash-dot-dot, that's L") instead of recognizing the sound. Then when they try to scale up to 13 WPM (the old US ham license requirement) they hit a wall — they have to relearn every letter as a sound pattern.
Russ Farnsworth proposed in the 1960s: send each character at full target speed (say, 20 WPM, ~60 ms per unit), but stretch the gaps between characters so the average overall speed is slower (say, 7 WPM). This gives the learner two things at once: the actual sound shape of each letter at its real speed, and enough breathing room between letters to decode them.
The Koch method — which the Morse Code Translator doesn't directly implement but the same audio engine can produce — pairs Farnsworth timing with a curriculum that introduces letters two at a time. Start with K and M. Send hours of K-M-K-K-M-K-M-M at 20 WPM character speed with 5 WPM effective spacing. Add R. Then S. After 40 letters you have the full alphabet, and crucially you've never been "slow" — your ear knows K at 20 WPM from day one. Modern apps like LCWO (Learn Cw Online) and Morse Mania are built on this two-parameter (character WPM + effective WPM) approach.
The Audio Side — Why 600-800 Hz?
The standard Morse practice tone is between 600 Hz and 800 Hz, with 700 Hz being a common compromise. This isn't arbitrary — it's the frequency band where the human ear has its peak sensitivity (around 2-4 kHz is actually the most sensitive, but high frequencies fatigue you fast over a 30-minute QSO), where speech and Morse don't share much spectrum (most speech energy is 200-400 Hz fundamental + harmonics), and where typical communication receivers' SSB (single-sideband) audio passband sits comfortably.
Generating the tone is just a sine wave: sample[t] = amplitude × sin(2π × f × t). At f=600 Hz with a 44100 Hz sample rate, one cycle is 73.5 samples; for a 60 ms dot you need 0.060 × 44100 = 2646 samples. But there's a subtle catch: if you snap the amplitude from 0 to full-amplitude on the first sample, you generate broadband clicks (audible as a sharp "tick" before each tone). The fix is rise/fall envelope shaping — typically a 5 ms ramp-up at the start of every tone and a 5 ms ramp-down at the end, using a raised-cosine or simple linear ramp. Without it, the tone sounds harsh; with it, the tone sounds like a clean musical pulse. This is exactly what professional CW (continuous wave) transmitters do at the radio level via "shaped keying".
What Decoding From Audio Actually Requires
Going the other way — recording Morse from a speaker and outputting text — is harder than encoding because:
- Threshold detection: you have to decide what's "tone" vs "silence" in a recording that has noise, possibly other signals, possibly an operator with inconsistent timing. Most decoders use a sliding-window envelope detector with adaptive thresholds (mean + 2σ of recent amplitude).
- Speed estimation: you don't know the WPM in advance. Decoders measure the duration of the shortest tone in the recording (assumed to be a dot) and derive everything else from that. If the operator slows down or speeds up mid-message — common in human sending — the decoder has to re-estimate.
- Operator drift: human operators routinely send dots that are 0.8-1.2 units instead of exactly 1, and dashes that vary similarly. The "fist" — an operator's idiosyncratic timing signature — was famously identifiable; experienced wireless operators could tell who was sending based on rhythm alone. Modern decoders use median timings and tolerance windows around 1× and 3× to absorb this drift.
- Word-boundary ambiguity: at high WPM the inter-character (3 unit) gap and inter-word (7 unit) gap aren't always distinguishable when the operator is rushed. Decoders bias toward inserting spaces at gaps closer to 7× and treating gaps closer to 3× as letter boundaries, but get this wrong with sloppy senders.
For decoding pasted Morse text (where the dots, dashes, and gaps are unambiguous), none of this applies — it's a straight lookup table. The challenge is real-time audio decoding, which is why robust audio decoders are rare.
The Honest Limitations
The Morse Code Translator handles text↔Morse conversion, audio playback of typed text at adjustable WPM with proper raised-cosine envelope shaping, WAV download for offline practice, and PNG/SVG image export for visual reference cards. It does not currently transcribe Morse from a microphone or uploaded audio file — that requires the adaptive envelope detection described above and is materially more complex than the encode path. It also doesn't implement Farnsworth or Koch timing modes directly; you can simulate Farnsworth by slowing the effective WPM, but the tool sends with uniform inter-character spacing rather than the asymmetric "fast characters, wide gaps" Farnsworth profile.
International Morse is the only variant supported. American Morse (Vail-Morse), Wabun (Japanese), and Cyrillic Morse all have different letter mappings and aren't interchangeable.
Related Tools
- Morse Code Translator — encode, decode, play, download WAV, export PNG
- Base64 Encoder/Decoder — for when you need a different encoding entirely
- Hash Generator — for cryptographic integrity rather than transport encoding
- Case Converter — Morse is case-insensitive; this helps normalize inputs
- QR Code Generator — modern visual encoding alternative
TL;DR
Morse is a five-duration timing protocol where the gap lengths carry as much information as the dots and dashes. Prosigns fuse letters to create out-of-band protocol signals; SOS is one of them, not an abbreviation. Q-codes compressed common operational phrases by 5-10× and a handful (QSL, QRT) survived into modern radio jargon. The letter assignments are hand-rolled Huffman coding from a typesetter's box. Farnsworth timing — full-speed characters with stretched gaps — is how people learn 20+ WPM without re-learning every letter twice. Tones are typically 600-800 Hz with 5 ms rise/fall envelopes to suppress key-clicks. Decoding from audio is much harder than encoding because of threshold detection, speed estimation, operator drift, and gap ambiguity. Try the Morse Code Translator for encode + audio out; bring your own ear for decode.