Differenze tra le versioni di "La struttura di un file Midi"
(43 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 2: | Riga 2: | ||
<BR>In particolare il file Midi è composto da <SPAN Style="text-decoration:underline">almeno</span> due blocchi di dati. | <BR>In particolare il file Midi è composto da <SPAN Style="text-decoration:underline">almeno</span> due blocchi di dati. | ||
− | ==Il blocco d'Intestazione== | + | ==Il blocco d'Intestazione (MThd)== |
− | Il primo blocco di dati | + | Il primo blocco di dati del file Midi è <SPAN Style="text-decoration:underline">sempre</span> la cosiddetta "''Traccia Midi d'Intestazione''", anche rappresentata nel file con l'acronimo ''MThd''. |
<BR>Questo blocco è <SPAN Style="text-decoration:underline">sempre</span> costituito complessivamente da 14 byte, così distinti: | <BR>Questo blocco è <SPAN Style="text-decoration:underline">sempre</span> costituito complessivamente da 14 byte, così distinti: | ||
<BR>a) i primi 4 byte individuano univocamente il blocco d'intestazione con i valori ASCII delle lettere "MThd"; | <BR>a) i primi 4 byte individuano univocamente il blocco d'intestazione con i valori ASCII delle lettere "MThd"; | ||
Riga 11: | Riga 11: | ||
<BR>e) seguono altri 2 byte che specificano in ordine ''Big-Endian'' la risoluzione del Tempo Delta (PPQN). | <BR>e) seguono altri 2 byte che specificano in ordine ''Big-Endian'' la risoluzione del Tempo Delta (PPQN). | ||
− | Mostriamo un esempio di blocco d'Intestazione: | + | Mostriamo un <U>esempio</u> di blocco d'Intestazione: |
− | 4D 54 68 64 00 00 00 06 00 01 00 04 01 80 | + | <TABLE> |
− | + | <TR align=center><TD> MThd </td><TD> </td><TD> lunghezza </td><TD> </td><TD> formato </td><TD> </td><TD> tracce </td><TD> </td><TD> risoluzione </td></tr> | |
+ | <TR align=center><TD style=color:red><B>4D 54 68 64</b></td><TD> </td><TD style=color:darkgreen> 00 00 00 06</td><TD> </td><TD style=color:#FA8072> 00 01</td><TD> </td><TD style=color:maroon> 00 04</td><TD> </td><TD style=color:blue> 01 80</td></tr> | ||
+ | <TR align=center><TD>a</td><TD> </td><TD>b<TD> </td><TD>c<TD> </td><TD>d<TD> </td><TD>e</td></tr></table> | ||
Tali dati esemplificativi di blocco ''MThd'' ci dicono che: | Tali dati esemplificativi di blocco ''MThd'' ci dicono che: | ||
− | <BR>a) intende essere un blocco d' | + | <BR>a) intende essere un blocco d'Intestazione, infatti i primi 4 byte corrispondono alla rappresentazione ASCII dei caratteri M T h d ; |
− | <BR>b) dopo gli iniziali 8 byte del blocco restano soltanto altri 6 byte; | + | <BR>b) dopo gli iniziali 8 byte del blocco restano soltanto altri 6 byte (qui indicati dalle lettere c, d, e); |
− | <BR>c) il file è di tipo 1; | + | <BR>c) il file <U>in questo esempio</u> è di tipo 1; |
− | <BR>d) oltre il blocco MThd sono presenti a seguire altre 4 tracce di dati Midi; | + | <BR>d) oltre il blocco MThd sono presenti a seguire <U>in questo esempio</u> altre 4 tracce (MTrk) di dati Midi; |
− | <BR>e) la risoluzione del Tempo Delta in questo | + | <BR>e) la risoluzione del ''Tempo Delta'' <U>in questo esempio</u> è 384 pulsazioni per nota da un quarto. |
===Il tipo di file Midi=== | ===Il tipo di file Midi=== | ||
Esistono tre tipi di strutture interne del file Midi, e si identificano con i numeri 0, 1 e 2. | Esistono tre tipi di strutture interne del file Midi, e si identificano con i numeri 0, 1 e 2. | ||
− | Il tipo "0" di file Midi è il più semplice, poiché prevede il blocco d'Intestazione e <SPAN Style="text-decoration:underline">una sola</span> traccia contenente i dati degli eventi Midi secondo la loro sequenza temporale esecutiva: i vari canali Midi e i dati di tutti gli eventi Midi previsti sono così mescolati in un'unica traccia. | + | Il tipo "0" di file Midi è il più semplice, poiché prevede il blocco d'Intestazione e <SPAN Style="text-decoration:underline">una sola</span> traccia contenente i dati degli eventi Midi secondo la loro sequenza temporale esecutiva: i vari canali Midi <SUP>[[[#Note|nota 1]]]</sup> e i dati di tutti gli eventi Midi previsti sono così mescolati in un'unica traccia. |
Il tipo "1", il più comune, prevede il blocco d'Intestazione e <SPAN Style="text-decoration:underline">almeno</span> una traccia di dati degli eventi Midi. Poiché questo tipo può supportare molte tracce, <SPAN Style="text-decoration:underline">si è soliti</span> (seppur non obbligatorio) porre in ciascuna traccia di dati gli eventi Midi appartenenti al medesimo canale Midi. | Il tipo "1", il più comune, prevede il blocco d'Intestazione e <SPAN Style="text-decoration:underline">almeno</span> una traccia di dati degli eventi Midi. Poiché questo tipo può supportare molte tracce, <SPAN Style="text-decoration:underline">si è soliti</span> (seppur non obbligatorio) porre in ciascuna traccia di dati gli eventi Midi appartenenti al medesimo canale Midi. | ||
− | Il tipo "2", usato rarissimamente, può contenere i dati Midi di più brani musicali, aventi anche diversa impostazione temporale, nonché proprie tracce. | + | Il tipo "2", usato rarissimamente, può contenere i dati Midi di più brani musicali, aventi anche diversa impostazione temporale, nonché proprie tracce multiple indipendenti. |
===La risoluzione del ''Tempo Delta''=== | ===La risoluzione del ''Tempo Delta''=== | ||
− | Va detto preliminarmente che tutti gli elementi costituenti i dati del file Midi sono anche chiamati ''Eventi'' Midi, poiché ciascuno di essi avviene nel tempo in modo sequenziale (uno dopo l'altro). Ogni ''Evento'' Midi <SPAN Style=text-decoration:underline">accade</span> dopo un altro precedente ''Evento'' Midi. Questa distanza temporale fra un ''Evento'' Midi e quello precedente nel file Midi <SPAN Style=text-decoration:underline">non</span> è indicata in un'unità di misura di tempo (secondi, millisecondi, etc), bensì in ''tick''. <SUP>[[[#Note|nota | + | Va detto preliminarmente che tutti gli elementi costituenti i dati del file Midi sono anche chiamati ''Eventi'' Midi, poiché ciascuno di essi avviene nel tempo in modo sequenziale (uno dopo l'altro). Ogni ''Evento'' Midi <SPAN Style="text-decoration:underline">accade</span> dopo un altro precedente ''Evento'' Midi. Questa distanza temporale fra un ''Evento'' Midi e quello precedente nel file Midi <SPAN Style="text-decoration:underline">non</span> è indicata in un'unità di misura di tempo (secondi, millisecondi, etc), bensì in ''tick''. <SUP>[[[#Note|nota 2]]]</sup> |
− | <BR>Più in particolare la distanza temporale fra un ''Evento'' Midi e quello suo precedente è chiamata anche " ''Tempo Delta'' " ed è espressa in ''Tick'' <SUP>[[[#Note|nota | + | <BR>Più in particolare la distanza temporale fra un ''Evento'' Midi e quello suo precedente è chiamata anche " ''Tempo Delta'' " (T𝚫) ed è espressa in ''Tick'' <SUP>[[[#Note|nota 3]]]</sup> in formato ''a lunghezza variabile'' <SUP>[[[#Note|nota 4]]]</sup>. |
− | <BR> | + | <BR>Vanno dunque considerate e tenute ben distinte le seguenti tre espressioni del ''Tempo Delta'': |
+ | <BR>1) in unità di misura temporale (secondi, millisecondi, microsecondi, etc); | ||
+ | <BR>2) in ''tick'' reali, effettivi; | ||
+ | <BR>3) in ''tick'', ma in formato ''a lunghezza variabile''. | ||
+ | <BR>E' qui opportuno ribadire che nel file Midi il ''Tempo Delta'' che separa un ''Evento'' Midi da quello precedente è <SPAN Style="text-decoration:underline">solo e sempre</span> espresso nella terza modalità, ossia in quantità ''tick'' in formato ''a lunghezza variabile'' ! | ||
+ | <BR>Va altresì ricordato che il valore del ''Tempo Delta'' nel file Midi può essere espresso da 1 a 4 byte massimo, e va precisato che un valore di ''Tempo Delta'' pari a &h00 (zero) sta a significare che ovviamente l'<I>Evento</i> Midi avverrà <SPAN Style="text-decoration:underline">contemporaneamente</span> a quello che lo precede. | ||
+ | Venendo quindi agli ultimi due byte del blocco d'Intestazione, essi prendono come riferimento una nota da ¼ (ossia la ''semiminima'': <FONT Size=4>♩</font> ), e indicano quanti impulsi o ''tick'' sono necessari per ottenere appunto la durata di una nota da ¼. Le altre misure si otterranno proporzionalmente dall'impostazione della divisione in ''tick'' stabilita negli ultimi due byte del blocco d'Intestazione. | ||
+ | ==Il blocco Traccia (MTrk)== | ||
+ | Come è stato già accennato dopo il blocco d'Intestazione seguono nel file Midi uno o più blocchi ''Traccia'' (''MTrk''). | ||
+ | <BR>Il blocco ''Traccia'' è individuato dalle seguenti caratteristiche principali: | ||
+ | <BR>1) inizia <SPAN Style="text-decoration:underline">sempre</span> con 4 byte che rappresentano nel codice ASCII le lettere: M T r k; | ||
+ | <BR>2) seguono immediatamente altri 4 byte che esprimono in ordine ''Big-Endian'' la quantità di byte che - a seguire - costituiscono il blocco Traccia in questione; | ||
+ | <BR>3) segue un valore di ''Tempo Delta''; | ||
+ | <BR>4) contiene gli effettivi dati degli ''Eventi'' Midi: ''Eventi'' Midi strettamente intesi (''Channel Voice'', ''Channel Mode'', ''System Common'', ''System Real Time'', ''System Exclusive'') e Meta-Eventi, nonché i relativi valori dei ''Tempi Delta'' posti fra un ''Evento'' Midi e il precedente; | ||
+ | <BR>5) termina <SPAN Style="text-decoration:underline">sempre</span> con il ''Meta-Evento'' di "''Fine traccia''", individuato dai seguenti 3 byte: FF 2F 00. | ||
+ | <BR>Va specificato che la ''Traccia'' Midi <SPAN Style="text-decoration:underline">non</span> corrisponde a un ''Canale'' Midi. Va però aggiunto che solitamente - per ovvie ragioni di comodità - si inseriscono in un blocco ''Traccia'' i ''Messaggi'' Midi appartenenti allo stesso ''Canale'' Midi. | ||
+ | <BR>Va anche ricordato che le tracce Midi (MTrk) possono essere una o più. | ||
+ | |||
+ | Mostriamo un esempio brevissimo e semplicissimo di blocco Traccia ''MTrk'': | ||
+ | <TABLE> | ||
+ | <TR align=center><TD>MTrk</td><TD> </td><TD> lunghezza </td><TD> </td><TD> T𝚫 </td><TD> </td><TD> Messaggio </td><TD> </td><TD> T𝚫 </td><TD> </td><TD> Messaggio </td><TD> </td><TD> T𝚫 </td><TD> </td><TD> Meta-Evento</td></tr> | ||
+ | <TR align=center><TD style=color:red><B>4D 54 72 6B</b></td><TD> </td><TD style=color:darkgreen> 00 00 00 0D</td><TD> </td><TD style=color:blue> 00 </td><TD> </td><TD style=color:maroon> 90 48 64 </td><TD> </td><TD style=color:blue> 83 00</td><TD> </td><TD style=color:maroon> 80 48 00 </td><TD> </td><TD style=color:blue> 00</td><TD> </td><TD style=color:#FA8072> FF 2F 00</td></tr></table> | ||
+ | |||
+ | ===La ''Mappa del Tempo''=== | ||
+ | Solitamente (ma non è obbligatorio) nel <SPAN Style="text-decoration:underline">primo</span> blocco Traccia vengono inseriti soltanto tutti i Meta-eventi che si intendono prevedere nel file Midi in questione, con particolare riferimento a quelli afferenti al Tempo metronomico (FF 51 03) e alla suddivisione della misura (FF 58 04). | ||
+ | <BR>Per questa ragione la <SPAN Style="text-decoration:underline">prima</span> Traccia viene anche chiamata: " ''Mappa del Tempo'' ". | ||
+ | |||
+ | ==I ''Meta''-eventi== | ||
+ | I ''Meta''-eventi sono così chiamati, perché in realtà essi non appartengono al protocollo della trasmissione dei singoli dati MIDI fra dispositivi e pertanto <SPAN Style="text-decoration:underline">non</span> sono ''eventi'' Midi. Essi, però, sono previsti dal protocollo dello ''Standard Midi File'', e apportano informazioni importanti nella gestione del file Midi. | ||
+ | <BR>Tutti i ''Meta''-eventi sono composti da più byte, dei quali i primi tre sono fondamentali per la individuazione dell'evento ''Meta'' e del suo ruolo all'interno del file Midi. | ||
+ | <BR>In particolare: | ||
+ | <BR>1) il primo byte ha <SPAN Style="text-decoration:underline">sempre</span> valore &hFF e identifica l'evento appunto come ''Meta''; | ||
+ | <BR>2) il secondo byte specifica il "tipo" di evento ''Meta''; | ||
+ | <BR>3) il terzo byte specifica la quantità di byte che costituisce l'informazione contenuta dal corrente ''Meta''-evento. Tale valore può essere costituito da 1 fino a 4 byte ed è espresso in formato ''a lunghezza variabile''. | ||
+ | <BR>I restanti byte rappresentano l'informazione apportata dall'evento ''Meta''. | ||
+ | <BR>Va ricordato che prima e dopo il ''Meta''-evento sono presenti i valori del ''Tempo Delta'', così come qualsiasi ''Evento'' in generale. | ||
+ | |||
+ | Mostriamo un esempio pratico di evento ''Meta'': | ||
+ | <FONT Color=red>FF</font> <FONT Color=darkgreen>51</font> <FONT Color=blue>03</font> <FONT Color=maroon>07 A1 20</font> | ||
+ | |||
+ | ===I tipi di eventi ''Meta''=== | ||
+ | I ''Meta''-eventi sono complessivamente 16. | ||
+ | <BR>Di seguito ne mostriamo i più comunemente utilizzati: | ||
+ | <TABLE border="1"><TR><TD> | ||
+ | <TABLE border="1" width="100%"><TR><TD> | ||
+ | <TABLE> <TR><TD><FONT Color=red>FF</font> <FONT Color=blue>01</font> <FONT Color=darkgreen>lu</font> <FONT Color=maroon>vv vv ...</font></td></tr> | ||
+ | <TR><TD>(Evento di testo) utilizzato per apportare un qualunque tipo di testo. </td></tr> | ||
+ | <TR><TD>lu = uno o più byte che specificano in formato a <I>lunghezza variabile</i> la quantità di byte ASCII attinenti al testo.</td></tr> | ||
+ | <TR><TD>vv = i valori in codice ASCII dei caratteri che formano il testo.</td></tr> </table> | ||
+ | </td></tr></table> | ||
+ | <TABLE border="1" width="100%"><TR><TD> | ||
+ | <TABLE><TR><TD><FONT Color=red>FF</font> <FONT Color=blue>02</font> <FONT Color=darkgreen>lu</font> <FONT Color=maroon>vv vv ...</font></td></tr> | ||
+ | <TR><TD>(Copyright) utilizzato per specificare il copyright collegato al file Midi. </td></tr> | ||
+ | <TR><TD>lu = uno o più byte che specificano in formato a <I>lunghezza variabile</i> la quantità di byte ASCII attinenti al testo.</td></tr> | ||
+ | <TR><TD>vv = i valori in codice ASCII dei caratteri che formano il testo.</td></tr> </table> | ||
+ | </td></tr></table> | ||
+ | <TABLE border="1" width="100%"><TR><TD> | ||
+ | <TABLE><TR><TD><FONT Color=red>FF</font> <FONT Color=blue>03</font> <FONT Color=darkgreen>lu</font> <FONT Color=maroon>vv vv ...</font></td></tr> | ||
+ | <TR><TD>(Nome della Traccia) utilizzato per specificare il nome della traccia corrente.</td></tr> | ||
+ | <TR><TD>lu = uno o più byte che specificano in formato a <I>lunghezza variabile</i> la quantità di byte ASCII attinenti al testo.</td></tr> | ||
+ | <TR><TD>vv = i valori in codice ASCII dei caratteri che formano il testo.</td></tr> </table> | ||
+ | </td></tr></table> | ||
+ | <TABLE border="1" width="100%"><TR><TD> | ||
+ | <TABLE><TR><TD><FONT Color=red>FF</font> <FONT Color=blue>04</font> <FONT Color=darkgreen>lu</font> <FONT Color=maroon>vv vv ...</font></td></tr> | ||
+ | <TR><TD>(Strumento) utilizzato per specificare il nome dello strumento musicale della traccia corrente.</td></tr> | ||
+ | <TR><TD>lu = uno o più byte che specificano in formato a <I>lunghezza variabile</i> la quantità di byte ASCII attinenti al testo.</td></tr> | ||
+ | <TR><TD>vv = i valori in codice ASCII dei caratteri che formano il testo.</td></tr> </table> | ||
+ | </td></tr></table> | ||
+ | <TABLE border="1" width="100%"><TR><TD> | ||
+ | <TABLE><TR><TD><FONT Color=red>FF</font> <FONT Color=blue>05</font> <FONT Color=darkgreen>lu</font> <FONT Color=maroon>vv vv ...</font></td></tr> | ||
+ | <TR><TD>(Lyric) utilizzato per inserire una sillaba del testo di un brano musicale.</td></tr> | ||
+ | <TR><TD>lu = uno o più byte che specificano in formato a <I>lunghezza variabile</i> la quantità di byte ASCII attinenti al testo.</td></tr> | ||
+ | <TR><TD>vv = i valori in codice ASCII dei caratteri che formano il testo.</td></tr> </table> | ||
+ | </td></tr></table> | ||
+ | <TABLE border="1" width="100%"><TR><TD> | ||
+ | <TABLE><TR><TD><FONT Color=red>FF</font> <FONT Color=blue>2F</font> <FONT Color=darkgreen>00</font></td></tr> | ||
+ | <TR><TD>(Fine Traccia) è un evento <I>Meta</i> obbligatorio: va posto al termine della Traccia Midi corrente.</td></tr> | ||
+ | <TR><TD>Non prevede dati aggiuntivi, pertanto il suo 3° byte è posto a 0.</td></tr> </table> | ||
+ | </td></tr></table> | ||
+ | <TABLE border="1" width="100%"><TR><TD> | ||
+ | <TABLE><TR><TD><FONT Color=red>FF</font> <FONT Color=blue>51</font> <FONT Color=darkgreen>03</font> <FONT Color=maroon>vv vv vv</font></td></tr> | ||
+ | <TR><TD>(Tempo metronomico) utilizzato per impostare il "Tempo metronomico".</td></tr> | ||
+ | <TR><TD>Sono previsti 3 byte di dati a seguire.</td></tr> | ||
+ | <TR><TD>vv = i byte del valore che rappresenta il Tempo metronomico ottenuto dalla seguente formula: 60.000.000 / bpm = valore_del_Tempo_metronomico.</td></tr> </table> | ||
+ | </td></tr></table> | ||
+ | <TABLE border="1" width="100%"><TR><TD> | ||
+ | <TABLE><TR><TD><FONT Color=red>FF</font> <FONT Color=blue>58</font> <FONT Color=darkgreen>04</font> <FONT Color=maroon>vv vv vv</font></td></tr> | ||
+ | <TR><TD>(Suddivisione della Misura) utilizzato per impostare il metro, ossia la suddivisione della misura.</td></tr> | ||
+ | <TR><TD>Sono previsti 4 byte di dati a seguire.</td></tr> | ||
+ | <TR><TD>vv = i byte che specificano la suddivisione della misura.</td></tr> </table> | ||
+ | </td></tr></table> | ||
+ | <TABLE border="1" width="100%"><TR><TD> | ||
+ | <TABLE><TR><TD><FONT Color=red>FF</font> <FONT Color=blue>59</font> <FONT Color=darkgreen>02</font> <FONT Color=maroon>vv vv vv</font></td></tr> | ||
+ | <TR><TD>(Tonalità) utilizzato per impostare la tonalità del brano Midi.</td></tr> | ||
+ | <TR><TD>Sono previsti 2 byte di dati a seguire.</td></tr> | ||
+ | <TR><TD>vv = i byte che specificano la Tonalità.</td></tr> | ||
+ | <TR><TD>Il primo byte specifica gli accidenti in chiave: un valore positivo indica il numero di diesis (#) in chiave, il valore 0 indica la tonalità di Do maggiore, un valore negativo indica il numero di bemolli (♭) in chiave.</td></tr> | ||
+ | <TR><TD>Il secondo byte specifica il "modo": il valore 0 rappresenta la modalità "Maggiore", il valore 1 rappresenta la modalità "Minore".</td></tr> </table> | ||
+ | </td></tr></table> | ||
+ | </table> | ||
+ | |||
+ | ==Esempio di file Midi== | ||
+ | Mostriamo in fine i dati esadecimali di un semplice file Midi, funzionante, composto dal Blocco d'Intestazione (MThd), dal blocco traccia "MTrk" (''Mappa del Tempo'') e da un secondo blocco traccia "MTrk" (i valori dei ''Tempi Delta'' sono colorati in arancione): | ||
+ | <TABLE BORDER="1" CELLSPACING="2" CELLPADDING="2"><TR><TD> | ||
+ | <TABLE><TR><TD>MThd</td><TD style=color:transparent>.</td><TD style=color:red><B> 4D 54 68 64</b> 00 00 00 06 00 01 00 02 01 80</td></tr> | ||
+ | <TR><TD>1<SUP>a</sup> traccia (''Mappa del Tempo'')</td><TD style=color:transparent>.</td><TD style=color:blue><B> 4D 54 72 6B</b> 00 00 00 19 <FONT Color=orange>00</font> FF 58 04 03 02 60 08 <FONT Color=orange>00</font> FF 51 03 09 27 C0 <FONT Color=orange>00</font> FF 59 02 01 00 <FONT Color=orange>00</font> FF 2F 00</td></TR> | ||
+ | <TR><TD>2<SUP>a</sup> traccia</td><TD style=color:transparent>.</td><TD style=color:blue><B> 4D 54 72 6B</b> 00 00 00 2A <FONT Color=orange>00</font> B0 07 64 <FONT Color=orange>00</font> B0 0A 30 <FONT Color=orange>00</font> B0 5B 40 <FONT Color=orange>00</font> B0 5D 10 <FONT Color=orange>00</font> C0 04 <FONT Color=orange>00</font> 90 45 64 <FONT Color=orange>83 00</font> 80 45 00 <FONT Color=orange>81 40</font> 90 42 64 <FONT Color=orange>86 00</font> 80 42 00 <FONT Color=orange>00</font> FF 2F 00</td></TR></TABLE> | ||
+ | </td></tr></table> | ||
=Note= | =Note= | ||
− | [1] Il | + | [1] Il ''Canale'' Midi è un'impostazione presente in ciascun evento Midi che permette a un dispositivo di filtrare gli eventi Midi riproducendo soltanto quelli appartenenti a un determinato ''Canale''. |
− | [2] Per convertire un valore temporale dai secondi in ''tick'' effettivi, si potrà adottare la seguente formula: | + | [2] Il " ''Tick'' " è l'unità di misura più piccola nell'ordine della risoluzione PPQN. |
+ | |||
+ | [3] Per convertire un valore temporale dai secondi in ''tick'' effettivi, si potrà adottare la seguente formula: | ||
(secondi * 1000000) / ((60000000 / bpm) / td) = tick_reali | (secondi * 1000000) / ((60000000 / bpm) / td) = tick_reali | ||
Laddove: | Laddove: | ||
* ''secondi'': è il valore temporale espresso in secondi che intercorre fra un Evento-Midi e quello immediatamente successivo; | * ''secondi'': è il valore temporale espresso in secondi che intercorre fra un Evento-Midi e quello immediatamente successivo; | ||
* ''bmp'': è il tempo metronomico (battute per minuto); | * ''bmp'': è il tempo metronomico (battute per minuto); | ||
− | * ''td'': è la risoluzione per nota da 1/4 (PPQN) impostata nel | + | * ''td'': è la risoluzione per nota da 1/4 (PPQN) impostata nel file Midi. |
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | [4] La modalità di conversione di un valore temporale dai secondi in ''tick'' nel valore esadecimale in formato "a lunghezza variabile" è descritta nella seguente pagina della Wiki: [[Conversione_del_Tempo_Delta_fra_due_eventi_Midi_dai_secondi_nel_valore_esadecimale_in_formato_"a_lunghezza_variabile"|Conversione del Tempo Delta fra due eventi Midi dai secondi nel valore esadecimale in formato "a lunghezza variabile"]]. |
Versione attuale delle 09:55, 19 ott 2024
Il file Midi è strutturato in blocchi (chunk) coerenti di dati, ciascuno dei quali rappresenta una "Traccia" Midi (Midi Track).
In particolare il file Midi è composto da almeno due blocchi di dati.
Indice
Il blocco d'Intestazione (MThd)
Il primo blocco di dati del file Midi è sempre la cosiddetta "Traccia Midi d'Intestazione", anche rappresentata nel file con l'acronimo MThd.
Questo blocco è sempre costituito complessivamente da 14 byte, così distinti:
a) i primi 4 byte individuano univocamente il blocco d'intestazione con i valori ASCII delle lettere "MThd";
b) seguono altri 4 byte che specificano in ordine Big-Endian la quantità di byte restanti del blocco d'Intestazione, ossia sempre 6 byte;
c) seguono altri 2 byte che specificano in ordine Big-Endian il tipo di file Midi (0, 1 oppure 2);
d) seguono altri 2 byte che specificano in ordine Big-Endian la quantità di tracce oltre quella d'Intestazione presenti nel file Midi;
e) seguono altri 2 byte che specificano in ordine Big-Endian la risoluzione del Tempo Delta (PPQN).
Mostriamo un esempio di blocco d'Intestazione:
MThd | lunghezza | formato | tracce | risoluzione | ||||
4D 54 68 64 | 00 00 00 06 | 00 01 | 00 04 | 01 80 | ||||
a | b | c | d | e |
Tali dati esemplificativi di blocco MThd ci dicono che:
a) intende essere un blocco d'Intestazione, infatti i primi 4 byte corrispondono alla rappresentazione ASCII dei caratteri M T h d ;
b) dopo gli iniziali 8 byte del blocco restano soltanto altri 6 byte (qui indicati dalle lettere c, d, e);
c) il file in questo esempio è di tipo 1;
d) oltre il blocco MThd sono presenti a seguire in questo esempio altre 4 tracce (MTrk) di dati Midi;
e) la risoluzione del Tempo Delta in questo esempio è 384 pulsazioni per nota da un quarto.
Il tipo di file Midi
Esistono tre tipi di strutture interne del file Midi, e si identificano con i numeri 0, 1 e 2.
Il tipo "0" di file Midi è il più semplice, poiché prevede il blocco d'Intestazione e una sola traccia contenente i dati degli eventi Midi secondo la loro sequenza temporale esecutiva: i vari canali Midi [nota 1] e i dati di tutti gli eventi Midi previsti sono così mescolati in un'unica traccia.
Il tipo "1", il più comune, prevede il blocco d'Intestazione e almeno una traccia di dati degli eventi Midi. Poiché questo tipo può supportare molte tracce, si è soliti (seppur non obbligatorio) porre in ciascuna traccia di dati gli eventi Midi appartenenti al medesimo canale Midi.
Il tipo "2", usato rarissimamente, può contenere i dati Midi di più brani musicali, aventi anche diversa impostazione temporale, nonché proprie tracce multiple indipendenti.
La risoluzione del Tempo Delta
Va detto preliminarmente che tutti gli elementi costituenti i dati del file Midi sono anche chiamati Eventi Midi, poiché ciascuno di essi avviene nel tempo in modo sequenziale (uno dopo l'altro). Ogni Evento Midi accade dopo un altro precedente Evento Midi. Questa distanza temporale fra un Evento Midi e quello precedente nel file Midi non è indicata in un'unità di misura di tempo (secondi, millisecondi, etc), bensì in tick. [nota 2]
Più in particolare la distanza temporale fra un Evento Midi e quello suo precedente è chiamata anche " Tempo Delta " (T𝚫) ed è espressa in Tick [nota 3] in formato a lunghezza variabile [nota 4].
Vanno dunque considerate e tenute ben distinte le seguenti tre espressioni del Tempo Delta:
1) in unità di misura temporale (secondi, millisecondi, microsecondi, etc);
2) in tick reali, effettivi;
3) in tick, ma in formato a lunghezza variabile.
E' qui opportuno ribadire che nel file Midi il Tempo Delta che separa un Evento Midi da quello precedente è solo e sempre espresso nella terza modalità, ossia in quantità tick in formato a lunghezza variabile !
Va altresì ricordato che il valore del Tempo Delta nel file Midi può essere espresso da 1 a 4 byte massimo, e va precisato che un valore di Tempo Delta pari a &h00 (zero) sta a significare che ovviamente l'Evento Midi avverrà contemporaneamente a quello che lo precede.
Venendo quindi agli ultimi due byte del blocco d'Intestazione, essi prendono come riferimento una nota da ¼ (ossia la semiminima: ♩ ), e indicano quanti impulsi o tick sono necessari per ottenere appunto la durata di una nota da ¼. Le altre misure si otterranno proporzionalmente dall'impostazione della divisione in tick stabilita negli ultimi due byte del blocco d'Intestazione.
Il blocco Traccia (MTrk)
Come è stato già accennato dopo il blocco d'Intestazione seguono nel file Midi uno o più blocchi Traccia (MTrk).
Il blocco Traccia è individuato dalle seguenti caratteristiche principali:
1) inizia sempre con 4 byte che rappresentano nel codice ASCII le lettere: M T r k;
2) seguono immediatamente altri 4 byte che esprimono in ordine Big-Endian la quantità di byte che - a seguire - costituiscono il blocco Traccia in questione;
3) segue un valore di Tempo Delta;
4) contiene gli effettivi dati degli Eventi Midi: Eventi Midi strettamente intesi (Channel Voice, Channel Mode, System Common, System Real Time, System Exclusive) e Meta-Eventi, nonché i relativi valori dei Tempi Delta posti fra un Evento Midi e il precedente;
5) termina sempre con il Meta-Evento di "Fine traccia", individuato dai seguenti 3 byte: FF 2F 00.
Va specificato che la Traccia Midi non corrisponde a un Canale Midi. Va però aggiunto che solitamente - per ovvie ragioni di comodità - si inseriscono in un blocco Traccia i Messaggi Midi appartenenti allo stesso Canale Midi.
Va anche ricordato che le tracce Midi (MTrk) possono essere una o più.
Mostriamo un esempio brevissimo e semplicissimo di blocco Traccia MTrk:
MTrk | lunghezza | T𝚫 | Messaggio | T𝚫 | Messaggio | T𝚫 | Meta-Evento | |||||||
4D 54 72 6B | 00 00 00 0D | 00 | 90 48 64 | 83 00 | 80 48 00 | 00 | FF 2F 00 |
La Mappa del Tempo
Solitamente (ma non è obbligatorio) nel primo blocco Traccia vengono inseriti soltanto tutti i Meta-eventi che si intendono prevedere nel file Midi in questione, con particolare riferimento a quelli afferenti al Tempo metronomico (FF 51 03) e alla suddivisione della misura (FF 58 04).
Per questa ragione la prima Traccia viene anche chiamata: " Mappa del Tempo ".
I Meta-eventi
I Meta-eventi sono così chiamati, perché in realtà essi non appartengono al protocollo della trasmissione dei singoli dati MIDI fra dispositivi e pertanto non sono eventi Midi. Essi, però, sono previsti dal protocollo dello Standard Midi File, e apportano informazioni importanti nella gestione del file Midi.
Tutti i Meta-eventi sono composti da più byte, dei quali i primi tre sono fondamentali per la individuazione dell'evento Meta e del suo ruolo all'interno del file Midi.
In particolare:
1) il primo byte ha sempre valore &hFF e identifica l'evento appunto come Meta;
2) il secondo byte specifica il "tipo" di evento Meta;
3) il terzo byte specifica la quantità di byte che costituisce l'informazione contenuta dal corrente Meta-evento. Tale valore può essere costituito da 1 fino a 4 byte ed è espresso in formato a lunghezza variabile.
I restanti byte rappresentano l'informazione apportata dall'evento Meta.
Va ricordato che prima e dopo il Meta-evento sono presenti i valori del Tempo Delta, così come qualsiasi Evento in generale.
Mostriamo un esempio pratico di evento Meta:
FF 51 03 07 A1 20
I tipi di eventi Meta
I Meta-eventi sono complessivamente 16.
Di seguito ne mostriamo i più comunemente utilizzati:
|
Esempio di file Midi
Mostriamo in fine i dati esadecimali di un semplice file Midi, funzionante, composto dal Blocco d'Intestazione (MThd), dal blocco traccia "MTrk" (Mappa del Tempo) e da un secondo blocco traccia "MTrk" (i valori dei Tempi Delta sono colorati in arancione):
|
Note
[1] Il Canale Midi è un'impostazione presente in ciascun evento Midi che permette a un dispositivo di filtrare gli eventi Midi riproducendo soltanto quelli appartenenti a un determinato Canale.
[2] Il " Tick " è l'unità di misura più piccola nell'ordine della risoluzione PPQN.
[3] Per convertire un valore temporale dai secondi in tick effettivi, si potrà adottare la seguente formula:
(secondi * 1000000) / ((60000000 / bpm) / td) = tick_reali
Laddove:
- secondi: è il valore temporale espresso in secondi che intercorre fra un Evento-Midi e quello immediatamente successivo;
- bmp: è il tempo metronomico (battute per minuto);
- td: è la risoluzione per nota da 1/4 (PPQN) impostata nel file Midi.
[4] La modalità di conversione di un valore temporale dai secondi in tick nel valore esadecimale in formato "a lunghezza variabile" è descritta nella seguente pagina della Wiki: Conversione del Tempo Delta fra due eventi Midi dai secondi nel valore esadecimale in formato "a lunghezza variabile".