阅读更多midi数据

  • 本文关键字:midi 数据 c++ 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_OPENn"));
break;
case MIM_CLOSE:
_tprintf_s(_T("wMsg=MIM_CLOSEn"));
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, data1, data2, data3);
break;
default:
_tprintf_s(_T("wMsg = unknownn"));
break;
} 
}

MIDI协议没有使用";和弦";。你所说的和弦只是一系列具有相同(精确或近似(时间的MIDI音符。例如,MIDI音序器在播放音符或在MIDI编辑器中呈现音符时不需要任何和弦。但是,当它在乐谱编辑器中显示音符时,它必须决定如何在和弦中对它们进行逻辑重组,为此,它使用了时间,但也使用了音高范围,有时还使用了MIDI通道,等等。这是乐谱编辑器工作所特有的,而不是MIDI协议所预期的。

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

最新更新