Как получить целочисленное значение из байтового массива, возвращенного 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-файлам и, как и другие мета-события, не должен передаваться по проводам в режиме реального времени. С другой стороны, описание байта данных, которое вас смущает, применяется к протоколу беспроводной связи.

Исходный ответ на эту тему, следовательно, правильный.

Другие вопросы по тегам