Send setup guide (rig + paddle) — match tone, avoid clipping, then tune SNR
1) Match your radio / keyer
- Paddle / keyer speed: set any comfortable speed (e.g. 12–20 WPM). The decoder estimates dit length automatically, so it does not need an exact WPM setting.
- Sidetone / pitch: set your rig's sidetone to a steady tone (common: 500–800 Hz). Then set Tone frequency (Hz) in the app to the same value (or click Auto-detect while the radio tone is playing).
- Filter (optional): if your rig has a CW RX filter, set it near the same pitch and reasonably narrow. A clean single tone makes decoding much easier.
2) Get a clean audio path (this matters more than gain)
- Best: feed audio from the radio into the computer/phone (line-out / headphone-out into line-in or an interface). This avoids room noise and coughs.
- OK: place the mic near the speaker but lower the speaker volume and point the mic at the speaker. Keep the mic away from your mouth to reduce voice triggers.
- If the decoder shows CLIP, the signal is saturating before the browser sees it. Reduce radio volume or OS mic input level, disable Mic Boost/AGC/enhancements, or move the mic farther away.
3) Tune the Send decoder controls (quick procedure)
- Start listening, then send a few steady dits.
- Set Decoder bandwidth to about 100 Hz (try 80 Hz if your room is noisy; try 150 Hz if your pitch wanders).
- Raise Decoder threshold (dB SNR) until the Key state stays OFF when you're not sending, then lower it slightly so dits/dahs trigger reliably.
- Use Hysteresis (start at 3 dB) to prevent chattering: higher = steadier OFF/ON, lower = more responsive but may false-trigger.
- Use Mic input gain only to keep the level reasonable; prefer tuning threshold/bandwidth first.
Spacing behavior (wide range is OK)
- This decoder will tolerate a wide range of inter-character spacing. If you send CQ very tight, it will still produce CQ. If you pause longer between characters while learning, it should still keep letters together and only insert a word space for a much longer pause.
Daily routine (10–15 minutes)
- Review first: do the due items. Don’t “relearn” from scratch each day.
- Stay in the 80–90% zone: if you’re getting crushed, raise spacing (Effective WPM ↓) and use Two-choice mode for 2–3 minutes.
- Then buffer training: 3–5 minutes of Type-after-gap. Increase chunk length only when it feels calm.
- Finish with transfer: play + copy short words/callsigns (use New target in Send-back).
When you plateau
- Stop counting: keep Character speed at 18–25 WPM, but slow the spacing (Effective WPM 6–12) and add Space boost.
- Attack confusion pairs: the app will naturally schedule your weakest symbols more often.
- Practice “keep going”: on-air you can miss one character and still complete the QSO. Aim for “field capture”: callsign, RST, name, QTH.
Best sending practice
- Send slower than you copy. Clean spacing beats speed.
- Use Send-back: play target → send target → score. Focus on letter spacing.
- If your rig has keyer weighting, keep it standard. Let your timing be consistent.
Suggested starter settings
- Character speed: 22 WPM
- Effective speed: 8–12 WPM
- Space boost (SOS): 1.25–1.60
- Mode: Two-choice → Single → Type-after-gap
Quick Start
- Enable Audio (top bar). This unlocks tone playback in your browser.
- Set speed: start around Character WPM 18–22 and Effective WPM 8–12 (Farnsworth spacing) if you’re new. If you’re experienced, set both to your normal speed.
- Pick a Practice set (top bar). Start with SOS Basic or Alphabet (letters only).
- Use your own material: in Practice set, choose Local TXT to load a
.txtfile, or choose Web page URL to load a single website page and play its text in Morse. - Go to Receive:
- Choose Two-choice if you want low-stress recognition training.
- Choose Single character for straightforward copy practice.
- Choose Type-after-gap to train short-term buffering.
- Choose Text line for real-world copying (words and spacing).
- Press Start and type what you hear. Use Repeat to replay the current prompt.
- Go to Send:
- Press Start listening to decode your sidetone/radio audio via microphone.
- Optionally enable Monitor / loopback (if present) to decode what the app itself is playing, useful when tuning send settings.
Speed model (important)
The app separates Character WPM (element speed: dit/dah timing) from Effective WPM (spacing speed: Farnsworth). This prevents “counting” while keeping characters crisp.
- Character WPM: how fast each character is formed (dit = 1 unit, dah = 3 units).
- Effective WPM: stretches only the spaces between characters/words to slow overall copy rate.
- Space Boost: extra spacing emphasis beyond normal Farnsworth. Use it if you tend to run characters together.
Tip: If decoding/recognition feels “blurry”, increase Character WPM a bit and reduce Effective WPM to keep the sound pattern sharp.
Top bar controls (global)
- Enable Audio: creates/activates the WebAudio engine. Required for all tone playback (Receive trainer and “Play target”).
- Enable Microphone: asks for mic permission and prepares input decoding (Send trainer). On iOS Safari this must be triggered by a tap.
- Tone frequency (slider): pitch of the CW sidetone used by the player. It also guides the decoder’s bandpass target. If you change it while audio is playing, the pitch updates immediately.
- Auto-detect: listens briefly to find the dominant tone frequency and sets the tone/decoder center frequency to match (useful with radios or external oscillators).
- Volume (slider): master playback level for tones. Important: monitor/loopback decoding uses the same generated audio signal—if volume is near zero you may get poor/no loopback decode.
- Character WPM (slider): element speed (dit/dah). Affects both Receive playback and the timing reference for loopback monitoring.
- Effective WPM (slider): spacing speed (Farnsworth). Slower Effective WPM gives more time between characters/words without changing the character shape.
- Space Boost (slider): adds additional spacing emphasis beyond Effective WPM. Useful if you are “hearing a run-on stream”.
- Practice set (dropdown): chooses the character/text pool used by Receive and by “Target” generation in Send.
- Built-in sets: common progressions (SOS, letters, numbers, punctuation, prosigns, etc.).
- Local TXT: use your own
.txtfile as the practice text (Receive play-all and line modes). - Web page URL: fetches one page and extracts readable text (no crawling). The Receive trainer can play that page in Morse.
- Audio out (dropdown): choose speakers/headphones. Use Refresh devices if you plug in a new headset after loading the page.
- Audio in (dropdown): choose your microphone or audio interface input for Send decode.
- Mic input gain (slider): pre-gain applied to incoming audio before decoding. Use modest values; prefer tuning threshold/bandwidth first.
Receive trainer
- Mode:
- Single character (type): plays one character; you type it. Best for early recognition.
- Two-choice: plays one of two characters; you choose A/B. Great for “pair discrimination” without keyboard overhead.
- Type-after-gap: plays a chunk, waits a gap, then you type the whole chunk. Trains buffering and reduces “instant reaction” habits.
- Text line: plays a full line of text; you copy the entire line. Good bridge to real copy/QSOs.
- Play whole text (file/page): (available with Local TXT / Web page) plays the entire document sequentially with adjustable pause between lines/items.
- Chunk length: used only for Type-after-gap. Larger = more buffering difficulty.
- Auto-submit delay:
- Single: when you stop typing, the app waits this long before scoring/submitting automatically.
- Chunk: similar, but tuned for longer chunk entries.
- Start: begins the Receive loop (new prompt → playback → you answer).
- Stop: stops playback and ends the current receive session.
- Repeat: replays the current prompt at the current settings (tone, speed, spacing).
- Accuracy / Latency: quick feedback metrics. Use latency to avoid “waiting too long” or “panic typing”.
Local TXT + Web page playback
- Local TXT: choose a
.txtfile as your practice material. The app uses the text as a line-based deck (blank lines separate sections). - Web page: enter a URL and load it. The app stays on that page only:
- It extracts readable text (ignores HTML markup).
- It does not follow links.
- It removes link text/menus so you hear the story/content instead of navigation.
- On pages with many items, it keeps text grouped by item (so you can enjoy one “story” at a time).
- Play whole text mode:
- Gap between lines/items slider: range from 1 word gap (minimum) to 10 seconds. Default is 3.0 s.
- Use Stop to cancel immediately.
Send trainer (mic decode)
The Send trainer decodes keyed CW from microphone/audio-in and shows the decoded text. It’s designed for practice feedback (rhythm/spacing), not contest-grade copy in noisy conditions.
- Start listening: begins decoding from the selected input device.
- Stop: stops decoding and scores your attempt against the current Target (if any).
- Mic level meter: shows input activity. If it never moves, mic permission/device selection is wrong.
- Decoder stats:
- Est. dit: decoder’s current estimate of dit duration (used for timing).
- Key state: whether the decoder currently thinks the tone is “ON”.
- SNR: estimated signal-to-noise ratio around the target tone.
- Threshold: current decision threshold relative to noise floor.
- Input peak + CLIP: if CLIP lights, your input is saturating—reduce gain/volume or move the mic.
- Decoder threshold (dB SNR): higher = stricter (fewer false triggers, but may miss weak dits). Lower = more sensitive (but may false-trigger in noise).
- Decoder bandwidth / tolerance (Hz): wider tolerates pitch drift and imperfect tones; narrower rejects noise but requires a steadier pitch.
- Hysteresis (dB): stabilizes ON/OFF decisions. Higher = steadier but can “hang”; lower = more responsive but noisier.
- Live decode: what the decoder is hearing right now. Use Clear to reset it.
- Target: practice phrase. Use New target to generate a new one from the current Practice set. Use Play target to hear it as clean CW at the current tone/speed.
- Result: after you press Stop, the app scores what you sent vs the target (tolerant but imperfect). Use it for spacing and rhythm feedback.
Monitor / loopback decode (decode what the app sent)
If your build includes a Monitor checkbox, it routes the app’s own CW audio back into the decoder so you can verify what was generated. This is useful while tuning send controls because it exercises the real decode engine rather than “short-circuiting” text.
- Click Enable Audio.
- Enable Monitor (loopback).
- Click Start listening in Send.
- Use Play target or start the Receive trainer. The decoded text should appear in Live decode.
- If loopback decode is weak: increase Volume a bit (monitor taps the generated audio path), and keep Decoder threshold moderate (start ~10–12 dB).
- For speed: loopback is seeded from Character WPM (element speed). Effective WPM only affects spacing.
Troubleshooting
Environment
If you hear nothing
- Make sure you clicked Enable Audio. Mobile Safari often blocks audio until a user gesture.
- Turn up Volume and confirm your Audio out device is correct (try headphones).
- If you selected a non-default output, click Refresh devices after plugging/unplugging headsets.
If the mic level never moves
- Click Enable Microphone and allow permission when prompted.
- Check browser/site permissions in your OS and ensure the correct Audio in device is selected.
- On iOS, use HTTPS and reload the page after granting permissions.
URL practice doesn’t load
- The app fetches only the exact page URL you enter and blocks private/localhost addresses for safety.
- If the site blocks automated fetches or requires login, try a different page or copy the text into a local
.txtfile.
Privacy
Everything runs locally in your browser. Practice stats and settings are stored in your browser’s local storage on this device. The URL practice feature fetches the requested page from your server (same origin) and returns extracted text for playback.