Browse Source

Made the MidiMessageSequence copy constructor generate a more faithful version of the original state, rather than always matching up all note on/off pairs

tags/2021-05-28
jules 7 years ago
parent
commit
b46c63bdae
1 changed files with 27 additions and 11 deletions
  1. +27
    -11
      modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp

+ 27
- 11
modules/juce_audio_basics/midi/juce_MidiMessageSequence.cpp View File

@@ -35,7 +35,14 @@ MidiMessageSequence::MidiMessageSequence()
MidiMessageSequence::MidiMessageSequence (const MidiMessageSequence& other) MidiMessageSequence::MidiMessageSequence (const MidiMessageSequence& other)
{ {
list.addCopiesOf (other.list); 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) MidiMessageSequence& MidiMessageSequence::operator= (const MidiMessageSequence& other)
@@ -86,16 +93,25 @@ MidiMessageSequence::MidiEventHolder** MidiMessageSequence::end() const noexcept
double MidiMessageSequence::getTimeOfMatchingKeyUp (int index) const noexcept double MidiMessageSequence::getTimeOfMatchingKeyUp (int index) const noexcept
{ {
if (auto* meh = list[index]) 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 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; return -1;
} }
@@ -108,8 +124,8 @@ int MidiMessageSequence::getIndexOf (const MidiEventHolder* event) const noexcep
int MidiMessageSequence::getNextIndexAtTime (double timeStamp) const noexcept int MidiMessageSequence::getNextIndexAtTime (double timeStamp) const noexcept
{ {
auto numEvents = list.size(); auto numEvents = list.size();
int i; int i;
for (i = 0; i < numEvents; ++i) for (i = 0; i < numEvents; ++i)
if (list.getUnchecked(i)->message.getTimeStamp() >= timeStamp) if (list.getUnchecked(i)->message.getTimeStamp() >= timeStamp)
break; break;
@@ -130,10 +146,10 @@ double MidiMessageSequence::getEndTime() const noexcept
double MidiMessageSequence::getEventTime (const int index) 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 meh->message.getTimeStamp();
return 0.0;
return 0;
} }
//============================================================================== //==============================================================================
@@ -141,8 +157,8 @@ MidiMessageSequence::MidiEventHolder* MidiMessageSequence::addEvent (MidiEventHo
{ {
newEvent->message.addToTimeStamp (timeAdjustment); newEvent->message.addToTimeStamp (timeAdjustment);
auto time = newEvent->message.getTimeStamp(); auto time = newEvent->message.getTimeStamp();
int i; int i;
for (i = list.size(); --i >= 0;) for (i = list.size(); --i >= 0;)
if (list.getUnchecked(i)->message.getTimeStamp() <= time) if (list.getUnchecked(i)->message.getTimeStamp() <= time)
break; break;
@@ -315,7 +331,7 @@ void MidiMessageSequence::createControllerUpdatesForTime (int channelNumber, dou
} }
else if (mm.isController()) else if (mm.isController())
{ {
const int controllerNumber = mm.getControllerNumber();
auto controllerNumber = mm.getControllerNumber();
jassert (isPositiveAndBelow (controllerNumber, 128)); jassert (isPositiveAndBelow (controllerNumber, 128));
if (! doneControllers[controllerNumber]) if (! doneControllers[controllerNumber])


Loading…
Cancel
Save