Как извлечь темп из файла MIDI - PullRequest
0 голосов
/ 15 марта 2019

Я использую встроенный метод sequence.getResolution (), чтобы извлечь длительность удара в миллисекундах. Это работает для некоторых песен, но не для всех. Например, для песни «Sweet Home Alabama» он возвращает ритм 384 мс, однако в реальной жизни фактическая длина бита составляет 612 мс. Это работает для бесчисленных других песен и работает только для одной из песен, с которыми я работаю.

Любой другой способ правильного извлечения bpm или темпа MIDI-файла с использованием java был бы очень признателен

1 Ответ

0 голосов
/ 15 марта 2019

Темп автоматически определяется в файле MIDI.Используя класс MetaMessage в javax.sound.MIDI и метод getData (), вы получите байты метаданных.Байты с меткой 0x51 содержат значение темпа, измеренное в микросекундах на четвертную ноту для каждой дорожки.Обратите внимание, что каждый MIDI-файл обычно имеет несколько дорожек;отсюда несколько темповых подписей.Посмотрите на схему ссылки на структуру MIDI ниже.Он объясняет каждый фрагмент данных файла MIDI и где и что все это означает.

Вот ссылка на схему структуры MIDI: http://www.ccarh.org/courses/253/handout/smf/

Вот ссылка на MetaMessageКласс: https://docs.oracle.com/javase/8/docs/api/javax/sound/midi/MetaMessage.html

Вот ссылка на стандартный формат файла MIDI: https://formats.kaitai.io/standard_midi_file/index.html

Простая сводка: 11-й и 12-й байт = количество дорожек.Это находится в заголовке, который имеет длину 14 байтов.Далее следует фрагмент трека, затем еще один, и еще один столько раз, сколько определено в 11-м и 12-м байтах.Каждый из них имеет длину, определенную в 5, 6, 7 и 8 байтах в чанке.Длина измеряет количество байтов дорожки (начиная с 9-го байта).

...