| 
							- /*
 -   ==============================================================================
 - 
 -    This file is part of the JUCE library.
 -    Copyright (c) 2022 - Raw Material Software Limited
 - 
 -    JUCE is an open source library subject to commercial or open-source
 -    licensing.
 - 
 -    The code included in this file is provided under the terms of the ISC license
 -    http://www.isc.org/downloads/software-support-policy/isc-license. Permission
 -    To use, copy, modify, and/or distribute this software for any purpose with or
 -    without fee is hereby granted provided that the above copyright notice and
 -    this permission notice appear in all copies.
 - 
 -    JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
 -    EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
 -    DISCLAIMED.
 - 
 -   ==============================================================================
 - */
 - 
 - namespace juce
 - {
 - namespace universal_midi_packets
 - {
 - 
 - PacketX2 Midi1ToMidi2DefaultTranslator::processNoteOnOrOff (const HelperValues helpers)
 - {
 -     const auto velocity = helpers.byte2;
 -     const auto needsConversion = (helpers.byte0 >> 0x4) == 0x9 && velocity == 0;
 -     const auto firstByte = needsConversion ? (uint8_t) ((0x8 << 0x4) | (helpers.byte0 & 0xf))
 -                                            : helpers.byte0;
 - 
 -     return PacketX2
 -     {
 -         Utils::bytesToWord (helpers.typeAndGroup, firstByte, helpers.byte1, 0),
 -         (uint32_t) (Conversion::scaleTo16 (velocity) << 0x10)
 -     };
 - }
 - 
 - PacketX2 Midi1ToMidi2DefaultTranslator::processPolyPressure (const HelperValues helpers)
 - {
 -     return PacketX2
 -     {
 -         Utils::bytesToWord (helpers.typeAndGroup, helpers.byte0, helpers.byte1, 0),
 -         Conversion::scaleTo32 (helpers.byte2)
 -     };
 - }
 - 
 - bool Midi1ToMidi2DefaultTranslator::processControlChange (const HelperValues helpers,
 -                                                           PacketX2& packet)
 - {
 -     const auto statusAndChannel = helpers.byte0;
 -     const auto cc               = helpers.byte1;
 - 
 -     const auto shouldAccumulate = [&]
 -     {
 -         switch (cc)
 -         {
 -             case 6:
 -             case 38:
 -             case 98:
 -             case 99:
 -             case 100:
 -             case 101:
 -                 return true;
 -         }
 - 
 -         return false;
 -     }();
 - 
 -     const auto group   = (uint8_t) (helpers.typeAndGroup & 0xf);
 -     const auto channel = (uint8_t) (statusAndChannel & 0xf);
 -     const auto byte    = helpers.byte2;
 - 
 -     if (shouldAccumulate)
 -     {
 -         auto& accumulator = groupAccumulators[group][channel];
 - 
 -         if (accumulator.addByte (cc, byte))
 -         {
 -             const auto& bytes = accumulator.getBytes();
 -             const auto bank   = bytes[0];
 -             const auto index  = bytes[1];
 -             const auto msb    = bytes[2];
 -             const auto lsb    = bytes[3];
 - 
 -             const auto value = (uint16_t) (((msb & 0x7f) << 7) | (lsb & 0x7f));
 - 
 -             const auto newStatus = (uint8_t) (accumulator.getKind() == PnKind::nrpn ? 0x3 : 0x2);
 - 
 -             packet = PacketX2
 -             {
 -                 Utils::bytesToWord (helpers.typeAndGroup, (uint8_t) ((newStatus << 0x4) | channel), bank, index),
 -                 Conversion::scaleTo32 (value)
 -             };
 -             return true;
 -         }
 - 
 -         return false;
 -     }
 - 
 -     if (cc == 0)
 -     {
 -         groupBanks[group][channel].setMsb (byte);
 -         return false;
 -     }
 - 
 -     if (cc == 32)
 -     {
 -         groupBanks[group][channel].setLsb (byte);
 -         return false;
 -     }
 - 
 -     packet = PacketX2
 -     {
 -         Utils::bytesToWord (helpers.typeAndGroup, statusAndChannel, cc, 0),
 -         Conversion::scaleTo32 (helpers.byte2)
 -     };
 -     return true;
 - }
 - 
 - PacketX2 Midi1ToMidi2DefaultTranslator::processProgramChange (const HelperValues helpers) const
 - {
 -     const auto group   = (uint8_t) (helpers.typeAndGroup & 0xf);
 -     const auto channel = (uint8_t) (helpers.byte0 & 0xf);
 -     const auto bank    = groupBanks[group][channel];
 -     const auto valid   = bank.isValid();
 - 
 -     return PacketX2
 -     {
 -         Utils::bytesToWord (helpers.typeAndGroup, helpers.byte0, 0, valid ? 1 : 0),
 -         Utils::bytesToWord (helpers.byte1, 0, valid ? bank.getMsb() : 0, valid ? bank.getLsb() : 0)
 -     };
 - }
 - 
 - PacketX2 Midi1ToMidi2DefaultTranslator::processChannelPressure (const HelperValues helpers)
 - {
 -     return PacketX2
 -     {
 -         Utils::bytesToWord (helpers.typeAndGroup, helpers.byte0, 0, 0),
 -         Conversion::scaleTo32 (helpers.byte1)
 -     };
 - }
 - 
 - PacketX2 Midi1ToMidi2DefaultTranslator::processPitchBend (const HelperValues helpers)
 - {
 -     const auto lsb   = helpers.byte1;
 -     const auto msb   = helpers.byte2;
 -     const auto value = (uint16_t) (msb << 7 | lsb);
 - 
 -     return PacketX2
 -     {
 -         Utils::bytesToWord (helpers.typeAndGroup, helpers.byte0, 0, 0),
 -         Conversion::scaleTo32 (value)
 -     };
 - }
 - 
 - bool Midi1ToMidi2DefaultTranslator::PnAccumulator::addByte (uint8_t cc, uint8_t byte)
 - {
 -     const auto isStart = cc == 99 || cc == 101;
 - 
 -     if (isStart)
 -     {
 -         kind = cc == 99 ? PnKind::nrpn : PnKind::rpn;
 -         index = 0;
 -     }
 - 
 -     bytes[index] = byte;
 - 
 -     const auto shouldContinue = [&]
 -     {
 -         switch (index)
 -         {
 -             case 0: return isStart;
 -             case 1: return kind == PnKind::nrpn ? cc == 98 : cc == 100;
 -             case 2: return cc == 6;
 -             case 3: return cc == 38;
 -         }
 - 
 -         return false;
 -     }();
 - 
 -     index = shouldContinue ? index + 1 : 0;
 - 
 -     if (index != bytes.size())
 -         return false;
 - 
 -     index = 0;
 -     return true;
 - }
 - 
 - }
 - }
 
 
  |