LMMS
Loading...
Searching...
No Matches
juce_UMPMidi1ToMidi2DefaultTranslator.h
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
23#ifndef DOXYGEN
24
25namespace juce
26{
28{
29
37{
38public:
40
50 template <typename PacketCallback>
51 void dispatch (const View& v, PacketCallback&& callback)
52 {
53 const auto firstWord = v[0];
54 const auto messageType = Utils::getMessageType (firstWord);
55
56 if (messageType != 0x2)
57 {
58 callback (v);
59 return;
60 }
61
62 const HelperValues helperValues
63 {
64 (uint8_t) ((0x4 << 0x4) | Utils::getGroup (firstWord)),
65 (uint8_t) ((firstWord >> 0x10) & 0xff),
66 (uint8_t) ((firstWord >> 0x08) & 0x7f),
67 (uint8_t) ((firstWord >> 0x00) & 0x7f),
68 };
69
70 switch (Utils::getStatus (firstWord))
71 {
72 case 0x8:
73 case 0x9:
74 {
75 const auto packet = processNoteOnOrOff (helperValues);
76 callback (View (packet.data()));
77 return;
78 }
79
80 case 0xa:
81 {
82 const auto packet = processPolyPressure (helperValues);
83 callback (View (packet.data()));
84 return;
85 }
86
87 case 0xb:
88 {
89 PacketX2 packet;
90
91 if (processControlChange (helperValues, packet))
92 callback (View (packet.data()));
93
94 return;
95 }
96
97 case 0xc:
98 {
99 const auto packet = processProgramChange (helperValues);
100 callback (View (packet.data()));
101 return;
102 }
103
104 case 0xd:
105 {
106 const auto packet = processChannelPressure (helperValues);
107 callback (View (packet.data()));
108 return;
109 }
110
111 case 0xe:
112 {
113 const auto packet = processPitchBend (helperValues);
114 callback (View (packet.data()));
115 return;
116 }
117 }
118 }
119
120 void reset()
121 {
123 groupBanks = {};
124 }
125
126private:
127 enum class PnKind { nrpn, rpn };
128
136
137 static PacketX2 processNoteOnOrOff (const HelperValues helpers);
138 static PacketX2 processPolyPressure (const HelperValues helpers);
139
140 bool processControlChange (const HelperValues helpers, PacketX2& packet);
141
142 PacketX2 processProgramChange (const HelperValues helpers) const;
143
144 static PacketX2 processChannelPressure (const HelperValues helpers);
145 static PacketX2 processPitchBend (const HelperValues helpers);
146
148 {
149 public:
150 bool addByte (uint8_t cc, uint8_t byte);
151
152 const std::array<uint8_t, 4>& getBytes() const noexcept { return bytes; }
154
155 private:
156 std::array<uint8_t, 4> bytes;
159 };
160
161 class Bank
162 {
163 public:
164 bool isValid() const noexcept { return ! (msb & 0x80); }
165
166 uint8_t getMsb() const noexcept { return msb & 0x7f; }
167 uint8_t getLsb() const noexcept { return lsb & 0x7f; }
168
169 void setMsb (uint8_t i) noexcept { msb = i & 0x7f; }
170 void setLsb (uint8_t i) noexcept { msb &= 0x7f; lsb = i & 0x7f; }
171
172 private:
173 // We use the top bit to indicate whether this bank is valid.
174 // After reading the spec, it's not clear how we should determine whether
175 // there are valid values, so we'll just assume that the bank is valid
176 // once either the lsb or msb have been written.
177 uint8_t msb = 0x80;
178 uint8_t lsb = 0x00;
179 };
180
181 using ChannelAccumulators = std::array<PnAccumulator, 16>;
182 std::array<ChannelAccumulators, 16> groupAccumulators;
183
184 using ChannelBanks = std::array<Bank, 16>;
185 std::array<ChannelBanks, 16> groupBanks;
186};
187
188}
189}
190
191#endif
#define noexcept
Definition DistrhoDefines.h:72
Definition juce_UMPMidi1ToMidi2DefaultTranslator.h:162
uint8_t getMsb() const noexcept
Definition juce_UMPMidi1ToMidi2DefaultTranslator.h:166
bool isValid() const noexcept
Definition juce_UMPMidi1ToMidi2DefaultTranslator.h:164
uint8_t getLsb() const noexcept
Definition juce_UMPMidi1ToMidi2DefaultTranslator.h:167
uint8_t lsb
Definition juce_UMPMidi1ToMidi2DefaultTranslator.h:178
void setLsb(uint8_t i) noexcept
Definition juce_UMPMidi1ToMidi2DefaultTranslator.h:170
void setMsb(uint8_t i) noexcept
Definition juce_UMPMidi1ToMidi2DefaultTranslator.h:169
uint8_t msb
Definition juce_UMPMidi1ToMidi2DefaultTranslator.h:177
Definition juce_UMPMidi1ToMidi2DefaultTranslator.h:148
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 getKind() const noexcept
Definition juce_UMPMidi1ToMidi2DefaultTranslator.h:153
PnKind kind
Definition juce_UMPMidi1ToMidi2DefaultTranslator.h:158
const std::array< uint8_t, 4 > & getBytes() const noexcept
Definition juce_UMPMidi1ToMidi2DefaultTranslator.h:152
std::array< ChannelBanks, 16 > groupBanks
Definition juce_UMPMidi1ToMidi2DefaultTranslator.h:185
std::array< ChannelAccumulators, 16 > groupAccumulators
Definition juce_UMPMidi1ToMidi2DefaultTranslator.h:182
std::array< PnAccumulator, 16 > ChannelAccumulators
Definition juce_UMPMidi1ToMidi2DefaultTranslator.h:181
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
void dispatch(const View &v, PacketCallback &&callback)
Definition juce_UMPMidi1ToMidi2DefaultTranslator.h:51
std::array< Bank, 16 > ChannelBanks
Definition juce_UMPMidi1ToMidi2DefaultTranslator.h:184
PnKind
Definition juce_UMPMidi1ToMidi2DefaultTranslator.h:127
@ nrpn
Definition juce_UMPMidi1ToMidi2DefaultTranslator.h:127
void reset()
Definition juce_UMPMidi1ToMidi2DefaultTranslator.h:120
const uint32_t * data() const noexcept
Definition juce_UMPacket.h:174
Definition juce_UMPView.h:46
unsigned v[N_MAX]
Definition inflate.c:1584
register unsigned i
Definition inflate.c:1575
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
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 uint8_t getStatus(uint32_t w) noexcept
Definition juce_UMPUtils.h:110
static constexpr uint8_t getGroup(uint32_t w) noexcept
Definition juce_UMPUtils.h:109
static constexpr uint8_t getMessageType(uint32_t w) noexcept
Definition juce_UMPUtils.h:108
RECT const char void(* callback)(const char *droppath))) SWELL_API_DEFINE(BOOL
Definition swell-functions.h:1004
#define const
Definition zconf.h:137