Real Morse! - User Manual
Real Morse! is a model-based CW trainer. It generates realistic Morse audio for training both beginner and advanced learners, based on a sender - channel - receiver communication model of
- transmitter/keying behavior,
- radio channel effects such as amplitude fading (QSB),
noise (QRN), and other distortions, plus (optionally) frequency effects such as drift and Doppler,
- receiver filter effects.
The goal is practice that sounds closer to real on-air CW than “clean” sidetone generators.
This web app is open source and experimental. No warranty is given on fitness for purpose or unexpected effects.
Quick Start
-
Enable audio: click Start once. Browsers require a user gesture before audio can play.
-
Choose your mode:
- Condx = quick “band conditions” presets (signal + QSB + noise).
- Params = full control of transmitter / channel / receiver parameters.
-
Pick what is sent: in Message, choose Source (Templates / Random callsigns / Custom text).
-
Click Generate new to create a fresh message and a new timing plan.
Use Repeat to replay the last generated message exactly.
-
If you want a real copying exercise, turn off Reveal transcript.
Turn it on only to check your copy.
UI Overview
The UI is organized as a radio-style audio chain: TX → Channel → RX. Most sections are implemented as
nested <details> blocks, so you can collapse everything and focus on one layer at a time.
Top Bar
- Mode buttons: Condx and Params (treated as a paired control).
- Transport: Start, Stop, Generate new, Repeat.
- Master volume: global output volume (independent of Condx/Params internal ratios).
- Status: Idle / Playing / Stopped.
- Help! jumps to this manual.
Main Panels
A) Message
- Source
- Template phrases — common CW exchange patterns with generated callsigns.
- Random callsigns — a single generated callsign (grammar-enforced).
- Custom text — your own message (restricted to typical CW character set).
- Template — selects a phrase pattern when Source = Templates.
- Reveal transcript — hides/shows the displayed message text for training vs validation.
- Transcript line — shows the actual generated text (masked when Reveal is off) and counts callsigns detected.
- Meta badges — quick readout of key run-time conditions (duration, WPM/Farnsworth, seed, noise, etc.).
B) Conditions (Condx mode)
When Condx mode is active, the full parameter sliders are ignored and the radio buttons
apply a small set of “band condition” values (primarily signal strength, QSB depth/rate, and noise floor).
This gives a fast, realistic practice ladder without “engineering the radio.”
C) Parameters (Params mode)
In Params mode, the full transmitter/channel/receiver model is enabled.
The layout is hierarchical:
-
TX (Transmitter)
- Keying — WPM, Farnsworth, timing variability (“fist”), weighting, gap, “send twice”, etc.
- Tone — sidetone pitch, keying envelope (attack/release), and related tone shaping.
- FM components — deliberate frequency behaviors originating at the transmitter (e.g., chirp, drift).
-
Channel (Propagation)
- AM effects — QSB fading and flutter (amplitude variation over time).
- Noise — band noise floor (QRN), plus optional impulsive static bursts.
- FM exception — satellite Doppler is treated as channel-origin frequency shift.
-
RX (Receiver)
- Filter — bandpass “Q” for CW filter narrowness and coloration.
- AGC — automatic gain control behavior (attack/release) to shape between-element noise vs silence.
JavaScript Implementation (Conceptual)
The app is a single-file WebAudio application built from a few clear layers:
-
State + UI binding — UI controls update a central state object. “Generate new” builds a message and a timing plan.
“Repeat” replays the last plan exactly (deterministic).
-
Message generation — templates and callsign grammar create realistic practice text. Custom text is sanitized to a safe CW set.
-
Morse planner — converts message text into a time-ordered keying plan (key up/down segments) using WPM + Farnsworth +
optional jitter/weighting.
-
Audio engine — constructs a WebAudio graph (tone source, keying envelope, propagation gain modulation, noise bed)
and schedules everything precisely against AudioContext.currentTime.
-
Deterministic randomness — a seeded PRNG produces reproducible “random” messages and channel variation when desired.
Seed handling is designed so “Repeat” is stable.
Audio model at a glance
- Signal path: Oscillator → Keying envelope → Channel AM (QSB/flutter) → RX filter → Master.
- Noise path: Noise source → Color shaping → RX filter coloration → Mixed with signal (with optional “signal masks noise” behavior in Condx).
- Scheduling: keying plan is rendered as gain ramps to avoid clicks; fading is applied via low-rate modulators.
Other Morse Apps (for comparison)
Glossary
- WPM
- Words per minute. Element speed for dits/dahs (character speed).
- Farnsworth
- Increases spacing between characters/words while keeping character elements at full speed.
- Dit / Dah
- The short and long Morse elements. Traditional dah length is ~3× a dit.
- Weight
- Bias that slightly lengthens or shortens keyed elements overall (a “heavier” or “lighter” fist).
- Jitter
- Random timing variation of elements and/or gaps; makes keying less machine-perfect.
- Pitch
- Transmitted audio tone frequency (sidetone-like pitch used for training).
- Attack / Release
- Envelope ramp times at key-down and key-up; prevents clicks and shapes keying “softness”.
- QSB
- Slow amplitude fading due to propagation (signal “washes in and out”).
- Flutter
- Faster, smaller amplitude variation than QSB (a “tremble” of the signal).
- Drift
- Slow frequency change over time (TX instability or tuning drift).
- Doppler
- Frequency shift due to relative motion; in ham practice often associated with satellites.
- QRN
- Atmospheric noise / band noise floor (background noise).
- QRM
- Interference from other stations (another keyed CW signal or multiple signals).
- Bandpass Q
- Receiver filter “sharpness”. Higher Q is narrower and changes the audio “color” of signal/noise.
- AGC
- Automatic gain control. It adjusts gain over time; fast attack can suppress peaks, slow release can keep noise down between elements (or the opposite, depending on settings).
- Seed
- Text value used to generate reproducible “random” messages and channel variation.
- Condx
-
Condition preset mode. Ignores most parameter sliders and instead applies a small set of “band condition” presets
(signal strength, noise floor, QSB depth/rate) for fast realistic practice.
- Params
-
Parameter mode. Enables full control of the transmitter / channel / receiver model using the sliders and checkboxes
in the right panel.
- Start
-
Starts playback of the current message plan. Also serves as the initial “audio unlock” gesture required by browsers
before sound can play.
- Stop
-
Stops playback immediately and cancels any active Repeat n cycle.
- Generate new
-
Creates a new message and builds a fresh timing plan. If no seed is provided, a new random seed is used.
- Repeat
-
Replays the last generated message (deterministically, so practice is consistent).
- Repeat n
-
Plays n iterations in a row (1–100). Each iteration generates a new random seed, produces a new message (with new callsigns),
builds a new plan, and plays it. The input field shows a countdown during the cycle, then returns to its original value at the end.
- Speaker
-
Label for the master output volume control (the slider next to it). This is the overall loudness of the app relative to the current system setting of the speaker.
- Idle / Playing / Stopped
-
Playback status indicator. Idle means nothing is currently playing,
Playing means audio is active, and Stopped means playback was manually stopped.
- Help!
-
Jumps to the in-page user manual section.