|
1 | 1 | // |
2 | 2 | // Created by Syl Morrison on 20/10/2024. |
3 | 3 | // |
| 4 | +#include "mostly_harmless/utils/mostlyharmless_Visitor.h" |
| 5 | + |
| 6 | + |
4 | 7 | #include <mostly_harmless/mostlyharmless_PluginBase.h> |
5 | 8 | #include <mostly_harmless/utils/mostlyharmless_Macros.h> |
6 | 9 | #include <mostly_harmless/audio/mostlyharmless_AudioHelpers.h> |
7 | 10 | #include <mostly_harmless/utils/mostlyharmless_NoDenormals.h> |
| 11 | +#include <mostly_harmless/events/mostlyharmless_MidiEvent.h> |
8 | 12 | #include <clap/helpers/plugin.hxx> |
9 | 13 |
|
10 | 14 | namespace mostly_harmless::internal { |
11 | | - namespace midi_headers { |
12 | | - constexpr static auto s_note_off{ 0x80 }; |
13 | | - constexpr static auto s_note_on{ 0x90 }; |
14 | | - constexpr static auto s_poly_aftertouch{ 0xA0 }; |
15 | | - constexpr static auto s_control_change{ 0xB0 }; |
16 | | - constexpr static auto s_program_change{ 0xC0 }; |
17 | | - constexpr static auto s_channel_aftertouch{ 0xD0 }; |
18 | | - constexpr static auto s_pitch_wheel{ 0xE0 }; |
19 | | - } // namespace midi_headers |
20 | 15 | PluginBase::PluginBase(const clap_host* host) : clap::helpers::Plugin<clap::helpers::MisbehaviourHandler::Ignore, clap::helpers::CheckingLevel::Maximal>(&getDescriptor(), host) { |
21 | 16 | MH_LOG("PROC: Creating plugin instance..."); |
22 | 17 | m_pluginEntry = core::createPluginEntry(); |
@@ -177,53 +172,33 @@ namespace mostly_harmless::internal { |
177 | 172 | // 0PPP PPPP |
178 | 173 | // 0VVV VVVV |
179 | 174 | const auto* midiEvent = reinterpret_cast<const clap_event_midi*>(event); |
180 | | - const std::uint8_t message = midiEvent->data[0] & 0xF0; // SSSS 0000 - Message will be << 4 |
181 | | - const std::uint8_t channel = midiEvent->data[0] & 0x0F; // 0000 CCCC |
182 | | - switch (message) { |
183 | | - case midi_headers::s_note_on: [[fallthrough]]; |
184 | | - case midi_headers::s_note_off: { |
185 | | - const std::uint8_t note = midiEvent->data[1]; // 0PPP PPPP |
186 | | - const std::uint8_t velocity = midiEvent->data[2]; // 0VVV VVVV |
187 | | - const auto fpVelocity = static_cast<double>(velocity) / 127.0; |
188 | | - if (message == midi_headers::s_note_on) { |
189 | | - m_engine->handleNoteOn(midiEvent->port_index, channel, note, fpVelocity); |
190 | | - } else { |
191 | | - m_engine->handleNoteOff(midiEvent->port_index, channel, note, fpVelocity); |
192 | | - } |
193 | | - break; |
194 | | - } |
195 | | - case midi_headers::s_poly_aftertouch: { |
196 | | - const std::uint8_t note = midiEvent->data[1]; |
197 | | - const std::uint8_t pressure = midiEvent->data[2]; |
198 | | - m_engine->handlePolyAftertouch(midiEvent->port_index, channel, note, pressure); |
199 | | - break; |
200 | | - } |
201 | | - case midi_headers::s_control_change: { |
202 | | - const std::uint8_t controllerNumber = midiEvent->data[1]; |
203 | | - const std::uint8_t data = midiEvent->data[2]; |
204 | | - m_engine->handleControlChange(midiEvent->port_index, channel, controllerNumber, data); |
205 | | - break; |
206 | | - } |
207 | | - case midi_headers::s_program_change: { |
208 | | - const std::uint8_t programNumber = midiEvent->data[1]; |
209 | | - m_engine->handleProgramChange(midiEvent->port_index, channel, programNumber); |
210 | | - break; |
211 | | - } |
212 | | - case midi_headers::s_channel_aftertouch: { |
213 | | - const std::uint8_t pressure = midiEvent->data[1]; |
214 | | - m_engine->handleChannelAftertouch(midiEvent->port_index, channel, pressure); |
215 | | - break; |
216 | | - } |
217 | | - case midi_headers::s_pitch_wheel: { |
218 | | - const std::uint8_t lsb = midiEvent->data[1]; |
219 | | - const std::uint8_t msb = midiEvent->data[2]; |
220 | | - const std::uint16_t combined = lsb & (msb << 7); |
221 | | - m_engine->handlePitchWheel(midiEvent->port_index, channel, combined); |
222 | | - break; |
223 | | - } |
224 | | - default: break; |
| 175 | + auto res = mostly_harmless::events::midi::parse(midiEvent->data[0], midiEvent->data[1], midiEvent->data[2]); |
| 176 | + if (!res) { |
| 177 | + return; |
225 | 178 | } |
226 | | - break; |
| 179 | + std::visit(utils::Visitor{ |
| 180 | + [this, &midiEvent](events::midi::NoteOff x) { |
| 181 | + m_engine->handleNoteOff(midiEvent->port_index, x.channel, x.note, x.velocity); |
| 182 | + }, |
| 183 | + [this, &midiEvent](events::midi::NoteOn x) { |
| 184 | + m_engine->handleNoteOn(midiEvent->port_index, x.channel, x.note, x.velocity); |
| 185 | + }, |
| 186 | + [this, &midiEvent](events::midi::PolyAftertouch x) { |
| 187 | + m_engine->handlePolyAftertouch(midiEvent->port_index, x.channel, x.note, x.pressure); |
| 188 | + }, |
| 189 | + [this, &midiEvent](events::midi::ControlChange x) { |
| 190 | + m_engine->handleControlChange(midiEvent->port_index, x.channel, x.controllerNumber, x.data); |
| 191 | + }, |
| 192 | + [this, &midiEvent](events::midi::ProgramChange x) { |
| 193 | + m_engine->handleProgramChange(midiEvent->port_index, x.channel, x.programNumber); |
| 194 | + }, |
| 195 | + [this, &midiEvent](events::midi::ChannelAftertouch x) { |
| 196 | + m_engine->handleChannelAftertouch(midiEvent->port_index, x.channel, x.pressure); |
| 197 | + }, |
| 198 | + [this, &midiEvent](events::midi::PitchWheel x) { |
| 199 | + m_engine->handlePitchWheel(midiEvent->port_index, x.channel, x.value); |
| 200 | + } }, |
| 201 | + *res); |
227 | 202 | } |
228 | 203 | case CLAP_EVENT_TRANSPORT: { |
229 | 204 | if (const auto* transportEvent = reinterpret_cast<const clap_event_transport_t*>(event)) { |
|
0 commit comments