1

2日目にMIDI信号を送ろうとしています。私は次のコードを使用しています:

int pitchValue = 8191 //or -8192;
int msb = ?;
int lsb = ?;
UInt8 midiData[]  = { 0xe0, msb,  lsb};
[midi sendBytes:midiData size:sizeof(midiData)];

msb と lsb の計算方法がわかりません。私は、pitchValue << 8 を試してみました。-8192 と +8191 を取得したい。

質問が簡単でしたら申し訳ありません。

4

2 に答える 2

2

pitchValueMIDI データ バイトは 7 ビットに制限されているため、 2 つの 7 ビット値に分割する必要があります。

int msb = (pitchValue + 8192) >> 7 & 0x7F;
int lsb = (pitchValue + 8192) & 0x7F;

編集: @bgporter が指摘したように、ピッチ ホイールの値は 8192 だけオフセットされるため、「ゼロ」(つまり、中心位置) は 8192 (0x2000) になるため、pitchValue を 8192 だけオフセットするように回答を編集しました。

于 2012-02-26T17:50:15.317 に答える
2

ピッチ ベンド データは、符号ビットの問題を回避するためにオフセットされます。最大の負の偏差は、-8192 ではなくゼロの値として送信されるため、次の Python コードのように補正する必要があります。

def EncodePitchBend(value):
    ''' return a 2-tuple containing (msb, lsb) '''
    if (value < -8192) or (value > 8191):
        raise ValueError
    value += 8192
    return (((value >> 7) & 0x7F), (value & 0x7f))
于 2012-02-27T19:06:04.343 に答える