No problem at all, you came quite clearly 
- The plugin is stateful, so everywhere you want to use that plugin, you need an instance.
You can use the AudioProcessorGraph. I would only do that if you want that type of host like the AudioPluginHost, where you connect the different plugins in random orders.
If you want a Cubase style chain of plugins, I would simply use a
std::vector<std::unique_ptr<juce::AudioPluginInstance>>
When you playback I guess you use some AudioSources at the moment. What you need to do is to get an AudioBuffer<float>
with the audio data and a MidiBuffer (you can use an empty one to begin with, until you get to use instruments). Now you can sequentially call processBlock on all instances:
// in getNextAudioBlock()
auto proxy = juce::AudioBuffer<float>(info.buffer->getArrayOfWritePointers(), info.buffer->getNumChannels(), info.startSample, info.numSamples);
juce::MidiBuffer midi;
// todo: set current autimation values (optional)
// todo set position on juce::AudioPlayhead (optional)
for (auto& plugin : plugins)
plugin->processBlock (proxy, midi);
- If you need an editor, you create a window (Component and addToDesktop() and setVisible (true)) and give it the child the AudioProcessorEditor by calling
plugin->createEditor();
Remember, AudioPluginInstance inherits AudioProcessor, so the createEditor is available. Only methods from your specific AudioProcessors are not available.
Hope that helps