Распознавание мелодии с помощью нечеткого поиска
Курсовой проект - Компьютеры, программирование
Другие курсовые по предмету Компьютеры, программирование
ательную информацию. Эти данные относятся к одному треку. Очевидно, что количество MTrk записей в файле должно совпадать со значением NumTraks, указанном в записи MThd. Заголовок записи MTrk начинается с идентификатора записи, который представляет собой четыре ASCII байта M, T, r, k, за которым следует значение длины записи, т.е. число, равное количеству байтов в данной записи. Для различных треков значения длин MTrk записей могут быть различны. (Например, трек, содержащий партию скрипки из Концерта Баха, по всей видимости, будет содержать больше данных, чем трек, содержащий басовую партию, в которой на один такт приходится лишь две ноты.)
Трек в MIDI файле аналогичен треку в MIDI секвенсоре. Трек секвенсора содержит последовательность событий. Например, первым событием может быть взятие ноты до первой октавы. Вторым событием может быть взятие ноты ми терцией выше. Эти два события могут произойти в одно и то же время. Третьим событием может быть снятие ноты до. Это событие может произойти несколькими долями позже после первого события (т.е. звук до будет снят спустя несколько долей после того, как он был взят).
В блоке трека хранятся сами события, то есть MIDI-сообщения, снабженные меткой времени. В блоке должно присутствовать хотя бы одно событие. Структура блока трека одинакова для MIDI-файлов любого формата (0, 1, или 2).
Событие состоит из дельта-времени и самого сообщения MIDI (рис. 3). Дельта-время хранится как величина переменной длины.
Рис. 3. Форма записи MIDI-сообщения
Для каждого событие указывается его время, именно в этот момент времени событие происходит, все события организованы в пределах одной записи в памяти секвенсора в порядке их появления во времени. В MIDI файле время события указывается перед байтами данных, которые описывают само событие. Иными словами, временная метка события предшествует описанию события. Например, если первое события происходит спустя 4 временных интервала (временной интервал устанавливается в MThd записи) после начала воспроизведения, то соответствующее ему значение дельта и значение промежутка времени v устанавливается равным 04. Если следующее событие происходит одновременно с этим первым событием, то значение его времени дельта равно 00.
Таким образом, время дельта - это длительность, выраженная в элементарных временных интервалах, между данным событием и ему предшествующим событием. Поскольку предполагается, что все треки начинают воспроизводиться с момента времени равного 0, то время дельта первого события становится равным 0. Однако следующее событие может случиться и через полтора часа (то есть, через несколько миллионов тиков). Как быть в этом случае? Ведь память нужно экономить, а отводить под дельта-время фиксированное поле размеров в несколько байт нежелательно. На помощь приходят так называемые величины переменной длины. Они представляют удобный способ записи целых чисел - от самых малых до самых больших, без необходимости отводить под число фиксированное количество байт. Биты исходного числа упаковываются в один или более байтов: в каждый байт по сеть бит (справа, биты с 0 по 6-ой). Старший бит в байте является служебным. В зависимости от величины времени дельта, количество байтов может быть различным. Для того чтобы отметить последний байт в последовательности этих байтов, необходимо оставить 7-ой бит этого последнего байта чистым (старший бит равен 0).
Так, если время дельта находится в пределах от 0 до 127, то оно может быть выражено одним единственным байтом. Самое большое время дельта устанавливается в размере 0FFFFFFF (268 435 455 тиков, что при темпе в 500 ударов в минуту и разрешении 96 PPQN составляет около четырех суток), для записи такого времени потребуется величина переменной длины размером 4 байта. Время дельта соответствующая величина переменной длины.
В форме величин переменной длины указывается не только дельта-время, но и длина некоторых событий.
Так могут выглядеть величины переменной длины для разных значений времен дельта (время дельта выражено в виде 32-битного значения):
Рис. 4. Примеры чисел в различных формах записи
Первые байты (байт 1 или байты с 1 по 4) записи MTrk задают значение времени дельта для первого события в формате величины переменной длины. Следующий за этой величиной байт данных представляет собой первый байт события MIDI. Это байт носит название байта статуса события или байта текущего MIDI статуса. Для MIDI событий он представляет собой статус байт данного события. Первое событие в блоке трека должно всегда начинаться со статус-байта. MIDI события представляют собой обычные сообщения канала. Она могут быть сохранены (так же, как и при передача) методом Running Status. Суть его проста - если передается серия сообщений с одним и тем же статус-байтом, то достаточно передать только первый статус-байт, а остальные опустить. Такой режим обеспечивает около 30% сжатия. Режим применяется только при передаче голосовых сообщений и сообщений режима канала. Он очень хорошо справляется с потоком сообщений непрерывных контроллеров, таких как колесо модуляции и послекасание.
После статус байта следуют один или два байта данных, в зависимости от типа события. После этих байтов данных находится следующее значение времени дельта (в виде величины переменной длины), и начинается процесс прочтения следующего события.
Особый случай представляют собой сообщения SYSEX, имеющие статус байт, равный F0. События SYSEX могут иметь любую длину. После ?/p>