Differenze tra le versioni di "La struttura di un file Midi"

Da Gambas-it.org - Wikipedia.
Riga 31: Riga 31:
  
 
===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>&#091;[[#Note|nota 1]]&#093;</sup>
+
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>&#091;[[#Note|nota 1]]&#093;</sup>
 
<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>&#091;[[#Note|nota 2]]&#093;</sup> in formato ''a lunghezza variabile'' <SUP>&#091;[[#Note|nota 3]]&#093;</sup>.
 
<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>&#091;[[#Note|nota 2]]&#093;</sup> in formato ''a lunghezza variabile'' <SUP>&#091;[[#Note|nota 3]]&#093;</sup>.
 
<BR>Vanno dunque considerate e tenute ben distinte le seguenti tre espressioni del ''Tempo Delta'':
 
<BR>Vanno dunque considerate e tenute ben distinte le seguenti tre espressioni del ''Tempo Delta'':
Riga 37: Riga 37:
 
<BR>2) in ''tick'' reali, effettivi;
 
<BR>2) in ''tick'' reali, effettivi;
 
<BR>3) in ''tick'', ma in formato ''a lunghezza variabile''.
 
<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>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 ricordato altresì che il valore del ''Tempo Delta'' nel file Midi può essere espresso da 1 a 4 byte massimo.
 
<BR>Va ricordato altresì che il valore del ''Tempo Delta'' nel file Midi può essere espresso da 1 a 4 byte massimo.
  
Riga 45: Riga 45:
 
Come è stato già accennato dopo il blocco d'intestazione segue nel file Midi il blocco ''Traccia'' (''MTrk'').
 
Come è stato già accennato dopo il blocco d'intestazione segue nel file Midi il blocco ''Traccia'' (''MTrk'').
 
<BR>Esso è individuato dalle seguenti caratteristiche principali:
 
<BR>Esso è 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>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>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>3) segue un valore di ''Tempo Delta'';
 
<BR>4) contiene gli effettivi dati di tutti gli ''Eventi'' Midi: ''Eventi'' Midi strettamente intesi (''Messaggi'' Midi) e Meta-Eventi, nonché i relativi valori dei ''Tempi Delta'';
 
<BR>4) contiene gli effettivi dati di tutti gli ''Eventi'' Midi: ''Eventi'' Midi strettamente intesi (''Messaggi'' Midi) e Meta-Eventi, nonché i relativi valori dei ''Tempi Delta'';
<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>5) termina <SPAN Style="text-decoration:underline">sempre</span> con il ''Meta-Evento'' di "''Fine traccia''", individuato dai seguenti 3 byte: FF 2F 00.
  
 
===La ''Mappa del Tempo''===
 
===La ''Mappa del Tempo''===

Versione delle 11:16, 3 mag 2018

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.

Il blocco d'Intestazione

Il primo blocco di dati, costituente il file Midi, è sempre la cosidetta "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:

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;
c) il file è di tipo 1;
d) oltre il blocco MThd sono presenti a seguire altre 4 tracce di dati Midi;
e) la risoluzione del Tempo Delta in questo caso è 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 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.

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 1]
Più in particolare la distanza temporale fra un Evento Midi e quello suo precedente è chiamata anche " Tempo Delta " (T𝚫) ed è espressa in Tick [nota 2] in formato a lunghezza variabile [nota 3].
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 ricordato altresì che il valore del Tempo Delta nel file Midi può essere espresso da 1 a 4 byte massimo.

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 proporzialmente dall'impostazione della divisione in tick stabilita negli ultimi due byte del blocco d'Intestazione.

Il blocco Traccia

Come è stato già accennato dopo il blocco d'intestazione segue nel file Midi il blocco Traccia (MTrk).
Esso è 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 di tutti gli Eventi Midi: Eventi Midi strettamente intesi (Messaggi Midi) e Meta-Eventi, nonché i relativi valori dei Tempi Delta;
5) termina sempre con il Meta-Evento di "Fine traccia", individuato dai seguenti 3 byte: FF 2F 00.

La Mappa del Tempo

......



Note

[1] Il " Tick " è l'unità di misura più piccola nell'ordine della risoluzione PPQN.

[2] 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 fileMidi.

[2] 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.



Pagina in costruzione !