https://audio.dev/adc-japan-26/schedule/
https://data.audio.dev/workshops/2026/build-first-plugin-with-juce/materials.zip
Anthony Nicholls
Attila Szarvas
Reuben Thomas
Tom Poole
https://audio.dev/adc-japan-26/schedule/
https://data.audio.dev/workshops/2026/build-first-plugin-with-juce/materials.zip
Put the materials somewhere that is not managed by iCloud, OneDrive, DropBox, or similar.
Backup systems can interfere with the build process!
https://audio.dev/adc-japan-26/schedule/
https://data.audio.dev/workshops/2026/build-first-plugin-with-juce/materials.zip









workspace is where we’ll edit the source code of our plug-insPlugins is where you will find your compiled plug-insTestHost is where you will find the TestHost applicationProjucer is where you will find the Projucer applicationWe’re now using the workshop checkpoints
The #01 in the title signals that the corresponding checkpoint for
the beginning of the section is the 01 directory
To return to this point in the workshop you can delete the contents
of the workspace folder and copy the contents of the 01 folder into the
workspace folder
We’ve already done this for step #01, so we’re all starting from the same place
Objectives of this section:
Open the Projucer: Projucer/[your platform]/Projucer(.app/.exe)
 
In the Projucer, open the workspace/SimpleDelay.jucer project





We’ve seen a lot of Projucer settings but we don’t need to change any for this workshop!
Creating a Linux Makefile from the Projucer is a little different - there are no IDEs associated with Makefiles so after saving your project you need to run make from the command line
If you are comfortable using CMake then there is a CMakeLists.txt in the root directory.
 
 
 






A simple host application for testing our plug-in can be found in the workshop materials:
TestHost/macOS/TestHost.appTestHost/Win64/TestHost.exeTestHost/Linux/TestHostLaunch the one appropriate for your platform.


Find the SimpleDelay plug-in that you’ve built in the Plugins folder and drop it onto the plug-in section of the TestHost app.
Click on the plug-in name to open the UI.
Open your IDE project file:
workspace\Builds\VisualStudio2022\SimpleDelay.slnworkspace/Builds/macOS/SimpleDelay.xcodeprojOn Linux open the source file directly:
workspace/Source/PluginProcessor.cpp
The SimpleDelayAudioProcessor class has a lot of methods
The only one needed for this section is processBlock
processBlock is called repeatedly by the plug-in host with a chunk
of audio to process
Be careful here! processBlock will be called on the audio thread,
which is not the same as that used for drawing a GUI or handling mouse
events (more on this a little later)
AudioBuffer is a class containing non-interleaved channels of audio
data represented as floats, and methods to access and modify them.
processBlock is passed a reference to an AudioBuffer containing
the incoming audio data. We create an audio effect by modifying this
data.
For plug-ins the number of samples to process each block usually corresponds to the “buffer size” setting of the host (1024, 512, ...)
Parameters are how plug-in hosts control plug-ins
They are exposed as part of the plug-in format’s interface
Parameters can be changed via:
Use classes derived from AudioProcessorParameter
JUCE provides some basic types to get you started
AudioParameterFloatAudioParameterBoolAudioParameterChoiceAudioParameterInt
Let’s add some less trivial audio processing
This section requires quite a lot of typing to complete. Start from the contents of the 05 folder and review the changes rather than typing along.
An echo of the incoming audio
The audio at time t is combined with a recursively attenuated audio at time (t - nD)
where D is the delay time and n = 1,2,3,4,...
Increasing the delay time D increases the time between echos
Increasing the attenuation decreases the time taken for the echos to fade away
Our SimpleDelay plug-in will feature a fixed delay time, but a variable feedback (opposite of attenuation) with a dry/wet mix control
A simple circular buffer of audio history
Use an AudioProcessorValueTreeState to manage your parameters
becomes
When plug-in hosts save and load projects, each plug-in must save and restore its state
getStateInformation (juce::MemoryBlock& destData)setStateInformation (const void* data, int sizeInBytes)The plug-in’s state must be serialised to, and deserialised from, a block of memory managed by the host.
Let’s display a custom GUI and draw some graphics

Be careful here!
It’s very easy to create race conditions, where one thread is modifying a bit of memory whilst another thread is reading it.
This is easily the most complicated aspect of working with real-time audio.
Using JUCE’s AudioParameter classes and an AudioProcessorValueTreeState makes things much simpler.

From now until the next break there will be a lot of code to add as we put together a GUI that’s more than a few basic shapes
Don’t worry about keeping up!
During and after the break there will be time to experiment with your own GUIs




Let’s create some interactive GUI elements
JUCE GUIs are trees of components

Adding Sliders, or any other Component requires the following basic steps

We would like to control the plug-in from the GUI

What is a debugger?
What is a breakpoint?
Debugging standalone plug-in is simple as we control the whole process
Debugging the plug-in inside an actual host is slightly more complicated as we are running inside a different process (the host)
Debuggers can attach to a separate process to allow you to debug and set breakpoints in your code












General improvements:
For this particular effect:
GitHub: https://github.com/juce-framework/JUCE
Forum: https://forum.juce.com
Course: https://juce.com/learn/course
Tutorials: https://juce.com/learn/tutorials