Posted February 28th, 2018 at 22:00 PM
For a while I've created paraphonic synthesizer VSTs for my own use using SynthEdit and despite its age, it remains the most productive method I've discovered so far. Very complex systems can be integrated and tested quickly and then exported for use in your VST Host or DAW. As a graphical design design system you stay 'connected' with routing and signal processing thoughout the design process and of course you can easily hear things as you go along. GUI panel design is pretty simple. As an intuitive design process there is little need to go hunting for examples and documentation though this is worth a read and its currently a free download.
However the software developer in me wanted to review currently available code-centric approaches. There are a quite a few and I've wasted a lot of time on some of them. Despite the last comment there are a several notable exceptions such as JUCE, the new HISE, Pure Data (Pd) and more frustratingly VST.NET. I've summarised my findings below and ranked the various methods.
However before I display the results it may help if I describe a little about my requirements. I happen to like Ableton and that has consequences. Basically I have to use V2 vsts since Ableton refuses to adopt V3. In addition the 'silent' PC I use for audio work uses an Apollo Lake CPU using Intel's Goldmont architecture and this forced me to use a 32bit version of Ableton (long story but Ableton use OpenSSL as part of licensing and OpenSSL had a bug associated with Goldmont processors that fails when running in 64bit). I also need poly or paraphonic synth VSTs not just effects so what I'm looking for is a reliable template and process to which I can quickly add synth code components and connectivity. All build/compile attempts were made with VS2017.
The initial summary is shown in the table below. The rankings are somewhat arbitrary and relate mainly to my requirements.
As you can see SynthEdit is probably still my best option, though I looked further at JUCE, HISE, Pd and VST.NET.
Extensive C++ framework for instrument/effect development. Large developer community and probably the most formal fit for my requirements. The learning curve was quite steep and intially, for me at least, the sound generating code is buried by the overhead so as a process it has not been that productive so far. This is useful but its a little old (doesn't cover Prodjucer) and doesn't cover synths in any detail. There's good formal documentation here, with a decent set of examples in the git checkout, and online tutorials. A substantial developer community brings a large number of third party examples too. Two in particular, VanillaJuce and Sarah are poly synth examples.
Both examples compiled 'out-of-the-box' which is quite rare. Documentation is here
You need to buy a license for JUCE if you want to use commercially, but for personal use, with the minor irritation of a nag-popup on the VST, its free. I know disk space is cheap but the size of a typical project might be an issue in the region of 300MB to 500MB.
I only recently became of aware of HISE and first impressions are good. Once a project is setup its pretty easy to export a VST. Project size still very large but you can have many presets per project so that places a check on disk usage. Good documentation though the developer community is still small compared to JUCE. Examples are still few and far between but with a hybrid development environment (part-graphical, part-code) its quick to develop ideas and hear them as you go. An instrument takes the form of a vertical stack of generators and modulators, here's a simple FM synth.
The learning curve is nothing like as steep as JUCE though I have not yet figured how to create low level components, e.g. a new generator or modulator, which is where JUCE excels.
Pure Data is well established, introduced in the 90's, with a large developer community. It has a crude graphical front end that can be entirely scripted if you want. The actual GUI for an instrument is functional but looks pretty bad. You need to use Camomile to wrap a Pd instrument to play in a DAW.
Since I’d much prefer to use C#, instead of C++, I’m disappointed that I could not get VST.NET to build out-of-the-box though I found a useful example, Syntage, that used pre-built VST.NET libraries. Here's a slightly modified version replacing the awful intrinsic font.
It’s a mono synth sadly, however it built reliably and the code structure is pretty obvious. I had little time to look at making a poly version but it might be one for the future.
Best of the rest were Dplug and Rust. Dplug since the code structure is very straightforward and Rust interesting since it appears to be another flavour-of-the-month language, but neither resulted in working poly synths.