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::writeChannel(ushort channel, uchar value) { // m_universe contains scaled values (0-127), so we have to compare scaled value as well // however, since writeUniverse scales the value again, we have to store unscaled value. char scaled = DMX2MIDI(value); if (channel < ushort(m_universe.size()) && m_universe[channel] != scaled) { QByteArray tmp(m_universe); for (uchar ch = 0; ch < MAX_MIDI_DMX_CHANNELS && ch < tmp.size(); ++ch) { char midi = tmp[ch]; tmp[ch] = (char)MIDI2DMX(midi); } tmp[channel] = value; writeUniverse(tmp); } }