void DaalDelAudioProcessor::getFromDelayBuffer(AudioBuffer<float>& buffer, const int channel, const int bufferLength, const int delayBufferLength, const float* bufferData, const float* delayBufferData) {
    
    // Set delay time
    int curDelayTime = _curDelayTime;
    
    // Randomize delay time (half vs. full)
    // int dice = rand() % 100;
    // if (dice > 50) {
    //    curDelayTime = static_cast<int>(_delayTimeMax / 2);
    // }
    
    // Randomize delay time (within min to max range)
    curDelayTime = rand() % (std::max(_delayTimeMax - _delayTimeMin, 1));
    curDelayTime += _delayTimeMin;
    
    
    // Just set it to min
    // curDelayTime = _delayTimeMin;
    
    // ====
    
    // Poor man's oscillator (just for testing real quick)
    // TODO: Use a real oscillator
    if (_curDelayTimeDirectionIsUp) { // Up
        curDelayTime++;
        if (curDelayTime >= _delayTimeMax) _curDelayTimeDirectionIsUp = false;
    }
    else { // Down
        curDelayTime--;
        if (curDelayTime <= _delayTimeMin) _curDelayTimeDirectionIsUp = true;
    }
    
    // ====
    
    // Update delay time
    _curDelayTime = curDelayTime;
    DBG("curDelayTime=" + String(curDelayTime));
    
    // Get
    const int readPosition = static_cast<int> (delayBufferLength + _writePosition - (_sampleRate * curDelayTime / 1000)) % delayBufferLength;
    
    if (delayBufferLength > bufferLength + readPosition) { // Straight copy
        buffer.addFrom(channel, 0, delayBufferData + readPosition, bufferLength, 1 - _delayDryWetGain);
    }
    else { // Copy with wrap-around
        const int bufferRemaining = delayBufferLength - readPosition;
        buffer.addFrom(channel, 0, delayBufferData + readPosition, bufferRemaining,  1 - _delayDryWetGain);
        buffer.addFrom(channel, bufferRemaining, delayBufferData, bufferLength - bufferRemaining,  1 - _delayDryWetGain);
    }
}
void PolyWavegeneratorProcessor::processBlock(AudioSampleBuffer& buffer, MidiBuffer& midiBuffer)
{
  // clear all the midibuffers of the voices because they still contain the events from the last process Block
  for(int index = 0; index < voices.size(); index++)
  {
    voices[index]->clearMidiBuffer();
  }
  
  // Midi and Voice Handler this is not correct yet i need to watch out for different note ons of the same note in one buffer and other stuff
  if(takesMidi && !midiBuffer.isEmpty())
  {
    MidiMessage& message1 = *new MidiMessage();
    ScopedPointer<MidiBuffer::Iterator> iterator = new MidiBuffer::Iterator(midiBuffer);
    int sampleInBuffer = 0;
    while(iterator->getNextEvent(message1, sampleInBuffer))
    {
      if(message1.isNoteOn())
      {
        // always take the first one and move it to the back => the oldest voice will be "overwritten"
        voices[0]->setIsOn(true);
        voices[0]->setMidiNote(message1.getNoteNumber());
        voices[0]->addMidiEvent(message1, sampleInBuffer);
        
        voices.move(0, voices.size()-1);
      }
      else if(message1.isNoteOff())
      {
        for(int index = 0; index < voices.size(); index++)
        {
          if(voices[index]->getMidiNote() == message1.getNoteNumber())
          {
            ScopedPointer<Voice> tempVoice = voices[index];
            
            tempVoice->setIsOn(false);
            tempVoice->addMidiEvent(message1, sampleInBuffer);
            tempVoice->setMidiNote(-1); // this should be removed but just in case for now
            
            break;
          }
        }
      }
    }
  }
  
  
  
  // Audio Handling of the voices
  AudioBuffer<float> outBuffer = getBusBuffer(buffer, false, 0);
  
  int numActive = 0; // eventually this could be a member variable
  for(int index = 0; index < voices.size(); index++)
  {
    if(voices[index]->getIsOn())
    {
      numActive++;
      
      voices[index]->clearAudioBuffer();
      voices[index]->fillBufferEnvelope();
      voices[index]->fillBufferAudio();
      
      outBuffer.addFrom(0, 0, voices[index]->getOutBuffer(), 0, 0, outBuffer.getNumSamples());
    }
  }
  
  outBuffer.applyGain(1.0f/numActive);
  
  
}