void processAudio(AudioBuffer &buffer){
   FloatArray left = buffer.getSamples(LEFT_CHANNEL);
   FloatArray right = buffer.getSamples(RIGHT_CHANNEL);
   leftBuffer->copyFrom(left);
   rightBuffer->copyFrom(right);
   leftPatch.processAudio(*leftBuffer);
   rightPatch.processAudio(*rightBuffer);
   left.copyFrom(*leftBuffer);
   right.copyFrom(*rightBuffer);
 }
    void perform (AudioBuffer<FloatType>& buffer, MidiBuffer& midiMessages, AudioPlayHead* audioPlayHead)
    {
        auto numSamples = buffer.getNumSamples();
        auto maxSamples = renderingBuffer.getNumSamples();

        if (numSamples > maxSamples)
        {
            // being asked to render more samples than our buffers have, so slice things up...
            tempMIDI.clear();
            tempMIDI.addEvents (midiMessages, maxSamples, numSamples, -maxSamples);

            {
                AudioBuffer<FloatType> startAudio (buffer.getArrayOfWritePointers(), buffer.getNumChannels(), maxSamples);
                midiMessages.clear (maxSamples, numSamples);
                perform (startAudio, midiMessages, audioPlayHead);
            }

            AudioBuffer<FloatType> endAudio (buffer.getArrayOfWritePointers(), buffer.getNumChannels(), maxSamples, numSamples - maxSamples);
            perform (endAudio, tempMIDI, audioPlayHead);
            return;
        }

        currentAudioInputBuffer = &buffer;
        currentAudioOutputBuffer.setSize (jmax (1, buffer.getNumChannels()), numSamples);
        currentAudioOutputBuffer.clear();
        currentMidiInputBuffer = &midiMessages;
        currentMidiOutputBuffer.clear();

        {
            const Context context { renderingBuffer.getArrayOfWritePointers(), midiBuffers.begin(), audioPlayHead, numSamples };

            for (auto* op : renderOps)
                op->perform (context);
        }

        for (int i = 0; i < buffer.getNumChannels(); ++i)
            buffer.copyFrom (i, 0, currentAudioOutputBuffer, i, 0, numSamples);

        midiMessages.clear();
        midiMessages.addEvents (currentMidiOutputBuffer, 0, buffer.getNumSamples(), 0);
        currentAudioInputBuffer = nullptr;
    }
// copy data from internal audio buffer to external audio buffer
void AverageLevelFiltered::copyTo(
    AudioBuffer<float> &destination,
    const int numberOfSamples)
{
    jassert(fftSampleBuffer_.getNumChannels() ==
            destination.getNumChannels());
    jassert(fftSampleBuffer_.getNumSamples() >=
            numberOfSamples);
    jassert(destination.getNumSamples() >=
            numberOfSamples);

    int numberOfChannels = fftSampleBuffer_.getNumChannels();

    // copy data to external buffer
    for (int channel = 0; channel < numberOfChannels; ++channel)
    {
        destination.copyFrom(channel, 0,
                             fftSampleBuffer_,
                             channel, 0,
                             numberOfSamples);
    }
}