Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции распечатать мат-л.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.36 Mб
Скачать

4. Запись — набор взаимосвязанных байтов.

Данные всегда хранятся в виде записей. В одном MIDI-файле могут сосуществовать несколько различных записей. Каждая запись может иметь свой собственный размер, то есть количество байтов в различных записях может быть различно. Данные, хранящиеся в одной записи, связаны друг с другом определенным образом. Запись — это по своей сути набор взаимосвязанных байтов.

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

Длина записи не учитывает 8 байт заголовка. Байты длины просто указывают количество байтов в записи, которые следуют за заголовком.

Приведем пример заголовка (здесь байты представлены в шестнадцатеричном виде):

4D 54 68 64 00 00 00 06

Отметим, что первые четыре байта заголовка образуют MThd (то есть первыми четырьмя байтами заголовка являются ASCII значения букв 'M', 'T', 'h', и 'd'). Последующие 4 байта говорят нам, что в записи будет еще 6 байтов, следующих за заголовком. После этих шести байтов должен следовать следующий заголовок записи или же конец MIDI-файла.

Фактически все MIDI-файлы начинаются с заголовка MThd и именно этот факт является указанием на то, что мы имеем дело со стандартным MIDI-файлом).

5. Запись mThd

Запись MThd имеет длину 6 байт и следует за идентификатором MThd и 32 битным числом (00 00 00 06).

Рассмотрим подробно эти 6 байтов, следующих за 8-байтным заголовком в MThd записи.

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

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

Файлы типа 2 содержат один или несколько независимых треков, каждый такой трек образует свой собственный паттерн. Если ваш секвенсор разделяет MIDI-данные на несколько блоков в памяти, но воспроизводит лишь один единственный блок в данное время, но не воспроизводит их одновременно, когда каждый блок памяти содержит отдельную пьесу или ее кусок, то этот секвенсор будет читать и записывать MIDI-файлы второго типа.

Следующие два байта определяют количество треков, хранимых в файле, эти два байта обозначаются NumTracks. Естественно, что для файлов типа 0 значение NumTracks всегда равно 1. Для двух оставшихся типов возможны другие значения.

Оставшиеся два байта указывают величину временного разрешения, то есть количество временных импульсов (временных тиков), приходящихся на одну четвертную длительность, что в виде аббревиатуры английских слов обозначается как PPQN. Например, если ваш секвенсер использует 96 ppqn, то соответствующее поле в заголовке записи будет иметь шестнадцатеричное значение 00 60.

Напротив, если первый байт рассматриваемого поля заголовка отрицателен, то соответствующий формат использует стандарт SMPTE вместо стандарта PPQT. В этом случае первый байт поля временного разрешения принимает значения −24, −25, −29 или −30, что соответствует четырем стандартным типам в стандарте SMPTE. Второй байт (положительная величина) указывает величину разрешения во фрейме. Стандартные величины разрешения фрейма представляют собой 4 (временной код MIDI), 8, 10, 80 (SMPTE) или 100.

Задавая значения фреймов −25 и величину внутрифреймового разрешения 40, можно установить значение временного разрешения длительностью в миллисекунду.

Ниже приводится пример целой записи типа MThd, включая ее заголовок:

4D 54 68 64 MThd идентификатор

00 00 00 06 Длина записи MThd всегда равна 6 байтам

00 01 Формат данного MIDI-файла 1

00 02 В данном файле содержится 2 записи типа MTrk

00 60 The Pulses Per Quarter Note is 96.