Форматы SMF
Обычно секвенсоры используют свой собственный формат хранения аранжировок. Это вызвано тем, что структура данных, разработанная под возможности конкретной программы, гораздо эффективнее, с ней просто-напросто легче работать. В свой формат можно записывать дополнительные данные, например, по настройке пользовательского интерфейса (положение и размер окна, шрифт и так далее). Кроме того, компактность стандартных MIDI-файлов (в частности, величины переменной длины для хранения времени наступления событий) оборачивается неудобством: для работы с аранжировкой все дельта-времена в файле нужно "распаковать", а при сохранении файла снова "запаковать". С другой стороны, SMF — это переносимый межплатформенный формат, в нем можно определять любые дополнительные блоки для хранения специфических данных. Например, один секвенсор может сохранить в блоке с именем "Mtr" состояние метронома — включен или выключен. Другому секвенсору этот блок не помеха, он может определить в том же файле и несколько своих специфических блоков. Так что часть секвенсоров использует формат SMF напрямую, он является для них "родным". Другие позволяют импортировать и экспортировать MIDI-файлы при необходимости. Для поддержки разных типов секвенсоров и другого оборудования стандартные 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. Организация MMA в будущем может разработать другие форматы SMF для поддержки новых структур данных в секвенсорах. Блок заголовка ("MThd")
Отрицательные числа выбраны потому, что записываются в виде двоичного дополнения (см. предыдущую статью), то есть содержат в старшем бите единицу. А эта единица как раз и является признаком абсолютного способа отсчета времени. Число тиков на кадр хранится в положительном варианте и обычно принимает одно из следующих значений: 4 (разрешение как в MIDI Time Code, когда на кадр приходятся четыре сообщения Quarter Frame), 8, 10, 80 (разрешение одного бита в кадре SMPTE) или 100. Такая система позволяет указывать абсолютное время наступления события с точностью до 1/128 кадра. Кроме того, если задать формат кадра 25 fps и разрешение 40 тиков на кадр, то каждый тик будет соответствовать одной миллисекунде. Поле division в этом случае будет иметь значение 0xE728, байт 0xE7 — это запись числа -25 в дополнительном коде, а 0x28 — это число 40 в шестнадцатеричном представлении. Блок трека ("MTrk")
В блоке трека хранятся сами события, то есть MIDI-сообщения, снабженные меткой времени. В блоке должно присутствовать хотя бы одно событие. Структура блока трека одинакова для MIDI-файлов любого формата (0, 1 и 2), рис. 13.
Событие состоит из дельта-времени и самого сообщения MIDI, рис. 14. Напомню, что дельта-время хранится как величина переменной длины.
|