【问题标题】:Read more midi data阅读更多 midi 数据
【发布时间】:2020-10-12 18:43:28
【问题描述】:

要从 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, data1, data2, data3);
        break;
    default:
        _tprintf_s(_T("wMsg = unknown\n"));
        break;
    } 
}

【问题讨论】:

  • 没有任何事情发生在同一时刻;弹奏和弦将发送有关事件的一系列音符。

标签: c++ midi


【解决方案1】:

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

无论如何,具有相同时序的音符会与其他音符一样按顺序接收。所以你必须分析接收到的数据来决定它们是否是和弦的成员。

【讨论】:

  • 是的。要检测和弦,您需要更复杂的东西,而不是简单地重新组合具有完全相同时间的音符。例如,您可以在十六分之一的网格上“量化”(四舍五入)这些时间。但要做到这一点,您首先必须从可能以毫秒表示的时间中计算出十六分之一的持续时间(您需要选择一个速度来进行转换)以及网格的开始位置。跨度>
猜你喜欢
  • 1970-01-01
  • 2014-01-20
  • 2016-04-27
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 2015-06-22
  • 2017-07-11
  • 2014-10-10
相关资源
最近更新 更多