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