| Field | Value | Copy |
|---|---|---|
| Characters | {{ char_count }} | |
| Words | {{ word_count }} | |
| Letters decoded | {{ letters_decoded }} | |
| Unknown tokens | {{ unknown_count }} | |
| Dots | {{ dots }} | |
| Dashes | {{ dashes }} | |
| Distinct tokens | {{ distinct_tokens }} | |
| Normalized Morse | {{ normalized_morse }} | |
| Decoded | {{ decoded_text }} |
Morse code is a timed alphabet. A short mark and a long mark carry the symbols, but spacing carries just as much meaning because the same marks can turn into different letters or whole words when the gaps change.
Written Morse is often easier to misread than it looks. A message copied from a radio log, study sheet, or handwritten note may already contain separator choices, punctuation shortcuts, or stray symbols that decide how the line should be grouped before any plain text appears.
A written Morse decoder is most useful when you want to turn that structure back into normal text without losing the rhythm behind it. That matters for checking copied traffic, reviewing practice drills, comparing separator conventions, or confirming that a compact line of dots and dashes really says what you think it says.
The catch is that a readable sentence is only the first confidence check. Separator assumptions, unsupported groups, and omitted marks can still produce plausible output, so good Morse work always means reading the text and the structure together.
International Morse code maps letters, digits, and punctuation to sequences of short and long elements. The built-in table here covers A to Z, 0 to 9, and common punctuation including ., ,, ?, ', !, /, (), &, :, ;, =, +, -, _, ", $, and @. Anything outside that set is not guessed. It stays an unknown group.
The underlying timing rules are simple even when a message looks busy. A dot is one unit, a dash is three, the gap inside one character is one, the gap between characters is three, and the gap between words is seven. Operators often express speed in words per minute by using the standard word PARIS as the timing reference.
At 20 WPM, the dot unit is 0.06 seconds. When Farnsworth WPM stays at 0 or matches the main speed, the whole message uses that same unit family. When the Farnsworth value is lower, this decoder keeps dots, dashes, and intra-character spaces tied to the main speed and stretches only the inter-character and inter-word gaps. That matches the practical teaching idea behind Farnsworth timing even though training references sometimes derive the slower gap unit with a fuller PARIS-based formula.
The decode path is literal. Dot-like and dash-like Unicode marks are normalized first, tabs and non-breaking spaces are treated as plain spaces, and only the first non-blank line is kept. That line is split by the chosen word separator and letter separator, each group is looked up in the Morse table, and the resulting text is cased only after the lookup step is finished.
| Output | What it really represents | Common misread |
|---|---|---|
| Words | The number of groups created by the current word separator. | A surprising word count usually means the separator choice is wrong, not that Morse itself is ambiguous. |
| Letters decoded | The number of token groups after letter splitting, including groups that later turn out to be unknown. | It can be higher than the number of visible characters in the decoded text. |
| Normalized Morse | A rebuilt line made only from recognized groups, using the chosen output separators. | It is not a verbatim echo of everything you pasted. |
| Audio and WAV | A synthetic timing model created from recognized groups plus lead, tail, WPM, and optional Farnsworth spacing. | Audio length is not the duration of the raw paste when unknown groups were dropped. |
| Letter Frequency | A to Z counts taken after case conversion. | Digits and punctuation can decode correctly without adding bars to the chart. |
For playback and export, the recognized signal is synthesized as a sine tone with configurable frequency, volume, lead silence, and tail silence. The downloadable WAV file is written as mono 16-bit PCM at 44.1 kHz with short edge ramps to keep clicks down.
The most reliable first pass is simple: paste one line, leave Input letter separator as a single space, leave Input word separator as /, and keep Unknown policy on Replace. That gives you the easiest way to see where the parse breaks before you clean anything up.
0 or Normalized Morse is shorter than the source you expected, stop there and fix the structure before copying the text out.Once the parse is trustworthy, change Case mode and the output separators to match how you want the final text and normalized code to read. Skip is best used late in the process. It produces cleaner text, but it can also hide the fact that part of the message never mapped at all.
The Audio tab is useful when rhythm matters as much as text. Keep the same Morse line, hold the main Audio WPM steady, and lower Farnsworth WPM only when you want wider gaps for practice. Before you share or export anything, compare Decoded Text, Unknown tokens, Normalized Morse, and the summary audio time so the text and timing tell the same story.
Decoded Text is the headline result, but it should never stand alone. The safest read is to pair it with Unknown tokens and Normalized Morse. When all three agree with your expectation, the decode is usually solid enough for study, note cleanup, or practice playback.
The main false-confidence trap is a clean-looking sentence produced by partial data loss. If the text looks right but the normalized code shrank, the audio seems too short, or the unknown count is non-zero, treat the result as a draft decode until you fix the missing groups.
Paste .... . .-.. .-.. --- / .-- --- .-. .-.. -.. with the default separators. The decoder returns HELLO WORLD, reports 2 words, shows 0 unknown tokens, and rebuilds the same structure in Normalized Morse. This is the clean baseline for checking that your source uses ordinary spaces between letters and a slash between words.
Keep that same Morse line, leave Audio WPM at 20, and set Farnsworth WPM to 8. The decoded text stays HELLO WORLD, but the summary audio time grows and the timeline shows longer flat silent stretches between characters and words. That is the expected outcome because the marks stay the same while the gaps widen.
Suppose the source is ....|.|.-..|.-..|---//.--|---|.-.|.-..|-... Set Input letter separator to | and Input word separator to //. The line now resolves cleanly to HELLO WORLD. If you leave the defaults in place, the message looks broken even though the Morse groups themselves are valid.
Paste ... --- ... --.-.-. With Unknown policy on Replace, the text becomes SOS? and Unknown tokens rises to 1, which tells you the last group is not in the built-in table. Switch to Skip, and the text can collapse to SOS. That looks cleaner, but it is less honest unless you keep watching the unknown count.
No. This decoder expects written dots and dashes. The audio features work in the opposite direction by turning recognized groups into a synthetic practice signal.
Only the first non-blank line is used. That keeps one decode run tied to one Morse line instead of silently merging a whole worksheet.
If every parsed group is unknown and you skip unknown groups, the decoded text becomes empty and the result panels no longer have anything to show. Switch back to Replace to expose the failing groups, then fix separators or source content.
That usually means Farnsworth WPM, Lead, or Tail changed. Those settings affect silence and spacing, not the decoded characters themselves.
The decode logic, charts, playback, and WAV render all run in the browser here. The privacy caveat is the page URL: changed input and settings are mirrored into query parameters, so do not share the link if the message is sensitive.
.- or ...-.