News

2018/9/5: Hexter is one of the FM software synthesizers selected for the Open Source Music FM Synthesizer Challenge!! Go make music with hexter or other open-source FM synths, and win fame and glory!

2018/3/18: hexter 1.1.0 adds support for hosts which don't support run_multiple_synths(), for example, Carla and Renoise. Each plugin instance is run separately, and support for the global polyphony limit has been removed.

2014/6/10: hexter 1.0.3 fixes a bug which could cause hosts to crash when removing instances of hexter (thanks to Rui Nuno Capela).

2012/11/8: hexter 1.0.2 fixes a problem where exiting and restarting the GUI while editing a patch would cause the edited patch to become inaccessible (the editor would be disabled with an ‘edit buffer sync error’ message.)

2012/11/2: hexter 1.0.1 fixes a linking failure on some platforms.

2012/11/1: hexter celebrates its eighth birthday with an integrated patch editor and a version 1.0.0 designation. Also included are more patch loading enhancements, NRPN parameter mapping, and the option to use floating-point math in the synthesis code instead of fixed-point.

2012/10/22: hexter development has moved to github. Download tarballs of release versions are still hosted on SourceForge.

2011/5/24: Martin Tarenskeen has done wonders for hexter's ability to load different patch bank formats. His DXconvert tool handles even more formats, plus it can load patches from several other FM synths and convert them (approximately, at least) for use with hexter.

2011/1/26: Bálint Pfliegel has created a C# port of hexter named Sixport. I was surprised that a virtual-machine based implementation of hexter's rendering code performs as well as Sixport does—pretty cool! With the right combination of hardware and operating system, one can even run it in a browser, as part of the Pluto DAW. Some demos can be found here.

2009/1/4: hexter version 0.6.2 released! Release 0.6.2 is a maintenance release, which adds no significant synthesis features, but updates the code for more recent GTK+, adds better patch loading to tx_edit.c, and handles the new DSSI ‘sample-rate’ OSC method (by silently ignoring it.)

2007/4/11: hexter version 0.6.1 released! hexter now includes emulation of the DX7 LFO, plus amplitude and pitch modulation! Other new features include configurable performance parameters, better patch bank loading code, and a 0.5.x compatibility mode. (If you're already using the 0.6.0 release, you probably don't need to upgrade, but if you are distributing a 0.6.0 package, please do upgrade soon -- the installation paths in 0.6.0 were broken.)

2006/1/18: hexter version 0.5.9 released! New features include real-time control of the coarse frequency parameters, plus fixes for RPM, gcc 2.9x and 4.x, and Mac OS X 10.4 ‘Tiger’.

2004/12/29: hexter version 0.5.8 released! New features include a ‘volume’ control and MIDI CC volume handling, GTK+ 2.x or readline UIs, project directory handling, better error messages, and some new patches.

2004/11/16: Some recordings comparing hexter and a real TX7 are available here.

Introduction

hexter is a software synthesizer that models the sound generation of a Yamaha DX7 synthesizer. It can easily load most DX7 patch bank files, edit those patches via a built-in editor or MIDI sys-ex messages (ALSA systems only), and recreate the sound of the DX7 with greater accuracy than any previous open-source emulation (that the author is aware of....)

hexter operates as a plugin for the DSSI Soft Synth Interface. DSSI is a plugin API for software instruments (soft synths) with user interfaces, permitting them to be hosted in-process by audio applications. More information on DSSI can be found on the DSSI website.

hexter is written and copyright © 2018 by Sean Bolton, and licensed under the GNU General Public License, version 2 or later. While this software is ‘free’ within the requirements of that license, I (Sean) would appreciate any or all of the following should you find hexter useful:

hexter benefited greatly from previous open-source efforts, most notably Juan Linietsky's rx-saturno, and FluidSynth by Peter Hanappe, et al. See the AUTHORS file in the hexter distribution for more details.

Requirements

hexter requires the following:

Download and Installation

Release versions of hexter may be downloaded from SourceForge.

hexter uses GNU autoconf and automake, and pkgconfig, so installation is only slightly more complicated than ./configure && make && make install. See the README file for specifics.

The development version of hexter may be had by cloning the github repository:

git clone https://github.com/smbolton/hexter.git

Screenshots

hexter main window

This screenshot (click the image for full size) shows the GUI main windows for three instances of hexter. Note that sys-ex editing is currently enabled in the channel 1 instance (details below).

hexter Widgy editor

This shows the patch editor in ‘Widgy’ mode,

hexter Retro editor

while this one shows the editor in ‘Retro’ mode.

Operation

To run the hexter plugin under the jack-dssi-host provided in the DSSI distribution, I do the following:

  1. Start JACK.

  2. Start jack-dssi-host, supplying the correct plugin path and filename (substitute <prefix> as appropriate):

    $ DSSI_PATH=<prefix>/lib/dssi sudo jack-dssi-host hexter.so

    jack-dssi-host should start, and moments later the hexter graphic user interface should appear.

  3. Use qjackctl or aconnect to connect jack-dssi-host to a MIDI source, such as vkeybd.

  4. Begin playing sounds! If you get no response, try clicking the ‘Send Test Note’ button in the hexter GUI. This sends a note directly via the host to the plugin, so if you hear sound now, look for a problem between the host and your MIDI source. If you still don't hear sound, I'd look for a problem between the host and your output device. If you continue having trouble, you might recompile with DSSP_DEBUG bit 2 set, which will cause the plugin to continuously output a quiet buzz to help debug your outgoing signal path.

hexter starts up with a default set of sound presets, or ‘patches’, that you can select either by selecting the GUI ‘Patches’ tab and clicking on the patch name, or by sending a MIDI program change from your MIDI source with the appropriate program number.

Patch Import/Export

hexter can import DX7 patch bank files in several formats:

You may use the ‘Import Patch Bank...’ option in the ‘File’ menu to import patches. After selecting the filename, you will need to specify the program number (0 to 127) at which to begin importing the patches.

Several patch bank files are installed with hexter in <prefix>/share/hexter/.

You may also export patch banks using the ‘File’ menu ‘Export Patch Bank...’ option. You can then select which of the formats to save in, and what range of patches to export. Finally, select the filename to which you want to save, and click ‘Ok’.

Synthesizer Configuration

On the ‘Configuration’ tab of the hexter GUI, there are a number of controls for configuring hexter:

Performance Parameters

The ‘Performance’ tab of the hexter GUI contains controls for the DX7/TX7 Performance Parameters:

Patch Editing

The current patch may be edited by selecting ‘Edit Patch...’ from the ‘Edit’ menu, which opens the patch editor window. All patch edits accumulate as a temporary ‘overlay’ replacing the current patch, but are not saved into the patch bank until you click the ‘Save Changes into Patch Bank’ button and complete the save process. (Once you've saved edits into the patch bank, remember to save the bank to disk using the ‘Export Patch Bank...’ option of the ‘File’ menu!)

Clicking the ‘Discard Changes’ button or selecting another patch from the ‘Patches’ tab will discard any active edits. At any time the top status line of the editor window will tell you which patch is being edited, and whether there are any changes in effect.

The editor has two modes of operation, selected by the ‘Editor Mode’ combo box near the bottom left of the editor window. One mode, called ‘Widgy’, uses standard GTK+ widgets for editing patch parameters, and displays graphical representations of envelopes and scaling curves to aid in comprehension of the patch parameters. The other mode, called ‘Retro’ is based on text-based editors of decades past. You may switch between editor modes at any time.

While the ‘Retro’ mode provides little in terms of visualization assistance, it can provide the experienced user with more efficient editing. Both the mouse and cursor keys may be used to select the parameter to be edited. Generally, the number keys are used to enter a parameter directly, the ‘-’ key decrements a parameter, the ‘+’ or ‘=’ keys increment the parameter, and the ‘delete’ or ‘backspace’ key will reset the parameter to a default value. Perhaps most convient for users without a separate MIDI keyboard, the space bar can be used to toggle a test note, even while changing patches with other keys!

MIDI Controller Mapping

In addition to the performance parameter MIDI messages mentioned above, hexter responds to MIDI volume (MIDI control change 39), sustain pedal (MIDI CC 64), and all-sounds-off, all-notes-off, and reset-controllers control messages (CCs 120, 123, and 121, respectively).

The operator parameters of the current patch can also be changed via the following MIDI control change (CC) and non-registered parameter (NRPN) messages. Messages marked with ‘*’ in the ‘Operator’ column will cause an immediate effect on playing notes, while the others will only affect subsequently-played notes.

CC or NRPN

Operator

Parameter

CC 16 (General Purpose #1 MSB)

1 *

Frequency Coarse

CC 17 (General Purpose #2 MSB)

2 *

Frequency Coarse

CC 18 (General Purpose #3 MSB)

3 *

Frequency Coarse

CC 19 (General Purpose #4 MSB)

4 *

Frequency Coarse

CC 80 (General Purpose #5)

5 *

Frequency Coarse

CC 81 (General Purpose #6)

6 *

Frequency Coarse

NRPN 0

6

Envelope Generator Rate 1

NRPN 1

6

Envelope Generator Rate 2

NRPN 2

6

Envelope Generator Rate 3

NRPN 3

6

Envelope Generator Rate 4

NRPN 4

6

Envelope Generator Level 1

NRPN 5

6

Envelope Generator Level 2

NRPN 6

6

Envelope Generator Level 3

NRPN 7

6

Envelope Generator Level 4

NRPN 8

6

Keyboard Level Scaling Break Point

NRPN 9

6

Keyboard Level Scaling Left Depth

NRPN 10

6

Keyboard Level Scaling Right Depth

NRPN 11

6

Keyboard Level Scaling Left Curve

NRPN 12

6

Keyboard Level Scaling Right Curve

NRPN 13

6

Keyboard Rate Scaling

NRPN 14

6

Amp Mod Sensitivity

NRPN 15

6

Keyboard Velocity Sensitivity

NRPN 16

6

Operator Output Level

NRPN 17

6 *

Oscillator Mode

NRPN 18

6 *

Oscillator Frequency Coarse

NRPN 19

6 *

Oscillator Frequency Fine

NRPN 20

6 *

Oscillator Detune

NRPN 21

5

Envelope Generator Rate 1

NRPN 22

5

Envelope Generator Rate 2

NRPN 23

5

Envelope Generator Rate 3

NRPN 24

5

Envelope Generator Rate 4

NRPN 25

5

Envelope Generator Level 1

NRPN 26

5

Envelope Generator Level 2

NRPN 27

5

Envelope Generator Level 3

NRPN 28

5

Envelope Generator Level 4

NRPN 29

5

Keyboard Level Scaling Break Point

NRPN 30

5

Keyboard Level Scaling Left Depth

NRPN 31

5

Keyboard Level Scaling Right Depth

NRPN 32

5

Keyboard Level Scaling Left Curve

NRPN 33

5

Keyboard Level Scaling Right Curve

NRPN 34

5

Keyboard Rate Scaling

NRPN 35

5

Amp Mod Sensitivity

NRPN 36

5

Keyboard Velocity Sensitivity

NRPN 37

5

Operator Output Level

NRPN 38

5 *

Oscillator Mode

NRPN 39

5 *

Oscillator Frequency Coarse

NRPN 40

5 *

Oscillator Frequency Fine

NRPN 41

5 *

Oscillator Detune

NRPN 42

4

Envelope Generator Rate 1

NRPN 43

4

Envelope Generator Rate 2

NRPN 44

4

Envelope Generator Rate 3

NRPN 45

4

Envelope Generator Rate 4

NRPN 46

4

Envelope Generator Level 1

NRPN 47

4

Envelope Generator Level 2

NRPN 48

4

Envelope Generator Level 3

NRPN 49

4

Envelope Generator Level 4

NRPN 50

4

Keyboard Level Scaling Break Point

NRPN 51

4

Keyboard Level Scaling Left Depth

NRPN 52

4

Keyboard Level Scaling Right Depth

NRPN 53

4

Keyboard Level Scaling Left Curve

NRPN 54

4

Keyboard Level Scaling Right Curve

NRPN 55

4

Keyboard Rate Scaling

NRPN 56

4

Amp Mod Sensitivity

NRPN 57

4

Keyboard Velocity Sensitivity

NRPN 58

4

Operator Output Level

NRPN 59

4 *

Oscillator Mode

NRPN 60

4 *

Oscillator Frequency Coarse

NRPN 61

4 *

Oscillator Frequency Fine

NRPN 62

4 *

Oscillator Detune

NRPN 63

3

Envelope Generator Rate 1

NRPN 64

3

Envelope Generator Rate 2

NRPN 65

3

Envelope Generator Rate 3

NRPN 66

3

Envelope Generator Rate 4

NRPN 67

3

Envelope Generator Level 1

NRPN 68

3

Envelope Generator Level 2

NRPN 69

3

Envelope Generator Level 3

NRPN 70

3

Envelope Generator Level 4

NRPN 71

3

Keyboard Level Scaling Break Point

NRPN 72

3

Keyboard Level Scaling Left Depth

NRPN 73

3

Keyboard Level Scaling Right Depth

NRPN 74

3

Keyboard Level Scaling Left Curve

NRPN 75

3

Keyboard Level Scaling Right Curve

NRPN 76

3

Keyboard Rate Scaling

NRPN 77

3

Amp Mod Sensitivity

NRPN 78

3

Keyboard Velocity Sensitivity

NRPN 79

3

Operator Output Level

NRPN 80

3 *

Oscillator Mode

NRPN 81

3 *

Oscillator Frequency Coarse

NRPN 82

3 *

Oscillator Frequency Fine

NRPN 83

3 *

Oscillator Detune

NRPN 84

2

Envelope Generator Rate 1

NRPN 85

2

Envelope Generator Rate 2

NRPN 86

2

Envelope Generator Rate 3

NRPN 87

2

Envelope Generator Rate 4

NRPN 88

2

Envelope Generator Level 1

NRPN 89

2

Envelope Generator Level 2

NRPN 90

2

Envelope Generator Level 3

NRPN 91

2

Envelope Generator Level 4

NRPN 92

2

Keyboard Level Scaling Break Point

NRPN 93

2

Keyboard Level Scaling Left Depth

NRPN 94

2

Keyboard Level Scaling Right Depth

NRPN 95

2

Keyboard Level Scaling Left Curve

NRPN 96

2

Keyboard Level Scaling Right Curve

NRPN 97

2

Keyboard Rate Scaling

NRPN 98

2

Amp Mod Sensitivity

NRPN 99

2

Keyboard Velocity Sensitivity

NRPN 100

2

Operator Output Level

NRPN 101

2 *

Oscillator Mode

NRPN 102

2 *

Oscillator Frequency Coarse

NRPN 103

2 *

Oscillator Frequency Fine

NRPN 104

2 *

Oscillator Detune

NRPN 105

1

Envelope Generator Rate 1

NRPN 106

1

Envelope Generator Rate 2

NRPN 107

1

Envelope Generator Rate 3

NRPN 108

1

Envelope Generator Rate 4

NRPN 109

1

Envelope Generator Level 1

NRPN 110

1

Envelope Generator Level 2

NRPN 111

1

Envelope Generator Level 3

NRPN 112

1

Envelope Generator Level 4

NRPN 113

1

Keyboard Level Scaling Break Point

NRPN 114

1

Keyboard Level Scaling Left Depth

NRPN 115

1

Keyboard Level Scaling Right Depth

NRPN 116

1

Keyboard Level Scaling Left Curve

NRPN 117

1

Keyboard Level Scaling Right Curve

NRPN 118

1

Keyboard Rate Scaling

NRPN 119

1

Amp Mod Sensitivity

NRPN 120

1

Keyboard Velocity Sensitivity

NRPN 121

1

Operator Output Level

NRPN 122

1 *

Oscillator Mode

NRPN 123

1 *

Oscillator Frequency Coarse

NRPN 124

1 *

Oscillator Frequency Fine

NRPN 125

1 *

Oscillator Detune

Fixed Point vs. Floating Point Rendering

hexter can be compiled to do its sound rendering using either fixed-point math or floating-point math. The difference in sound quality should not be audible, so the question of which type of math to use becomes which type of math is faster. On many older processors (e.g. PowerPC G4), the fixed-point math is substantially faster. With newer processors, the speed of each type of math depends on several factors, including the particular processor, the compiler and the compiler options used. It is often surprising which is faster for a given configuration!

On fairly normal posix systems (like Linux or OS X), you can compile a small test program, to test which type of math is the fastest on your processor. To do this, unpack the hexter tarball, cd into the fptest directory, type make, then type ./fptest. After 30-60 seconds, you should see a summary of the test results.

By default, hexter is built to use fixed-point rendering. If your test results say that floating-point is faster, then you can configure hexter to use floating-point with the --enable-floating-point configure option.

Here are some test results from a few machines. Percentages indicate the speed relative to the faster mode.

Processor

Fixed Point

Floating Point

PowerPC G4 800MHz

faster

49.5%

PowerPC G4 1.07GHz

faster

49.8%

Pentium III (Coppermine) 933MHz

95.2%

faster

Intel Celeron D 2.8GHz (32 bit)

faster

87.1%

Intel Celeron D 2.8GHz (64 bit)

faster

72.8%

Intel Core Duo 1.83GHz, OS X 10.4.9

92.9%

faster

Intel Core 2 Duo 2.4GHz, Linux 3.2

96.1%

faster *

Intel Core 2 Duo 2.4GHz, OS X 10.4.11

91.4%

faster *

Intel Core 2 Duo 2.4GHz, OS X 10.6.8

faster

61.5% *

Intel Core 2 Duo 2.5GHz, OS X 10.6.7

faster

62.0%

Intel Core i7, OS X 10.7

faster

52.0%

* These three all come from the same machine!

Frequently Asked Questions

Q. The plugin seems to work fine, but the GUI never appears. Why?

A. Make sure the hostname of your machine is resolvable (if not, the OSC messages can't be sent between host and GUI). If your machine's hostname is ‘foo.bar.net’, make sure you either have an entry for ‘foo.bar.net’ in /etc/hosts, or that your DNS server can resolve it. Test this with e.g. ping foo.bar.net. To test that the GUI itself works, you can start it by itself (without a DSSI host) by giving it the -test option, for example:

$ <prefix>/lib/dssi/hexter/hexter_gtk -test

Q. What happened to the global polyphony limit?

A. Support for the global polyphony limit was removed from hexter in version 1.1.0. Previous to this, hexter used the DSSI API function run_multiple_synths(), which enabled the global limit, but prevented hexter from working with certain hosts such as Carla and Renoise.

The global polyphony limit is not usually needed on modern machines, and indeed, the run_multiple_synths() API is inherently incompatible with the utilization of multiple CPU cores. If you do need the global limit, perhaps for resource-constrained devices such as older machines and embedded processors, use hexter 1.0.3 instead.

Resources

The Wikipedia Yamaha DX7 page.

Dave Benson's DX7 page, had lots of information as well as links to patch files.

The Synth Zone's collection of Yamaha links, which contains quite a few links to patch file collections.


Copyright © 2017 Sean Bolton. Created with Sausage Grinder.