GetDunne Wiki

Notes from the desk of Shane Dunne, software development consultant

User Tools

Site Tools



VanillaJuce is a simple example of a complete VST2.4 + AUv2 synthesizer built with JUCE 5.x.

In this context, “complete” doesn't mean that this is a particularly great synthesizer; rather, it means that all of the major plugin requirements are covered, i.e.:

  • VST 2.4 compatible plugin builds under Microsoft Visual Studio 2017 (Community version is sufficient)
  • Audio Unit v2 compatible plugin builds under Apple XCode (tested with v8.2.1)
  • Plugin has a simple GUI editor, using JUCE controls only (no custom graphics)
  • Very basic 16-voice synthesizer with 2 oscillators and ADSR amplitude envelope
  • Dynamic editing of sound parameters is supported
  • Saving and recalling sound programs (via plugin host) is supported

As a synthesizer, VanillaJuce is nothing special; it's not meant to be. Its oscillators are about as simple as possible, and as a result they don't sound very nice, mainly due to aliasing which is particularly noticeable when playing higher-pitched notes. Its envelope generators (which nicely illustrate the use of JUCE's LinearSmoothedValue template class) provide just enough dynamics that VanillaJuce can charitably be called a “synthesizer” rather than an “organ”.

Critically, VanillaJuce has no filters1), and thus some might argue that it's “not a real synthesizer”. I chose to leave out filters and filter envelope generators (EGs) for three reasons:

  1. These things get us into the realm of digital signal processing (DSP), which could greatly complicate what I intended as a simple code example to help the beginning JUCE user get started. (I plan to publish other JUCE examples illustrating DSP.)
  2. Pragmatically, there's not much point in adding filtering without first addressing aliasing in the oscillators.
  3. The code already illustrates how to create EGs; adding filter EGs wouldn't teach anything new.

There are already enough books and internet resources on DSP and synthesizer design, but I found getting started with JUCE to be a major hurdle. The relevant code examples (at and in the examples folder of the JUCE source code) were either too large (“kitchen sink demos”) or more frequently, too small (not “complete” in the sense I describe above). The complete JUCE-based synthesizer examples I was able to find (e.g. the excellent Obxd) featured so much customized/optimized code that they couldn't serve to illustrate the “JUCE way” of building a synthesizer plugin.

So, after figuring out what I needed the hard way, I decided to provide VanillaJuce as an open-source code example, to help others get started with the JUCE library. For maximum flexibility, I use the MIT License, which permits use in closed-source projects.

Although I have considerable C++ experience, I am not a JUCE expert! I welcome all comments and ideas for how to make VanillaJuce a better example for new users, on the JUCE forum where you can find me as user “getdunne”.

Getting started

If you haven't yet set up your PC or Mac to work with JUCE, great! I have a ton of stuff to tell you, which might save you some time and frustration. Go to Starting from scratch with JUCE.

If you already have JUCE set up, but are not yet familiar with how to use the Projucer to start a new project, have a look at Getting started with the Projucer before moving on the code review pages below.

VanillaJuce code overview


Since writing this, I have added two enhancements to the basic project, accessible via separate branches of the GitHub repo:

As of 1/26/2019, there's a new filter-gui branch which illustrates how to add filters.
vanillajuce.txt · Last modified: 2019/01/26 22:31 by shane