1

我正在尝试第二天发送一个 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。但它工作不正确,当我使用 midi 工具查看事件时,我看到最小值 -8192 和 +8064 最大值。我想得到-8192和+8191。

对不起,如果问题很简单。

4

2 回答 2

2

由于 MIDI 数据字节限制为 7 位,因此您需要拆分pitchValue为两个 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 回答