From b46c63bdae9adc0903e7f16e630edd32d0f7fca9 Mon Sep 17 00:00:00 2001 From: jules Date: Wed, 4 Apr 2018 15:52:45 +0100 Subject: [PATCH] Made the MidiMessageSequence copy constructor generate a more faithful version of the original state, rather than always matching up all note on/off pairs --- .../midi/juce_MidiMessageSequence.cpp | 38 +++++++++++++------ 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp b/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp index 5113c16f24..0321e46674 100644 --- a/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp +++ b/modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp @@ -35,7 +35,14 @@ MidiMessageSequence::MidiMessageSequence() MidiMessageSequence::MidiMessageSequence (const MidiMessageSequence& other) { list.addCopiesOf (other.list); - updateMatchedPairs(); + + for (int i = 0; i < list.size(); ++i) + { + auto noteOffIndex = other.getIndexOfMatchingKeyUp (i); + + if (noteOffIndex >= 0) + list.getUnchecked(i)->noteOffObject = list.getUnchecked (noteOffIndex); + } } MidiMessageSequence& MidiMessageSequence::operator= (const MidiMessageSequence& other) @@ -86,16 +93,25 @@ MidiMessageSequence::MidiEventHolder** MidiMessageSequence::end() const noexcept double MidiMessageSequence::getTimeOfMatchingKeyUp (int index) const noexcept { if (auto* meh = list[index]) - if (meh->noteOffObject != nullptr) - return meh->noteOffObject->message.getTimeStamp(); + if (auto* noteOff = meh->noteOffObject) + return noteOff->message.getTimeStamp(); - return 0.0; + return 0; } int MidiMessageSequence::getIndexOfMatchingKeyUp (int index) const noexcept { - if (auto* meh = list [index]) - return list.indexOf (meh->noteOffObject); + if (auto* meh = list[index]) + { + if (auto* noteOff = meh->noteOffObject) + { + for (int i = index; i < list.size(); ++i) + if (list.getUnchecked(i) == noteOff) + return i; + + jassertfalse; // we've somehow got a pointer to a note-off object that isn't in the sequence + } + } return -1; } @@ -108,8 +124,8 @@ int MidiMessageSequence::getIndexOf (const MidiEventHolder* event) const noexcep int MidiMessageSequence::getNextIndexAtTime (double timeStamp) const noexcept { auto numEvents = list.size(); - int i; + for (i = 0; i < numEvents; ++i) if (list.getUnchecked(i)->message.getTimeStamp() >= timeStamp) break; @@ -130,10 +146,10 @@ double MidiMessageSequence::getEndTime() const noexcept double MidiMessageSequence::getEventTime (const int index) const noexcept { - if (auto* meh = list [index]) + if (auto* meh = list[index]) return meh->message.getTimeStamp(); - return 0.0; + return 0; } //============================================================================== @@ -141,8 +157,8 @@ MidiMessageSequence::MidiEventHolder* MidiMessageSequence::addEvent (MidiEventHo { newEvent->message.addToTimeStamp (timeAdjustment); auto time = newEvent->message.getTimeStamp(); - int i; + for (i = list.size(); --i >= 0;) if (list.getUnchecked(i)->message.getTimeStamp() <= time) break; @@ -315,7 +331,7 @@ void MidiMessageSequence::createControllerUpdatesForTime (int channelNumber, dou } else if (mm.isController()) { - const int controllerNumber = mm.getControllerNumber(); + auto controllerNumber = mm.getControllerNumber(); jassert (isPositiveAndBelow (controllerNumber, 128)); if (! doneControllers[controllerNumber])