-1

次のように uint32_t があります。

uint32_t midiData=0x9FCC00;

この uint32_t を小さなパーツに分割して、9 が独自のエンティティになり、F が独自のエンティティになり、CC が独自のエンティティになるようにする必要があります。私が何をしているのか疑問に思われるかもしれませんが、プログラムで管理しやすいように、MIDI メッセージの部分を分割しようとしています。

私はこの解決策を見つけましたが、問題はそれを CC セクションに適用する方法がわからないことと、この方法が C++ で機能するかどうかわからないことです。

これが私がこれまでに持っているものです:

uint32_t midiData=0x9FCC00;

uint32_t status = 0x0FFFFF & midiData; // Retrieve 9
uint32_t channel = (0xF0FFFF & midiData)>>4; //Retrieve F
uint32_t note = (0xFF00FF & midiData) >> 8; //Retrieve CC

これは C++ で正しいですか? 私が尋ねる理由は、私が以前に C++ を使用したことがなく、その > と < を使用する構文が常に私を混乱させていたからです (したがって、私はそれを避ける傾向があります)。

4

3 に答える 3

0

一般に、最初にシフトしてからマスクすることをお勧めします-エラーが発生しにくくなります:

uint8_t cmd = (midiData >> 16) & 0xff;
uint8_t note = (midiData >> 8) & 0x7f;     // MSB can't be set
uint8_t velocity = (midiData >> 0) & 0x7f; // ditto

cmd次に、変数を分割します。

uint8_t status = (cmd & 0xf0);             // range 0x00 .. 0xf0
uint8_t channel = (cmd & 0x0f);            // range 0 .. 15

status個人的には、値を 0 .. 15 の範囲にマッピングし直すことは気にしません。たとえば、通常の0x90値ではなく「メモ」であることが一般的に理解されています9

于 2017-05-24T21:47:58.570 に答える