Obsah
1. General MIDI a formát souborů SMF
2. Typy souborů SMF
3. Hlavička souborů SMF
4. Hudební data (stopy)
5. Časové značky
6. Literatura
7. Odkazy na Internetu
1. General MIDI a formát souborů SMF
Ve standardu General MIDI je kromě dalších požadavků specifikován i formát souborů označovaných zkratkou SMF, neboli Standard MIDI File. Jedná se o binární soubory, které mají většinou příponu .mid; u některých rozšířených verzí se však koncovka může lišit. Tyto soubory se díky své poměrně jednoduché struktuře, úspornému záznamu hudby a otevřenosti formátu hojně rozšířily, a to jak mezi hudebníky (mnohé klávesy například obsahují disketovou jednotku nebo USB rozhraní, ze kterých je možné SMF soubory přehrávat), tak i mezi majiteli osobních počítačů. V SMF souborech může být uložena buď jedna hudební stopa, nebo – v případě použití většího množství hudebních nástrojů – stop více. Hudba přitom není uložena ve formě samplů, jak je tomu například v případě formátu WAVE (RIFF) či MP3, ale jako posloupnost takzvaných událostí (events), což jsou ve svém principu MIDI zprávy (popsané v předchozí části seriálu) doplněné o časovou značku tak, aby bylo možné přesně zaznamenat i začátek a konec přehrávání určitého tónu nebo celého akordu. Vzhledem k tomu, že každá událost je uložená pouze na několika bajtech, bývají soubory SMF velmi malé – celá několikaminutová skladba se může zapsat do souboru majícího velikost jen několik málo kilobajtů.
Obrázek 1: Přehrávání hudby uložené ve formátu SMF (s koncovkou MIDI) pomocí užitečné aplikace „timidity“ na počítači s Linuxem. MIDI lze samozřejmě přehrát i s využitím aplikací s grafickým uživatelským rozhraním, například XMMS.
2. Typy souborů SMF
Ve standardu jsou popsány tři typy (subformáty) souborů SMF, které jsou označovány jako Type-0, Type-1 a Type-2. V minulosti se velmi často používal typ 0, jehož interní struktura je nejjednodušší (obsahuje totiž jen jednu hudební stopu), ovšem například záznam vícehlasé hudby musí být řešen pomocí triku. Dnes se můžeme často setkat s typem 1, jehož přednost spočívá v možnosti použití většího množství hudebních stop (1 až 65535), přičemž události pro každý hudební nástroj jsou uloženy v samostatné stopě. Typ 2 se prozatím příliš nerozšířil. Z tohoto důvodu bude další popis zaměřen především na subformáty Type-0 a Type-1. Před podrobnějším popisem interní struktury souborů SMF si připomeňme, že v General MIDI jsou přesně stanovena čísla pro jednotlivé typy hudebních nástrojů (viz zpráva typu Program Change) a desátý kanál je vyhrazen pro bicí (perkusní) nástroje, u nichž se většinou nezaznamenává výška jimi generovaného zvuku (přehrávaná nota).
Vlastní zvuky hudebních nástrojů v souborech SMF uloženy nejsou, což představuje poměrně velký rozdíl oproti formátům typu MOD (Amiga Module) či XM, v nichž jsou uloženy jak hudební stopy, tak i samply nástrojů či jiných zvuků (u SMF se o přehrávání stará samotné cílové hudební zařízení, které musí zvuky všech nástrojů přehrát – jak praví norma – „s dostatečnou kvalitou“). Následuje výpis jednotlivých skupin hudebních nástrojů tak, jak jsou popsány v General MIDI. Pro vlastní pokusy doporučuji použít hned skupinu první, ve které jsou akustická piana, které přehrají prakticky libovolné klávesy:
Číslo programu/nástroje | Skupina nástrojů |
---|---|
01 – 08 | klavíry |
09 – 16 | laděné bicí |
17 – 24 | varhany |
25 – 32 | kytary |
33 – 40 | basové zvuky |
41 – 48 | smyčce |
49 – 56 | ansáblové zvuky |
57 – 64 | žestě |
65 – 72 | plátkové |
73 – 80 | píšťaly |
81 – 88 | elektronické sólové zvuky |
89 – 96 | elektronické doprovodné zvuky |
97 – 104 | elektronické zvukové efekty |
105 – 112 | etnické |
113 – 120 | perkusivní |
121 – 128 | zvukové efekty |
Obrázek 2: Nejjednodušší MIDI rozhraní pro počítače Amiga. MIDI konektor je přímo zapojen na sériový port, což sice není zcela korektní, ale většina MIDI zařízení obsahuje na svém vstupu optočlen, který obvody zařízení ochrání.
3. Hlavička souborů SMF
Soubory SMF na svém začátku obsahují hlavičku, po které následují data jednotlivých hudebních stop s ukončovací značkou. Každá část souboru (hlavička, stopa) začíná čtyřmi bajty, které lze chápat jako čtyři ASCII znaky textu (v tomto ohledu se SMF přibližuje například populárnímu grafickému formátu PNG, v němž jednotlivé chunky taktéž začínají čtveřicí ASCII znaků). Ostatní data jsou většinou uložena v binární podobě, přičemž hodnoty, které se kvůli svému maximálnímu rozsahu nevejdou do jednoho bajtu, jsou uloženy systémem nižší bajt–vyšší bajt (totéž platí i v případě, že je hodnota uložena na čtyřech bajtech). Hlavička obsahuje základní informace o souboru SMF, především jeho typ (viz předchozí kapitola), počet hudebních stop a základní rychlost přehrávání. Délka hlavičky je u standardních souborů rovna čtrnácti bajtům s následujícím významem:
Offset | Délka (bajty) | Význam |
---|---|---|
00 | 4 | ASCII text ‚MThd‘ – MIDI header |
04 | 4 | délka zbytku hlavičky, pro standardní soubory je zde hodnota 6 |
08 | 2 | typ (subformát) SMF souboru – 0000=Type-0, 0001=Type-1 |
10 | 2 | počet stop, 1 až 65535 (pro subformát 1) |
12 | 2 | rychlost přehrávání hudby (počet tiků na přehrání čtvrťové noty; čím vyšší hodnota, tím rychleji se hudba přehrává) |
Následuje ukázka formátu hlavičky skutečného (dosti známého) souboru DukeNukem_Level1.mid uloženého ve formátu SMF (viz též první obrázek, na kterém je patrné, že i přehrávač timidity vypisuje některé základní informace o právě zpracovávaném hudebním souboru):
Offset | Obsah (hexa) | Význam |
---|---|---|
00 | 4d 54 68 64 | ASCII text ‚MThd‘ – MIDI header |
04 | 00 00 00 06 | délka zbytku hlavičky je rovna šesti bajtům |
08 | 00 01 | typ souboru = Type-1 |
10 | 00 0d | počet stop je roven třinácti |
12 | 00 90 | rychlost přehrávání hudby je nastavena na 0×90 (0×80 odpovídá čtvrtinové notě) |
Obrázek 3: Vylepšené MIDI rozhraní na počítači Amiga. Zde se již nachází oddělovací vstupní optočlen (předchozí zapojení bylo určeno pouze pro výstup dat na MIDI zařízení), členy zajišťující vytvoření proudové smyčky atd.
4. Hudební data (stopy)
Ihned po hlavičce souboru SMF následují hudební data, tj. informace o jednotlivých hudebních stopách, přičemž každá hudební stopa začíná čtveřicí bajtů s hodnotami 0×4D, 0×54, 0×72 a 0×6B, což odpovídá ASCII znakům „MTrk“ – MIDI track. Jak jsme si již řekli v úvodních odstavcích, je hudba zaznamenána ve formě takzvaných událostí (events), přičemž každá událost odpovídá MIDI zprávě doplněné o časovou značku. Nejjednodušší události mají délku čtyři bajty, přičemž v prvním bajtu je zaznamenána časová značka (viz následující kapitola), po níž následuje klasická tříbajtová MIDI zpráva. Pokud například budeme chtít postupně přehrát tři noty C, D a E, postačuje použít tři události odpovídající zprávám Note On, za nimiž budou následovat tři zprávy Note Off – viz následující fragment obsahu SMF souboru:
Bajty v souboru | Událost | Význam |
---|---|---|
00 90 3C 60 | Note On | Začne se přehrávat nota C, rychlost náběhu je rovna 0×60 |
7F 90 3E 60 | Note On | Začne se přehrávat nota D, rychlost náběhu je rovna 0×60 |
7F 90 40 60 | Note On | Začne se přehrávat nota E, rychlost náběhu je rovna 0×60 |
7F 80 3C 00 | Note Off | Konec přehrávání noty C |
00 80 3E 00 | Note Off | Konec přehrávání noty D |
00 80 40 00 | Note Off | Konec přehrávání noty E |
Každá stopa musí být ukončena čtveřicí bajtů s hodnotami 0×00, 0×FF, 0×2F a 0×00.
Obrázek 4: První verze legendárního programu Cubase byly určeny pro počítače Atari ST, které byly vybaveny MIDI rozhraním.
Vztah mezi číslem noty, jejím značením a výškou tónu platný pro temperovanou stupnici odvozenou od komorního a s frekvencí 440 Hz:
Oktáva (MIDI) | Kód noty | Označení noty | Frekvence (Hz) |
---|---|---|---|
–5 | 0 | C | 8,1757989156 |
–5 | 1 | C#/Db | 8,6619572180 |
–5 | 2 | D | 9,1770239974 |
–5 | 3 | D#/Eb | 10,3008611535 |
–5 | 4 | E | 10,3008611535 |
–5 | 5 | F | 10,9133822323 |
–5 | 6 | F#/Gb | 11,5623257097 |
–5 | 7 | G | 12,2498573744 |
–5 | 8 | G#/Ab | 12,9782717994 |
–5 | 9 | A | 13,7500000000 |
–5 | 10 | A#/Bb | 14,5676175474 |
–5 | 11 | B | 15,4338531643 |
–4 | 12 | C | 16,3515978313 |
–4 | 13 | C#/Db | 17,3239144361 |
–4 | 14 | D | 18,3540479948 |
–4 | 15 | D#/Eb | 19,4454364826 |
–4 | 16 | E | 20,6017223071 |
–4 | 17 | F | 21,8267644646 |
–4 | 18 | F#/Gb | 23,1246514195 |
–4 | 19 | G | 24,4997147489 |
–4 | 20 | G#/Ab | 25,9565435987 |
–4 | 21 | A | 27,5000000000 |
–4 | 22 | A#/Bb | 29,1352350949 |
–4 | 23 | B | 30,8677063285 |
–3 | 24 | C | 32,7031956626 |
–3 | 25 | C#/Db | 34,6478288721 |
–3 | 26 | D | 36,7080959897 |
–3 | 27 | D#/Eb | 38,8908729653 |
–3 | 28 | E | 41,2034446141 |
–3 | 29 | F | 43,6535289291 |
–3 | 30 | F#/Gb | 46,2493028390 |
–3 | 31 | G | 48,9994294977 |
–3 | 32 | G#/Ab | 51,9130871975 |
–3 | 33 | A | 55,0000000000 |
–3 | 34 | A#/Bb | 58,2704701898 |
–3 | 35 | B | 61,7354126570 |
–2 | 36 | C | 65,4063913251 |
–2 | 37 | C#/Db | 69,2956577442 |
–2 | 38 | D | 73,4161919794 |
–2 | 39 | D#/Eb | 77,7817459305 |
–2 | 40 | E | 82,4068892282 |
–2 | 41 | F | 87,3070578583 |
–2 | 42 | F#/Gb | 92,4986056779 |
–2 | 43 | G | 97,9988589954 |
–2 | 44 | G#/Ab | 103,8261743950 |
–2 | 45 | A | 110,0000000000 |
–2 | 46 | A#/Bb | 116,5409403795 |
–2 | 47 | B | 123,4708253140 |
–1 | 48 | C | 130,8127826503 |
–1 | 49 | C#/Db | 138,5913154884 |
–1 | 50 | D | 146,8323839587 |
–1 | 51 | D#/Eb | 155,5634918610 |
–1 | 52 | E | 164,8137784564 |
–1 | 53 | F | 174,6141157165 |
–1 | 54 | F#/Gb | 184,9972113558 |
–1 | 55 | G | 195,9977179909 |
–1 | 56 | G#/Ab | 207,6523487900 |
–1 | 57 | A | 220,0000000000 |
–1 | 58 | A#/Bb | 233,0818807590 |
–1 | 59 | B | 246,9416506281 |
0 | 60 | C | 261,6255653006 |
0 | 61 | C#/Db | 277,1826309769 |
0 | 62 | D | 293,6647679174 |
0 | 63 | D#/Eb | 311,1269837221 |
0 | 64 | E | 329,6275569129 |
0 | 65 | F | 349,2282314330 |
0 | 66 | F#/Gb | 369,9944227116 |
0 | 67 | G | 391,9954359817 |
0 | 68 | G#/Ab | 415,3046975799 |
0 | 69 | A | 440,0000000000 |
0 | 70 | A#/Bb | 466,1637615181 |
0 | 71 | B | 493,8833012561 |
1 | 72 | C | 523,2511306012 |
1 | 73 | C#/Db | 554,3652619537 |
1 | 74 | D | 587,3295358348 |
1 | 75 | D#/Eb | 622,2539674442 |
1 | 76 | E | 659,2551138257 |
1 | 77 | F | 698,4564628660 |
1 | 78 | F#/Gb | 739,9888454233 |
1 | 79 | G | 783,9908719635 |
1 | 80 | G#/Ab | 830,6093951599 |
1 | 81 | A | 880,0000000000 |
1 | 82 | A#/Bb | 932,3275230362 |
1 | 83 | B | 987,7666025122 |
2 | 84 | C | 1 046,5022612024 |
2 | 85 | C#/Db | 1 108,7305239075 |
2 | 86 | D | 1 174,6590716696 |
2 | 87 | D#/Eb | 1 244,5079348883 |
2 | 88 | E | 1 318,5102276515 |
2 | 89 | F | 1 396,9129257320 |
2 | 90 | F#/Gb | 1 479,9776908465 |
2 | 91 | G | 1 567,9817439270 |
2 | 92 | G#/Ab | 1 661,2187903198 |
2 | 93 | A | 1 760,0000000000 |
2 | 94 | A#/Bb | 1 864,6550460724 |
2 | 95 | B | 1 975,5332050245 |
3 | 96 | C | 2 093,0045224048 |
3 | 97 | C#/Db | 2 217,4610478150 |
3 | 98 | D | 2 349,3181433393 |
3 | 99 | D#/Eb | 2 489,0158697766 |
3 | 100 | E | 2 637,0204553030 |
3 | 101 | F | 2 793,8258514640 |
3 | 102 | F#/Gb | 2 959,9553816931 |
3 | 103 | G | 3 135,9634878540 |
3 | 104 | G#/Ab | 3 322,4375806396 |
3 | 105 | A | 3 520,0000000000 |
3 | 106 | A#/Bb | 3 729,3100921447 |
3 | 107 | B | 3 951,0664100490 |
4 | 108 | C | 4 186,0090448096 |
4 | 109 | C#/Db | 4 434,9220956300 |
4 | 110 | D | 4 698,6362866785 |
4 | 111 | D#/Eb | 4 978,0317395533 |
4 | 112 | E | 5 274,0409106059 |
4 | 113 | F | 5 587,6517029281 |
4 | 114 | F#/Gb | 5 919,9107633862 |
4 | 115 | G | 5 919,9107633862 |
4 | 116 | G#/Ab | 6 644,8751612791 |
4 | 117 | A | 7 040,0000000000 |
4 | 118 | A#/Bb | 7 458,6201842894 |
4 | 119 | B | 7 902,1328200980 |
5 | 120 | C | 8 372,0180896192 |
5 | 121 | C#/Db | 8 869,8441912599 |
5 | 122 | D | 9 397,2725733570 |
5 | 123 | D#/Eb | 9 956,0634791066 |
5 | 124 | E | 10 548,0818212118 |
5 | 125 | F | 11 175,3034058561 |
5 | 126 | F#/Gb | 11 839,8215267723 |
5 | 127 | G | 12 543,8539514160 |
5. Časové značky
Každá událost začíná časovou značkou. Nejedná se o absolutně zapsaný čas, ale o časový rozdíl mezi okamžikem poslední události a události, která právě začíná probíhat (počet tiků trvání jedné čtvrťové noty je uložen v hlavičce). Například pokud potřebujeme přehrávat tóny v pravidelném rytmu, tj. jednotlivé noty mají zaznít po 00, 10, 20, 30, 40 a 50 časových jednotkách, budou mít časové značky hodnoty 00, 10, 10, 10, 10, 10, protože 10–0=10, 20–10=10, 30–20=10 atd. Hodnota 00 značí nulovou pauzu, tj. dvě nebo více událostí mohou proběhnout přesně v tom samém časovém okamžiku. V případě, že je časový rozdíl reprezentován hodnotu menší než 0×7f (127 dekadicky), je situace velmi jednoduchá – časová značka má délku jednoho bajtu, který je zapsán jako první bajt dané události.
Ovšem ve skutečnosti je někdy nutné zadávat i mnohem delší časové rozdíly. Ty se ukládají do většího počtu bajtů (počet bajtů je proměnlivý od jednoho do čtyř), přičemž všechny bajty kromě posledního mají hodnotu větší než 0×7f (127 dekadicky), protože je u nich uměle nastaven nejvyšší bit a pouze do posledního bajtu je zapsána hodnota menší než 0×7f. Maximální čas, který lze tímto způsobem reprezentovat, lze uložit jako sekvenci bajtů 0×ff 0×ff 0×ff 0×7f. Při překódování na hexadecimální číslo dojdeme k hodnotě 0×0fffffff (nesmíme zapomenout na to, že se v souborech SMF nejdříve ukládá bajt s nejnižší váhou), což v desítkové číselné soustavě odpovídá 228=268435456. Příklad záznamu některých hodnot časových značek:
Ukládaná hodnota (desítkově) | Sekvence bajtů (hex) |
---|---|
1 | 01 |
127 | 7f |
128 | 81 00 |
129 | 81 01 |
255 | 81 7f |
256 | 82 00 |
Pro načtení hodnoty časové značky lze použít následující algoritmus (vstupem je pole obsahující hodnoty jednotlivých bajtů s časovou značkou):
int midiDecTime2normalTime(int[] n)
{
int l=n.length;
int t=0;
for (int i=0 ; i<l-1 ; i++)
{
t += (n[i]-128) * Math.pow(2,7 * (l-i-1)) ;
}
t += n[l-1];
return t;
}
Obrázek 5: Osobní počítač Atari 520 ST, který je vybaven MIDI rozhraním.
6. Literatura
- Arnell, Billy. „McScope: System.“ Music, Computers, and Software,
April 1988: 58–60. Conger, Jim. C Programming for MIDI.
Redwood City: M & T Books, 1988. - Cooper, Jim. „Mind Over MIDI: Information Sources and System-exclusive Data Formats.“,
Keyboard October, 1986: 110–111. - Enders, Bernd and Wolfgang Klemme. MIDI and Sound Book for the Atari ST.
Redwood City: M & T Books, 1989. - Matzkin, Jonathan. „A MIDI Musical Offering.“
PC Magazine 29 Nov. 1988: 229+. - Peters, Constantine. „Reading up on MIDI for the Novice and the Pro.“
PC Magazine 29 Nov. 1988: 258. - Basic MIDI, Paul White,
Sanctuary Publishing Ltd, London 1999.
ISBN 1 86074 262 9 - A Beginner's Guide to MIDI,
R A Penfold, Babani Publishing Ltd,
London 1993. ISBN 0 85934 331 6 - MIDI for Organists,
C E Pykett
Obrázek 6: Osobní počítač Atari 1040 STf, který je taktéž vybaven MIDI rozhraním.
7. Odkazy na Internetu
- Musical Instrument Digital Interface
http://cs.wikipedia.org/wiki/MIDI - Introduction to MIDI
http://www.chrisbsmusic.com/howmidiworks.html - P. Herout: Obecné MIDI (General MIDI)
http://www-kiv.zcu.cz/~herout/html_sbo/midi/5.html - (.mid) Standard MIDI File Format
http://faydoc.tripod.com/formats/mid.htm - A crash course on the standard MIDI specification
http://www.skytopia.com/project/articles/midi.html - MIDI transform V1.1
http://www.skytopia.com/software/midi - MIDI File Parsing
http://www.ccarh.org/courses/253/assignment/midifile/ - Grafické karty a grafické akcelerátory (6) – Stručná historie počítačů Atari ST
/clanky/graficke-karty-a-graficke-akceleratory-6/ - Amiga Midi HOST Adapter
http://amigareview.amiga.sk/amiga-review-21/amiga-midi-host-adapter - Atari.org
http://www.atari.org/ - Atari 520ST/ST+/STM
http://www.old-computers.com/museum/computer.asp?c=20 - Atari ST (CZ)
http://cs.wikipedia.org/wiki/Atari_ST - Atari ST (EN)
http://en.wikipedia.org/wiki/Atari_ST - MIDI Maze,
http://en.wikipedia.org/wiki/MIDI_Maze - HoofJaw & MIDI.com – Your MIDI File Center!,
http://www.hoofjaw.com/Default.aspx - Kenton Releases New MIDI Merge Box,
http://www.dolphinmusic.co.uk/news/news-story/news_id/1925 - How Optical Isolation Works (with Switching Power Supply) – Illustration,
http://www.bb-elec.com/tech_articles/optical_isolation_illustration.asp - Opto-isolator,
http://en.wikipedia.org/wiki/Opto-isolator - Musical Instrument Digital Interface,
http://en.wikipedia.org/wiki/Musical_Instrument_Digital_Interface - Daves Old Computers – Atari ST,
http://www.classiccmp.org/dunfield/atarist/index.htm - A MIDI Pedalboard Encode,
http://www.pykett.org.uk/a_midi_pedalboard_encoder.htm - MIDI Note Number, Frequency Table,
http://tonalsoft.com/pub/news/pitch-bend.aspx - Note names, MIDI numbers and frequencies,
http://www.phys.unsw.edu.au/jw/notes.html - The MIDI Specification,
http://www.gweep.net/~prefect/eng/reference/protocol/midispec.html - Essentials of the MIDI protocol,
http://ccrma.stanford.edu/~craig/articles/linuxmidi/misc/essenmidi.html - Veni, MIDI, Vici: Generating a simple MIDI file using VB, part 1,
http://blogs.msdn.com/vbteam/archive/2009/02/27/veni-midi-vici-generating-a-simple-midi-file-using-vb-part-1-matt-gertz.aspx