PC Help

 Към заглавната страница на PC HelpТърсене


Уроци

MIDI - преговор и Стандартни MIDI-файлове

MIDI хардуер

MIDI (Musical Instrument Digital Interface = Цифров интерфейс за музикални инструменти) използва токов кръг 5 mA, отговарящ на лог. 0.  В интервала между данните (лог. 1) ток не тече.  Данните се предават асинхронно, с 8 информационни бита (първо най-младшият), един стартов бит (лог. 0) и един стопов бит (лог. 1), без контрол по четност.  Скоростта на предаването е 31250 бита в секунда.

Използват се съединители-петици (DIN), а кабелът е екранирана усукана двойка.  Ширмовката се свързва към краче 2 и от двата му края.  Това краче остава свободно на входа MIDI IN (виж Фиг. A) и по този начин се получава Фарадеев кафез (екранът е свързан само в единия край - на изхода).  Изходът MIDI THRU е незадължителен и се използва за свързване на един изход към повече входове на принципа "маргаритка" (daisy-chain), защото при токовия кръг един физически изход може да се свърже само към един-единствен физически вход.

MIDI протокол

MIDI е сравнително прост комуникационен протокол.  Едно MIDI съобщение се състои от един или повече байтове в зависимост от съобщението.  Има две категории MIDI съобщения:  канално съобщение и системно съобщение.

Каналните съобщения съставят по-голямата част от MIDI протокола, тъй като те отговарят за неща като ноти и програмни промени.  Форматът на каналното MIDI съобщение е: 
midi_канално_съобщение := [състояние] байт_данни [байт_данни]

[състояние] означава типа на каналното съобщение и номер на MIDI канала, на който принадлежи състоянието.  Най-старшият бит (бит 7) на байта на състоянието е винаги установен в 1. (Или обратното - байт с установен най-старши бит е байт на състоянието).  Броят на данновите байтове зависи от състоянието (в синтакса [] означава незадължителен).

Байтът на състоянието на каналното съобщение е във формата 0xSC.  Тетрадата S е типът на съобщението, а C е MIDI каналът, на който състоянието принадлежи.  Тъй като по дефиниция най-старшият бит на тетрадата S е 1, това позволява 8 възможни типа съобщения (8, 9, 0xA, ..., 0xF).  Но 0xF е запазено за системните съобщения, така че остават 7 възможни типа.  От своя страна тетрадата С е 4 бита, затова тя може да дефинира канали от 0x00 до 0x0F, или по-просто казано, канали от 1 до 16.  Например ето един обикновен байт на състоянието:  0x90.  Това е "нота включена" за канал 1.

Що се отнася до каналното съобщение, има едно важно понятие:  текущо състояние.  Когато имаме текущо състояние, се предават само данновите байтове на съобщението.  Например, ако е изпратено съобщение с точно определено състояние "нота включена" за канал 1 (0x90), тогава "нота включена" за канал 1 става текущо състояние.  По този начин следващата "нота включена" може да бъде предадена чрез предаване само на данновите байтове, свързани със съобщението "нота включена".  Когато пристигне байтът за състояние на каналното съобщение, текущото състояние се променя в ново състояние.

Има три типа системни съобщения:  обикновени, в реално време и специални.  Форматът на всяко едно от тези съобщения е различен и ние ще ги обсъдим малко по-късно.

В MIDI има доста специални случаи, но има един, който трябва да изясним, защото той е в постоянна употреба.  Съобщение "нота включена" (0x90) със скорост 0 винаги се интерпретира като нота изключена (0x80).  Това е залегнало в MIDI спецификацията, за да могат нотите с веднъж установено текущо състояние да се изключат без промяна на текущото състояние на "нота изключена".  Без този специален случай, където "нота включена" е всъщност "нота изключена", понятието за текущо състояние щеше да бъде без голяма стойност.  Това е така, защото всъщност самото предназначение на текущото състояние е да съкрати информационния поток в MIDI.

Нека да погледнем един пример за информационния поток в MIDI, за да се уверим, че разбираме текущото състояние и двете различни употреби на "нота включена".

0x90 0x41 0x40   0x41 0x00     0x91 0x42 0x40    0x81 0x42 0x40
--------------   ---------     --------------    --------------
  нота вкл.      нота вкл.       нота вкл.         нота вкл.
  нота=0x41      нота=0x41       нота=0x42         нота=0x42
  ск.=0x40       ск.=0x00        ск.=0x40          ск.=0x40

Има 5 общи системни съобщения.  Те винаги отменят текущото състояние.  Има 6 системни съобщения за реално време.  Обърнете внимание, че съобщениятя в реално време се състоят от един-единствен байт на състоянието.  Също така, съобщенията в реално време не отменят текущото състояние и те могат да се появат навсякъде, дори по средата на друго съобщение!

И накрая, има системни специални съобщения.  Както общите съобщения, специалните съобщения винаги отмянят текущото състояние.  Системното специално съобщение започва с 0XF0 и завършва с 0XF7 или някакъв друг байт на състояние за нереално време.  Следователно, информационните байтове на системното специално съобщение никога не могат да имат установен най-старши бит.  Този факт води до многобройни схеми за преминаване на 8-битова информация през механизъм, проектиран за 7-битова информация.  Това е може би един от най-големите пропуски при проектирането на MIDI протокола.

Системните специални съобщения се използват за предаване на пакети и други видове информация, специфична за всяко MIDI устройство.
 
 

Спецификация MIDI 1.0

Състояние   Байт(ове) данни      ОписаниеD7----D0    D7----D0
-----------------------------------------------------------------
Канални съобщения за гласовете
-----------------------------------------------------------------
1000cccc    0nnnnnnn    Събитие "Нота изключена"
            0vvvvvvv    Това съобщение се предава, когато е
                        освободен клавишът на дадената нота.
                        (nnnnnnn) е номерът на нотата.
                        (vvvvvvv) е силата й.

1001cccc    0nnnnnnn    Събитие "Нота включена"
            0vvvvvvv    Tова съобщение се предава, когато
                        клавишът бива натиснат (нотата започва)
                        (nnnnnnn) е номерът на нотата.
                        (vvvvvvv) е силата й.
 

1010cccc    0nnnnnnn    Полифонична сила на натиска (After-touch)
            0vvvvvvv    Това съобщение се предава, когато се
                        промени силата на вече звучащ тон.
                        (nnnnnnn) е номерът на нотата.
                        (vvvvvvv) е новата й сила.
 

1011cccc    0ccccccc    Промяна в управлението.
            0vvvvvvv    Това съобщение се предава при промяна на
                        стойност в контролера (педал, лост и др.)
                        Някои номера на контролери са резервирани
                        за специфични цели.
                        (ccccccc) е номерът на контролера.
                        (vvvvvvv) е новата стойност.
 

1100cccc    0ppppppp    Смяна на програмата
                        Това съобщение се предава, когато се
                        сменя тембърът (програмата, инструментът)
                        (ppppppp) е номерът на новата програма.
 

1101nnnn    0ccccccc    Налягане на канала (After-touch).
                        Това съобщение се предава, когато се
                        променя налягането на канала.  Някои
                        "динамични" клавиатури на поддържат
                        полифоничен after-touch.  Използвайте
                        това съобщение за предаване на единична
                        най-голяма сила (на всички натиснати в
                        момента клавиши).
                        (ccccccc) е номерът на канала.
 

1110nnnn    0lllllll    Промяна в колелото за смяна на строя.
            0mmmmmmm    Tова съобщение се предава, за да покаже
                        промяна в състоянието на т. нар. "pitch
                        wheel", което се измерва в 14-битова
                        стойност.  Централно положение (няма
                        промяна на строя) е 2000H.
                        Чувствителността е функция на
                        предавателя.
                        (llllll) са най-младшите 7 бита.
                        (mmmmmm) са най-старшите 7 бита.

-----------------------------------------------------------------
Канални съобшения за режима (Виж също промяната в управл. по-горе)
-----------------------------------------------------------------
1011nnnn    0ccccccc    Съобщения за режима на канала.
            0vvvvvvv    Tова е същият код като промяната в
                        управлението (по-горе), но управлява
                        режима, използвайки резервирани номера
                        на контролери.  Номерата са:

                        Местно управление.
                        Когато местното управление е изключено,
                        всички устройства от даден канал
                        ще отговарят само на данните, приети
                        през MIDI.  Изсвирените данни и т.н. ще
                        бъдат игнорирани.  Местното управление
                        включено възстановява функциите на
                        нормалните контролери.
                        c = 122, v =   0: Местното управл. изкл.
                        c = 122, v = 127: Местното управл. вкл.

                        Всички ноти изключени.
                        При приемане на това съобщение
                        всички генератори се изключват.
                        c = 123, v =   0: Всички ноти изключени
                        c = 124, v =   0: Режим Omni изключен
                        c = 125, v =   0: Режим Omni включен
                        c = 126, v =   M: Mono вкл. (Poly изкл.),
                        където M е номерът на канала
                        (Omni изкл.) или 0 (Omni вкл.)
                        c = 127, v =   0: Poly вкл. (Mono изкл.)
                        (Заб.: Tези 4 съобщения предизвикват също
                        Всички ноти изключени)

-----------------------------------------------------------------
Общи системни съобщения
-----------------------------------------------------------------
11110000    0iiiiiii    Системно специално.
            0ddddddd    Tова съобщение се грижи за всичко, което
               ..       MIDI не поддържа.  (iiiiiii) е 7-битовият
               ..       код на производителя.  Ако синтезаторът
            0ddddddd    разпознава кода като свой, той ще следи
            11110111    остатъка от съобщението (ddddddd).
                        В противен случай съобщението ще бъде
                        игнорирано.  Системните специални
                        съобщения се използват за изпращане на
                        обемисти съобщения като параметри на
                        инструмента и други нестандартни данни.
                        (Заб.: Само съобщенията в реално време
                        могат да се смесват със Системното
                        специално).

11110001                Неопределено.

11110010    0lllllll    Указател за позицията в песента.
            0mmmmmmm    Tова е вътрешен 14-битов регистър, който
                        съдържа броя MIDI-удари (1 удар = шест
                        MIDI-импулса), изминали от началото на
                        песента. l е младшият, m - старшият байт.

11110011    0sssssss    Избор на песен.
                        изборът на песен определя коя
                        последователност или песен да се свири.
 

11110100                Неопределено.

11110101                Неопределено.

11110110                Заявка за настройка.
                        При приемане на Заявка за настройка
                        всички аналогови синтезатори трябва
                        да настроят осцилаторите си.

11110111                Край на Системно специално съобщение.
                        Използва се за завършване на предаването
                        на данни чрез Системно специално
                        съобщение (виж по-горе).

-----------------------------------------------------------------Системни съобщения в реално време-----------------------------------------------------------------
11111000                Времезадаващ такт.
                        Изпраща се 24 пъти за четвърт-нота,
                        когато се изисква сънхронизация.

11111001                10 ms (1 съобщение на всеки 10 ms)

11111010                Старт.
                        Стартира просвирването на текущата
                        последователност.  (Това съобщение ще
                        бъде последвано от Времезадаващи тактове)

11111011                Продължение.
                        Продължи от точката, в която
                        последователността е била спряна.

11111100                Стоп.
                        Спри текущата последователност.

11111101                Неопределено.

11111110                Aктивна чувствителност
                        Изпозването на това съобщение не е
                        задължително.  Когато то първоначално е
                        предадено, приемникът ще очаква да получи
                        друго такова съобщение всеки 300 ms
                        (максимум), или ще приеме, че връзката
                        е приключила.  При приключване приемникът
                        ще изключи всички гласове и ще се върне
                        към нормален (без активна чувствителност)
                        режим.

11111111                Начално установяване.
                        Установява всички приемници в системата в
                        начално състояние.  Това съобщение трябва
                        да бъде използвано внимателно, за
                        предпочитане при ръчно управление. В
                        частност то не бива да бъде изпращано при
                        включване на захранването.

MIDI-номера на нотите за различните октави

Номер
октава
Номера на нотите
CC#DD#EFF#GG#AA#B

0
1
2
3
4
> 5
6
7
8
9
10

0
12
24
36
48
60
72
84
96
108
120

1
13
25
37
49
61
73
85
97
109
121

2
14
26
38
50
62
74
86
98
110
122

3
15
27
39
51
63
75
87
99
111
123

4
16
28
40
52
64
76
88
100
112
124

5
17
29
41
53
65
77
89
101
113
125

6
18
30
42
54
66
78
90
102
114
126

7
19
31
43
55
67
79
91
103
115
127

8
20
32
44
56
68
80
92
104
116


9
21
33
45
57
69
81
93
105
117


10
22
34
46
58
70
82
94
106
118


11
23
35
47
59
71
83
95
107
119

Заб.: Октава 1 е суб-контра октавата, 1 - контра,..., 10 - щеста. Със знак ">" е отбелязана първа октава, 60 е до от първа.

MIDI, разгледан в Бакус-Наур-форма

Дефинициите 3-17 определят текущо състояние и вмъкване на данни в реално време, както и различните канални съобщения.
  1. <MIDI Stream> ::=        <MIDI msg> < MIDI Stream>
  2. <MIDI msg> ::=           <sys msg> | <chan msg>
  3. <chan msg> ::=           <chan 1byte msg> | <chan 2byte msg>
  4. <chan 1byte msg> ::=     <chan stat1 byte> <data singlet> <running singlets>
  5. <chan 2byte msg> ::=     <chan stat2 byte> <data pair> <running pairs>
  6. <chan stat1 byte> ::=    <chan voice stat1 nibble> <hex nibble>
  7. <chan stat2 byte> ::=    <chan voice stat2 nibble> <hex nibble>
  8. <chan voice stat1 nyble>::= C | D
  9. <chan voice stat2 nyble>::= 8 | 9 | A | B | E
  10. <hex nyble> ::=          0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F
  11. <data pair> ::=          <data singlet> <data singlet>
  12. <data singlet> ::=       <realtime byte> <data singlet> | <data byte>
  13. <running pairs> ::=      <empty> | <data pair> <running pairs>
  14. <running singlets> ::=   <empty> | <data singlet> <running singlets>
  15. <data byte> ::=          <data MSD> <hex nyble>
  16. <data MSD> ::=           0 | 1 | 2 | 3 | 4 | 5 | 6 | 7
  17. <realtime byte> ::=      F8 | FA | FB | FC | FE | FF
  18. <sys msg> ::=            <sys common msg> | <sysex msg> | <sys realtime msg>
  19. <sys realtime msg> ::=   <realtime byte>
  20. <sysex msg> ::=          <sysex data byte> <data singlet> <running singlets> <eox byte>
  21. <sysex stat byte> ::=    F0
  22. <eox byte> ::=           F7
  23. <sys common msg> ::=     <song position msg> | <song select msg> | <tune request>
  24. <tune request> ::=       F6
  25. <song position msg> ::=  <song position stat byte> <data pair>
  26. <song select msg> ::=    <song select stat byte> <data singlet>
  27. <song position stat byte>::= F2
  28. <song select stat byte> ::= F3


Специфицация на Стандартните MIDI файлове

0. Въведение

Тук е описан форматът на стандартния MIDI файл.  MIDI файловете съдържат един или повече MIDI потока, с информация за времето на всяко събитие.  Поддържат се структурата на песента, последователността и пистата, информация за темпото и временната сигнатура.  Наред с MIDI данните могат да бъдат записвани имената на пистите и друга описателна информация.  Този формат поддържа много писти и много последователности, така че ако потребителят на една многопистова програма има намерение да прехвърли файл към друга програма, този формат може да позволи това да стане.

1. Последователности, писти, порции:  блочна структура на файл

Файловете на последователностите са направени от "порции".  Всяка порция има 4-байтов тип и 32-битова дължина, което е броят на байтовете в порцията.  Тази структура позволява да бъдат проектирани бъдещите типове порции, които да бъдат лесно игнорирани, ако са окрити от програма, написана преди порцията да бъде въведена.

Дефинират се два типа порции:  заглавна (MThd) и пистова.  Заглавната порция осигурява минимално количество информация, отнасяша се до целия MIDI файл.  Пистовата порция съдържа последователен информационен поток от MIDI данни, които могат да съдържат информация за до 16 MIDI канала.  Концепциите за множество писти, множество MIDI изходи, музикални мотиви, последователности и песни могат да бъдат реализирани чрез използването на няколко пистови порции.

Един MIDI файл винаги започва със заглавна порция, следвана от една или повече пистови порции. 
MThd  <дължина на заглавните данни> <заглавни данни>MTrk  <дължина на заглавните данни> <заглавни данни>MTrk  <дължина на заглавните данни> <заглавни данни>...

Най-голямото позволено число е 0FFFFFFF, така че представянето с променлива дължина да се побере в 32 бита в програма за запис на числа с променлива дължина.  Теоретично, и по-големи числа са възможни, но 200000000 96ти от удара при бързо темпо от 500 удара в минута трае дни, достатъчно дълго за всяко делта-време!

Ето синтаксиса на една MTrk порция: 
<писта данни> = <MTrk събитие> +<MTrk събитие> = <делта-време> <събитие> 
<делта-времe> е записано с променлива дължина.  То представлява количеството време преди следвашото събитие.  Ако първото събитие в пистата настъпи в самото й начало или ако две събития настъпят едновременно, се използува делта-време нула.  Делта-времената винаги съществуват.  Делта-времето е някаква част от удара (или секундата при запис на писта със SMPTE времена), както е зададено в заглавната порция.

<събитие> = <MIDI събитие> | <sysex събитие> | <meтa-събитие>

<MIDI събитие> e всяко съобщение на MIDI канал.  Използва се текущо състояние:  байтовете на състоянието могат да бъдат изпуснати след първия байт.  Първото събитие във файла задава състоянието.  Самото делта-време не се счита за събитие:  то е интегрална част от спецификацията.  Обърнете внимание, че текущото състояние се използва между делта-времената.

<meтa-събитието> означава не-MIDI информация, използвана в този формат или в секвенсерите, със следния синтаксис:

FF <тип> <дължина> <байтове>

Всички мета-събития започват с FF, следва байт за типа на събитието (който е винаги по-малък от 128), след това - дължината на данните, записана с променлива дължина и накрая самите данни.  Ако няма данни, дължината е 0. Както при sysex събитията, не е позволено използването на текущо състояние.  Както при порциите, в бъдеще могат да бъдат дефинирани нови мета-събития, които могат да не са известни на съществуващите програми, така че програмите трябва подходящо да игнорират мета-събитията, които те не разпознават и наистина да очакват да ги срещнат.

<sysex събитие> означава MIDI системно специално съобщение или "escape", определящо произволни байтове за предаване.  За съжаление, някои производители на синтезатори определят своите системни специални съобщения за предаване като малки пакети.  Всеки пакет е само част от едно синтактично цяло системно специално съобщение, но времето, по което те се предават е важно.  Примери за това са байтовете, предавани в синтезатора CZ на Casio kato данни на инструментите или в тоналния модул на Yamaha FB-01 в "системен специален" режим, в който могат да се предават микротонални данни.  За да могат да се обработват ситуации като тези, са предвидени две форми на <sysex събитие>:

F0 <дължина> <байтове за предаване след F0>F7 <дължина> <всички байтове за предаване> 
И в двата случая, дължината се записва като количество с променлива дължина, равно на броя на байтовете, които я следват, без да включва себе си и типа на съобщението (F0 or F7), но включвайки всички следващи байтове, както и всяко F7 на края, което трябва да се предава.  Първата форма, с код F0, се използва за синтактично завършени съобшения или за първия пакет в серия, т.е.  съобщения, в които F0 трябва да бъде предадено.  Втората форма се използва за остатъка от пакетите в едно синтактично съобщение, което не започва с F0.  Разбира се, F7 не се счита за част от системното специално съобшение.  Също като в MIDI, текущо състояние не е позволено, този път защото дължината се записва като количество с променлива дължина, което може да не започва с бит 7, установен в единица.

Синтактичното системно специално съобщение трябва винаги да завършва с F7, дори ако реалното устройство не го е изпратило, така че вие знаете кога сте достигнали края на цялото съобщение без да се очаква следващото събитие в MIDI файла.

Огромното мнозинство системни специални съобщения просто използват F0 формата.  Например, предаденото съобщение F0 43 12 00 07 F7 ще бъде записано в MIDI файл като F0 05 43 12 00 07 F7.  Както бе отбелязано по-горе, изисква се да се включи F7 накрая, така че четецът на MIDI файла да знае, че е прочел цялото съобщение.

За особени ситуации, когато единичното съобщение е разделено с части от него, предавани по различно време, както е при прехвърляне на данни за инструментите в Casio CZ, или при "системния специален режим" на Yamaha FB-01, се използва форматът с F7 на sysex събитието за всеки пакет с изключение на първия.  Никой от пакетите няма да завърши с F7 освен последния, който трябва да завърши с F7.  Трябва също да няма никакви предаваеми MIDI събития между пакетите на едно многопакетно съобщение.

Събитието F7 може да бъде използвано също като "escape" за предаване на какви да са байтове, включително байтове в реално време, указател на песента, или MIDI код за време, които нормално не са позволени в тази спецификация.  Не трябва да се правят никакви усилия за интерпретирането на тези байтове по този начин.  Тъй като системно специално съобщение не се предава, не е необходимо или уместно да се завърши F7-събитие с F7 в този случай.
 

2. Заглавна порция

Заглавната порция в началото на файла определя основна информация за данните във файла.  Данновата секция съдържа три 16-битови думи, като старшият байт е първи (разбира се).  Ето синтаксиса на пълната порция: 
<тип порция> <дължина> <формат> <писти> <делене> 
Както е описано по-горе, <тип порция> са 4-те ASCII знака 'MThd'; <дължина> е 32-битовото представяне на числото 6 (със старшия байт напред).  Първата дума, <формат>, обозначава общата организация на файла.  Само три стойности на формата са определени:

0       файлът съдържа единствена многоканална писта1       файлът съдържа една или повече едновременни писти (или MIDI изходи) на последователност2       файлът съдържа една или повече последователно независими еднопистови музикални мотива 
Следващата дума, <писти>, e броя на пиститовите порции във файла.  Четвъртата дума, <делене>, е разделянето на четвъртинка нота, представено от делта-времената във файла.  (Ако то е отрицателно, то означава делене на секундата, представено от делта-времената във файла, така че пистата да може да означава събития, настъпващи в същинско време вместо метрично време.  Това се представя по следния начин:  старшият байт има една от следните четири стойности:  -24, -25, -29 или -30, в съответствие с четирите стандартни SMPTE и MIDI формата за кодиране на времето и означава броя на кадрите за секунда.  Втотият байт (записан положителен) е разрешението в рамките на кадъра:  типичните стойности могат да бъдат 4 (разрешение на MIDI кода за времето), 8, 10, 80 (битово разрешение) или 100.  Тази система позволява точно обозначаване на писти, базирани върху кодиране на времето, но също дава възможност за писти на основата на милисекунди чрез задаване на 25 кадъра в секунда и разрешение от 40 единици за кадър.)

Формат 0, т.е.  една многоканална писта, е най-взаимозаменяемото представяне на данни.  Едно от приложенията на MIDI файловете е просто еднопистово просвирващо устройство в програма, която трябва да накара синтезаторите да издават звуци, но която се занимава предимно с нещо друго като смесители или устройства за звукови ефекти.  Много е желателно да може да се получава такъв формат, дори ако дадена програма е базирана върху писти, за да работи с тези прости програми. 
Програмите, които поддържат няколко едновременни писти, могат да съхраняват и четат данни във формат 1, ветрикално едномерна форма, т.е.  набор от писти.  Програмите, които поддържат няколко независими музикални мотива, могат да съхраняват и четат данни във формат 2, хоризонтално едномерна форма.  Осигуряването на тези минимални възможности осигурява максимална взаимозаменяемост.

MIDI файловете могат да изразяват темпо и размер и те са избрани да правят това за прехвърляне на картите на темпото от едно устройство към друго.  За файл във формат 0 темпото ще бъде разхвърляно по протежение на пистата и четецът на картата на темпото трябва да игнорира междинните събития; за файл във формат 1 картата на темпото трябва да бъде съхранено като първа писта.  Учтиво е четецът на картата на темпото да предложи на вашия потребител възможността да направи един файл във формат 0 само с темпото, освен ако Вие можете да използвате формат 1.

Всички MIDI файлове трябва да обозначават темпото и размера.  Ако не го правят, размерът се приема да е 4/4 и темпото 120 удара в минута.  Във формат 0 тези мета-събития трябва да настъпят поне в началото на единичната многоканална писта.  Във формат 1, тези мета-събития трябва да се съдържат в първата писта.  Във формат 2, всеки от временно независимите музикални мотиви трябва да съдържа поне начална информация за размера и темпото.

Могат да се дефинират други форматни идентификатори, за да се поддържат други структури.  Програма, четяща непознат форматен идентификатор трябва да върне грешка към потребителя вместо да се опитва да чете по-нататък.
 

3. Meтa-събития

Тук са дефинирани някои мeтa-събития.  Не се изисква всяка програма да поддържа всяко мета-събитие.  Мета-събитията, които са първоначално дефинирани, включват: 
FF 00 02 ssss              Номер на последователносттаFF 01 дължина текст        Teкстово събитие 
Типовете мета-събития от 01 до 0F са резервирани за различни типове текстови събития, всяко от които отговаря на спецификацията на текстовите събития (по-горе), но се използва за различна цел:

FF 02 дължина текст        Обявление за авторско правоFF 03 дължина текст        Име на последователността / пистатаFF 04 дължина текст        Име на инструментаFF 05 дължина текст        Лирика (текст на песен)FF 06 дължина текст        MaркерFF 07 дължина текст        Момент за репликаFF 2F 00                   Край на пистата

Това събитие е задължително.  То се включва, за да може да бъде зададен точният момент на завършване за пистата, така че да има точна дължина, която е необходима за писти, които са зациклени или слети.

FF 51 03 tttttt      Ново тeмпо, в микросекунди за MIDI четвърт нота

Това събитие показва смяна на темпото.  Друг начин на изразяване на "микросекунди за четвърт нота" е "24ти от микросекундата за MIDI такт".  Представянето на темпото като време за един удар вместо удари за единица време позволява абсолютно точна дълговременна синхронизация с базиран върху времето протокол като SMPTE или MIDI кодирането по време.  Такава точност, осигурена от това разрешение на темпото позволява четириминутна пиеса със 120 удара в минута да бъде точна в рамките на 500 usec в края на пиесата.  В идеалния случай тези събития трябва да настъпват само там, където биха били разположени MIDI тактовете.  Това съглашение е предназначено да гарантира, или поне да увеличи вероятността за съвместимост с други устройства за синхронизация, така че картата на размера и темпото, записана в този формат да може лесно да се прехвърля към друго устройство.

FF 54 05 час мин сек кадър част      Отместване по SMPTE

(SMPTE е формат за кодиране на времето, използван в киното, телевизията и видеоиндустрията)

Това събитие, ако го има, означава SMPTE времето, по което пистовата порция се очаква да започне.  То трябва да съществува в началото на пистата, т.е.  преди всички ненулеви делта-времена и преди всички предаваеми мета-събития.  Часът трябва да бъде кодиран в SMPTE формат, точно както е в MIDI кодирането на времето.  Във файл от формат 1 SMPTE отместването трябва да бъде ваписано с картата на темпото и няма смисъл в коя да е друга писта.  Полето "част" съдържа частични кадри, в 100тни от кадъра, дори в SMPTE-базирани писти, които определят различно разделяне на кадъра за делта-времената.

FF 58 04 числ знам тактове bb      Размер

Размерът се изразява като четири числа.  "числ" и "знам" означават числителя и знаменателя на размера, както той би бил обозначен.  Знаменателят е отрицателна степен на две:  2 означава четвъртина нота, 3 означава осмина нота, и т.н.  Параметърът "тактове" изразява броя на MIDI тактовите импулси за едно тракване на метронома.  Параметърът "bb" изразява броя на отбелязаните 32-ини ноти в еднa MIDI четвърт нота (24 MIDI импулса).  Tова е добавено, защото има множество програми, които позволяват на потребителя да обозначи, че това, което MIDI счита за четвъртинка нота (24 импулса) трябва да бъде нотирано като, или да се свързва с нещо друго.

Следователно, пълното събитие за 6/8 такт, където метрономът траква всеки три осминки ноти, но има 24 импулса за четвъртинка нота, 72 в един такт, ще бъде (шестнадесетично):

FF 58 04 06 03 24 08

T.е., 6/8 такт (8 е 2 на 3та степен, така че това е 06 03), 36 MIDI импулса за точкувана четвъртинка (24 шестн.!), и осем нотирани 32-ини ноти за MIDI четвърт нота.

FF 59 02 sf mi     Знак за ключа

    sf = -7:  7 бемола
    sf = -1:  1 бемол
    sf =  0:  Сол ключ
    sf =  1:  1 диез
    sf =  7:  7 диеза
    mi =  0:  мажор
    mi =  1:  минор

FF 7F дълж данни  Специфично за секвенсера мета-събитие

4. Откъси от програми

Ето някои програми за четене и запис на числа с променлива дължина в MIDI файловете.  Тези програми са на C и използват getc and putc, които четат и записват единични 8-битови знаци от/към файловете infile и outfile.


doubleword ReadVarLen ()
{
    register doubleword value;
    register byte c;

    if ((value = getc(infile)) & 0x80)
    {
        value &= 0x7f;
        do
        {
            value = (value << 7) + ((c = getc(infile)) & 0x7f);
        } while (c & 0x80);
    }
    return (value);
}

WriteVarLen (value)
register long value;
{
    register long buffer;

    buffer = value & 0x7f;
    while ((value >>= 7) > 0)
    {
        buffer <<= 8;
        buffer |= 0x80;
        buffer += (value & 0x7f);
    }
    while (TRUE)
    {
        putc(buffer,outfile);
        if (buffer & 0x80)
            buffer >>= 8;
        else
            break;
    }
}


Лекция 1 - Въведение. Апаратна част

Лекция 2 - Протокол. Канални съобщения

Лекция 3 - Системни съобщения

Лекция 4 - Стандарти GM / GS / XG / GM2

Лекция 5 - MIDI - преговор и Стандартни MIDI-файлове

Назад


Webmaster