我知道这应该很容易但...... 我正在尝试从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
但这似乎没有给我正确的价值。
答案 0 :(得分:4)
首先,并非所有MIDI信息都包含频道。 (例如,时钟消息和sysex消息不会。)带有通道的消息称为“语音”消息。
为了确定任意MIDI消息是否是语音消息,您需要检查第一个字节的前4位。然后,一旦您知道有语音消息,该通道就位于第一个字节的低4位。
语音留言在0x8n
和0xEn
之间,其中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。