diff --git a/Source/RenderEngine.cpp b/Source/RenderEngine.cpp index e92582ac..6dd18210 100644 --- a/Source/RenderEngine.cpp +++ b/Source/RenderEngine.cpp @@ -113,9 +113,8 @@ void RenderEngine::renderPatch (const uint8 midiNote, MidiMessage onMessage = MidiMessage::noteOn (1, midiNote, midiVelocity); - onMessage.setTimeStamp(0); MidiBuffer midiNoteBuffer; - midiNoteBuffer.addEvent (onMessage, onMessage.getTimeStamp()); + midiNoteBuffer.addEvent (onMessage, 0); // Setup fft here so it is destroyed when rendering is finished and // the stack unwinds so it doesn't share frames with a new patch. @@ -144,6 +143,10 @@ void RenderEngine::renderPatch (const uint8 midiNote, for (int i = 0; i < numberOfBuffers; ++i) { + // Only trigger one note on during first audio buffer + if (i > 0) + midiNoteBuffer.clear(); + // Trigger note off if in the correct audio buffer. ifTimeSetNoteOff (noteLength, sampleRate, @@ -286,18 +289,20 @@ void RenderEngine::ifTimeSetNoteOff (const double noteLength, MidiBuffer& bufferToNoteOff) { double eventFrame = noteLength * sampleRate; - bool bufferBeginIsBeforeEvent = currentBufferIndex * bufferSize < eventFrame; - bool bufferEndIsAfterEvent = (currentBufferIndex + 1) * bufferSize >= eventFrame; + double bufferStartSample = currentBufferIndex * bufferSize; + + bool bufferBeginIsBeforeEvent = bufferStartSample < eventFrame; + bool bufferEndIsAfterEvent = bufferStartSample + bufferSize >= eventFrame; bool noteOffEvent = bufferBeginIsBeforeEvent && bufferEndIsAfterEvent; + if (noteOffEvent) { - MidiBuffer midiOffBuffer; MidiMessage offMessage = MidiMessage::noteOff (midiChannel, midiPitch, midiVelocity); - offMessage.setTimeStamp(eventFrame); - midiOffBuffer.addEvent(offMessage, offMessage.getTimeStamp()); - bufferToNoteOff = midiOffBuffer; + + double samplesUntilNoteOff = eventFrame - bufferStartSample; + bufferToNoteOff.addEvent(offMessage, samplesUntilNoteOff); } }