====== VanillaJuce ====== [[https://github.com/getdunne/VanillaJuce|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 filters//((As of 1/26/2019, there's a new //filter-gui// branch which illustrates how to add filters.)), 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: - 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.) - Pragmatically, there's not much point in adding filtering without first addressing aliasing in the oscillators. - 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 https://www.juce.com/tutorials 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 [[https://github.com/2DaT/Obxd|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 [[https://opensource.org/licenses/MIT|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 [[https://forum.juce.com/|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|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|Getting started with the Projucer]] before moving on the code review pages below. ===== VanillaJuce code overview ===== * [[Overview]] * [[The plugin Processor]] * [[The plugin Editor]] * [[The synthesizer]] ===== Branches ===== Since writing this, I have added two enhancements to the basic project, accessible via separate //branches// of the GitHub repo: * The //filter-gui// branch illustrates how to add per-voice filters and filter envelopes. The filter code used is from https://github.com/michaeldonovan/VAStateVariableFilter. * The //network// branch illustrates how to add network connectivity, as discussed in my 2018 talk at the Audio Developer Conference in London; see http://getdunne.net/adc2018.