SQ8L — 64-bit port
A faithful 64-bit port of SQ8L 0.91b, the free Ensoniq SQ-80 emulation by Siegfried Kullmann (2006–2008), for modern macOS (Apple Silicon and Intel), Windows x64 and Linux (x86-64 and ARM64), as VST2, VST3, Audio Unit (macOS), CLAP and LV2 (Linux).
SQ8L was a 32-bit Windows-only VST written in Delphi. Its source code was never released, and the plugin could no longer run in today's 64-bit hosts. This project rebuilds it from the original binary so that it can keep being played.
Unofficial project. Not affiliated with Siegfried Kullmann, with Ensoniq or with its successors. See Rights and credits.
How faithful is it?
The port was not written "by ear": every part was translated from the original machine code and verified against the original plugin running inside an x86 emulator.
- Sound: bit-exact. The complete engine produces exactly the same samples as the original: 1176 test renders (all 168 factory programs × 7 MIDI scenarios: chords, legato, controllers, aftertouch, sustain, voice stealing, random sequences), 120.8 million samples per channel, zero differences. Each DSP module (DOC 5503 oscillators, filter, LFOs, envelopes, amplifier, voice management) was also verified call by call on real captured states — tens of millions of calls in total.
- Editor: pixel-exact. The window uses the original artwork and the original drawing logic: across 162 editor states, 0 differing pixels (text excepted, see below). The page and parameter logic was checked against the original in 26,705 interactions.
- Compatibility. Same VST2 unique ID (
SQ8L), same 512 programs and the same chunk format as the original: projects saved with the original plugin load with their sound. Library files (.8XL), bank files and SQ-80/ESQ-1 SysEx are read and written exactly like the original.
Differences from the original
- Popup menus, message boxes, file pickers and the WRITE / MIDI-port dialogs use the operating system's native controls: on macOS they look like macOS. On Linux they are drawn inside the plug-in window (the file picker is the desktop's, or a simple built-in one).
- The mouse on a knob: turning one hides the cursor until the button comes up and holds
it where the turn began, so the pointer never runs into the edge of the screen and stops
the turn — you can keep dragging as long as you like — and it reappears exactly where it
was. The original's OPTIONS → Mouse position is restored after... → Knob turning became
Mouse → Hide cursor when editing, on by default and shared with the original's
restMouseKnobsetting. - A few small additions to the editor: a right click on a knob opens the list of its values
(the original has that on a double click, which still works), a knob the display page has
no parameter for is drawn half faded instead of looking like every other knob, a left click
on the program number opens the program list (the original needs a right or double click),
the VOICES parameter on the EMU page (see below), and these OPTIONS items: Polyphony
(see below), Down arrow -> next program (the original's hidden
swapProgUpDnsetting), Ask before loading banks/libraries (on by default, like the original), MTS-ESP (see below) and Zoom (see below). OPTIONS is also regrouped: Polyphony leads, and the original's mouse-restore submenu and its separate Right click on display -> scroll page item are now one Mouse submenu. - Window size: the editor can be enlarged from 100% to 300% with OPTIONS → Zoom (or
the window's corner, where the host allows it). It is drawn at the window's resolution
rather than enlarged: the panel (labels, signal lines, frames, logo) as vector shapes
measured from the original's picture, the knobs, buttons, LEDs and both displays from
their state. The size is global (saved in
SQ8L.ini). - MTS-ESP: OPTIONS → MTS-ESP → Enable makes the plug-in follow an MTS-ESP master's tuning, for microtuning and dynamic scales (off by default; the master's scale name then appears in the top bar). Each voice is retuned by its own resampling clock rather than by the SQ-80's pitch table, which is quantized to about 3 cents: the tuning is exact to a millionth of a cent while the oscillators, their relative detune and the sound itself are untouched. By default only the master's deviation from equal temperament is applied, so the SQ-80's own per-key pitch offsets (−1.5 to +0.5 cents, part of how it sounds) are preserved; Correct SQ-80 per-key pitch offsets tunes to the master's frequencies exactly instead. Pitch bend and glide keep the original's stepping either way. Both switches belong to the instance: they are saved with it in your project, not globally, so two instances can differ and a project recalls what it was set to.
- Polyphony: 8 voices like the SQ-80 by default, 1 to 64 with the VOICES parameter on
the EMU page, right below VSTEAL. It belongs to the sound, so it is stored in the program
and travels with it: into banks and libraries, and into the project your host saves. Every
program that does not have it — anything made by the original SQ8L, any
.8XLor bank file, any imported SysEx dump — plays with the SQ-80's 8 voices, exactly as it always did, and the original can still load a bank the port saved. OPTIONS → Polyphony overrides the parameter for one instance (Set by program by default) and is saved with that instance in your project, not globally. Changing the voices never interrupts anything: the notes that are playing keep playing, and soft voice stealing gets as many slots to fade out in as there are voices. With 8 voices the sound is bit-exact; with more, a performance changes only where the original would have stolen a voice. The output is not rescaled, so many voices sounding together are louder: lower the volume if needed. - Text (status bar, program name) uses Liberation Sans, a free font metrically compatible with Arial, with anti-aliasing.
- SEND/REQ to a hardware SQ-80/ESQ-1 over MIDI ports are not connected yet (SysEx import and export through files work).
- Two original bugs could not be reproduced and were made safe: an integer division by zero in the envelope SHAPE code for a few rare level/velocity combinations (the original crashed), and an uninitialised byte read in the "AM bug" emulation when oscillator 2 is edited while a note plays (the port uses the intended value).
- As in the original, sample rates below 44.1 kHz are not supported.
Installation
Download the archive for your system from the
Releases page. The numbered releases have been tried by hand; the
nightly pre-release is rebuilt from main after every merged pull request, once it has
passed the same automatic checks.
macOS (10.15 or later, universal): copy SQ8L.component to
~/Library/Audio/Plug-Ins/Components, SQ8L.vst3 to ~/Library/Audio/Plug-Ins/VST3,
SQ8L.vst to ~/Library/Audio/Plug-Ins/VST, SQ8L.clap to ~/Library/Audio/Plug-Ins/CLAP.
The plug-ins are not notarized by Apple, so macOS blocks them when they come from the
internet: remove the quarantine flag in Terminal, then restart your DAW.
xattr -dr com.apple.quarantine ~/Library/Audio/Plug-Ins/Components/SQ8L.component ~/Library/Audio/Plug-Ins/VST3/SQ8L.vst3 ~/Library/Audio/Plug-Ins/VST/SQ8L.vst ~/Library/Audio/Plug-Ins/CLAP/SQ8L.clap
Windows (10/11, 64-bit): copy SQ8L.dll (VST2) to your VST plug-in folder,
SQ8L.vst3 to C:\Program Files\Common Files\VST3, SQ8L.clap to
C:\Program Files\Common Files\CLAP. If the old 32-bit SQ8L.dll is in the same folder,
keep a copy of it first: the files have the same name.
Linux (x86-64 or ARM64, X11 or XWayland): unpack SQ8L-Linux-x64.tar.gz (or -arm64)
and copy SQ8L.so (VST2) to ~/.vst, SQ8L.vst3 to ~/.vst3, SQ8L.clap to ~/.clap
and SQ8L.lv2 to ~/.lv2. Banks A and B and the options are kept in ~/.config/SQ8L.
The user library (banks A and B) and the options are stored in
~/Library/Application Support/SQ8L (macOS), %APPDATA%\SQ8L (Windows) or ~/.config/SQ8L
(Linux) as
SQ8L_backup.dat and SQ8L.ini, the same files the original kept in its folder. To use an
existing library, copy your old SQ8L_backup.dat there (or load it with FILE → Load
library).
The manual of the original (readme.txt in the SQ8L 0.91b archive) applies unchanged.
Building from source
Requirements: CMake ≥ 3.22, Ninja, a C++17 compiler (Clang, GCC or MSVC), Git.
git clone --recursive <this repository> cmake -S . -B build -G Ninja cmake --build build
- macOS universal: add
-DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" -DCMAKE_OSX_DEPLOYMENT_TARGET=10.15. - Linux: install the X11 and OpenGL development packages first (Debian/Ubuntu:
libx11-dev libxext-dev libxcursor-dev libxrandr-dev libgl-dev libdbus-1-dev). - Windows x64 from macOS/Linux with MinGW-w64:
-DCMAKE_TOOLCHAIN_FILE=cmake/mingw-w64-x86_64.cmake(Linux: use the-posixcompilers). - Plug-ins are written to
build/bin/.
On Windows, build natively with Visual Studio 2022 instead (cl.exe or clang-cl, both
x64) through the presets in CMakePresets.json, which write to build/<preset>/bin/:
cmake --preset msvc # or: clang-cl, msvc-debug, clang-cl-debug
cmake --build --preset msvcIn VS Code, pick the preset in the status bar and press F7; the CMake Tools extension
supplies the x64 developer environment. Run the presets from a Developer Command Prompt
otherwise. Building third_party/core-math with cl.exe needs src/compat/core_math_msvc.hpp,
which supplies the 128-bit integer type and the GCC builtins MSVC lacks.
Check that the engine still reproduces the original (no original files needed):
cmake --build build --target sq8l_render_check ./build/sq8l_render_check --regression tests/regression
This renders 243 MIDI cases and compares a hash of the output with the hash of the original plugin's output.
How it was made
oracle/— a small Win32 emulator (Unicorn) that runs the originalSQ8L.dllon any platform: it renders audio through the VST2 interface and even opens and drives the original editor (USER32/GDI emulated on a framebuffer). It is the reference for all tests.re/scripts/— analysis tools: Delphi class/RTTI recovery, form (DFM) decoding, Ghidra export per Delphi unit, data extraction.tests/— differential tests: real calls of the original routines are captured in the emulator and replayed on the C++ code, which must give identical results and state.docs/— porting guide (x87 floating point semantics, Delphi conventions, method), GUI architecture and one document per module of the original (docs/modules/).src/engine/the synth engine,src/gui/the editor,src/plugin/the plug-in (DPF) and platform layers (macOS, Windows).
The emulator and the differential tests need the original plugin, which is not
included. Put SQ8L.dll (v0.91b, SHA-256
ffbb70884a6cd2af9600d287deebb2ba8dc6ec2270150ceef04c23d0fc92ab0e) and SQ8L.ini from
the original archive in original/, install requirements.txt, and run
tools/prepare_reference.sh.
Rights and credits
SQ8L © 2006–2008 Siegfried Kullmann. Factory sounds in bank C by Ole Jeppesen and Siegfried Kullmann; bank D contains the Ensoniq SQ-80 factory sounds. Thanks to Rainer Buchty "for SQ80 resources & disassembled OS code", as in the original.
This port reproduces SQ8L's behaviour, artwork and data (including the SQ-80 wave ROM and factory sounds that the original plugin contained) to preserve a freeware instrument that could no longer run. It is free, non-commercial and published in good faith. The rights to the original work belong to Siegfried Kullmann; Ensoniq, ESQ-1 and SQ-80 are trademarks of their respective owners.
If you hold rights to any part of this work and object to its publication, please open an issue (you can ask there for a private contact) and it will be addressed promptly.
Third-party components and their licences: see THIRD_PARTY_NOTICES.md. Licence of this repository: see LICENSE.md.
