General MIDI a formát souborů SMF

5. 3. 2009
Doba čtení: 10 minut

Sdílet

V dnešní části seriálu o architekturách počítačů si popíšeme interní strukturu formátu souborů SMF, které většinou mívají koncovku .mid. Tyto soubory jsou používané pro ukládání, přenos a přehrávání jednostopé i vícestopé hudby na různých systémech, včetně běžných osobních počítačů vybavených zvukovým čipem.

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ů.

pc5101

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
pc5102

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ě)
pc5203

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.

pc5104

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;
} 
pc5105

Obrázek 5: Osobní počítač Atari 520 ST, který je vybaven MIDI rozhraním.

bitcoin_skoleni

6. Literatura

  1. Arnell, Billy. „McScope: System.“ Music, Computers, and Software,
    April 1988: 58–60. Conger, Jim. C Programming for MIDI.
    Redwood City: M & T Books, 1988.
  2. Cooper, Jim. „Mind Over MIDI: Information Sources and System-exclusive Data Formats.“,
    Keyboard October, 1986: 110–111.
  3. Enders, Bernd and Wolfgang Klemme. MIDI and Sound Book for the Atari ST.
    Redwood City: M & T Books, 1989.
  4. Matzkin, Jonathan. „A MIDI Musical Offering.“
    PC Magazine 29 Nov. 1988: 229+.
  5. Peters, Constantine. „Reading up on MIDI for the Novice and the Pro.“
    PC Magazine 29 Nov. 1988: 258.
  6. Basic MIDI, Paul White,
    Sanctuary Publishing Ltd, London 1999.
    ISBN 1 86074 262 9
  7. A Beginner's Guide to MIDI,
    R A Penfold, Babani Publishing Ltd,
    London 1993. ISBN 0 85934 331 6
  8. MIDI for Organists,
    C E Pykett
pc5106

Obrázek 6: Osobní počítač Atari 1040 STf, který je taktéž vybaven MIDI rozhraním.

7. Odkazy na Internetu

  1. Musical Instrument Digital Interface
    http://cs.wiki­pedia.org/wiki/MI­DI
  2. Introduction to MIDI
    http://www.chris­bsmusic.com/how­midiworks.html
  3. P. Herout: Obecné MIDI (General MIDI)
    http://www-kiv.zcu.cz/~he­rout/html_sbo/m­idi/5.html
  4. (.mid) Standard MIDI File Format
    http://faydoc­.tripod.com/for­mats/mid.htm
  5. A crash course on the standard MIDI specification
    http://www.sky­topia.com/pro­ject/articles/mi­di.html
  6. MIDI transform V1.1
    http://www.sky­topia.com/sof­tware/midi
  7. MIDI File Parsing
    http://www.ccar­h.org/courses/253/as­signment/midi­file/
  8. Grafické karty a grafické akcelerátory (6) – Stručná historie počítačů Atari ST
    /clanky/graficke-karty-a-graficke-akceleratory-6/
  9. Amiga Midi HOST Adapter
    http://amigare­view.amiga.sk/a­miga-review-21/amiga-midi-host-adapter
  10. Atari.org
    http://www.ata­ri.org/
  11. Atari 520ST/ST+/STM
    http://www.old-computers.com/mu­seum/computer­.asp?c=20
  12. Atari ST (CZ)
    http://cs.wiki­pedia.org/wiki/A­tari_ST
  13. Atari ST (EN)
    http://en.wiki­pedia.org/wiki/A­tari_ST
  14. MIDI Maze,
    http://en.wiki­pedia.org/wiki/MI­DI_Maze
  15. HoofJaw & MIDI.com – Your MIDI File Center!,
    http://www.ho­ofjaw.com/Defau­lt.aspx
  16. Kenton Releases New MIDI Merge Box,
    http://www.dol­phinmusic.co.uk/new­s/news-story/news_id/1925
  17. How Optical Isolation Works (with Switching Power Supply) – Illustration,
    http://www.bb-elec.com/tech_ar­ticles/optical_i­solation_illus­tration.asp
  18. Opto-isolator,
    http://en.wiki­pedia.org/wiki/Op­to-isolator
  19. Musical Instrument Digital Interface,
    http://en.wiki­pedia.org/wiki/Mu­sical_Instrumen­t_Digital_Inter­face
  20. Daves Old Computers – Atari ST,
    http://www.clas­siccmp.org/dun­field/atarist/in­dex.htm
  21. A MIDI Pedalboard Encode,
    http://www.py­kett.org.uk/a_mi­di_pedalboard_en­coder.htm
  22. MIDI Note Number, Frequency Table,
    http://tonalsof­t.com/pub/new­s/pitch-bend.aspx
  23. Note names, MIDI numbers and frequencies,
    http://www.phys­.unsw.edu.au/jw/no­tes.html
  24. The MIDI Specification,
    http://www.gwe­ep.net/~prefec­t/eng/referen­ce/protocol/mi­dispec.html
  25. Essentials of the MIDI protocol,
    http://ccrma.stan­ford.edu/~cra­ig/articles/li­nuxmidi/misc/es­senmidi.html
  26. Veni, MIDI, Vici: Generating a simple MIDI file using VB, part 1,
    http://blogs.msdn­.com/vbteam/ar­chive/2009/02/2­7/veni-midi-vici-generating-a-simple-midi-file-using-vb-part-1-matt-gertz.aspx

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.