0

これは簡単なはずですが... 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

しかし、それは私に正しい値を与えていないようでした。

4

1 に答える 1

4

まず第一に、すべての MIDI メッセージにチャンネルがあるわけではありません。(たとえば、クロック メッセージと sysex メッセージはそうではありません。) チャネルを含むメッセージは、「音声」メッセージと呼ばれます。

任意の MIDI メッセージが音声メッセージかどうかを判断するには、最初のバイトの上位 4 ビットをチェックする必要があります。次に、音声メッセージがあることがわかったら、チャネルは最初のバイトの下位 4 ビットにあります。

ボイス メッセージは と の間に0x8nあります。 はチャネルです。0xEnn

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 を減算する必要があります。

于 2013-04-13T23:15:52.830 に答える