LMMS
Loading...
Searching...
No Matches
juce_UMPMidi1ToMidi2DefaultTranslator.cpp
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the JUCE library.
5 Copyright (c) 2022 - Raw Material Software Limited
6
7 JUCE is an open source library subject to commercial or open-source
8 licensing.
9
10 The code included in this file is provided under the terms of the ISC license
11 http://www.isc.org/downloads/software-support-policy/isc-license. Permission
12 To use, copy, modify, and/or distribute this software for any purpose with or
13 without fee is hereby granted provided that the above copyright notice and
14 this permission notice appear in all copies.
15
16 JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
17 EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
18 DISCLAIMED.
19
20 ==============================================================================
21*/
22
23namespace juce
24{
26{
27
29{
30 const auto velocity = helpers.byte2;
31 const auto needsConversion = (helpers.byte0 >> 0x4) == 0x9 && velocity == 0;
32 const auto firstByte = needsConversion ? (uint8_t) ((0x8 << 0x4) | (helpers.byte0 & 0xf))
33 : helpers.byte0;
34
35 return PacketX2
36 {
37 Utils::bytesToWord (helpers.typeAndGroup, firstByte, helpers.byte1, 0),
38 (uint32_t) (Conversion::scaleTo16 (velocity) << 0x10)
39 };
40}
41
43{
44 return PacketX2
45 {
46 Utils::bytesToWord (helpers.typeAndGroup, helpers.byte0, helpers.byte1, 0),
48 };
49}
50
52 PacketX2& packet)
53{
54 const auto statusAndChannel = helpers.byte0;
55 const auto cc = helpers.byte1;
56
57 const auto shouldAccumulate = [&]
58 {
59 switch (cc)
60 {
61 case 6:
62 case 38:
63 case 98:
64 case 99:
65 case 100:
66 case 101:
67 return true;
68 }
69
70 return false;
71 }();
72
73 const auto group = (uint8_t) (helpers.typeAndGroup & 0xf);
74 const auto channel = (uint8_t) (statusAndChannel & 0xf);
75 const auto byte = helpers.byte2;
76
77 if (shouldAccumulate)
78 {
79 auto& accumulator = groupAccumulators[group][channel];
80
81 if (accumulator.addByte (cc, byte))
82 {
83 const auto& bytes = accumulator.getBytes();
84 const auto bank = bytes[0];
85 const auto index = bytes[1];
86 const auto msb = bytes[2];
87 const auto lsb = bytes[3];
88
89 const auto value = (uint16_t) (((msb & 0x7f) << 7) | (lsb & 0x7f));
90
91 const auto newStatus = (uint8_t) (accumulator.getKind() == PnKind::nrpn ? 0x3 : 0x2);
92
93 packet = PacketX2
94 {
95 Utils::bytesToWord (helpers.typeAndGroup, (uint8_t) ((newStatus << 0x4) | channel), bank, index),
97 };
98 return true;
99 }
100
101 return false;
102 }
103
104 if (cc == 0)
105 {
106 groupBanks[group][channel].setMsb (byte);
107 return false;
108 }
109
110 if (cc == 32)
111 {
112 groupBanks[group][channel].setLsb (byte);
113 return false;
114 }
115
116 packet = PacketX2
117 {
118 Utils::bytesToWord (helpers.typeAndGroup, statusAndChannel, cc, 0),
120 };
121 return true;
122}
123
125{
126 const auto group = (uint8_t) (helpers.typeAndGroup & 0xf);
127 const auto channel = (uint8_t) (helpers.byte0 & 0xf);
128 const auto bank = groupBanks[group][channel];
129 const auto valid = bank.isValid();
130
131 return PacketX2
132 {
133 Utils::bytesToWord (helpers.typeAndGroup, helpers.byte0, 0, valid ? 1 : 0),
134 Utils::bytesToWord (helpers.byte1, 0, valid ? bank.getMsb() : 0, valid ? bank.getLsb() : 0)
135 };
136}
137
139{
140 return PacketX2
141 {
142 Utils::bytesToWord (helpers.typeAndGroup, helpers.byte0, 0, 0),
144 };
145}
146
148{
149 const auto lsb = helpers.byte1;
150 const auto msb = helpers.byte2;
151 const auto value = (uint16_t) (msb << 7 | lsb);
152
153 return PacketX2
154 {
155 Utils::bytesToWord (helpers.typeAndGroup, helpers.byte0, 0, 0),
157 };
158}
159
161{
162 const auto isStart = cc == 99 || cc == 101;
163
164 if (isStart)
165 {
166 kind = cc == 99 ? PnKind::nrpn : PnKind::rpn;
167 index = 0;
168 }
169
170 bytes[index] = byte;
171
172 const auto shouldContinue = [&]
173 {
174 switch (index)
175 {
176 case 0: return isStart;
177 case 1: return kind == PnKind::nrpn ? cc == 98 : cc == 100;
178 case 2: return cc == 6;
179 case 3: return cc == 38;
180 }
181
182 return false;
183 }();
184
185 index = shouldContinue ? index + 1 : 0;
186
187 if (index != bytes.size())
188 return false;
189
190 index = 0;
191 return true;
192}
193
194}
195}
#define byte
Definition blargg_source.h:87
std::array< uint8_t, 4 > bytes
Definition juce_UMPMidi1ToMidi2DefaultTranslator.h:156
bool addByte(uint8_t cc, uint8_t byte)
Definition juce_UMPMidi1ToMidi2DefaultTranslator.cpp:160
uint8_t index
Definition juce_UMPMidi1ToMidi2DefaultTranslator.h:157
PnKind kind
Definition juce_UMPMidi1ToMidi2DefaultTranslator.h:158
std::array< ChannelBanks, 16 > groupBanks
Definition juce_UMPMidi1ToMidi2DefaultTranslator.h:185
std::array< ChannelAccumulators, 16 > groupAccumulators
Definition juce_UMPMidi1ToMidi2DefaultTranslator.h:182
static PacketX2 processPitchBend(const HelperValues helpers)
Definition juce_UMPMidi1ToMidi2DefaultTranslator.cpp:147
PacketX2 processProgramChange(const HelperValues helpers) const
Definition juce_UMPMidi1ToMidi2DefaultTranslator.cpp:124
bool processControlChange(const HelperValues helpers, PacketX2 &packet)
Definition juce_UMPMidi1ToMidi2DefaultTranslator.cpp:51
static PacketX2 processChannelPressure(const HelperValues helpers)
Definition juce_UMPMidi1ToMidi2DefaultTranslator.cpp:138
static PacketX2 processNoteOnOrOff(const HelperValues helpers)
Definition juce_UMPMidi1ToMidi2DefaultTranslator.cpp:28
static PacketX2 processPolyPressure(const HelperValues helpers)
Definition juce_UMPMidi1ToMidi2DefaultTranslator.cpp:42
@ nrpn
Definition juce_UMPMidi1ToMidi2DefaultTranslator.h:127
@ rpn
Definition juce_UMPMidi1ToMidi2DefaultTranslator.h:127
static PuglViewHint int value
Definition pugl.h:1708
unsigned short uint16_t
Definition mid.cpp:99
unsigned int uint32_t
Definition mid.cpp:100
unsigned char uint8_t
Definition mid.cpp:98
Definition juce_UMP_test.cpp:26
Packet< 2 > PacketX2
Definition juce_UMPacket.h:186
Definition carla_juce.cpp:31
@ group
Definition juce_AccessibilityRole.h:61
static uint32_t scaleTo32(uint8_t word7Bit)
Definition juce_UMPConversion.h:144
static uint16_t scaleTo16(uint8_t word7Bit)
Definition juce_UMPConversion.h:126
Definition juce_UMPMidi1ToMidi2DefaultTranslator.h:130
uint8_t byte0
Definition juce_UMPMidi1ToMidi2DefaultTranslator.h:132
uint8_t typeAndGroup
Definition juce_UMPMidi1ToMidi2DefaultTranslator.h:131
uint8_t byte2
Definition juce_UMPMidi1ToMidi2DefaultTranslator.h:134
uint8_t byte1
Definition juce_UMPMidi1ToMidi2DefaultTranslator.h:133
static constexpr uint32_t bytesToWord(uint8_t a, uint8_t b, uint8_t c, uint8_t d)
Definition juce_UMPUtils.h:38