1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-10 23:44:24 +00:00

Added a method MidiMessage::withTimeStamp, and some MidiMessageSequence unit-tests

This commit is contained in:
jules 2017-10-13 09:27:34 +01:00
parent ac60ce57ce
commit b5432c710a
3 changed files with 74 additions and 6 deletions

View file

@ -93,7 +93,7 @@ int MidiMessage::getMessageLengthFromFirstByte (const uint8 firstByte) noexcept
1, 2, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
};
return messageLengths [firstByte & 0x7f];
return messageLengths[firstByte & 0x7f];
}
//==============================================================================
@ -344,6 +344,11 @@ String MidiMessage::getDescription() const
return String::toHexString (getRawData(), getRawDataSize());
}
MidiMessage MidiMessage::withTimeStamp (double newTimestamp) const
{
return { *this, newTimestamp };
}
int MidiMessage::getChannel() const noexcept
{
auto data = getRawData();
@ -985,7 +990,7 @@ String MidiMessage::getMidiNoteName (int note, bool useSharps, bool includeOctav
if (isPositiveAndBelow (note, 128))
{
String s (useSharps ? sharpNoteNames [note % 12]
String s (useSharps ? sharpNoteNames[note % 12]
: flatNoteNames [note % 12]);
if (includeOctaveNumber)
@ -1079,7 +1084,7 @@ const char* MidiMessage::getRhythmInstrumentName (const int n)
NEEDS_TRANS("Open Cuica"), NEEDS_TRANS("Mute Triangle"), NEEDS_TRANS("Open Triangle")
};
return (n >= 35 && n <= 81) ? names [n - 35] : nullptr;
return (n >= 35 && n <= 81) ? names[n - 35] : nullptr;
}
const char* MidiMessage::getControllerName (const int n)

View file

@ -171,6 +171,11 @@ public:
*/
void addToTimeStamp (double delta) noexcept { timeStamp += delta; }
/** Return a copy of this message with a new timestamp.
The units for the timestamp will be application-specific - see the notes for getTimeStamp().
*/
MidiMessage withTimeStamp (double newTimestamp) const;
//==============================================================================
/** Returns the midi channel associated with the message.

View file

@ -107,7 +107,7 @@ int MidiMessageSequence::getIndexOf (const MidiEventHolder* event) const noexcep
int MidiMessageSequence::getNextIndexAtTime (double timeStamp) const noexcept
{
const int numEvents = list.size();
auto numEvents = list.size();
int i;
for (i = 0; i < numEvents; ++i)
@ -338,4 +338,62 @@ void MidiMessageSequence::createControllerUpdatesForTime (int channelNumber, dou
}
}
#if JUCE_UNIT_TESTS
struct MidiMessageSequenceTest : public juce::UnitTest
{
MidiMessageSequenceTest() : juce::UnitTest ("MidiMessageSequence") {}
void runTest() override
{
MidiMessageSequence s;
s.addEvent (MidiMessage::noteOn (1, 60, 0.5f).withTimeStamp (0.0));
s.addEvent (MidiMessage::noteOff (1, 60, 0.5f).withTimeStamp (4.0));
s.addEvent (MidiMessage::noteOn (1, 30, 0.5f).withTimeStamp (2.0));
s.addEvent (MidiMessage::noteOff (1, 30, 0.5f).withTimeStamp (8.0));
beginTest ("Start & end time");
expectEquals (s.getStartTime(), 0.0);
expectEquals (s.getEndTime(), 8.0);
expectEquals (s.getEventTime (1), 2.0);
beginTest ("Matching note off & ons");
s.updateMatchedPairs();
expectEquals (s.getTimeOfMatchingKeyUp (0), 4.0);
expectEquals (s.getTimeOfMatchingKeyUp (1), 8.0);
expectEquals (s.getIndexOfMatchingKeyUp (0), 2);
expectEquals (s.getIndexOfMatchingKeyUp (1), 3);
beginTest ("Time & indeces");
expectEquals (s.getNextIndexAtTime (0.5), 1);
expectEquals (s.getNextIndexAtTime (2.5), 2);
expectEquals (s.getNextIndexAtTime (9.0), 4);
beginTest ("Deleting events");
s.deleteEvent (0, true);
expectEquals (s.getNumEvents(), 2);
beginTest ("Merging sequences");
MidiMessageSequence s2;
s2.addEvent (MidiMessage::noteOn (2, 25, 0.5f).withTimeStamp (0.0));
s2.addEvent (MidiMessage::noteOn (2, 40, 0.5f).withTimeStamp (1.0));
s2.addEvent (MidiMessage::noteOff (2, 40, 0.5f).withTimeStamp (5.0));
s2.addEvent (MidiMessage::noteOn (2, 80, 0.5f).withTimeStamp (3.0));
s2.addEvent (MidiMessage::noteOff (2, 80, 0.5f).withTimeStamp (7.0));
s2.addEvent (MidiMessage::noteOff (2, 25, 0.5f).withTimeStamp (9.0));
s.addSequence (s2, 0.0, 0.0, 8.0); // Intentionally cut off the last note off
s.updateMatchedPairs();
expectEquals (s.getNumEvents(), 7);
expectEquals (s.getIndexOfMatchingKeyUp (0), -1); // Truncated note, should be no note off
expectEquals (s.getTimeOfMatchingKeyUp (1), 5.0);
}
};
static MidiMessageSequenceTest midiMessageSequenceTests;
#endif
} // namespace juce