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