阅读更多Midi数据

问题描述

要从Midi键盘读取数据,我使用以下回调函数,但是:如何管理多个数据? 例如,当同时在键盘上按下多个键(和弦)时?

void CALLBACK midi_in_proc_(HMIDIIN hMidiIn,UINT wMsg,DWORD dwInstance,DWORD dwParam1,DWORD dwParam2)
{
    unsigned char ch_msg,data1,data2,data3;

    switch(wMsg) {
    case MIM_OPEN:
        _tprintf_s(_T("wMsg=MIM_OPEN\n"));
        break;
    case MIM_CLOSE:
        _tprintf_s(_T("wMsg=MIM_CLOSE\n"));
        break;
    case MIM_DATA:
        ch_msg = (unsigned char)(0xFF & dwParam1);
        data1 = (unsigned char)(0xFF & (dwParam1 >> 8));        
        data2 = (unsigned char)(0xFF & (dwParam1 >> 16));       
        data3 = (unsigned char)(0xFF & (dwParam1 >> 24));       
        on_short_message(ch_msg,data3);
        break;
    default:
        _tprintf_s(_T("wMsg = unkNown\n"));
        break;
    }
    
}

解决方法

MIDI协议不使用“和弦”的概念。您所说的和弦只是一系列具有相同(精确或近似)定时的MIDI音符。例如,MIDI音序器在播放音符或将其显示在MIDI编辑器中时不需要任何和弦。但是,当它在乐谱编辑器中显示音符时,它必须决定如何在和弦中进行逻辑上的重新组合,为此,它使用了定时,音高范围(有时是MIDI通道等)。这是特定于乐谱编辑器工作的东西,而不是MIDI协议想要的东西。

无论如何,具有相同定时的音符与其他音符一样被顺序接收。因此,您必须分析接收到的数据以确定它们是否属于和弦。