| @@ -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]) | |||