{{ morse_display }}
| Metric | Value | Copy |
|---|---|---|
| Unit (ms) | {{ Math.round(unit_ms) }} | |
| Total units | {{ total_units }} | |
| Duration (s) | {{ duration_seconds.toFixed(2) }} | |
| Characters | {{ char_count }} | |
| Words | {{ word_count }} | |
| Letters encoded | {{ letter_count }} | |
| Unknown chars | {{ unknown_count }} | |
| Dots | {{ dots }} | |
| Dashes | {{ dashes }} | |
| Input text | {{ input_text }} | |
| Morse | {{ morse_display }} |
Morse code turns letters, digits, and punctuation into timed patterns of short and long signals. The symbols matter, but the spacing matters just as much, because copy speed and message clarity depend on how quickly each element is sent and how much silence separates letters and words.
This page converts text into Morse, calculates how long the message will take to send, draws a tone timeline, and lets you listen to or export the generated signal. That makes it useful for practice drills, club demonstrations, and quick timing checks when a plain character table is not enough.
A learner can paste a call sign exchange, keep the default 20 words per minute for character speed, then lower the Farnsworth rate to stretch the spaces between letters and words. The visible Morse string stays familiar, but the rhythm becomes easier to copy and the duration grows in a way the chart and metrics make explicit.
The package is most helpful when you want to compare rhythm, duration, and unsupported characters across runs. The summary badges, Signal Metrics tab, and Tone vs Time chart show whether a change came from message length, Morse timing, gap stretching, or dropped characters rather than from guesswork.
It is still an encoder and practice aid, not a decoder, keyer, or proof that a transmission will meet every operating convention. Speaker quality, browser audio rules, and your own separator choices can change what you hear or copy even when the underlying code string looks correct.
The simplest first pass is plain text, default separators, and a single change to Speed (WPM). That gives you a clean baseline for the Morse string, Unit (ms), and Duration (s) before you start changing audio or gap settings.
If you are practicing copy rather than matching a fixed transmission standard, lower Farnsworth WPM beneath the character WPM. In this package, that slows the overall message by stretching letter and word gaps while keeping dot and dash timing at the original character speed.
A reliable workflow is to confirm the Morse string first, confirm the metrics second, and use the audio preview last. That order makes it easier to spot unsupported characters and timing surprises before you export anything.
International Morse timing is built on a single time unit. A dot lasts one unit, a dash lasts three, the gap between elements inside one character lasts one, the gap between letters lasts three, and the gap between words lasts seven. The package follows that timing model and maps supported characters through an internal table that covers A-Z, 0-9, and common punctuation such as ., ?, /, @, and $.
The base unit comes from the character speed in words per minute. The package uses u = 1.2 / WPM, which is the usual derivation from the 50-unit PARIS timing convention. If Farnsworth WPM is greater than 0 and lower than WPM, the package keeps dot and dash lengths at u but recalculates letter and word gaps from the slower Farnsworth unit. That is why overall duration can increase even though the dot length does not change.
Text is normalized by trimming leading and trailing whitespace and splitting the remaining content into words. Each supported character becomes a Morse pattern, unsupported characters increment Unknown chars, and the package either skips them or replaces them with the chosen placeholder pattern. The display separators only change the visible Morse string. They do not change the generated timing. By contrast, Lead silence and Tail silence are appended to the segment list and therefore increase total duration.
| Symbol | Meaning | Unit | Visible output |
|---|---|---|---|
u |
Base dot duration from character speed | seconds | Unit (ms) after conversion |
u_F |
Gap duration used for Farnsworth spacing | seconds | Implicit in total duration and chart spacing |
T |
Total send time including lead and tail silence | seconds | Duration (s) |
N |
Total time expressed in base units | count | Total units |
| Setting | What it changes | What it does not change |
|---|---|---|
| WPM | Dot length, dash length, gaps when Farnsworth is inactive, and total duration | Character mapping |
| Farnsworth WPM | Letter and word gaps when 0 < F < WPM |
Dot and dash length |
| Unknown policy | Whether unsupported characters disappear or become placeholder Morse | Timing of already supported characters |
| Letter separator / Word separator | Displayed Morse string only | Signal timing and chart shape |
| Frequency / Volume | Audio pitch and loudness | Morse timing metrics |
The Audio tab converts the segment list into a step chart and a sine-wave playback signal. The downloadable WAV file is generated locally as mono 16-bit PCM at 44.1 kHz, with a short ramp at tone edges to reduce clicks. The page does not upload text or audio, and dropped .txt files are read only inside the browser.
Work from text to timing to audio so you can catch mapping problems before you listen or export.
If the Morse output is shorter than expected, do not trust the audio yet. Check Unknown chars first, then decide whether to keep skipping unsupported symbols or switch to placeholder replacement.
Unit (ms) tells you the actual dot speed. Duration (s) tells you how long the whole message takes after gap stretching and lead or tail silence are included. Unknown chars tells you whether the Morse string or audio may have lost information from the original text.
The main false-confidence trap is trusting the visible dots and dashes without checking timing. Two runs can display similar Morse strings while sounding very different, so verify Unit (ms) and the Tone vs Time chart whenever pace matters.
Plain timing check with SOS. Enter SOS at 20 WPM with Farnsworth WPM = 0. The package returns Morse = ... --- ..., Unit (ms) = 60, Duration (s) = 2.08, Dots = 6, and Dashes = 3. The total is longer than the pure Morse element count because the default 0.2-second lead and tail silence are included.
Slower overall rhythm without slower characters. Enter CQ TEST at 18 WPM and set Farnsworth WPM = 12. The page still reports a base Unit (ms) of about 67, but Duration (s) rises to about 4.77 and the chart shows longer silent gaps. That is the correct Farnsworth pattern: same character speed, slower overall copy pace.
Unsupported character troubleshooting. Enter AB# at 15 WPM with Unknown policy = skip. The package reports Unknown chars = 1, Letters encoded = 2, and Morse = .- -.... Switch the policy to replace with placeholder ?, and the message becomes .- -... ..--.. with a longer duration. That is the clearest way to confirm the missing symbol was a mapping issue, not an audio problem.
Because the package only stretches gaps when Farnsworth WPM is greater than 0 and lower than WPM. If it is equal to or higher than the character speed, the gap unit falls back to the normal one.
The page includes letter gaps, word gaps, and the configured Lead silence and Tail silence in Duration (s). It is timing the complete signal, not just the on-tone parts.
They increment Unknown chars. In skip mode they disappear from the Morse output and timing. In replace mode they use the placeholder character if that placeholder has a Morse mapping.
No. Frequency (Hz) and Volume (%) change the tone you hear and the WAV output level, but the timing metrics still come from WPM, Farnsworth WPM, message content, and added silence.
Playback is created in the browser with an audio context, and many browsers require a user gesture before sound can start. Click anywhere on the page if needed, then press Play again.
No. The package has no Lambda helper for this slug, and dropped or selected .txt files are read locally in the browser.