Windows 11 utilities for running WSJT-X Improved with the QRP Labs QMX+:
- keep Windows time accurate enough for FT8; and
- verify the QMX+ USB receive-audio path before launching WSJT-X.
The QMX+ LCD has an audio-level indicator at the top-left character,
under the A VFO symbol. A single dot during transmit or tune means
little or no transmit audio drive is reaching the QMX+ over USB. Typical
causes include wrong WSJT-X output device, USB re-enumeration after a
reconnect, FxSound audio routing, or exclusive-mode contention.
qmx_audio_check.py measures receive audio (QMX+ -> PC). It does not
test transmit audio directly, but a missing or silent receive device is
evidence that USB enumeration or device selection must be fixed before
debugging WSJT-X transmit audio.
Operating procedure is in CHECKLIST.md. Debugging notes are in NOTES.md.
Tuned for one specific configuration:
| Component | Version / detail |
|---|---|
| OS | Windows 11 |
| Radio | QRP Labs QMX+ |
| QMX+ firmware | 1.03.002 |
| Software | WSJT-X Improved 3.0.0 |
| Antenna | AlexLoop magnetic loop (2nd floor, urban courtyard) |
| Band / mode | 30 m FT8, 10.136 MHz |
| Other audio software present | FxSound |
| File | Purpose |
|---|---|
Ensure-FT8-TimeSync.ps1 |
Configures and tests the Windows Time service so FT8 timing is usable after a rebuild, reboot, or failed w32tm /resync. |
qmx_audio_check.py |
Lists Windows audio devices, identifies likely QMX+/USB audio devices, captures a short sample, and reports where its peak level falls on a measurement scale from SILENT through CLIPPING. |
CHECKLIST.md |
Operating checklist for routine WSJT-X + QMX+ operation, including what not to change. |
NOTES.md |
Debugging notes and post-commit validation. |
- Windows 11
- PowerShell
- Administrator PowerShell session
- Network access to public NTP servers
- Windows 11
- Python 3
- QRP Labs QMX+ connected by USB
- Python packages:
pip install sounddevice numpyPython virtual environment setup (the .venv/ directory is gitignored;
create it yourself, do not commit it):
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
pip install sounddevice numpyAll commands below assume PowerShell is open at the repository root.
Open PowerShell as Administrator at the repository root, then run:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\Ensure-FT8-TimeSync.ps1The script:
- requires Administrator privileges;
- sets the Windows Time service to automatic startup;
- starts
w32timeif it is not already running; - configures manual NTP peers:
time.windows.comtime.nist.govpool.ntp.org
- restarts the Windows Time service;
- forces a resync;
- prints
w32tm /query /status; and - runs a short stripchart check against
time.windows.com.
For FT8, the final offset should be well under +/-1 second.
Run from a normal PowerShell session at the repository root:
.\.venv\Scripts\Activate.ps1
python .\qmx_audio_check.pyDefault behavior:
- searches for audio devices whose name matches known radio hints
(
Digital Audio Interface,USB Audio Codec,QMX,QDX) or a user-supplied--pattern; - lists input and output devices;
- marks likely input candidates;
- prints the Windows default input and output;
- warns if the default Windows output appears to be a radio device; and
- captures 3 seconds of mono audio at 48 kHz from the detected input device.
Useful variants:
python .\qmx_audio_check.py --pattern QMX
python .\qmx_audio_check.py --pattern USB
python .\qmx_audio_check.py --device N
python .\qmx_audio_check.py --duration 5
python .\qmx_audio_check.py --samplerate 48000Use --device N when several input candidates are listed. Windows can
enumerate the same physical device through multiple audio APIs (MME,
WDM-KS, WASAPI shared/exclusive). Prefer a 48 kHz QMX+ input when
available.
qmx_audio_check.py reports peak level, RMS level, and peak dBFS, and
classifies the result by peak dBFS.
| Label | Peak band | What it tends to indicate |
|---|---|---|
SILENT |
peak < -100 dBFS | No useful audio reached the capture device. Check USB cable, device selection, Windows privacy settings, and disabled devices. |
VERY QUIET |
peak < -60 dBFS | Usually wrong device selected or exclusive-mode contention. Check device selection first. |
QUIET |
peak < -40 dBFS | Low in dBFS terms, but may still decode when the Windows clock is synchronized. |
NORMAL |
-40 to -15 dBFS | Operating range observed on this station. WSJT-X typically shows 3-4 green dots. |
HOT |
> -15 dBFS | High but not clipping. Consider reducing for headroom. |
CLIPPING |
peak > -0.3 dBFS | Near full scale. Reduce QMX+ AF output or Windows input level. |
On this station, FT8 decoded normally at about -40 dBFS peak and -55 dBFS RMS when the Windows clock was synchronized. A 4-second clock offset produced zero decodes while the audio path still looked plausible.
If WSJT-X decodes nothing while the band is active, check time before adjusting audio.
On this setup, USB RX audio from the QMX+ behaved as effectively
fixed-gain. No USB RX gain control was found in the firmware 1.03.002
menu during this session; SSB -> USB Gain affected TX only. No
adjustment was needed for this station.
See CHECKLIST.md for the full operating procedure. In brief:
- Connect and power the QMX+.
- Run
Ensure-FT8-TimeSync.ps1after rebuilds, reboots, or failed syncs. - Run
qmx_audio_check.pybefore launching WSJT-X. - In WSJT-X, explicitly select the QMX+ audio devices rather than relying on Windows defaults.
- If QMX+ audio devices disappear from WSJT-X, power-cycle or reconnect the QMX+ and restart WSJT-X.
Typical WSJT-X audio-device names on Windows look like:
Digital Audio Interface (N- QMX Transceiver)
The N can change after USB reconnects. Recheck WSJT-X audio settings
when Windows renumbers the device.
Do not make the QMX+ the Windows default output device. System audio processors such as FxSound target the default output; Windows system sounds can be routed to the QMX+ audio device. Set speakers or headphones as the default; select the QMX+ explicitly inside WSJT-X.
Use a process-local execution-policy bypass:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy BypassThen run the script again from the same Administrator PowerShell session.
Open PowerShell as Administrator. The script exits if not elevated.
Run Ensure-FT8-TimeSync.ps1 from Administrator PowerShell. It configures
manual NTP peers, restarts w32time, and forces a resync.
Run again with the specific input index:
python .\qmx_audio_check.py --device NQMX+ LCD top-left character, under the A VFO symbol, shows a single
dot. On this station, that indicated little or no transmit audio drive
reaching the QMX+ over USB.
Likely causes:
- WSJT-X output is not set to the QMX+ device;
- Windows default output is FxSound or another non-QMX+ device, and
WSJT-X is configured to
Default; - QMX+ re-enumerated to a new device number since WSJT-X last bound to it;
- another application is holding the device in exclusive mode;
- QMX+ USB audio routing changed after a FxSound or Windows update.
Diagnostic sequence:
- In WSJT-X,
File -> Settings -> Audio, confirm Output is set explicitly toDigital Audio Interface (... QMX Transceiver), notDefault. - Run
python .\qmx_audio_check.pyto check the RX side. If the script reportsVERY QUIETorSILENT, fix USB enumeration, device selection, and routing before returning to WSJT-X. - If the script reports
QUIETorNORMALbut the QMX+ still shows one dot, treat the WSJT-X output binding or Windows output routing as the live suspect.
A QUIET result on its own is not a problem when the clock is synchronized.
Power-cycle or reconnect the QMX+, then restart WSJT-X. Windows may assign a new device number.
Known failure mode when the FxSound APO has been unloaded but not cleanly, or when the audio stack is in an inconsistent state. Use the legacy control panel, which bypasses the Settings app entirely:
mmsys.cplThe Playback and Recording tabs in that dialog respond normally when the Settings app won't.
If mmsys.cpl also fails to commit changes, restart the audio service
from an elevated PowerShell session:
Restart-Service -Name Audiosrv -ForceThis forces the audio stack to re-initialize and drops stale APO hooks. Any app currently using audio will briefly lose its connection and reconnect.
Ensure-FT8-TimeSync.ps1 changes only Windows Time service
configuration and queries time status.
qmx_audio_check.py is read-only. It captures a short in-memory audio
sample to compute level statistics and changes nothing.
MIT License. See LICENSE.