Beispiel #1
0
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);
    }
}