feat: Get CIN from status byte

Removed unused implementation of UsbMidiEventPacket
This commit is contained in:
Francois Best 2018-11-03 18:58:45 +01:00
parent a34087c92c
commit 3f15b733e4
3 changed files with 99 additions and 125 deletions

View File

@ -60,6 +60,45 @@ struct CodeIndexNumbers
singleByte = 0x0F, 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) static inline byte getSize(byte inCodeIndexNumber)
{ {
switch (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 END_MIDI_NAMESPACE

View File

@ -1,75 +0,0 @@
#include "unit-tests.h"
#include <src/midi_UsbDefs.h>
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

View File

@ -0,0 +1,60 @@
#include "unit-tests.h"
#include <src/midi_UsbDefs.h>
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