ARA Plugin: where to start?


I’m developing my first ARA plugin, but unfortunately the lack of tutorials and simple examples is slowing me down.

What I want to do as a first, very simple, prototype:

  • Plugin with a single button in the UI
  • When the button is pressed the plugin processes ALL the track, doing something that in real time would be too heavy on the CPU (or even not realtime at all)
  • During playback the plugin playbacks the processed track

First of all I’ve followed this video: , and I’ve created the same classes

Screenshot 2023-11-15 alle 21.01.14

My AudioProcessor class is deriving “AudioProcessorARAExtension”. It compiles, but I get this assert at compile time:

JUCE Assertion failure in juce_CreatePluginFilter.h:42

Which is:

   #if JucePlugin_Enable_ARA
    jassert (dynamic_cast<juce::AudioProcessorARAExtension*> (pluginInstance.get()) != nullptr);

What I have to do? Besides that assert, what’s the next step after what is shown in the video?

I’ve studied the code of the “ARAPluginDemo” example, but not only is different in numerous aspects wrt the video above, it’s also too convoluted for what I need, and it’s really difficult to extract from it only what I need for my project.

Are there any tutorials available that I’ve missed? Simple examples? Detailed documentation?

If I’ll be able to make this project, I’m available for building and publishing on GitHub a very simple example project to help future ARA developer.


In the ARA SDK there’s the simplest form of ARA. It’s not juce but it’s more minimal if that’s what you’re after -

But I’d suggest understanding the ARA concepts such as AudioSource, AudioModification, PlaybackRenderer etc.
You’ll find nice documentation in the SDK itself

For juce, you should be familiar with AudioReaders as they’re useful for passing and processing audio that’s capable of random access.

Thank you, I’ll give a look at the example! Could you please confirm that the basic project that I’m trying to build (one button, process the whole track, and playback the processed version) is actually feasible with ARA? Thanks

a. I’m not sure what’s the benefit of ARA is the actual constrain is CPU usage. (if it is then basic offline rendering would be sufficient).

b. Not sure about the process you’re planning, as I guess you can separate it into multiple steps as some would be lighter/suitable for real time. But, yes, with ARA you can “analyze” the audio in non-realtime. but you’d have to implement a way to play it back in realtime. (so if it’s to intensive and you simply render the audio to files and then replays it, you end up making huge files, also, it’ll make the ARA plug-in less portable between studios as the user will have to ensure all the rendered files are shared with the project)

I started out with the JUCE ARA example:

But you can also check out the official ARA documentation located at <YOUR_ARA_SDK_LOCATION>/ARA_SDK/ARA_Library/ARA_Library.html.

1 Like

Thank you for your feedback. Correct me if I’m wrong, but JUCE does not support offline rendering right? Or better, you have to bounce in place the track with the effects enabled through your DAW menus. My problem is that the audio processing that needs to be integrated is too CPU intensive to run in real time, and also will strongly benefit from knowing the whole track (or at least pretty large buffers of it = not only CPU usage but also latency if run in real time).

Maybe offline rendering and saving the output in another track of the project may be the best solution :thinking: , it could be something like: record the track, add the plugin, bounce in place the track, remove the plugin from the old track and mute it.

Thank you, I’ll think about it!

JUCE does not support offline rendering since the plugin formats do not support it.
But this is no problem when using ARA or letting the user record the audio manually.

If in your case not only the analysis but also the playback is too CPU intensive, you could just process the entire clip using ara/the recorded clip, store this as a file, and then playback the cached audio file instead.


Yes, I’ve decided to follow that path! Thank you again for your help!