从midistatus获取MIDI通道

时间:2013-04-13 22:57:48

标签: midi coremidi

我知道这应该很容易但...... 我正在尝试从midiStatus消息中获取MIDI通道号。

我有MIDI信息:

MIDIPacket *packet = (MIDIPacket*)pktList->packet;

 for(int i = 0; i<pktList->numPackets; i++){  
      Byte midiStatus = packet->data[0];
      Byte midiCommand = midiStatus>>4; 


      if(midiCommand == 0x80){} ///note off
      if(midiCommand == 0x90){} ///note on
}

我试过

  Byte midiChannel = midiStatus - midiCommand

但这似乎没有给我正确的价值。

1 个答案:

答案 0 :(得分:4)

首先,并非所有MIDI信息都包含频道。 (例如,时钟消息和sysex消息不会。)带有通道的消息称为“语音”消息。

为了确定任意MIDI消息是否是语音消息,您需要检查第一个字节的前4位。然后,一旦您知道有语音消息,该通道就位于第一个字节的低4位。

语音留言在0x8n0xEn之间,其中n是频道。

Byte midiStatus = packet->data[0];
Byte midiCommand = midiStatus & 0xF0;  // mask off all but top 4 bits

if (midiCommand >= 0x80 && midiCommand <= 0xE0) {
    // it's a voice message
    // find the channel by masking off all but the low 4 bits
    Byte midiChannel = midiStatus & 0x0F;

    // now you can look at the particular midiCommand and decide what to do
}

另请注意,MIDI通道在消息中介于0-15之间,但通常会在1-16之间呈现给用户。在向用户显示频道之前,您必须添加1,如果从用户获取值,则必须减1。