Пример изменения шага PGMidi - PullRequest
1 голос
/ 25 февраля 2012

Второй день пытаюсь отправить миди-сигнал.Я использую следующий код:

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. </p>

Извините, если вопрос прост.

Ответы [ 2 ]

2 голосов
/ 27 февраля 2012

Данные изменения высоты тона смещены, чтобы избежать проблем со знаковыми битами. Максимальное отрицательное отклонение отправляется как значение ноль, а не -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))
2 голосов
/ 26 февраля 2012

Поскольку байты данных MIDI ограничены 7 битами, вам нужно разделить pitchValue на два 7-битных значения:

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

Редактировать: , как указал @bgporter,Значения колеса тона смещены на 8192, так что «ноль» (т. е. центральное положение) находится на 8192 (0x2000), поэтому я отредактировал свой ответ для смещения pitchValue на 8192.

...