Как получить целочисленное значение из байтового массива, возвращенного MetaMessage.getData()?
Мне нужно получить значение темпа из файла MIDI. Я обнаружил, что команда set_tempo имеет значение 0x51, поэтому у меня есть этот кусок кода:
for (int i = 0; i < tracks[0].size(); i++) {
MidiEvent event = tracks[0].get(i);
MidiMessage message = event.getMessage();
if (message instanceof MetaMessage) {
MetaMessage mm = (MetaMessage) message;
if(mm.getType()==SET_TEMPO){
// now what?
mm.getData();
}
}
}
Но метод getData() возвращает массив байтов! Как я могу преобразовать это в нормальную человеческую форму, иначе целое число? Я читал, что он хранится в формате, подобном следующему: "tt tt tt", но весь большой / маленький порядок байтов, со знаком / без знака и переменной длины делает его слишком запутанным.
2 ответа
Tempo - это 3-байтовое целое число с прямым порядком байтов, а число битов в минуту рассчитывается какBPM = 60,000,000 / (tt tt tt)
byte[] data = mm.getData();
int tempo = (data[0] & 0xff) << 16 | (data[1] & 0xff) << 8 | (data[2] & 0xff);
int bpm = 60000000 / tempo;
Я использую:
mpq = ((data[0] & 0x7f) << 14) | ((data[1] & 0x7f) << 7) | (data[2] & 0x7f);
куда mpq
представляет микросекунды на четверть ноты или микросекунды на удар.
Это объясняется тем, что сообщения Midi используют только 7 бит в каждом байте для представления данных. Следует также отметить, что в Java
тип данных байта (из которых данные являются массивом) является целым числом со знаком и имеет место только для 7 бит данных.
После создания этого поста я получил следующий ответ от Ассоциации MIDI:
Номер параметра (tttttt) представляет собой 24-разрядное целое число без знака в формате с прямым порядком байтов.
"Установить темп" - это мета-событие, принадлежащее спецификации SMF. Он применяется только к стандартным MIDI-файлам и, как и другие мета-события, не должен передаваться по проводам в режиме реального времени. С другой стороны, описание байта данных, которое вас смущает, применяется к протоколу беспроводной связи.
Исходный ответ на эту тему, следовательно, правильный.