| 197 | } |
| 198 | |
| 199 | void CardinalPluginContext::writeMidiMessage(const rack::midi::Message& message, const uint8_t channel) |
| 200 | { |
| 201 | if (bypassed) |
| 202 | return; |
| 203 | |
| 204 | const size_t size = message.bytes.size(); |
| 205 | DISTRHO_SAFE_ASSERT_RETURN(size > 0,); |
| 206 | DISTRHO_SAFE_ASSERT_RETURN(message.frame >= 0,); |
| 207 | |
| 208 | MidiEvent event; |
| 209 | event.frame = message.frame; |
| 210 | |
| 211 | switch (message.bytes[0] & 0xF0) |
| 212 | { |
| 213 | case 0x80: |
| 214 | case 0x90: |
| 215 | case 0xA0: |
| 216 | case 0xB0: |
| 217 | case 0xE0: |
| 218 | event.size = 3; |
| 219 | break; |
| 220 | case 0xC0: |
| 221 | case 0xD0: |
| 222 | event.size = 2; |
| 223 | break; |
| 224 | case 0xF0: |
| 225 | switch (message.bytes[0] & 0x0F) |
| 226 | { |
| 227 | case 0x0: |
| 228 | case 0x4: |
| 229 | case 0x5: |
| 230 | case 0x7: |
| 231 | case 0x9: |
| 232 | case 0xD: |
| 233 | // unsupported |
| 234 | return; |
| 235 | case 0x1: |
| 236 | case 0x2: |
| 237 | case 0x3: |
| 238 | case 0xE: |
| 239 | event.size = 3; |
| 240 | break; |
| 241 | case 0x6: |
| 242 | case 0x8: |
| 243 | case 0xA: |
| 244 | case 0xB: |
| 245 | case 0xC: |
| 246 | case 0xF: |
| 247 | event.size = 1; |
| 248 | break; |
| 249 | } |
| 250 | break; |
| 251 | default: |
| 252 | // invalid |
| 253 | return; |
| 254 | } |
| 255 | |
| 256 | DISTRHO_SAFE_ASSERT_RETURN(size >= event.size,); |
no test coverage detected