Определите ключевую подпись файла MIDI - PullRequest
0 голосов
/ 07 января 2020

У меня проблемы с анализом ключевой сигнатуры MIDI-файла. подпись времени должна быть в форме ff 59 02 sf mi. Официальная документация MIDI гласит, что sf должно быть значением от 7 до -7, в то время как mi равно 0 или 1. Я предполагаю, что если sf отрицательно, оно сохраняется с использованием дополнения до двух, но как я узнаю когда значение, которое я читаю, дополняет два или нет?

1 Ответ

1 голос
/ 07 января 2020

Мне кажется, что, если байт хранится в дополнении до двух, когда отрицательный, он также сохраняется в дополнении до двух, когда положительный. Одним из преимуществ продажи дополнения к двум является то, что представление положительных значений идентично их двоичному аналогу без знака. Например, 0001 равно +1 в любом представлении. Это означает, что на самом деле не имеет смысла чередовать формат данных между двоичным дополнением и двоичным знаком без знака в зависимости от того, является ли значение положительным.

Если вам интересно, есть ли простой способ повернуть два - закодированные байты в целочисленные значения со знаком, для этого можно использовать модуль struct.

>>> import struct
>>> data = bytes([0xff, 0x59, 0x02, 0xf9, 0x01])
>>> struct.unpack("xxxbb", data)
(-7, 1)

Здесь значение «xxxbb» указывает, что первые три байта следует игнорировать, а следующие два байта числа со знаком, занимающие по 8 бит каждый.


Также можно распаковать данные, хранящиеся в списке строк, путем промежуточного преобразования в байты:

import struct
data = ["ff", "59", "02", "f9", "01"]
data = bytes(int(x, 16) for x in data)
print(struct.unpack("xxxbb", data))
...