Lezione 13
Standard MIDI File: eventi MTrk
Programmazione MIDI (Prof. Luca A. Ludovico)
Struttura generale di uno SMF
• MThd <lunghezza dei dati dello header><dati dello header>
M
T
h
d
Lunghezza
• MTrk <lunghezza dei dati della track> <dati della track>
M
T
r
k
Lunghezza
• MTrk <lunghezza dei dati della track> <dati della track>
M
T
r
k
• …
Programmazione MIDI (Prof. Luca A. Ludovico)
13. Standard MIDI File: eventi MTrk
Lunghezza
Prima struttura: MIDI Track header (MThd) chunk
• MThd <lunghezza dei dati dello header><dati dello header>
M
T
h
d
Lunghezza
• Contenuto esadecimale del chunk
4D
54
68
64 00
HEADER
00
00
06
00
0x
nn
nn
tt
tt
DATI
(codice ASCII per MThd) (lunghezza pari a 6 byte) (tipo SMF) (tracce MTkr) (risoluz.)
• x = 0  SMF Type 0, x = 1  SMF Type 1, x = 2  SMF Type 2
• nn identifica il numero di tracce di tipo MTrk presenti
• tt tt indica la risoluzione temporale
Programmazione MIDI (Prof. Luca A. Ludovico)
13. Standard MIDI File: eventi MTrk
Altre strutture: MIDI Track (MTrk) chunk
• MTrk <lunghezza dei dati dello header><dati della track>
M
T
rh
dk
Lunghezza
• Contenuto esadecimale del chunk
4D
54
72
6B
nn
nn
nn
nn
HEADER
(codice ASCII per MTrk)
(lunghezza variabile)
??
??
??
??
??
??
DATI
(eventi MIDI della traccia)
• Dopo l’header, vengono descritti tutti gli eventi MIDI della traccia, in
termini di coppie [delta time, event]: ogni evento viene temporizzato
Programmazione MIDI (Prof. Luca A. Ludovico)
13. Standard MIDI File: eventi MTrk
Apertura di file MIDI con viewer esadecimale
• Gli SMF sono salvati in formato binario
• E’ possibile aprirli tramite un viewer esadecimale,
quale:
–
–
Il modulo integrato all’interno di Microsoft Visual Studio
TextPad (http://www.textpad.com)
• Esperimento: ascolto e visualizzazione in esadecimale
dei file MIDI di tipo 0 e di tipo 1
–
–
–
Riconoscimento e parsing dell’MThd
Riconoscimento del (o degli) MTrk
Differenze tra tipo 0 e tipo 1, verifica del numero di tracce
Programmazione MIDI (Prof. Luca A. Ludovico)
13. Standard MIDI File: eventi MTrk
MIDI Running Status
• MIDI è seriale: eventi originariamente simultanei non
possono essere trasmessi nello stesso istante.
–
Con frequenza 31.25 Kbit/s e10 bit per byte di dati MIDI, un messaggio
Note On o Note Off (3 byte) richiede 960µs, circa 1 ms, per la
trasmissione
• Per ridurre il ritardo introdotto e la quantità di dati
trasmessi si può usare la tecnica del "running status“ (o
stato di esecuzione)
• Idea: inviare uno status byte solo se il messaggio non è
dello stesso tipo di quello precedente sullo stesso
canale.
Programmazione MIDI (Prof. Luca A. Ludovico)
13. Standard MIDI File: eventi MTrk
Esempio di MIDI Running Status
• Contenuto del campo MTrk per un evento MIDI di un accordo
maggiore di Do con stato di esecuzione
Tempo
delta
Byte di
stato
Valore
I byte di
dati
Valore
II byte di
dati
Valore
…
Note On,
Ch. 1
9016
Pitch
(C3)
2416
Velocity
4016
00
Stato di
esec.
N/A
Pitch
(E3)
2816
Velocity
5516
00
Stato di
esec.
N/A
Pitch
(G3)
2B16
Velocity
4916
• Risultato: … 90 24 40 00 28 55 00 2B 49 …
Programmazione MIDI (Prof. Luca A. Ludovico)
13. Standard MIDI File: eventi MTrk
Confronto
Senza running status
MIDI Out
o
MIDI Thru
MIDI In
Con running status
MIDI Out
o
MIDI Thru
MIDI In
Programmazione MIDI (Prof. Luca A. Ludovico)
13. Standard MIDI File: eventi MTrk
Osservazioni
• L’efficacia del metodo migliora usando messaggi Note
On con velocity = 0 anzichè Note Off
• Altri esempi notevoli: variazione valore nei controller
continui o pitch bend wheel
• Osservazioni:
–
–
–
Non ci sono limiti di tempo all’esecuzione del byte di stato
Si applica solo ai messaggi channel voice e channel mode; non
viene influenzato dai real-time; viene interrotto da SysEx e
System Common
Cosa succede se lo stato di esecuzione viene cancellato?
Programmazione MIDI (Prof. Luca A. Ludovico)
13. Standard MIDI File: eventi MTrk
Descrizione degli eventi
• Nel MIDI Track (MTrk) chunk si trovano eventi <event> separati da
tempi delta <delta_time>
• <event> = <MIDI event> |<sysex event> | <meta-event>
• <MIDI event> = qualsiasi channel message
–
si adotta la tecnica del running status
• <sysex event> = F0 <length> <System Exclusive bytes>
–
il primo byte ha valore F0, e sono costituiti da più byte
• <meta-event> = FF <type> <length> <bytes>
–
–
per informazioni di tipo descrittivo, non direttamente relate alla performance
musicale, contenute nelle tracce MTrk (ad es. però il BPM è fondamentale)
il primo byte ha valore FF, e sono costituiti da più byte
Programmazione MIDI (Prof. Luca A. Ludovico)
13. Standard MIDI File: eventi MTrk
I metadati: metro della misura
• FF 58 04 xx yy kk 08
•
•
•
•
FF: definisce il tipo di evento  metadato
58: identifica il tipo di metadato  metro della misura
04: quantità di byte contenuti nella parte seguente (costante)
xx: numeratore del rapporto della suddivisione della misura
–
•
yy: codifica del denominatore del rapporto
Il numero da inserire è l’esponente cui elevare la base 2 per ottenere il
denominatore prescelto, espresso in esadecimale
–
•
•
Es: per ¾ = 03
Es.: interi: yy = 00, metà: yy = 01, quarti: yy = 02, ottavi: yy = 03, …
kk: numero di MIDI clock per un click di metronomo, sapendo che la
pulsazione è suddivisa in 24 clock.
08: definisce che ci sono 8 note da 1/32 in una nota ¼
–
Introdotto per compatibilità con software che interpretano in modo differente
la pulsazione rispetto al valore da un quarto
Programmazione MIDI (Prof. Luca A. Ludovico)
13. Standard MIDI File: eventi MTrk
Esempio di metro
• Si consideri il file Michelle_type0.mid. Si cerchi la prima
indicazione di metro (FF 58)
FF 58 04 04 02 18 08
id
lungh.
dati
• 0416  num = 4; 0216  den = 202; Ne consegue: metro = 4/4
• 1816  il metronomo batte ogni 12 clock MIDI (ottavi)
• Altro esempio:
FF 58 04 06 03 24 08
id
lungh.
dati
• Tempo di 6/8; 2416  il metronomo si avverte ogni 36 clock (quarti
con il punto)
Programmazione MIDI (Prof. Luca A. Ludovico)
13. Standard MIDI File: eventi MTrk
I metadati: tempo metronomico
• FF 51 03 xx xx xx
•
•
•
•
FF: definisce il tipo di evento  metadato
51: identifica il tipo di metadato  tempo metronomico
03: quantità di byte contenuti nella parte seguente (costante)
xx xx xx: microsecondi per nota da un quarto
x = (60.000.000 · d / 4) / bpm
60.000.000 è la quantità di microsecondi per ogni nota da un quarto
d è il denominatore del metro della misura
bpm è il numero di battiti al minuto del metronomo (tempo metronomico)
Si ricava dalla proporzione x[ms] : d/4[pulsazioni] = 60.000.000[ms] : bpm[pulsazioni], ove d tiene conto del denominatore
del metro mentre la pulsazione MIDI corrisponde convenzionalmente sempre al quarto
• Attenzione: questo metadato va sempre specificato dopo il metro,
e se cambia il metro va rispecificato
Programmazione MIDI (Prof. Luca A. Ludovico)
13. Standard MIDI File: eventi MTrk
Esempio di tempo metronomico
• Si consideri il file Michelle_type0.mid
• Si cerchi la prima indicazione di tempo (FF 51)
FF 51 03 07 A1 1F
id
lungh.
dati
• 07A11F16 = 499999 = n;
• Per definizione n = (60.000.000 · d / 4) / bpm
Essendo noti i valori di n e di d, è possibile calcolare il bpm
• bpm = 120 pulsazioni al minuto
Programmazione MIDI (Prof. Luca A. Ludovico)
13. Standard MIDI File: eventi MTrk
I metadati: armatura di chiave
• FF 59 02 xx yy
•
•
•
•
•
FF: definisce il tipo di evento  metadato
59: identifica il tipo di metadato  armatura di chiave
02: quantità di byte contenuti nella parte seguente (costante)
xx: numero di accidenti in chiave (vedi slide successiva)
yy: definisce il modo
–
–
Maggiore yy = 00
Relativo minore yy = 01
• I sequencer lo scrivono e leggono in tracce distinte
• Può essere considerato opzionale, poiché l’altezza della nota
alterata è definita dal secondo byte di Note On
Programmazione MIDI (Prof. Luca A. Ludovico)
13. Standard MIDI File: eventi MTrk
Codifica degli accidenti in chiave
Maggiore
Diesis:
Bemolle:
Minore
xx = 00 :
--
Do Magg.
La min.
xx = 01 :
1#
Sol Magg.
Mi min.
xx = 02 :
2#
Re Magg.
Si min.
xx = 03 :
3#
La Magg.
Fa# min.
xx = 04 :
4#
Mi Magg.
Do# min.
xx = 05 :
5#
Si Magg.
Sol# min.
xx = 06 :
6#
Fa# Magg.
Re# min.
xx = 07 :
7#
Do# Magg.
La# min.
xx = FF :
1b
Fa Magg.
Re min.
xx = FE :
2b
Sib Magg.
Sol min.
xx = FD :
3b
Mib Magg.
Do min.
xx = FC :
4b
Lab Magg.
Fa min.
xx = FB :
5b
Reb Magg.
Sib min.
xx = FA :
6b
Solb Magg.
Mib min.
xx = F9 :
7b
Dob Magg.
Lab min.
Programmazione MIDI (Prof. Luca A. Ludovico)
13. Standard MIDI File: eventi MTrk
Esempio di armatura di chiave
• Si consideri il file Michelle_type0.mid
• Si cerchi la prima indicazione di armatura (FF 59)
FF 59 02 FF 00
id
• FF  1 bemolle
• 00  modo maggiore
• Tonalità: Fa Magg.
Programmazione MIDI (Prof. Luca A. Ludovico)
13. Standard MIDI File: eventi MTrk
lungh. dati
I metadati: nome della traccia
• FF 03 ll xx xx …
• FF: definisce il tipo di evento  metadato
• 03: identifica il tipo di metadato  nome della traccia
• ll: quantità di byte contenuti nella parte seguente (variabile),
ossia il numero di caratteri nella stringa alfanumerica che
costituisce il nome
• xx xx …: il testo, codificato carattere per carattere, che sarà
associato alla traccia dal sequencer
• Esempio: FF 03 05 46 6C 75 74 65
• Esempio: FF 03 08 56 69 6F 6C 69 6E 20 49
Programmazione MIDI (Prof. Luca A. Ludovico)
13. Standard MIDI File: eventi MTrk
I metadati: nome dello strumento
• FF 04 ll xx xx …
• FF: definisce il tipo di evento  metadato
• 04: identifica il tipo di metadato  nome dello strumento
• ll: quantità di byte contenuti nella parte seguente (variabile),
ossia il numero di caratteri nella stringa alfanumerica che
costituisce il nome
• xx xx …: il nome dello strumento, codificato carattere per
carattere, con o senza spazi
• Esempio: ricerca di FF 04 nel file Michelle_type1.mid
Programmazione MIDI (Prof. Luca A. Ludovico)
13. Standard MIDI File: eventi MTrk
I metadati: testo cantato (lyrics)
• FF 05 ll xx xx …
• FF: definisce il tipo di evento  metadato
• 05: identifica il tipo di metadato  testo cantato
• ll: quantità di byte contenuti nella parte seguente (variabile),
ossia il numero di caratteri nella stringa alfanumerica che
costituisce il testo cantato
• xx xx …: il testo, codificato carattere per carattere, con o senza
spazi
• Esempio:
... | ΔT | Note On | ΔT | FF 05 05 50 72 6F 20 2D | ΔT | Note Off | ΔT | ...
corrisponde al testo “Pro –”
Programmazione MIDI (Prof. Luca A. Ludovico)
13. Standard MIDI File: eventi MTrk
I metadati: fine della traccia MTrk
• FF 2F 00
• FF: definisce il tipo di evento  metadato
• 2F: identifica il tipo di metadato  fine della traccia
• 00: quantità di byte contenuti nella parte seguente (in generale
variabile, ma in questo caso fissa)
• Ogni traccia MTrk termina con un evento di chiusura formato da
tre byte: FF 2F 00, preceduti sempre da un valore di ΔT.
• L’ultimo byte uguale a zero rappresenta la lunghezza del metaevento, la quale, non essendo presenti dati ulteriori, è appunto
pari a zero.
Programmazione MIDI (Prof. Luca A. Ludovico)
13. Standard MIDI File: eventi MTrk
Scarica

Presentazione del corso