Morse Code
{{ morse_summary_preview }}
{{ char_count }} chars · {{ duration_readable }} audio
WPM {{ wpm }} {{ letter_count }} letters {{ word_count }} words
{{ volume_percent }}%
{{ 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 }}

                    
:

Introduction:

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.

Everyday Use & Decision Guide:

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.

  • Watch Unknown chars whenever the source text includes curly quotes, accented letters, or symbols outside the built-in mapping.
  • Use replace only when the placeholder character itself has a Morse mapping. Otherwise the package behaves like skip.
  • Compare runs with the same input text if you want timing comparisons to mean anything. Changing frequency or volume changes the sound, not the Morse timing.
  • If the code looks right but the pacing feels wrong, inspect Unit (ms) and the Tone vs Time chart before trusting your ear.

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.

Technical Details:

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.

u = 1.2WPM uF = { 1.2F if 0 < F < WPM u otherwise } T = lead + signal segments + tail
Timing symbols and package outputs
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
Package settings that materially change results
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.

Assumptions & limitations

  • Whitespace is collapsed into word breaks, so repeated spaces do not survive as separate timing events.
  • Unsupported characters raise Unknown chars and can shorten the message if the policy is skip.
  • A placeholder only works in replace mode when that placeholder has its own Morse mapping.
  • Farnsworth WPM has no effect when it is 0, equal to WPM, or higher than WPM.
  • Total units is derived from total duration, so lead and tail silence contribute to it.

Step-by-Step Guide:

Work from text to timing to audio so you can catch mapping problems before you listen or export.

  1. Paste text into Text or drop a plain-text file onto the textarea. The encoded output begins once the input is nonblank.
  2. Set Speed (WPM) for the character rate, then check the summary badges and the Encoded Morse block to make sure the message itself looks right.
  3. Open Advanced only if needed. Lower Farnsworth WPM below WPM to stretch gaps, or change Unknown policy if unsupported characters are disappearing.
  4. Use the Signal Metrics tab to compare Unit (ms), Duration (s), Unknown chars, and the final Morse string.
  5. Switch to Audio to inspect Tone vs Time, then press Play. If there is no sound, interact with the page and press Play again because browsers may block audio until a user gesture.
  6. Use Download WAV when you need an audio file, or open JSON if you want the structured timing summary for another workflow.

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.

Interpreting Results:

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.

  • If Unit (ms) changes, your character speed changed.
  • If Duration (s) changes while Unit (ms) stays the same, the difference came from message length, Farnsworth spacing, or added silence.
  • If Unknown chars is greater than 0, compare the final Morse field with the input text before you transmit or share it.
  • If the chart shows longer flat silent sections but the Morse symbols are the same, Farnsworth spacing is doing what it should.

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.

Worked Examples:

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.

FAQ:

Why does Farnsworth sometimes seem to do nothing?

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.

Why is the total time longer than the Morse symbols alone suggest?

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.

What happens to characters the package does not recognize?

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.

Does changing frequency or volume alter timing?

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.

Why do I get no sound until I press Play?

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.

Are dropped text files uploaded?

No. The package has no Lambda helper for this slug, and dropped or selected .txt files are read locally in the browser.

Glossary:

WPM
Words per minute, the character-speed setting used to derive the base dot length.
Farnsworth timing
A training method that keeps character speed high while lengthening spaces between letters and words.
Dot unit
The base time length from which dashes and gaps are derived.
Unknown character
An input symbol with no Morse mapping in the package's built-in table.

References: