问题描述
要从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协议想要的东西。
无论如何,具有相同定时的音符与其他音符一样被顺序接收。因此,您必须分析接收到的数据以确定它们是否属于和弦。