Juce Synthesiser Problem: popping sound accompanies midi on/off messages

You both are talking of different things:
Yes, the AudioProcessor::processBlock() method expects the whole buffer to pe processed, i.e. either copy samples into or clearing it.

When you call Synthesiser:::renderNextBlock(), I would say, calling from 0 to buffer.getNumSamples() should be correct, because, the midi buffer is responsible to determine the offsets.

Where @martinrobinson-2’s note applies is the SynthesiserVoice::renderNextBlock(), where you have to make sure, you only render into the window determined by startSample and numSamples.

I hope that makes sense…

Maybe if you don’t mind sharing your AudioProcessor::processBlock() and your SynthesiserVoiice::renderNextBlock() implementation? (maybe simplified, if you are worried about IP details…)