From 3f15b733e47e6d0faa9e1190a9559dcca00fa9ac Mon Sep 17 00:00:00 2001 From: Francois Best Date: Sat, 3 Nov 2018 18:58:45 +0100 Subject: [PATCH] feat: Get CIN from status byte Removed unused implementation of UsbMidiEventPacket --- src/midi_UsbDefs.h | 89 ++++++++----------- test/unit-tests/tests/unit-tests_MidiUsb.cpp | 75 ---------------- .../tests/unit-tests_MidiUsbDefs.cpp | 60 +++++++++++++ 3 files changed, 99 insertions(+), 125 deletions(-) delete mode 100644 test/unit-tests/tests/unit-tests_MidiUsb.cpp create mode 100644 test/unit-tests/tests/unit-tests_MidiUsbDefs.cpp diff --git a/src/midi_UsbDefs.h b/src/midi_UsbDefs.h index 2170d02..b117bc4 100644 --- a/src/midi_UsbDefs.h +++ b/src/midi_UsbDefs.h @@ -60,6 +60,45 @@ struct CodeIndexNumbers singleByte = 0x0F, }; + static inline byte fromStatus(StatusByte inStatus) + { + const byte statusWithoutChannel = inStatus & 0xf0; + if (statusWithoutChannel >= midi::NoteOff && + statusWithoutChannel <= midi::PitchBend) + { + // Channel Voice Messages + return inStatus >> 4; + } + switch (inStatus) + { + // System Real Time Messages + case midi::Clock: + case midi::Start: + case midi::Continue: + case midi::Stop: + case midi::ActiveSensing: + case midi::SystemReset: + return CodeIndexNumbers::singleByte; + + case midi::SystemExclusive: + return CodeIndexNumbers::sysExStart; + + // System Common Messages + case midi::TimeCodeQuarterFrame: + return CodeIndexNumbers::systemCommon2Bytes; + case midi::SongPosition: + return CodeIndexNumbers::systemCommon3Bytes; + case midi::SongSelect: + return CodeIndexNumbers::systemCommon2Bytes; + case midi::TuneRequest: + return CodeIndexNumbers::systemCommon1Byte; + + default: + return CodeIndexNumbers::reserved; + } + + } + static inline byte getSize(byte inCodeIndexNumber) { switch (inCodeIndexNumber) @@ -91,54 +130,4 @@ struct CodeIndexNumbers } }; -// ----------------------------------------------------------------------------- - -struct UsbMidiEventPacket -{ -public: - inline UsbMidiEventPacket() - { - memset(mData, 0, 4 * sizeof(byte)); - } - -public: - inline void setHeader(byte inCableNumber, byte inCodeIndexNumber) - { - const byte msb = (0x0f & inCableNumber) << 4; - const byte lsb = (0x0f & inCodeIndexNumber); - mData[0] = msb | lsb; - } - inline void setMidiData(const byte* inData) - { - mData[1] = *inData++; - mData[2] = *inData++; - mData[3] = *inData; - } - inline byte getCableNumber() const - { - return mData[0] >> 4; - } - inline byte getCodeIndexNumber() const - { - return mData[0] & 0x0f; - } - inline const byte* getMidiData() const - { - return mData + 1; - } - inline byte* getMidiData() - { - return mData + 1; - } - inline UsbMidiEventPacket& operator=(const byte* inData) - { - mData[0] = *inData++; - setMidiData(inData); - return *this; - } - -public: - byte mData[4]; -}; - END_MIDI_NAMESPACE diff --git a/test/unit-tests/tests/unit-tests_MidiUsb.cpp b/test/unit-tests/tests/unit-tests_MidiUsb.cpp deleted file mode 100644 index 1e87233..0000000 --- a/test/unit-tests/tests/unit-tests_MidiUsb.cpp +++ /dev/null @@ -1,75 +0,0 @@ -#include "unit-tests.h" -#include - -BEGIN_MIDI_NAMESPACE - -END_MIDI_NAMESPACE - -// ----------------------------------------------------------------------------- - -BEGIN_UNNAMED_NAMESPACE - -TEST(MidiUsb, codeIndexNumberSizes) -{ - typedef midi::CodeIndexNumbers CIN; - EXPECT_EQ(CIN::getSize(CIN::reserved), 0); - EXPECT_EQ(CIN::getSize(CIN::misc), 0); - EXPECT_EQ(CIN::getSize(CIN::cableEvent), 0); - EXPECT_EQ(CIN::getSize(CIN::systemCommon2Bytes), 2); - EXPECT_EQ(CIN::getSize(CIN::systemCommon3Bytes), 3); - EXPECT_EQ(CIN::getSize(CIN::sysExStart), 3); - EXPECT_EQ(CIN::getSize(CIN::sysExContinue), 3); - EXPECT_EQ(CIN::getSize(CIN::systemCommon1Byte), 1); - EXPECT_EQ(CIN::getSize(CIN::sysExEnds1Byte), 1); - EXPECT_EQ(CIN::getSize(CIN::sysExEnds2Bytes), 2); - EXPECT_EQ(CIN::getSize(CIN::sysExEnds3Bytes), 3); - EXPECT_EQ(CIN::getSize(CIN::noteOff), 3); - EXPECT_EQ(CIN::getSize(CIN::noteOn), 3); - EXPECT_EQ(CIN::getSize(CIN::polyPressure), 3); - EXPECT_EQ(CIN::getSize(CIN::controlChange), 3); - EXPECT_EQ(CIN::getSize(CIN::programChange), 2); - EXPECT_EQ(CIN::getSize(CIN::channelPressure), 2); - EXPECT_EQ(CIN::getSize(CIN::pitchBend), 3); - EXPECT_EQ(CIN::getSize(CIN::singleByte), 1); -} - -TEST(MidiUsb, UsbMidiEventPacket) -{ - midi::UsbMidiEventPacket packet; - EXPECT_EQ(packet.mData[0], 0); - EXPECT_EQ(packet.mData[1], 0); - EXPECT_EQ(packet.mData[2], 0); - EXPECT_EQ(packet.mData[3], 0); - EXPECT_EQ(packet.getCableNumber(), 0); - EXPECT_EQ(packet.getCodeIndexNumber(), 0); - - packet.setHeader(12, 7); - EXPECT_EQ(packet.mData[0], 0xc7); - EXPECT_EQ(packet.getCableNumber(), 12); - EXPECT_EQ(packet.getCodeIndexNumber(), 7); - - const byte midiData[3] = { 12, 42, 47 }; - packet.setMidiData(midiData); - EXPECT_EQ(packet.mData[0], 0xc7); - EXPECT_EQ(packet.mData[1], 12); - EXPECT_EQ(packet.mData[2], 42); - EXPECT_EQ(packet.mData[3], 47); - - const byte fullData[4] = { 12, 34, 56, 78 }; - packet = fullData; - EXPECT_EQ(packet.mData[0], 12); - EXPECT_EQ(packet.mData[1], 34); - EXPECT_EQ(packet.mData[2], 56); - EXPECT_EQ(packet.mData[3], 78); - - const byte* midiDataConst = packet.getMidiData(); - EXPECT_EQ(midiDataConst[0], 34); - EXPECT_EQ(midiDataConst[1], 56); - EXPECT_EQ(midiDataConst[2], 78); - byte* midiDataMutable = packet.getMidiData(); - EXPECT_EQ(midiDataMutable[0], 34); - EXPECT_EQ(midiDataMutable[1], 56); - EXPECT_EQ(midiDataMutable[2], 78); -} - -END_UNNAMED_NAMESPACE diff --git a/test/unit-tests/tests/unit-tests_MidiUsbDefs.cpp b/test/unit-tests/tests/unit-tests_MidiUsbDefs.cpp new file mode 100644 index 0000000..c5059ef --- /dev/null +++ b/test/unit-tests/tests/unit-tests_MidiUsbDefs.cpp @@ -0,0 +1,60 @@ +#include "unit-tests.h" +#include + +BEGIN_MIDI_NAMESPACE + +END_MIDI_NAMESPACE + +// ----------------------------------------------------------------------------- + +BEGIN_UNNAMED_NAMESPACE + +TEST(MidiUsbDefs, codeIndexNumberFromStatus) +{ + typedef midi::CodeIndexNumbers CIN; + EXPECT_EQ(CIN::fromStatus(midi::InvalidType), CIN::reserved); + EXPECT_EQ(CIN::fromStatus(midi::NoteOff), CIN::noteOff); + EXPECT_EQ(CIN::fromStatus(midi::NoteOn), CIN::noteOn); + EXPECT_EQ(CIN::fromStatus(midi::AfterTouchPoly), CIN::polyPressure); + EXPECT_EQ(CIN::fromStatus(midi::ControlChange), CIN::controlChange); + EXPECT_EQ(CIN::fromStatus(midi::ProgramChange), CIN::programChange); + EXPECT_EQ(CIN::fromStatus(midi::AfterTouchChannel), CIN::channelPressure); + EXPECT_EQ(CIN::fromStatus(midi::PitchBend), CIN::pitchBend); + EXPECT_EQ(CIN::fromStatus(midi::Clock), CIN::singleByte); + EXPECT_EQ(CIN::fromStatus(midi::Start), CIN::singleByte); + EXPECT_EQ(CIN::fromStatus(midi::Continue), CIN::singleByte); + EXPECT_EQ(CIN::fromStatus(midi::Stop), CIN::singleByte); + EXPECT_EQ(CIN::fromStatus(midi::ActiveSensing), CIN::singleByte); + EXPECT_EQ(CIN::fromStatus(midi::SystemReset), CIN::singleByte); + EXPECT_EQ(CIN::fromStatus(midi::SystemExclusive), CIN::sysExStart); + EXPECT_EQ(CIN::fromStatus(midi::TuneRequest), CIN::systemCommon1Byte); + EXPECT_EQ(CIN::fromStatus(midi::TimeCodeQuarterFrame), CIN::systemCommon2Bytes); + EXPECT_EQ(CIN::fromStatus(midi::SongSelect), CIN::systemCommon2Bytes); + EXPECT_EQ(CIN::fromStatus(midi::SongPosition), CIN::systemCommon3Bytes); +} + +TEST(MidiUsbDefs, codeIndexNumberSizes) +{ + typedef midi::CodeIndexNumbers CIN; + EXPECT_EQ(CIN::getSize(CIN::reserved), 0); + EXPECT_EQ(CIN::getSize(CIN::misc), 0); + EXPECT_EQ(CIN::getSize(CIN::cableEvent), 0); + EXPECT_EQ(CIN::getSize(CIN::systemCommon2Bytes), 2); + EXPECT_EQ(CIN::getSize(CIN::systemCommon3Bytes), 3); + EXPECT_EQ(CIN::getSize(CIN::sysExStart), 3); + EXPECT_EQ(CIN::getSize(CIN::sysExContinue), 3); + EXPECT_EQ(CIN::getSize(CIN::systemCommon1Byte), 1); + EXPECT_EQ(CIN::getSize(CIN::sysExEnds1Byte), 1); + EXPECT_EQ(CIN::getSize(CIN::sysExEnds2Bytes), 2); + EXPECT_EQ(CIN::getSize(CIN::sysExEnds3Bytes), 3); + EXPECT_EQ(CIN::getSize(CIN::noteOff), 3); + EXPECT_EQ(CIN::getSize(CIN::noteOn), 3); + EXPECT_EQ(CIN::getSize(CIN::polyPressure), 3); + EXPECT_EQ(CIN::getSize(CIN::controlChange), 3); + EXPECT_EQ(CIN::getSize(CIN::programChange), 2); + EXPECT_EQ(CIN::getSize(CIN::channelPressure), 2); + EXPECT_EQ(CIN::getSize(CIN::pitchBend), 3); + EXPECT_EQ(CIN::getSize(CIN::singleByte), 1); +} + +END_UNNAMED_NAMESPACE