Both sides previous revision
Previous revision
Next revision
|
Previous revision
|
vanillajuce [2017/08/29 00:57] shane [Technical Topics] |
vanillajuce [2019/01/26 22:31] (current) shane |
====== VanillaJuce ====== | ====== VanillaJuce ====== |
| |
[[https://github.com/getdunne/VanillaJuce|VanillaJuce]] is a simple example of a complete VST2.4 + AUv2 synthesizer built with JUCE 5.1. | [[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.: | 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.: |
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". | 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//, 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: | 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: |
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.) | - 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. | - Pragmatically, there's not much point in adding filtering without first addressing aliasing in the oscillators. |
2. The code already illustrates how to create EGs; adding filter EGs wouldn't teach anything new. | - 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. | 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 //(GPL v3)// code example, to help others get started with the JUCE library. | 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". | 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". |
| |
===== Technical Topics ===== | ===== Getting started ===== |
* [[Preparing your PC or Mac to build audio plugins with JUCE]] | |
* [[Downloading and installing JUCE]] | |
* [[Getting past the opening hurdles]] | |
* [[Getting started with the Projucer]] | |
(More on the way, please be patient...) | |
| |
| 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. |