Распознавание мелодии с помощью нечеткого поиска

Курсовой проект - Компьютеры, программирование

Другие курсовые по предмету Компьютеры, программирование

времени (импульсов, тиков) необходимо подождать перед тем, как исполнить следующее событие MIDI). Этот формат позволяет сохранять информацию о темпе, временном разрешении, выраженном в количестве тиков на одну четвертную длительность (или во временных единицах, приходящихся на одну секунду, в формате SMPTE. Формат времени SMPTE - часы: минуты: секунды: кадры.), обозначения размера, информацию о музыкальных ключах, а также хранить названия треков и паттернов. Формат предусматривает возможность сохранения в одном файле нескольких паттернов и треков таким образом, что программы-приложения могут выбирать из всего набора хранимой информации ту, которая будет понятна данному приложению.

Данные всегда хранятся в виде записей. В одном MIDI-файле могут сосуществовать несколько различных записей. Каждая запись может иметь свой собственный размер, т.е. количество байтов в различных записях может быть различно. Данные, хранящиеся в одной записи, связаны друг с другом определенным образом. Каждая запись начинается с указания ее идентификатора, который состоит из четырех букв, т.е. из четырех ASCII байтов. Этот идентификатор указывает, какой тип записи представлен в содержащихся в записи байтах данных. Последующие за идентификатором четыре байта (каждый из которых состоит из 8 бит) образуют 32-битное значение, указывающее длину (или размер) данной записи. Все записи должны начинаться с этих двух полей: идентификатора записи и размера записи. Эти два поля, занимающие всего 8 байт, образуют заголовок записи.

Стандартные MIDI-файлы подразделяются на три разновидности или формата: 0, 1 и 2.

Рассмотрим их подробнее:

Файл формата 0 содержит один трек, в который помещаются события со всех шестнадцати MIDI-каналов. Это наиболее простой формат для обмена данными, так как в нем не учитывается исходная структура треков в секвенсоре (какой трек на какой MIDI-канал назначен). Файл формата 0 более приспособлен для переноса данных на такие устройства, как микшеры и процессоры эффектов, чем для сохранения аранжировок. При записи файла в формате 0 секвенсор просто сливает все сообщения со всех MIDI-каналов в один трек. Соответственно, при загрузке файла мы получаем одну дорожку, редактировать события на которой проблематично, поскольку события для разных каналов перемежаются друг с другом. Большинство секвенсоров имеют функцию разделения подобного микса по отдельным трекам, на каждый из которых помещаются события для одного MIDI-канала.

Файл формата 1 содержит отдельный трек для каждого MIDI-канала, что отражает привычную структуру аранжировки в секвенсоре.

Файл формата 2 содержит в себе несколько независимых произведений (или законченных паттернов), каждый паттерн состоит из одного трека, содержащего сообщения по всем 16-ти каналам. Этот формат предполагалось использовать в тех секвенсорах, которые могут работать с независимыми паттернами, исполняемыми несколькими инструментами одновременно. Однако формат 2 был повсеместно проигнорирован и в настоящее время рассматривается в спецификации как не предназначенный для секвенсоров.

Одним из главных отличий формата 0 и 1 является способ размещения мета-событий. В формате 0 мета-события темпа и размера (так называемая карта темпа) перемешиваются с другими MIDI-сообщениями. Кроме того, названия треков в этом формате не сохраняются. В формате 1 первый трек в файле отводится исключительно под карту темпа и другие мета-события, такие как Sequence/Track Name, Sequence Number, Marker, SMPTE Offset (см. далее). В случае отсутствия в файле карты темпа, темп принимается равным 120 BPM, а размер - 4/4.

Блок заголовка MThd имеет идентификатор MThd и длину 6 байт (рис. 1). Фактически все MIDI файлы начинаются с заголовка MThd, и именно этот факт является указанием на то, что мы имеем дело со стандартным MIDI файлом. Данные заголовка представляют собой три 16-битных слова. Первое слово (format) - формат SMF, может принимать одно из трех значений - 0, 1 и 2. Второе слово (ntrks) - число блоков треков (то есть самих треков) в файле. Для файла формата 0 оно будет всегда равно единице.

 

Рис. 1. Структура блока MThd

 

Последнее слово блока заголовка (division) задает способ измерения времени (timebase). Существуют два способа: музыкальный (такты / доли) и абсолютный (time-code-based), основанный на абсолютном времени. В любом случае дельта-время в файле измеряется тиками: при музыкальном способе задается количество тиков, приходящихся на четверть (то есть, PPQN (Pulse Per Quarter Note)), при абсолютном - количество тиков в одном SMPTE-кадре. Если старший (15-й) бит поля division сброшен в ноль, то используется музыкальный способ, а оставшиеся 15 бит содержат PPQN (до 32767)

Небольшое отступление: на самом деле, внутри секвенсора никаких тиков нет. Есть аппаратный таймер, который генерирует импульсы со строго постоянной частотой (например, каждую микросекунду). Дельта-время - разница в тиках между данным событием и предыдущим (либо началом песни). Подробнее о дельта-времени и его форме записи будет описано далее.

За записью MThd следует MTrk запись (рис. 2). Это единственный тип записи, отличающийся от MThd записи, который определен для MIDI файлов в настоящее время. Если по какой-либо причине в файле содержится идентификатор какой-либо записи другого типа, то, вероятно, эта запись создана для какой-либо другой программы, и эта запись должна быть проигнорирована в соответствии с указанной в ее заголовке длиной данной записи.

 

Рис. 2. Структура блока MTrk

запись содержит в себе MIDI данные и байты временных меток, а также необяз