23namespace juce::universal_midi_packets
26PacketX2 Midi1ToMidi2DefaultTranslator::processNoteOnOrOff (
const HelperValues helpers)
28 const auto velocity = helpers.byte2;
29 const auto needsConversion = (helpers.byte0 & std::byte { 0xf0 }) == std::byte { 0x90 } && velocity == std::byte { 0 };
30 const auto firstByte = needsConversion ? (std::byte { 0x80 } | (helpers.byte0 & std::byte { 0xf }))
40PacketX2 Midi1ToMidi2DefaultTranslator::processPolyPressure (
const HelperValues helpers)
44 Utils::bytesToWord (helpers.typeAndGroup, helpers.byte0, helpers.byte1, std::byte { 0 }),
49bool Midi1ToMidi2DefaultTranslator::processControlChange (
const HelperValues helpers,
52 const auto statusAndChannel = helpers.byte0;
53 const auto cc = uint8_t (helpers.byte1);
55 const auto shouldAccumulate = [&]
71 const auto group = (uint8_t) (helpers.typeAndGroup & std::byte { 0xf });
72 const auto channel = (uint8_t) (statusAndChannel & std::byte { 0xf });
73 const auto byte = helpers.byte2;
77 auto& accumulator = groupAccumulators[group][channel];
79 if (accumulator.addByte (cc,
byte))
81 const auto& bytes = accumulator.getBytes();
82 const auto bank = bytes[0];
83 const auto index = bytes[1];
84 const auto msb = bytes[2];
85 const auto lsb = bytes[3];
87 const auto value = uint16_t ((uint16_t (msb & std::byte { 0x7f }) << 7) | uint16_t (lsb & std::byte { 0x7f }));
89 const auto newStatus = (uint8_t) (accumulator.getKind() == PnKind::nrpn ? 0x3 : 0x2);
93 Utils::bytesToWord (helpers.typeAndGroup, std::byte ((newStatus << 0x4) | channel), bank, index),
104 groupBanks[group][channel].setMsb (uint8_t (
byte));
110 groupBanks[group][channel].setLsb (uint8_t (
byte));
116 Utils::bytesToWord (helpers.typeAndGroup, statusAndChannel, std::byte { cc }, std::byte { 0 }),
122PacketX2 Midi1ToMidi2DefaultTranslator::processProgramChange (
const HelperValues helpers)
const
124 const auto group = (uint8_t) (helpers.typeAndGroup & std::byte { 0xf });
125 const auto channel = (uint8_t) (helpers.byte0 & std::byte { 0xf });
126 const auto bank = groupBanks[group][channel];
127 const auto valid = bank.isValid();
131 Utils::bytesToWord (helpers.typeAndGroup,
134 valid ? std::byte { 1 } : std::byte { 0 }),
135 Utils::bytesToWord (helpers.byte1,
137 valid ? std::byte { bank.getMsb() } : std::byte { 0 },
138 valid ? std::byte { bank.getLsb() } : std::byte { 0 })
142PacketX2 Midi1ToMidi2DefaultTranslator::processChannelPressure (
const HelperValues helpers)
146 Utils::bytesToWord (helpers.typeAndGroup, helpers.byte0, std::byte { 0 }, std::byte { 0 }),
147 Conversion::scaleTo32 (uint8_t (helpers.byte1))
151PacketX2 Midi1ToMidi2DefaultTranslator::processPitchBend (
const HelperValues helpers)
153 const auto lsb = helpers.byte1;
154 const auto msb = helpers.byte2;
155 const auto value = uint16_t (uint16_t (msb) << 7 | uint16_t (lsb));
159 Utils::bytesToWord (helpers.typeAndGroup, helpers.byte0, std::byte { 0 }, std::byte { 0 }),
160 Conversion::scaleTo32 (value)
164bool Midi1ToMidi2DefaultTranslator::PnAccumulator::addByte (uint8_t cc, std::byte
byte)
166 const auto isStart = cc == 99 || cc == 101;
170 kind = cc == 99 ? PnKind::nrpn : PnKind::rpn;
176 const auto shouldContinue = [&]
180 case 0:
return isStart;
181 case 1:
return kind == PnKind::nrpn ? cc == 98 : cc == 100;
182 case 2:
return cc == 6;
183 case 3:
return cc == 38;
189 index = shouldContinue ? index + 1 : 0;
191 if (index != bytes.size())
static uint32_t scaleTo32(uint8_t word7Bit)
static uint16_t scaleTo16(uint8_t word7Bit)
static constexpr uint32_t bytesToWord(std::byte a, std::byte b, std::byte c, std::byte d)