Standard MIDI File

Standard MIDI File (zkráceně SMF) je souborový formát určený pro uložení hudebních dat a jejich přenos mezi různými zařízeními. Tyto soubory mají obvykle příponu .mid. Základním rozdílem oproti formátům pro uložení zvuku (WAV, MP3, OGG) je ten, že zatímco ve zvukových souborech je zaznamenán přímo digitalizovaný, případně komprimovaný zvuk, v SMF jsou uloženy parametry použitých hudebních nástrojů, informace o tempu hudby, informace o různých kanálech, jednotlivé noty uložené jako kombinace [čas, nota, rychlost] a další MIDI události.

Formát souboru

Data jsou v souboru uložena v blocích (tzv. „chunk“), kde každý blok obsahuje textový identifikátor dlouhý čtyři znaky (čtyři bajty) a informaci o délce bloku (také čtyři bajty). Vícebajtová čísla se v SMF ukládají v pořadí zvaném big-endian, tedy významnější bajty dříve. Po čtyřech bajtech délky následuje příslušný počet bajtů představujících datovou část bloku. Potom začíná další blok nebo končí soubor.

V praxi lze narazit na dva typy bloků:

  • MThd – Hlavička souboru, vyskytuje se na začátku souboru. Po čtyřech bajtech délky bloku (obvykle 0x00 0x00 0x00 0x06 hexadecimálně) následují dva bajty označující formát souboru (např. 0x00 0x00), dále dva bajty určující počet stop (např. 0x00 0x01) a nakonec dva bajty definující vztažnou hodnotu pro kódování času.
  • MTrk – Blok obsahující data a parametry stopy. Kromě parametrů použitých nástrojů a odehraných not může obsahovat i textové informace, např. název skladby.

Uložení jednotlivých stop

Stopa začíná identifikátorem MTrk následovaným tradičními čtyřmi bajty udávajícími délku bloku a poté již následuje posloupnost událostí ve tvaru časový přírůstek, stavový bajt, datové bajty. Stavový bajt nemusí být uveden, v takovém případě se parametry vztahují k předchozímu stavovému bajtu.

Časový přírůstek (někdy také deltačas) udává dobu od předchozí události. Může zabírat i více bajtů, v takovém případě je vlastní časový přírůstek „rozsekán“ po sedmi bitech a nejvyšší bit u všech bajtů, kromě posledního (nejnižšího) bajtu, je nastaven na jedničku. Např. číslo 127 (hexadecimálně 0x7F, binárně 01111111) se vejde do sedmi bitů a bude proto uloženo v jednom bajtu. Naopak číslo 33090 (0x8142, 10000001 01000010, po sedmi bitech zprava 10 0000010 1000010) bude uloženo ve třech bajtech 0x82 0x82 0x42 (1000010 10000010 01000010). Je zde určitá podobnost s kódováním UTF-8, kde ASCII znaky zabírají pouze jeden bajt (s nulovým nejvyšším bitem), zatímco znaky s vyšším pořadím zabírají bajtů více a jsou také zakončeny bajtem s nulovým nejvyšším bitem.

Stavový bajt (také příkaz, zpráva) definuje druh události. Jedná se o jeden bajt následující bezprostředně za časovým přírůstkem a lze jej poznat tak, že jeho nejvyšší bit je jednička. (Pokud je stavový bajt vynechán, má bajt za deltačasem nejvyšší bit nulový a jedná se o datový bajt.) Podle stavového bajtu lze rozhodnout, kolik následuje datových bajtů. Horní půlbajt obvykle udává druh příkazu a dolní půlbajt upřesňuje jeho význam, nejčastěji představuje číslo kanálu.

Datové bajty (jinak také parametry příkazu nebo zprávy) následují za stavovým bajtem, případně hned za deltačasem, pokud není stavový bajt uveden. Jejích délka závisí na stavu.

Příklady stavových a datových bajtů:

  • Stavový bajt 0x9k (zapnuta nota) je následován dvojicí bajtů [nota + rychlost], dolní půlbajt k udává číslo kanálu.
  • Stavový bajt 0xBk (změna zařízení) je následován dvojicí bajtů udávajících číslo zařízení a novou hodnotu.
  • Stavový bajt 0xCk (změna programu) je následován jedním bajtem obsahujícím číslo programu.
  • Stavový bajt 0xFF je poněkud výjimečný, neboť je následován jedním bajtem definujícím druh tzv. meta-události, další bajt udává délku a následuje příslušný počet bajtů s popisem meta-události.
    • 0xFF 0x03 0xnn (+ nn bajtů) – Název sekvence nebo stopy.
    • 0xFF 0x2F 0x00 – Konec stopy.

Související články

Musical Instrument Digital Interface – MIDI

Externí odkazy

Zdroj