bool QLCMIDIProtocol::midiToInput(uchar cmd, uchar data1, uchar data2, uchar midiChannel, quint32* channel, uchar* value) { /* Check if cmd is a MIDI COMMAND byte */ if (!MIDI_IS_CMD(cmd)) return false; /** Use a special handler function for system common messages */ if (MIDI_IS_SYSCOMMON(cmd)) return midiSysCommonToInput(cmd, data1, data2, channel, value); /* Check that the command came on the correct MIDI channel */ if (midiChannel <= 0xF && MIDI_CH(cmd) != midiChannel) return false; switch(MIDI_CMD(cmd)) { case MIDI_NOTE_OFF: *channel = CHANNEL_OFFSET_NOTE + quint32(data1); *value = 0; return true; case MIDI_NOTE_ON: *channel = CHANNEL_OFFSET_NOTE + quint32(data1); *value = MIDI2DMX(data2); return true; case MIDI_NOTE_AFTERTOUCH: *channel = CHANNEL_OFFSET_NOTE_AFTERTOUCH + quint32(data1); *value = MIDI2DMX(data2); return true; case MIDI_CONTROL_CHANGE: *channel = CHANNEL_OFFSET_CONTROL_CHANGE + quint32(data1); *value = MIDI2DMX(data2); return true; case MIDI_PROGRAM_CHANGE: *channel = CHANNEL_OFFSET_PROGRAM_CHANGE; *value = MIDI2DMX(data1); return true; case MIDI_CHANNEL_AFTERTOUCH: *channel = CHANNEL_OFFSET_CHANNEL_AFTERTOUCH; *value = MIDI2DMX(data1); return true; case MIDI_PITCH_WHEEL: *channel = CHANNEL_OFFSET_PITCH_WHEEL; *value = MIDI2DMX(data2); return true; default: return false; } }
void AlsaMidiOutputDevice::writeFeedback(uchar cmd, uchar data1, uchar data2) { if (isOpen() == false) return; // Setup a common event structure for all values snd_seq_event_t ev; snd_seq_ev_clear(&ev); snd_seq_ev_set_dest(&ev, m_receiver_address->client, m_receiver_address->port); //snd_seq_ev_set_subs(&ev); snd_seq_ev_set_direct(&ev); uchar midiCmd = MIDI_CMD(cmd); uchar midiCh = MIDI_CH(cmd); bool invalidCmd = false; switch(midiCmd) { case MIDI_NOTE_OFF: snd_seq_ev_set_noteoff(&ev, midiCh, data1, data2); break; case MIDI_NOTE_ON: snd_seq_ev_set_noteon(&ev, midiCh, data1, data2); break; case MIDI_CONTROL_CHANGE: snd_seq_ev_set_controller(&ev, midiCh, data1, data2); break; case MIDI_PROGRAM_CHANGE: snd_seq_ev_set_pgmchange(&ev, midiCh, data1); break; case MIDI_NOTE_AFTERTOUCH: snd_seq_ev_set_keypress(&ev, midiCh, data1, data2); break; case MIDI_CHANNEL_AFTERTOUCH: snd_seq_ev_set_chanpress(&ev, midiCh, data1); break; case MIDI_PITCH_WHEEL: snd_seq_ev_set_pitchbend(&ev, midiCh, ((data1 & 0x7f) | ((data2 & 0x7f) << 7)) - 8192); break; default: // What to do here ?? invalidCmd = true; break; } if (!invalidCmd) { if (snd_seq_event_output(m_alsa, &ev) < 0) qDebug() << "snd_seq_event_output ERROR"; } // Make sure that all values go to the MIDI endpoint snd_seq_drain_output(m_alsa); }