Lezione 14
Esercitazione su SMF
Programmazione MIDI (Prof. Luca A. Ludovico)
Analisi pratica di un breve file MIDI
4D 54 68 64 00 00 00 06 00 01 00 02 01 80 4D 54
72 6B 00 00 00 19 00 FF 58 04 03 02 60 08 00 FF
51 03 09 27 C0 00 FF 59 02 01 00 00 FF 2F 00 4D
54 72 6B 00 00 00 2A 00 B0 07 64 00 B0 0A 30 00
B0 5B 40 00 B0 5D 10 00 C0 04 00 90 45 64 86 00
80 45 64 81 40 90 42 64 81 40 80 42 64 00 FF 2F 00
Programmazione MIDI (Prof. Luca A. Ludovico)
14. Esercitazione su SMF
Come segmentare uno SMF in chunk
• Esiste sicuramente uno e un solo chunk di intestazione
(MThd), di lunghezza complessiva pari a 14 byte e
posizionato all’inizio del file
• Possono esistere uno o più chunk di traccia (MTrk), di
lunghezza variabile e delimitati da
[4D 54 72 6B … FF 2F 00]
– Per i file MIDI di tipo 0 vi è un unico chunk MTrk, per il tipo 1
e 2 ne deve esistere almeno uno
• Il chunk MThd e il/i chunk MTrk riempiono
completamente il file MIDI: nel file non vi sono byte
non appartenenti ad uno di essi.
Programmazione MIDI (Prof. Luca A. Ludovico)
14. Esercitazione su SMF
Ricerca dei chunk di header e di traccia
4D 54 68 64 00 00 00 06 00 01 00 02 01 80 4D 54
72 6B 00 00 00 19 00 FF 58 04 03 02 60 08 00 FF
51 03 09 27 C0 00 FF 59 02 01 00 00 FF 2F 00 4D
54 72 6B 00 00 00 2A 00 B0 07 64 00 B0 0A 30 00
B0 5B 40 00 B0 5D 10 00 C0 04 00 90 45 64 86 00
80 45 64 81 40 90 42 64 81 40 80 42 64 00 FF 2F 00
Programmazione MIDI (Prof. Luca A. Ludovico)
14. Esercitazione su SMF
Analisi del chunk MThd
4D 54 68 64 00 00 00 06 00 01 00 02 01 80 4D 54
72 6B 00 00 00 19 00 FF 58 04 03 02 60 08 00 FF
51 03 09 27 C0 00 FF 59 02 01 00 00 FF 2F 00 4D
54 72 6B 00 00 00 2A 00 B0 07 64 00 B0 0A 30 00
B0 5B 40 00 B0 5D 10 00 C0 04 00 90 45 64 86 00
80 45 64 81 40 90 42 64 81 40 80 42 64 00 FF 2F 00
•
Come si capisce fin dove si estende?
–
–
–
E’ un chunk di lunghezza fissa
La sua lunghezza è comunque scritta nell’header del chunk
Dal byte successivo inizia il primo MTrk, riconoscibile dalla sequenza 4D 54 72 6B
Programmazione MIDI (Prof. Luca A. Ludovico)
14. Esercitazione su SMF
Analisi del chunk MThd
4D 54 68 64 00 00 00 06 00 01 00 02 01 80 …
•
•
•
4D 54 68 64: intestazione di 4 byte del MIDI Track header chunk
00 00 00 06: questi 4 byte informano che seguiranno 6 byte di dati
00 01: questi 2 byte informano che il file MIDI è di tipo 1
–
•
00 02: questi 2 byte informano che dopo il MThd seguiranno 2 blocchi
di traccia MTrk
–
•
E’ vero? Si contano le tracce, ossia i chunk MTrk. Verifica con viewer esadecimale
E’ vero? Verifica con viewer esadecimale
01 80: informazione che specifica la risoluzione in impulsi per quarto
di nota.
Risulta: PPQN = 018016 = 38410
Programmazione MIDI (Prof. Luca A. Ludovico)
14. Esercitazione su SMF
Analisi del primo chunk MTrk
4D 54 68 64 00 00 00 06 00 01 00 02 01 80 4D 54
72 6B 00 00 00 19 00 FF 58 04 03 02 60 08 00 FF
51 03 09 27 C0 00 FF 59 02 01 00 00 FF 2F 00 4D
54 72 6B 00 00 00 2A 00 B0 07 64 00 B0 0A 30 00
B0 5B 40 00 B0 5D 10 00 C0 04 00 90 45 64 86 00
80 45 64 81 40 90 42 64 81 40 80 42 64 00 FF 2F 00
•
Come si capisce fin dove si estende?
–
–
E’ un chunk di lunghezza variabile, ma si può leggere il valore nell’header del chunk.
Attenzione: aprendo il file con un viewer esadecimale, è scritto in base 16!!!
Si conclude con il meta di fine traccia FF 2F 00, seguito da un nuovo MTrk
Programmazione MIDI (Prof. Luca A. Ludovico)
14. Esercitazione su SMF
Come segmentare i contenuti di MTrk
• L’intero contenuto di un chunk MTrk (per contenuto si intende la parte
successiva all’header) è un susseguirsi di coppie
[tempo delta, evento]
• I tempi delta vanno interpretati proseguendo la lettura dei byte finché
non si trova il byte che ha il bit più significativo posto a 0 (tutti i byte
che lo precedono in DT iniziano con una cifra esadecimale  8)
–
In molti casi il tempo delta si esprime su un unico byte; un caso particolare è il tempo
delta posto a 00, per indicare simultaneità o occorrenza immediata
• Gli eventi devono essere segmentati secondo le regole di decodifica
degli eventi MIDI o dei metaeventi tipici degli SMF
–
Ciascuno di essi ha una sua lunghezza, variabile da evento a evento ma predeterminata
(ad es. i messaggi Note On e Note Off occupano 3 byte, il messaggio Program Change ne
occupa 2, il metaevento Segnatura di tempo 7)
• Quello che segue una coppia [tempo delta, evento] è una nuova coppia
Programmazione MIDI (Prof. Luca A. Ludovico)
14. Esercitazione su SMF
Analisi del primo chunk MTrk
… 4D 54 72 6B 00 00 00 19 00 FF 58 04 03 02 60 08 00
FF 51 03 09 27 C0 00 FF 59 02 01 00 00 FF 2F 00 …
• 00: Tempo Delta. Questo byte posto a 0 stabilisce che il
successivo evento rispetto al precedente si verificherà dopo 0
PPQN, quindi senza alcun ritardo
• FF 58 04 03 02 60 08: evento Meta di segnatura di tempo
–
–
–
–
03:
02:
60:
08:
Numeratore = 3
Denominatore = 2^02 = 4
un colpo di metronomo ogni 96 tick MIDI (in questo caso, al sedicesimo)
8 note da 1/32 in una nota ¼
Segnatura di tempo per le misure è ¾
Programmazione MIDI (Prof. Luca A. Ludovico)
14. Esercitazione su SMF
Analisi del primo chunk MTrk
… 4D 54 72 6B 00 00 00 19 00 FF 58 04 03 02 60 08 00
FF 51 03 09 27 C0 00 FF 59 02 01 00 00 FF 2F 00 …
• 00: Tempo Delta pari a 0 PPQN
• FF 51 03 09 27 C0: evento Meta di tempo metronomico
–
–
–
–
0927C016 = 600.000 = n;
Per definizione n = (60.000.000 x d / 4) / bpm
Sono noti i valori di n e di d  è possibile calcolare il bpm
bpm = 100 pulsazioni al minuto
La velocità metronomica del brano MIDI è impostata a 100 bpm
Programmazione MIDI (Prof. Luca A. Ludovico)
14. Esercitazione su SMF
Analisi del primo chunk MTrk
… 4D 54 72 6B 00 00 00 19 00 FF 58 04 03 02 60 08 00
FF 51 03 09 27 C0 00 FF 59 02 01 00 00 FF 2F 00 …
• 00: Tempo Delta pari a 0 PPQN
• FF 59 02 01 00: evento Meta di tonalità
–
–
01: 1 diesis in chiave (Sol Maggiore/Mi minore)
00: la tonalità è maggiore
Tonalità del brano è Sol Maggiore
Programmazione MIDI (Prof. Luca A. Ludovico)
14. Esercitazione su SMF
Analisi del primo chunk MTrk
… 4D 54 72 6B 00 00 00 19 00 FF 58 04 03 02 60 08 00
FF 51 03 09 27 C0 00 FF 59 02 01 00 00 FF 2F 00 …
• 00: Tempo Delta pari a 0 PPQN
• FF 2F 00: fine del blocco di traccia
Programmazione MIDI (Prof. Luca A. Ludovico)
14. Esercitazione su SMF
Analisi del secondo chunk MTrk
4D 54 68 64 00 00 00 06 00 01 00 02 01 80 4D 54
72 6B 00 00 00 19 00 FF 58 04 03 02 60 08 00 FF
51 03 09 27 C0 00 FF 59 02 01 00 00 FF 2F 00 4D
54 72 6B 00 00 00 2A 00 B0 07 64 00 B0 0A 30 00
B0 5B 40 00 B0 5D 10 00 C0 04 00 90 45 64 86 00
80 45 64 81 40 90 42 64 81 40 80 42 64 00 FF 2F 00
•
Come si capisce fin dove si estende?
–
–
E’ un chunk di lunghezza variabile, ma si può leggere il valore nell’header del chunk.
2A16 = 4210
Si conclude con il meta di fine traccia FF 2F 00
Programmazione MIDI (Prof. Luca A. Ludovico)
14. Esercitazione su SMF
Analisi del secondo chunk MTrk
… 4D 54 72 6B 00 00 00 2A 00 B0 07 64 00 B0 0A 30 00
B0 5B 40 00 B0 5D 10 00 C0 04 00 90 45 64 86 00
80 45 64 81 40 90 42 64 81 40 80 42 64 00 FF 2F 00
• 00: Tempo Delta pari a 0 PPQN
• B0 07 64: Evento MIDI Control Change n. 7 (Volume)
10110000
Ctrl Change (Ch. 1)
00000111
01100100
Channel Volume
Value: 100
Programmazione MIDI (Prof. Luca A. Ludovico)
14. Esercitazione su SMF
Analisi del secondo chunk MTrk
… 4D 54 72 6B 00 00 00 2A 00 B0 07 64 00 B0 0A 30 00
B0 5B 40 00 B0 5D 10 00 C0 04 00 90 45 64 86 00
80 45 64 81 40 90 42 64 81 40 80 42 64 00 FF 2F 00
• 00: Tempo Delta pari a 0 PPQN
• B0 0A 30: Evento MIDI Control Change n. 10 (PanPot)
10110000
00001010
00110000
Ctrl Change (Ch. 1)
PanPot
Value: 48
Programmazione MIDI (Prof. Luca A. Ludovico)
14. Esercitazione su SMF
Analisi del secondo chunk MTrk
… 4D 54 72 6B 00 00 00 2A 00 B0 07 64 00 B0 0A 30 00
B0 5B 40 00 B0 5D 10 00 C0 04 00 90 45 64 86 00
80 45 64 81 40 90 42 64 81 40 80 42 64 00 FF 2F 00
• 00: Tempo Delta pari a 0 PPQN
• B0 5B 40: Evento MIDI Control Change n. 91 (Riverbero)
10110000
01011011
01000000
Ctrl Change (Ch. 1)
Riverbero
Value: 64
Programmazione MIDI (Prof. Luca A. Ludovico)
14. Esercitazione su SMF
Analisi del secondo chunk MTrk
… 4D 54 72 6B 00 00 00 2A 00 B0 07 64 00 B0 0A 30 00
B0 5B 40 00 B0 5D 10 00 C0 04 00 90 45 64 86 00
80 45 64 81 40 90 42 64 81 40 80 42 64 00 FF 2F 00
• 00: Tempo Delta pari a 0 PPQN
• B0 5D 10: Evento MIDI Control Change n. 93 (Chorus)
10110000
01011101
00010000
Ctrl Change (Ch. 1)
Chorus
Value: 16
Programmazione MIDI (Prof. Luca A. Ludovico)
14. Esercitazione su SMF
Analisi del secondo chunk MTrk
… 4D 54 72 6B 00 00 00 2A 00 B0 07 64 00 B0 0A 30 00
B0 5B 40 00 B0 5D 10 00 C0 04 00 90 45 64 86 00
80 45 64 81 40 90 42 64 81 40 80 42 64 00 FF 2F 00
• 00: Tempo Delta pari a 0 PPQN
• C0 04: Evento MIDI Program Change n. 4 (Piano Elettrico)
11000000
00000100
Program Change (Ch.1) Value: 4
Programmazione MIDI (Prof. Luca A. Ludovico)
14. Esercitazione su SMF
Analisi del secondo chunk MTrk
… 4D 54 72 6B 00 00 00 2A 00 B0 07 64 00 B0 0A 30 00
B0 5B 40 00 B0 5D 10 00 C0 04 00 90 45 64 86 00
80 45 64 81 40 90 42 64 81 40 80 42 64 00 FF 2F 00
• 00: Tempo Delta pari a 0 PPQN
• 90 45 64: Evento MIDI Note On, pitch 69 (La centrale), velocity
100
10010000
01000101
01100100
Note On (Ch.1)
Pitch: 69
Velocity: 100
Programmazione MIDI (Prof. Luca A. Ludovico)
14. Esercitazione su SMF
Analisi del secondo chunk MTrk
… 4D 54 72 6B 00 00 00 2A 00 B0 07 64 00 B0 0A 30 00
B0 5B 40 00 B0 5D 10 00 C0 04 00 90 45 64 86 00
80 45 64 81 40 90 42 64 81 40 80 42 64 00 FF 2F 00
•
86 00: Tempo Delta pari a 76810 PPQN
(1)0000110 (0)0000000  11000000002 = 76810
La risoluzione al quarto era 01 8016 = 38410, quindi è TΔ della minima
•
80 45 64: Evento MIDI Note Off, pitch 69 (La centrale), velocity 100
10000000
01000101
01100100
Note Off (Ch.1)
Pitch: 69
Velocity: 100
Programmazione MIDI (Prof. Luca A. Ludovico)
14. Esercitazione su SMF
Analisi del secondo chunk MTrk
… 4D 54 72 6B 00 00 00 2A 00 B0 07 64 00 B0 0A 30 00
B0 5B 40 00 B0 5D 10 00 C0 04 00 90 45 64 86 00
80 45 64 81 40 90 42 64 81 40 80 42 64 00 FF 2F 00
•
81 40: Tempo Delta pari a 19210 PPQN
(1)0000001 (0)1000000  11000000002 = 19210
La risoluzione al quarto era 01 8016 = 38410, quindi è TΔ della croma
•
90 42 64: Evento MIDI Note On, pitch 66 (Fa#), velocity 100
10010000
1000010
Note On (Ch.1)
Pitch: 66
Programmazione MIDI (Prof. Luca A. Ludovico)
14. Esercitazione su SMF
01100100
Velocity: 100
Analisi del secondo chunk MTrk
… 4D 54 72 6B 00 00 00 2A 00 B0 07 64 00 B0 0A 30 00
B0 5B 40 00 B0 5D 10 00 C0 04 00 90 45 64 86 00
80 45 64 81 40 90 42 64 81 40 80 42 64 00 FF 2F 00
•
81 40: Tempo Delta pari a 19210 PPQN
(1)0000001 (0)1000000  11000000002 = 19210
La risoluzione al quarto era 01 8016 = 38410, quindi è TΔ della croma
•
80 42 64: Evento MIDI Note Off, pitch 66 (Fa#), velocity 100
10000000
1000010
Note Off (Ch.1)
Pitch: 66
Programmazione MIDI (Prof. Luca A. Ludovico)
14. Esercitazione su SMF
01100100
Velocity: 100
Analisi del secondo chunk MTrk
… 4D 54 72 6B 00 00 00 2A 00 B0 07 64 00 B0 0A 30 00
B0 5B 40 00 B0 5D 10 00 C0 04 00 90 45 64 86 00
80 45 64 81 40 90 42 64 81 40 80 42 64 00 FF 2F 00
•
00: Tempo Delta pari a 0 PPQN
•
FF 2F 00: Fine del chunk di traccia
Programmazione MIDI (Prof. Luca A. Ludovico)
14. Esercitazione su SMF
Visualizzazione nel sequencer
Legenda
Griglia: linea scura  quarto
Programmazione MIDI (Prof. Luca A. Ludovico)
14. Esercitazione su SMF
Sezione 14.1
ESERCITAZIONE
Programmazione MIDI (Prof. Luca A. Ludovico)
14. Esercitazione su SMF
Esercizio di analisi: 14_esercizio.mid
4D 54 68 64 00 00 00 06 00 00 00 01 03 C0 4D 54
72 6B 00 00 00 4F 00 90 24 71 00 90 26 71 87 40
80 24 00 00 80 26 00 83 60 90 25 71 00 90 27 71
83 60 80 25 00 00 80 27 00 82 40 90 26 71 00 91
27 71 82 40 80 26 00 00 90 25 71 00 81 27 00 00
91 26 71 82 40 80 25 00 00 81 26 00 87 40 B0 7B
00 00 FF 2F 00
Programmazione MIDI (Prof. Luca A. Ludovico)
14. Esercitazione su SMF
Identificazione dei chunk e della loro lunghezza
4D 54 68 64 00 00 00 06 00 00 00 01 03 C0 4D 54
72 6B 00 00 00 4F 00 90 24 71 00 90 26 71 87 40
80 24 00 00 80 26 00 83 60 90 25 71 00 90 27 71
83 60 80 25 00 00 80 27 00 82 40 90 26 71 00 91
27 71 82 40 80 26 00 00 90 25 71 00 81 27 00 00
91 26 71 82 40 80 25 00 00 81 26 00 87 40 B0 7B
00 00 FF 2F 00
Legenda: Header dell’MThd Header dell’MTrk
Programmazione MIDI (Prof. Luca A. Ludovico)
14. Esercitazione su SMF
Lunghezza dell’MThd
Lunghezza dell’MTrk
Analisi del chunk MThd
4D 54 68 64 00 00 00 06 00 00 00 01 03 C0 …
•
•
•
4D 54 68 64: intestazione di 4 byte del MIDI Track header chunk
00 00 00 06: questi 4 byte informano che seguiranno 6 byte di dati
sino alla fine di questo chunk header
00 00: questi 2 byte informano che il file MIDI è di tipo 0
–
•
00 01: questi 2 byte informano che dopo il MThd seguirà 1 blocco di
traccia MTrk
–
•
E’ vero? Si contano le tracce, ossia i chunk MTrk.
E’ vero? Verifica con viewer esadecimale
03 C0: informazione che specifica la risoluzione in impulsi per quarto
di nota.
Risulta: PPQN = 03C016 = 96010
Programmazione MIDI (Prof. Luca A. Ludovico)
14. Esercitazione su SMF
MTrk: suggerimenti
4D 54 68 64 00 00 00 06 00 00 00 01 03 C0 4D 54
72 6B 00 00 00 4F 00 90 24 71 00 90 26 71 87 40
80 24 00 00 80 26 00 83 60 90 25 71 00 90 27 71
83 60 80 25 00 00 80 27 00 82 40 90 26 71 00 91
27 71 82 40 80 26 00 00 90 25 71 00 81 27 00 00
91 26 71 82 40 80 25 00 00 81 26 00 87 40 B0 7B
00 00 FF 2F 00
Legenda:
Note On Note Off Tempo Delta Controller Fine traccia
Le frecce mettono in corrispondenza l’accensione e lo spegnimento della stessa nota
Programmazione MIDI (Prof. Luca A. Ludovico)
14. Esercitazione su SMF
Qualche osservazione
• Considerando i soli nibble (4 bit) più significativi del byte di
stato degli eventi MIDI, alcuni valori sono standard dal punto di
vista dell’interpretazione della performance:
–
9x indica un messaggio NoteOn
–
8x indica un messaggio NoteOff
–
Bx indica un control change
–
Cx indica un program change
–
…
Ovviamente, essendo messaggi di canale, il secondo nibble non è standard
• Come si riconoscono le coppie di apertura/chiusura di un
evento musicale? Il NoteOff (8x) corrisponde a un precedente
NoteOn (9x) ove la x è la stessa e il primo byte di dati è
uguale.
Programmazione MIDI (Prof. Luca A. Ludovico)
14. Esercitazione su SMF
Visualizzazione nel sequencer
Legenda
Griglia: linea scura  quarto; linea chiara  sedicesimo
Colori: mattone  ch. 1; oliva  ch. 2
Programmazione MIDI (Prof. Luca A. Ludovico)
14. Esercitazione su SMF
Scarica

Presentazione del corso