SynthLab Downloads

SynthLab SDK: SynthLab_SDK1.2.5

SynthLab-DM Installer Windows:

SynthLab-DM Installer MacOS: SynthLabInstaller2.0.mac

SynthLab PCM Samples:

Make sure to read the SynthLab Documentation

Example Projects Note from Will:

Trying to maintain a set of stand-alone projects for all synths and APIs is a nightmare, and I was burned badly trying to do this for the 1st edition of the synth book. This is one of the many reasons that I packaged the synths in a single C++ object (SynthEngine). I designed the SDK to be framework neutral. It is no easier, or more difficult, to implement the synths in JUCE, iPlug2, or ASPiK. You need to follow the instructions in the SDK for client-side coding and especially in setting up the synth process structure (MIDI and empty buffers) to send to the engine on each block process cycle and drop that into your framework. Your chosen framework’s details on MIDI, audio, and GUI design and implementation are not part of the book nor the SynthLab SDK. However, if you want to see how I implemented them in ASPiK, you can download the projects here.

The PluginCore object owns the SynthEngine instance, so first see the plugincore.h and plugincore.cpp files. Then check the SDK documentation and you will see how the PluginCore client deals with the SynthEngine as described in the documentation.

Once more: the SynthEngine is just a C++ object. It is up to you to make this object work within the context of your chosen plugin framework according to the documentation.

Location of SDK

For my ASPiK projects, I placed the SynthLab SDK folder along with the other SDKs. It doesn’t really matter where you choose to place yours for other frameworks (or for ASPiK) – when you use your compiler’s “Add Files to Project” function, you browse to the folder to add them. Then, add the SDK path to your compiler’s “Additional Include Directories” environment setting. This is where the SDK is located, relative to the projects for the samples below (the arrows show the relative folder locations and distances from the SynthLab SDK). Please note that you may package your projects how you like – for example, rather than sharing the SDK files with the AU and VST3 SDK, you could brute force copy the files you need into one giant flattened folder. All of those details are up to you, and are not dependent on the SynthLab SDK!

Selecting the Synth:

As per the documentation here, the synthvoice.h file has a #define section at the top that allows you to build all 6 synths from the same SynthVoice object. You can either uncomment the #define statements, or use a C++ preprocessor definition, which is what I chose for these projects; therefore see the C++ preprocessor definitions in the compiler for that definition (of course you may always just un-comment the #define from the block at the top).

// --- NOTE: uncomment here, or (better) use a pre-processor 
//           directive in your compiler
//#define SYNTHLAB_WT 1
//#define SYNTHLAB_VA 1
//#define SYNTHLAB_PCM 1
//#define SYNTHLAB_KS  1
//#define SYNTHLAB_DX  1
//#define SYNTHLAB_WS  1

// --- SL_WT
#include "../../source/wtoscillator.h"

#include "../../source/vaoscillator.h"

#include "../../source/pcmoscillator.h"

#include "../../source/ksoscillator.h"

#include "../../source/fmoperator.h"

#include "../../source/wsoscillator.h"
#include "../../source/sequencer.h"

Example Projects: VST3

You can download the SynthLab synths in ASPiK format, and without the VST/AU SDKs (as normal). However, note that the synths are packaged in a single C++ object called SynthEngine. This object source is already available in the SDK’s examples/synthlab_examples folder, verbatim.

NOTE: the VST3 shell file (vst3plugin.cpp) has been modified from the normal ASPiK implementation to add the proxy variables for MIDI CCs (the dreaded VST3 MIDI CC issue), and the VST3Plugin::doControlUpdate( function has been modified to access these proxies and send them as MIDI to the synth engine — note this is a VST3 issue, and nothing to do with ASPiK or SynthLab)

// --- check for MIDI proxy parameters 
else if (pid >= baseCCParamID && pid <= baseCCParamIDEnd)
     issueMIDICCProxyMessage(pid, value);

bool VST3Plugin::issueMIDICCProxyMessage(ParamID proxyParamID, ParamValue proxyParamValue)
    if (!midiEventQueue) return false;
    proxyParamID -= baseCCParamID; // number is now 0 to 129 
    midiEvent event;
    event.midiMessage = (uint32_t)CONTROL_CHANGE;
    event.midiChannel = 0;
    event.midiData1 = proxyParamID;
    event.midiData2 = (uint32_t)(127.0 * proxyParamValue);
    event.midiSampleOffset = 0;

    if (proxyParamID < ControllerNumbers::kAfterTouch)
        return true;
    else if (proxyParamID == ControllerNumbers::kAfterTouch)
        // --- change "cc" to aftertouch
        event.midiMessage = CHANNEL_PRESSURE;
        return true;
    else if (proxyParamID == kPitchBend)
        event.midiMessage = (uint32_t)PITCH_BEND;
        unipolarDoubleToMIDI14_bit(proxyParamValue, event.midiData1, event.midiData2);
        return true;

    return false;

SynthLab VST3 Projects (ASPiK): SynthLab VST3 ASPiK

Complete VST3 project for SynthLab-WT

If you want to see a complete project for VST3, without running CMake, you can download the WT synth (it is around 250MB in size). You will still need the VST3 SDK and add the project as usual according to the ASPiK documentation.

SynthLab-WT VST3 Complete: SynthLab-WT VST3

Example Projects: AU

The ASPiK AU projects are identical to the VST3 versions as far as the SynthLab code goes. The AU plugin shell (ausynthplugin.cpp) is unmodified from the normal ASPiK implementation. The only real difference is the CMake setup for AU – as with the other ASPiK projects, absolutely nothing changes in the PluginCore.

SynthLab AU Projects (ASPiK): SynthLab AU ASPiK