Skip to content

requirementXYZ/CWStudio

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CW Studio

A complete Morse code (CW) workstation that runs in your browser — decode and send, no extra hardware required.

CW Studio pairs a Morse Decoder that reads CW from your receiver's audio with a Morse Keyer that sends it, both served by one small local service on your PC. The signal processing runs in the browser on the Web Audio API; the local service bridges the things a web page can't reach on its own — transceiver CAT control and serial-port keying.

You need a receiver and a sound card. That's it.

CW Studio Morse Decoder


What makes it different

Most software CW decoders assume textbook Morse: perfect 1:3 dot-to-dash ratios, exact spacing, clean signals. Real operators and real bands are nothing like that. CW Studio is built around that reality.

  • Fist adaptation — dot, dash, and spacing timings are tracked as three independent statistical clusters, so a heavy fist (1:4), a light one (1:2.2), or a contest operator who compresses spacing all decode correctly. The measured weight is shown live in the status bar.
  • Error correction, at the word level — real sending is not metronomic. A character gap that comes out slightly short merges two letters into one (GE--. . — becomes --.. = Z), and a stretched in-character gap splits one letter into two (SURE arrives as SUL). Both readings are made of entirely valid characters, so nothing looks wrong until you read the word — which is precisely how an operator spots it. CW Studio re-reads each finished word, reconsidering the gaps that sat closest to the decision boundary and scoring the alternatives against an English and amateur-radio vocabulary. It will also split a word that has run into the next one, such as a greeting backed straight onto a callsign. Corrections appear in amber with the original reading on hover, so the decoder never quietly guesses at you.
  • Interference tolerance — brief dropouts inside a mark are statistically detected and spliced out, so QSB flutter and static crashes don't chop dashes into dots. Impulse noise is rejected without breaking character timing.
  • Multi-channel copy — decode the strongest signals across the whole band simultaneously, each with its own filter and decoder. Click any row to tune the main decoder to that station.
  • Contest pileup trainer — practise against 1–3 simultaneous stations with realistic generated callsigns, serial exchanges, and randomised speeds, pitches, strengths, and fists. No radio needed.

Features

Morse Decoder

Display Live spectrum, scrolling waterfall, frequency ruler, signal-envelope scope
Tuning Click-to-tune, AFC that follows drifting signals, go-to-max, auto-GTM
Filters Four bandwidths (400 / 200 / 100 / 50 Hz), adjustable envelope smoothing
Detection Adaptive threshold with noise-floor tracking and squelch, or manual
Speed Automatic tracking roughly 5–60+ WPM, with lock and min/max limits
Sources Microphone / line-in, audio files, or the built-in practice generator
Rig control Click a signal and the transceiver retunes so it lands on your TX pitch (VFO or RIT)
Compact view Shrink to a small window showing only the decoded text and speed — for keeping copy in view while running a contest — and expand back
Themes Dark and light interfaces, switchable from the header and shared across every window
Output Copy or save the received text; all settings persist automatically

Morse Keyer

Keyboard sending Type-ahead — characters go out as you type; Backspace edits unsent text; Esc aborts
Macros F1–F8 with substitutions for your call, their call, name, RST, and auto-incrementing serial
Timing WPM with true effective-speed readout, dash:dot ratio, weighting, Farnsworth spacing
Sidetone Clean keyed sine with adjustable pitch and rise/fall edge — feed it to an SSB rig to transmit with no keying cable
Hardware keying Serial-port DTR/RTS keying with optional PTT and lead/tail delays, timed natively for millisecond precision
Paddle Iambic A/B or straight key — on-screen, keyboard, USB gamepad adapter, or a real key on a serial port's CTS/DSR lines
Extras Tune (continuous key-down), beacon mode, prosigns typed as <AR> <SK> <KN>

CW Studio Morse Keyer


Installing

Windows installer (recommended)

Download CWStudio-1.1.0-x64.msi from the latest release and run it. Everything is self-contained — no Python or other prerequisites.

⚠️ Windows will show a SmartScreen warning — this is expected

You will see "Windows protected your PC — Microsoft Defender SmartScreen prevented an unrecognized app from starting."

To continue: click More info, then Run anyway.

Why it happens: the installer is not yet code-signed. Windows shows this for any installer without a purchased code-signing certificate, regardless of whether the software is safe. It is a statement about the certificate, not about the contents.

How to satisfy yourself it is genuine: every line of source in this repository built this installer — the build is reproducible with installer/build.ps1. You can verify your download is byte-for-byte the file published here:

Get-FileHash CWStudio-1.1.0-x64.msi -Algorithm SHA256

Expected SHA-256 for 1.1.0: 4f50455d1e0e64804674ecd534e359d78e83b205786572dcfe16cf7f91eec874

If you would rather run nothing unsigned at all, use Running from source below instead.

CW Studio starts automatically when the install finishes, and adds a CW Studio entry to the Start Menu. Launching it puts an icon in the system tray and opens the launch menu:

CW Studio launch menu

Right-click the tray icon for Open Morse Decoder, Open Morse Keyer, Open both (tiled side by side), and Start / Stop server.

Tip: Windows 11 hides new tray icons behind the ^ arrow. Drag the CW Studio icon onto the taskbar to keep it visible.

Running from source

Requires Python 3.9+ on Windows. pip install pywin32 enables rig control and serial-port keying; without it, everything else still works.

git clone https://github.com/requirementXYZ/CWStudio.git
cd CWStudio
python src/server.py

Then open http://localhost:8321. For the tray launcher, run pythonw src/tray.pyw, or create a Start Menu shortcut with powershell -ExecutionPolicy Bypass -File src/create-shortcut.ps1.

First run

  1. Launch CW Studio and pick Morse Decoder (or Open both).
  2. Press ▶ Start — browsers require one click before audio may run.
  3. With no radio connected, set the practice generator going to see it work. Or append ?demo to the decoder URL for an instant simulated contest pileup.
  4. For live decoding, choose Mic / Line and feed your receiver's audio into the computer's line or microphone input.

Connecting your station

Receiving — connect the receiver's audio output (headphone or line out) to the computer's line-in or microphone input, then select Mic / Line as the source and choose your radio's sound card in the Device list — otherwise Windows hands over its default input, which is usually a webcam or laptop microphone. Many modern transceivers with a built-in USB audio codec appear as a sound device directly. If a rig feeds audio down only one side of a stereo input, set Channel to Left or Right. The Input level meter shows at a glance whether audio is actually arriving.

Transmitting — two options, no soldering required for the first:

  • Sidetone into an SSB rig: feed the computer's audio output to the transceiver's mic or line input and use VOX or PTT. The keyed sine becomes CW.
  • Serial-port keying: a keying interface (a transistor or optocoupler between a serial control line and the rig's key jack) driven by DTR or RTS, with optional PTT on the other line.

Rig control — install OmniRig and CW Studio can retune your transceiver when you click a signal on the waterfall.

Running alongside other station software — OmniRig serves several programs at once, so CW Studio can share the radio with a cluster, logging or DX dashboard application and both can tune it; tuning is last-action-wins rather than a tug of war, and CW Studio re-reads the dial at the moment you click so it never tunes from a stale frequency. Point both programs at the same OmniRig rig slot, and let only one of them use RIT. The real clash is serial ports, which only one program may open at a time — give CAT, keying and paddle input their own ports. See the user guide for the detail.

A real key or paddle — wire it to a USB gamepad adapter (dit and dah on buttons 1 and 2), to a serial port's CTS and DSR input lines, or via a microcontroller that emulates a keyboard. All three are supported natively and covered in the user guide.

Not running in the background

The pages send a heartbeat to the local service. When the last CW Studio tab is closed, the service shuts itself down about ninety seconds later — nothing is left running. The tray menu always shows the true state, and The service listens on 127.0.0.1 only, so nothing is exposed to your network. It prefers port 8321 and steps up to the next free port if another application already holds it, so it cannot be blocked by a clash.

To keep it running headless, start the service with --stay.

Documentation

A full user guide is built in — the ? Guide link in either tool's header, or help.html. Every panel has an icon that opens the guide at that topic.

How the decoder works

  1. Band-pass filter — two cascaded biquad sections centred on the tuned frequency, running per-sample in an AudioWorklet.
  2. Envelope detector — rectification and one-pole smoothing, decimated to a ~1.5 kHz envelope rate.
  3. Adaptive threshold — independent trackers for the signal peak (fast attack, ~2 s decay so it rides QSB) and the noise floor, with a squelch that keeps pure noise out of the decoder entirely.
  4. Keying detector — hysteresis, asymmetric glitch filtering, and statistical dropout bridging: a gap is only spliced out of a mark when it is anomalously short against the observed gap distribution.
  5. Speed and fist estimator — median-filtered mark lengths are split into dot and dash clusters at the largest statistical jump; the cluster centres adapt independently and decision boundaries sit at their geometric means.
  6. Character decoder — marks are re-classified with the latest estimates at each character boundary; failures go to the repair engine described above.

Repository layout

src/                 application source
  index.html         launch menu
  rx.html  app.js    Morse Decoder
  tx.html  tx.js     Morse Keyer
  dsp-worklet.js     band-pass filter and envelope detector (AudioWorklet)
  help.html          user guide
  server.py          local service: static files, rig bridge, serial keyer, watchdog
  tray.pyw           system-tray launcher
installer/           WiX source and build script for the MSI
docs/                screenshots

Building the installer

Requires PyInstaller and WiX Toolset v5 (dotnet tool install --global wix --version 5.0.2):

powershell -ExecutionPolicy Bypass -File installer/build.ps1

This produces build_out/CWStudio-1.1.0-x64.msi.

Requirements

  • Windows 10 or 11 (the local service uses Windows APIs for rig control, serial keying, and window management)
  • A current Chromium-based browser — Edge or Chrome — for AudioWorklet support
  • A receiver and a sound card for live decoding; nothing extra for practice mode

Licence and disclaimer

CW Studio is released under the MIT Licence. You may use, modify and redistribute it freely, and it comes with no warranty of any kind.

This software is provided as-is and is not supported. There is no warranty that it will work correctly, decode accurately, or be fit for any particular purpose, and no undertaking to fix faults or answer questions. Use it at your own risk.

Amateur radio carries real risks, and managing them is your responsibility:

  • Transmitting requires an appropriate licence. You alone are responsible for operating within your licence conditions, national regulations and band plans.
  • CW Studio can key a transmitter through a serial interface, and beacon mode can transmit repeatedly without further input. A mis-wired interface, a wrong setting or an unattended beacon may put a signal on the air when you did not intend it. Check your configuration before connecting it to a radio, and do not leave it transmitting unattended.
  • Transmitters, amplifiers, antennas and feedlines can carry dangerous voltages and RF energy. Antenna work carries risks of falls and of contact with power lines. Nothing in this software assesses or limits RF exposure.
  • Decoded text may be wrong. Never rely on it where accuracy matters — in particular for emergency or safety-of-life traffic, or where there are legal or financial consequences.

To the fullest extent permitted by law, the authors and contributors accept no liability for any injury, loss, damage to equipment, interference caused, or breach of regulations arising from the use of this software.

This is not legal advice.


CW Studio is an independent project, not affiliated with any equipment or software vendor. 73!

About

A Morse code (CW) workstation for Windows: a fist-adaptive decoder with error correction and a full-featured keyer, running in your browser from one small local service.

Topics

Resources

Stars

Watchers

Forks

Releases

Sponsor this project

Packages

Contributors

Languages