Real Morse! — User Manual
Real Morse! is a model-based CW trainer. It generates realistic Morse audio for training learners by
modeling both (1) transmitter/keying behavior and (2) radio channel effects such as amplitude fading (QSB),
noise (QRN), and other distortions, plus (optionally) frequency effects such as drift and Doppler.
The goal is practice that sounds closer to real on-air CW than “clean” sidetone generators.
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.