Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

31
Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

Transcript of Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

Page 1: Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

Esercitazione su SMF

Lezione 14

Programmazione MIDI (Prof. Luca A. Ludovico)

Page 2: Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

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

Analisi pratica di un breve file MIDI

Programmazione MIDI (Prof. Luca A. Ludovico)14. Esercitazione su SMF

Page 3: Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

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

Page 4: Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

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

Ricerca dei chunk di header e di traccia

Programmazione MIDI (Prof. Luca A. Ludovico)14. Esercitazione su SMF

Page 5: Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

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

Analisi del chunk MThd

Programmazione MIDI (Prof. Luca A. Ludovico)14. Esercitazione su SMF

Page 6: Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

Analisi del chunk MThd

Programmazione MIDI (Prof. Luca A. Ludovico)14. Esercitazione su SMF

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

– E’ vero? Si contano le tracce, ossia i chunk MTrk. Verifica con viewer esadecimale

• 00 02: questi 2 byte informano che dopo il MThd seguiranno 2 blocchi di traccia MTrk – E’ vero? Verifica con viewer esadecimale

• 01 80: informazione che specifica la risoluzione in impulsi per quarto di nota. Risulta: PPQN = 018016 = 38410

Page 7: Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

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

Analisi del primo chunk MTrk

Programmazione MIDI (Prof. Luca A. Ludovico)14. Esercitazione su SMF

Page 8: Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

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

– 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

Page 9: Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

… 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: Numeratore = 3– 02: Denominatore = 2^02 = 4– 60: 96 tick MIDI in una nota da ¼– 08: 8 note da 1/32 in una nota ¼

Segnatura di tempo per le misure è ¾

Analisi del primo chunk MTrk

Programmazione MIDI (Prof. Luca A. Ludovico)14. Esercitazione su SMF

Page 10: Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

… 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

Analisi del primo chunk MTrk

Programmazione MIDI (Prof. Luca A. Ludovico)14. Esercitazione su SMF

Page 11: Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

… 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

Analisi del primo chunk MTrk

Programmazione MIDI (Prof. Luca A. Ludovico)14. Esercitazione su SMF

Page 12: Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

… 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

Analisi del primo chunk MTrk

Programmazione MIDI (Prof. Luca A. Ludovico)14. Esercitazione su SMF

Page 13: Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

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

Analisi del secondo chunk MTrk

Programmazione MIDI (Prof. Luca A. Ludovico)14. Esercitazione su SMF

Page 14: Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

… 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 00000111 01100100 Ctrl Change (Ch. 1) Channel Volume Value: 100

Analisi del secondo chunk MTrk

Programmazione MIDI (Prof. Luca A. Ludovico)14. Esercitazione su SMF

Page 15: Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

… 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 00110000Ctrl Change (Ch. 1) PanPot Value: 48

Analisi del secondo chunk MTrk

Programmazione MIDI (Prof. Luca A. Ludovico)14. Esercitazione su SMF

Page 16: Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

… 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

Analisi del secondo chunk MTrk

Programmazione MIDI (Prof. Luca A. Ludovico)14. Esercitazione su SMF

Page 17: Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

… 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

Analisi del secondo chunk MTrk

Programmazione MIDI (Prof. Luca A. Ludovico)14. Esercitazione su SMF

Page 18: Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

… 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 00000100Program Change (Ch.1) Value: 4

Analisi del secondo chunk MTrk

Programmazione MIDI (Prof. Luca A. Ludovico)14. Esercitazione su SMF

Page 19: Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

… 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

Analisi del secondo chunk MTrk

Programmazione MIDI (Prof. Luca A. Ludovico)14. Esercitazione su SMF

Page 20: Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

… 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

Analisi del secondo chunk MTrk

Programmazione MIDI (Prof. Luca A. Ludovico)14. Esercitazione su SMF

Page 21: Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

… 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 01100100 Note On (Ch.1) Pitch: 66 Velocity: 100

Analisi del secondo chunk MTrk

Programmazione MIDI (Prof. Luca A. Ludovico)14. Esercitazione su SMF

Page 22: Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

… 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 01100100 Note Off (Ch.1) Pitch: 66 Velocity: 100

Analisi del secondo chunk MTrk

Programmazione MIDI (Prof. Luca A. Ludovico)14. Esercitazione su SMF

Page 23: Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

… 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

Analisi del secondo chunk MTrk

Programmazione MIDI (Prof. Luca A. Ludovico)14. Esercitazione su SMF

Page 24: Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

Visualizzazione nel sequencer

Programmazione MIDI (Prof. Luca A. Ludovico)14. Esercitazione su SMF

Legenda

Griglia: linea scura quarto

Page 25: Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

ESERCITAZIONESezione 14.1

Programmazione MIDI (Prof. Luca A. Ludovico)14. Esercitazione su SMF

Page 26: Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

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

Esercizio di analisi: 14_esercizio.mid

Programmazione MIDI (Prof. Luca A. Ludovico)14. Esercitazione su SMF

Page 27: Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

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 00Legenda: Header dell’MThd Header dell’MTrk Lunghezza dell’MThd Lunghezza dell’MTrk

Identificazione dei chunk e della loro lunghezza

Programmazione MIDI (Prof. Luca A. Ludovico)14. Esercitazione su SMF

Page 28: Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

Analisi del chunk MThd

Programmazione MIDI (Prof. Luca A. Ludovico)14. Esercitazione su SMF

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

– E’ vero? Si contano le tracce, ossia i chunk MTrk.

• 00 01: questi 2 byte informano che dopo il MThd seguirà 1 blocco di traccia MTrk – E’ vero? Verifica con viewer esadecimale

• 03 C0: informazione che specifica la risoluzione in impulsi per quarto di nota. Risulta: PPQN = 03C016 = 96010

Page 29: Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

MTrk: suggerimenti

Programmazione MIDI (Prof. Luca A. Ludovico)14. Esercitazione su SMF

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 00Legenda: Note On Note Off Tempo Delta Controller Fine traccia

Le frecce mettono in corrispondenza l’accensione e lo spegnimento della stessa nota

Page 30: Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

Qualche osservazione

Programmazione MIDI (Prof. Luca A. Ludovico)14. Esercitazione su SMF

• 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.

Page 31: Esercitazione su SMF Lezione 14 Programmazione MIDI (Prof. Luca A. Ludovico)

Visualizzazione nel sequencer

Programmazione MIDI (Prof. Luca A. Ludovico)14. Esercitazione su SMF

Legenda

Griglia: linea scura quarto; linea chiara sedicesimoColori: mattone ch. 1; oliva ch. 2