Quinlight Audio is a tracker music player and remastering tool for MOD/S3M/XM/IT and related formats. It plays modules, can remaster their source samples with optional external AI backends (AudioSR, LavaSR, FLowHigh, AP-BWE), and lets you A/B the result live during playback.
Release Scope
- Supported public target:
x86_64-unknown-linux-gnu - Supported posture: Linux-first public release, not a cross-platform build
- Default playback/export target: 96 kHz, 32-bit float (64-bit mixed end-to-end)
What It Does
- Plays tracker formats through vendored libopenmpt with a double-precision mixer
- Opens modules directly from archives (
.zip,.7z,.rar,.tar.*,.lha,.cab,.iso) - Replaces samples live during playback so you can compare Original, Reference 48k, and AI remasters (AudioSR, LavaSR, FLowHigh, AP-BWE) without restarting the song
- Combines multiple AI engines into a single sample via a time-domain registration consensus — each engine is aligned to a mathematically-exact sinc reference by 1-D dense optical flow, then a per-sample median rejects any one engine's hallucinations without the ringing of frequency-domain blending (the legacy rotor-manifold spectral consensus stays selectable)
- Exports the live result to FLAC or AAC (256 kbps)
- Supports batch CLI rendering for directories of modules
- Installs as a Linux desktop app (
--install-icon)
Quinlight Audio works without AI engines installed. The player, archive support, reference cleanup path, and export flow remain available even if you never set up the optional remaster backends.
Audiophile
Quinlight Audio's vendored libopenmpt fork is rebuilt for end-to-end double-precision audio. Every stage from sample interpolation through mixing to output uses 64-bit floating point — the only quantization in the playback path is the final cast to f32 at the audio device.
64-bit mixer pipeline
The entire mixer bus operates in double (mixsample_t = double). Volume,
panning, interpolation, and filter feedback all accumulate in 64-bit precision.
Volume ramps use Hermite smoothstep curves (t²(3−2t)) instead of linear ramps,
eliminating zipper artifacts on note transitions. The channel filter is a
cascaded 4-pole design — IT-style 2-pole resonant biquad followed by a
Butterworth post-filter — for 24 dB/octave rolloff with no integer truncation
in the coefficient path.
48 kHz sample remastering
Each sample in the module can be upscaled to 48 kHz via three methods:
- AI (AudioSR / LavaSR / FLowHigh / AP-BWE): neural bandwidth extension
- 48k reference: deterministic sinc resampling (FFmpeg swresample) — also the alignment master for the registration consensus below
- Original: raw sample at native rate (typically 8–22 kHz)
Samples are replaced live during playback. Pattern offset effects (Oxx, SAx)
are automatically rescaled to match the new sample rate, and portamento effects
are compensated in the engine so pitch slides sound identical regardless of which
sample mode is active.
Multi-engine consensus
Each enabled AI engine produces its own 48 kHz remaster of every sample. Those candidates are combined into one sample by a registration consensus that works entirely in the time domain — the default, because it neither rings nor smears transients the way frequency-domain blending does.
Registration (default). The deterministic 48 kHz sinc reference — the
mathematically exact bandlimited upsample — is taken as a master. For each AI
engine a dense 1-D Lucas–Kanade optical-flow field is computed from the master
to that engine: the same "register, then reduce" method Quinlight uses on
images, dropped to one dimension. The 2-D structure-tensor solve collapses to
the scalar u = −Σ(w·Ix·It) / Σ(w·Ix²) — a per-sample sub-sample shift that
best aligns the engine to the master. Each engine is then linearly warped onto
the master's grid, and the engines are reduced per sample by a winsorized
robust mean (the default: each engine is clamped to the per-sample median ±
(k·MAD + floor) before averaging, rejecting a lone spike like the median while
keeping the mean's smoothing where engines agree); plain median and mean
reducers are selectable via --reduce.
- No ringing. No FFT and no per-bin magnitude/phase surgery, so none of the inverse-STFT pre-echo or transient smearing the spectral path can introduce — warp-then-median is phase-coherent by construction.
- Sample-exact loops. Every engine is warped onto the sinc master, which carries the exact loop length and loop point, and both the LK window and the warp wrap circularly across the seam — so looped samples stay aligned to the sample.
- Master guides, gently. The sinc reference defines the alignment grid and
the loop timing. In
medianmode it also joins the reduction as a self-regulating member (it votes in the source band and is discarded as a low outlier in the AI-extended highs); inmean/robustmodes it is excluded so its bandlimited (no-HF) content never dilutes the engines' band-extension. - Robust to a bandlimited master. A goodness-of-fit gate trusts the flow at
a sample only when the local model
It ≈ −u·Ixactually explains the engine-vs-master difference (R² = sxt² / (sxx · Σ w·It²)). High frequencies the master cannot represent therefore cannot drive a spurious shift that would mangle the engine's own highs. - Strict by default. Registered mode keeps the per-engine usable-score
floor (0.9 Pearson correlation against the native-rate original): engines
scoring below it are dropped for that sample, and a sample with fewer than
two passing engines keeps its original audio rather than shipping a dubious
blend. The floor is tunable (
--threshold), but the default philosophy is to leave a sample unremastered before risking a wrong one.
Spectral (legacy, --consensus spectral). The original path scores each
candidate against the source by Pearson correlation of magnitude spectra below
the source's Nyquist (an engine that hallucinates even at known frequencies
isn't to be trusted), then combines the survivors via a per-bin Karcher mean
on the rotor manifold ℝ⁺ × S¹: geometric-mean magnitude (Karcher mean on ℝ⁺,
biased toward the quieter engines), circular-mean phase (Karcher mean on S¹),
and an agreement-scaling term — the resultant length of the phase rotor sum
(0–1) multiplies the magnitude, so bins where the engines disagree on phase (the
hallucination fingerprint) are attenuated. Below the source Nyquist the result
is rotor-blended back toward the source spectrum itself (arithmetic-mean
magnitude, shortest-arc SLERP on phase) so the bottom band stays anchored to
ground truth. Operating on the geodesic of (ℝ⁺ × S¹) makes that attenuation
deliberate instead of the hidden, ringing-inducing attenuation a Cartesian
complex blend produces — but the inverse STFT it still relies on is exactly the
ringing source the registration path removes. It remains available for A/B
comparison and is the automatic fallback when no sinc master is present.
Anisotropic interpolation
Pitch bends (vibrato, portamento, slides) are tracked in full double precision
(PitchT = double, FreqT = double) — no fixed-point period tables or integer
slide accumulators. IT linear slides use pow(2.0, amount/768.0) directly.
The resampling filter is a 64-tap polyphase sinc with 65536 phases (16-bit phase resolution) over true per-sample data mip-maps — every sample carries an octave-decimated pyramid (GPU texture-chain style, the design paper's W[q,m]), built at load time through a cascaded 63-tap Kaiser half-band. Reading mip level j makes the 64 taps span 64·2^j original samples, so heavy pitch-down stays properly bandlimited at any ratio. The decimation is loop-aware: loop bodies decimate as periodic signals (ping-pong as reflected-periodic, sustain loops included) via per-level boundary strips, so nothing past a loop point ever bleeds into the loop and seams stay click-free at any transposition. Each slice samples its mip with a kernel matched to the residual ratio (a fractional one-octave Kaiser family, β = 14.0 at unity to β = 11.0 near the octave edge).
On top of the data pyramid sits the full sheared-separable anisotropic
gather from the design paper (Eq. 13/14): the reconstruction footprint
spans up to four mip slices around the continuous level μ, widened by
R = 1 + k_r·|μ̇| when the pitch is moving (render.resampler.aniso64_k_r,
default 0.8), with stretched-tent slice weights that reduce exactly to the
classic trilinear blend at steady pitch. Each slice's phase taps are sheared
by β·(j−μ) where β = k_β·İ + k_β²·Ï (aniso64_k_beta = 0.65,
aniso64_k_beta2 = 0.15) — per-output-sample, tempo-invariant derivatives of
the playback increment, so the shear strength no longer depends on the
module's tick length.
Full derivation and design notes: audio_anisotropic_filter_v2.pdf. (The PDF's §12 "Connection to real engines" describes the pre-Aniso-64 16-tap engine; the shipped default is the 64-tap gather above.)
SIMD kernels are compiled for SSE2, AVX, AVX2, and AVX-512 with fully unrolled accumulator loops — runtime dispatch picks the widest available path.
Listen
A/B ten freely-licensed tracker modules. The before column is the
deterministic render (original samples, no AI); the after column is the
same module with its samples upscaled by the AI engines and merged through the
registration consensus. Both clips are the engine's native 96 kHz AAC
(.m4a), served via GitHub Pages — click to play inline. Some browser AAC
decoders resample 96 kHz down to the system output rate at playback, so what
you hear may be downsampled even though the bytes fetched are the full file.
Every demo module is Public Domain or CC-BY; each title links to its source on The Mod Archive. Full per-module credits are in NOTICE.
| Module | Fmt | Artist | License | Before | After |
|---|---|---|---|---|---|
| Wild Perspective | MOD | m0d | Public Domain | listen | listen |
| Silicon Dancer | MOD | Drozerix | Public Domain | listen | listen |
| Stars (4ch) | MOD | cs127 | CC-BY | listen | listen |
| Kłopoty z Czasem | XM | JAM | Public Domain | listen | listen |
| Haunted Occult Mans | XM | JAM | Public Domain | listen | listen |
| Digital Rendezvous | XM | Drozerix | Public Domain | listen | listen |
| module76 | S3M | K. Jose | CC-BY | listen | listen |
| Satisfacción | S3M | K. Jose | CC-BY | listen | listen |
| The Drunken Monkey | IT | christofori | Public Domain | listen | listen |
| NUEVE | IT | Djego Flochs | CC-BY | listen | listen |
Prefer a single download? Grab
quinlight-audio-96khz-bundle.zip
(all 10 modules as 96 kHz .m4a, organized into rendered/ and remastered/).
Build
Quinlight Audio currently targets Linux x86_64-unknown-linux-gnu. The build expects
Rust, a C++ toolchain, CMake, libarchive headers, and FFmpeg development libraries.
SDL3 is vendored and compiled from source at build time (via the sdl3 crate's
build-from-source feature), so no system SDL package is required — only CMake and a
C toolchain to build it.
Disk space: Plan for at least 30 GB free before installing. The full footprint (build artifacts + Python venv + AI model checkpoints) lands around 26 GB, with headroom for caches and rendered output.
sudo apt install build-essential clang mold cmake libarchive-dev \ libavcodec-dev libavformat-dev libavutil-dev libswresample-dev libswscale-dev cargo build --release
Optional AI Engine Setup
The supported public install path is the checked-in Linux installer:
./install_prerequisites.sh
That script creates ~/.local/share/quinlight-audio/venv, installs the pinned Python
package set used by Quinlight Audio, and runs a simple smoke check at the end.
Supported AI matrix for this release:
- Platform: Linux
x86_64-unknown-linux-gnu - Python:
3.12+ - PyTorch:
2.11.x - TorchAudio:
2.11.x - TorchVision:
0.26.x
The GUI shows the same pinned commands if the engines are missing.
Usage
# Launch the GUI quinlight-audio # Launch with GPU remastering quinlight-audio --upscale-mode gpu # Render a module to FLAC or AAC at the default 96 kHz target quinlight-audio render track.s3m -o track.flac quinlight-audio render track.s3m -o track.aac --format aac # Batch render a directory quinlight-audio convert mods -o renders --format flac aac # Restrict to specific engine(s) quinlight-audio convert mods -o renders --engine audiosr --engine lavasr --engine apbwe # Skip AI remastering (render originals only) quinlight-audio convert mods -o renders --no-remaster # Reference-only cleanup output (no AI, just cleaned 48kHz reference) quinlight-audio convert mods -o renders --reference-only --cleanup-preset declick-ar # Open modules from archives quinlight-audio render mods.zip -o track.flac quinlight-audio render mods.zip --file track.s3m -o out.flac # Install .desktop file and icon quinlight-audio --install-icon
Sponsor
Quinlight Audio is built by Kind Computers, LLC. If it's useful to you and you'd like to help fund continued development, you can sponsor the project on GitHub:
❤ Sponsor Quinlight Audio on GitHub
Legal / Backend Note
AI backend redistribution and branded promotion should still be reviewed engine-by-engine before any bundled or company-branded release. This repository documents a supported external-install flow for those backends; it does not claim that backend weights are bundled or cleared for redistribution.
Patent pending. Quinlight Audio's multi-engine AI consensus algorithm — the per-bin Karcher-mean spectral consensus on the rotor manifold described under Multi-engine consensus — is the subject of a pending U.S. patent application.
License
Quinlight Audio is licensed under the MIT License.
It bundles or builds against third-party components that remain under their own
licenses and are not covered by the MIT grant — notably OpenMPT/libopenmpt
(BSD-3-Clause, openmpt/), the flac-codec crate (MIT/Apache-2.0, flac-codec/),
and the SADIE II HRIR/SOFA datasets (Apache-2.0, HRTF/). See NOTICE
for the full attribution list. The optional AI remastering engines (AudioSR,
LavaSR, FLowHigh, AP-BWE) are installed separately, are not redistributed here,
and each carry their own license — review them before use.
