Структура миди-файла. ------------------ Общие принципы midi- формата. Файл миди представляет из себя простой набор событий,базовый набор которых: нажатие на ноту на определенном канале, отпускание ноты на определенном канале и изменение инструмента определенного канала. Но в отличие от файла imy миди-файл- это не простой набор команд, которые выполняются последовательно, а это своеобразный массив событий,имеющих каждое свое время выполнения. События в миди-файле находятся в треках, треки в свою очередь находятся в миди-файле. В треке могут быть события для любых 16каналов, каждый канал может хранить любой из 127инструментов. Все midi файлы состоят из заголовка и минимум одного трека. 1)Заголовок.Заголовок начинатеся со слова "MThd". После него идут четыре байта, которые имеют всегда постоянное значение "6"(это число значит длину заголовка в байтах). После идут два байта ,которые значат тип миди-файла(он может быть трех типов: Тип 0 означает, что файл содержит MIDI-данные, записанные на одном треке, который, вероятно, объединяет в себе все 16 MIDI-каналов. Если ваш секвенсор сохраняет MIDI-данные в одном единственном блоке памяти, из которого он их воспроизводит, то такой секвенсор будет читать и записывать MIDI-данные именно в этот тип MIDI-файлов. Файл типа 1 подразумевает, что в нем содержатся несколько (но возможно и всего один) одновременно воспроизводимых треков, каждый, вероятно, представляет свой собственный MIDI-канал. Все треки начинают воспроизводиться в один и тот же нулевой момент времени. Все треки, взятые вместе, образуют паттерн. Если ваш секвенсор разделяет в памяти различные MIDI-треки и хранит их в различных блоках и воспроизводит различные треки одновременно, то такой секвенсор будет читать и писать файлы типа 1. Файлы типа 2 содержат один или несколько независимых треков, каждый такой трек образует свой собственный паттерн. Если ваш секвенсор разделяет MIDI-данные на несколько блоков в памяти, но воспроизводит лишь один единственный блок в данное время, но не воспроизводит их одновременно, когда каждый блок памяти содержит отдельную пьесу или ее кусок, то этот секвенсор будет читать и записывать MIDI-файлы второго типа.). Следующие два байта хранят количество треков в файле, для типа файла "0" количество треков всегда будет 1. И последние два байта хранят темп (количество временных интервалов на 1/4длительность). 2)Трек. Каждый трек начинается со слова "MTrk". после идут 4байта с размером трека в байтах, причем если размер трека больше 255байт, то третий байт содержит количество полных значений числа 255 а последний байт хранит остаток, то есть например если размер трека 255байт,то размер трека имеет такое значение:"0 0 0 255", а если размер трека 500,то размер трека имеет такое значение:"0 0 1 245". После размера трека начинаются события. события могу быть трех типов: взятие ноты на определенном канале, отпускание ноты на определенном канле и изменение инструмента на определенном канале. Перед каждым событие должно стоять количество временных интервалов, через которые будет происходить событие, интервал могут хранить 1,2,3 или 4 байта в зависимости от значения интервала. После временного интервала пишется тип события в одном байте и его параметры, вот набор типов событий: [128][номер ноты от 0 до 127][громкость от 0 до 127]-отпустить ноту на 1канале. [129][номер ноты от 0 до 127][громкость от 0 до 127]-отпустить ноту на 2канале. ... [143][номер ноты от 0 до 127][громкость от 0 до 127]-отпустить ноту на 16канале. [144][номер ноты от 0 до 127][громкость от 0 до 127]-нажать ноту на 1канале. [145][номер ноты от 0 до 127][громкость от 0 до 127]-нажать ноту на 2канале. ... [159][144][номер ноты от 0 до 127][громкость от 0 до 127]-нажать ноту на 16канале. [192][номер инструмента от 0 до 127]-изменить инструмент 1 канала. [193][номер инструмента от 0 до 127]-изменить инструмент 2 канала. ... [207][номер инструмента от 0 до 127]-изменить инструмент 16 канала. В конце трека стоят три байта "255 47 0" , которые обозначают конец трека. Статью написал пользоватем gost6678 с использованием материалов в википедии.