A Yamaha DX7, in software.
Six-operator FM, all 32 algorithms, the envelope and LFO behavior of the real instrument, and it loads any DX7 bank ever made. Free software since 2004, written by Sean Bolton. This is the 2026 revival: the same engine, built as modern plugins for Linux, macOS and Windows, plus apps for Android and iOS.
Every release is on the releases page, with notes for what changed.
| Plugins | CLAP, LV2, Audio Unit on macOS, and the legacy DSSI plugin with its GTK2 editor on Linux |
|---|---|
| Standalone | Its own application with audio and MIDI, no host needed, on all three desktops |
| Phones | An Android app, and an iPhone and iPad app you build yourself |
| Command line | hexter-render turns a MIDI file and a bank into a WAV |
| Banks | .syx, .dx7, .mid, .tx7, .snd, .bnk, .dx2, and raw packed voices |
| Sysex | Single voice, 32-voice bulk dump (six-operator or four-operator), voice and function parameter changes, as the hardware sends them |
| License | GPL-2.0-or-later |
Unzip the package for your platform and copy what you want:
| CLAP | LV2 | Audio Unit | |
|---|---|---|---|
| Linux | ~/.clap/ | ~/.lv2/ | |
| macOS | ~/Library/Audio/Plug-Ins/CLAP/ | ~/Library/Audio/Plug-Ins/LV2/ | ~/Library/Audio/Plug-Ins/Components/ |
| Windows | %COMMONPROGRAMFILES%\CLAP\ | %APPDATA%\LV2\ |
The standalone runs from wherever you put it. The Linux package holds two:
hexter, which speaks ALSA and PulseAudio and runs anywhere, and
hexter-jack, which adds JACK and needs a JACK library installed to start.
Logic Pro and GarageBand use the Audio Unit;
restart Logic after copying it and it appears under AU Instruments as
Keith Adler > hexter.
The standalone window is small on purpose. hexter has no controls of its own, so its window is a short note saying it is running. Audio and MIDI settings, and saving or loading its state, live in the menu behind the icon at the top left of the window. Right-clicking the title bar opens the same menu.
Download the .apk above and open it. Android will ask once whether to
allow installs from your browser or file manager; say yes, then tap Install. It is not
in the Play Store, so this is the only route. You need Android 8.0 or newer on a 64-bit
device, which is every phone sold in the last several years. A USB MIDI keyboard needs
no setup; for a Bluetooth keyboard, tap Bluetooth MIDI in the app and pick it from the
list. Each release is signed with its own key, so uninstall the old version before
installing a new one.
Apple does not allow installing an app from a file, so there is nothing to download. With a Mac and Xcode you can build it onto your own phone with a free Apple ID in about twenty minutes. The README has the step by step, written for someone who has never opened Xcode. An app signed with a free Apple ID stops opening after seven days; press Run again and it works for another seven.
hexter has no editor. You play it over MIDI and your host shows its parameters, which is how a real DX7 module works:
| Parameter | Range | |
|---|---|---|
| Program | 1 to 128 | Named from the loaded bank. MIDI program change works too. |
| Algorithm | Patch, or 1 to 32 | Forces the patch's operator wiring, the knob on the front panel of the hardware. |
| OP1 to OP6 wave | Patch, or W1 to W8 | The waveform each operator plays. W1 is the DX7's sine. |
| Tuning | 415.3 to 466.2 Hz | A4 |
| Volume | -70 to +20 dB | |
| Polyphony | 1 to 64 voices | |
| Voice mode | Poly, Mono, Mono legato, Mono both |
The algorithm knob is an override rather than a setting. At Patch, where it rests, every program plays its own wiring and the knob does nothing. Move it to 1-32 and that wiring is forced, which you hear on notes you are already holding rather than only on the next one. Move it back to Patch, or select a program, and the patch's own algorithm returns.
The waveform knobs work the same way, one per operator. A DX7 operator can only play a sine; the four-operator machines from the TX81Z on pick one of eight shapes, and that is most of why they sound like themselves. W1 is the sine hexter has always played, W2 is that sine squared, and the rest silence part of the cycle or run it at double speed. Anything but W1 puts harmonics in before the FM starts, which takes a familiar patch somewhere a DX7 cannot go.
Loading a bank. In a CLAP host, use the host's preset browser and
point it at any bank file. In an LV2 host, set the Bank file property. Either way you
can also send the bank as a bulk dump over MIDI, from a six-operator machine or a
four-operator one, exactly as you would to the
hardware, or set HEXTER_DEFAULT_BANK to a file that loads on every
instance. Six banks ship with it, including the original DX7 ROM cartridges.
hexter models the six-operator engine, so it plays anything from that family. DX7, TX7, TX816 and TX802 banks load as they are. DX7II and DX7s banks load with the base voice; the II's extras live in a separate data block that hexter ignores. DX1 and DX5 banks load as they are, each half being a DX7 voice.
The four-operator machines are a different synth, with four operators instead of six and their own eight algorithms. hexter reads their 32-voice dumps anyway and converts each voice: the four operators take four of the six, wired with whichever DX7 algorithm stands closest, and the other two stay silent. Envelopes, ratios, detune, feedback, the LFO and the name come across. That covers DX21, DX27 and DX100, and TX81Z banks as well. A TX81Z voice also carries a waveform per operator, and each one lands on the DX7 operator that four-operator one became.
A converted voice is a sound-alike, not the hardware. Their envelopes have a stage the DX7 does not, and their pitch modulation reaches further for the same number. It is a way to play those banks, not a way to hear those machines. The TX81Z part in particular is built from the format rather than from a real dump, and has not been tried against hardware.
The FB-01 is four-operator as well, but not that family under another name: its bank is one message of its own, 6363 bytes holding 48 voices rather than 32, with seven-character names and every value stored as a pair of nibbles. hexter converts those too. Two of its values are kept as attenuation, where zero is loudest, so they are turned round on the way in; read the other way a patch comes out inside out and silent.
That format was read from the FB01 Sound Editor by Frederic Meslin. It is GPLv3 and hexter is GPL-2.0-or-later, so none of its code is here: what was taken is the description of a file format, which is a fact about the hardware. It is credited in AUTHORS. Like the TX81Z support this is built from the format rather than from a real dump, and the FB-01 banks shipping with hexter are old conversions, not originals, so they do not exercise it.
Still out of reach: the DX11 and the reface DX.