210 likes | 381 Views
Lezione 13. Standard MIDI File: eventi MTrk. Programmazione MIDI (Prof. Luca A. Ludovico). Struttura generale di uno SMF. M T h d. Lunghezza. M T r k. Lunghezza. M T r k. Lunghezza. MThd <lunghezza dei dati dello header><dati dello header>
E N D
Lezione 13 Standard MIDI File: eventi MTrk Programmazione MIDI (Prof. Luca A. Ludovico)
Struttura generale di uno SMF M T h d Lunghezza M T r k Lunghezza M T r k Lunghezza • MThd <lunghezza dei dati dello header><dati dello header> • MTrk <lunghezza dei dati della track> <dati della track> • MTrk <lunghezza dei dati della track> <dati della track> • … Programmazione MIDI (Prof. Luca A. Ludovico)13. Standard MIDI File: eventi MTrk
Prima struttura: MIDI Track header (MThd) chunk M T h d Lunghezza MThd <lunghezza dei dati dello header><dati dello header> Contenuto esadecimale del chunk 4D 54 68 64 00 00 00 06 00 0x nn nn tt tt HEADER 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 M T h d Lunghezza M T r k MTrk <lunghezza dei dati dello header><dati della track> Contenuto esadecimale del chunk 4D 54 72 6B nn nn nn nn ?? ?? ?? ?? ?? ?? HEADER DATI(codice ASCII per MTrk) (lunghezza variabile) (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 Risultato: … 90 24 40 00 28 55 00 2B 49 … Programmazione MIDI (Prof. Luca A. Ludovico)13. Standard MIDI File: eventi MTrk
Confronto MIDI Out oMIDI Thru MIDI In MIDI Out oMIDI Thru MIDI In Senza running status Con running status 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 60 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 • Es: per ¾ = 03 • 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.: interi: yy = 00, metà: yy = 01, quarti: yy = 02, ottavi: yy = 03, … • 60: definisce che ci sono 96 tick MIDI in una nota da ¼ • 08: definisce che ci sono 8 note da 1/32 in una nota ¼ Programmazione MIDI (Prof. Luca A. Ludovico)13. Standard MIDI File: eventi MTrk
Esempio di metro id dati lungh. • Si consideri il file Michelle_type0.mid • Si cerchi la prima indicazione di metro (FF 58) FF 58 04 04 02 18 08 • 0416 num = 4; • 0216 den = 202 • Ne consegue: metro = 4/4 • 1816 ci sono 12 tick MIDI in una nota da ¼ • 0816 ci sono 8 note da 1/32 in una nota ¼ Programmazione MIDI (Prof. Luca A. Ludovico)13. Standard MIDI File: eventi MTrk
I metadati: tempo metronomico • FF 51 03 xxxxxx • FF: definisce il tipo di evento metadato • 51: identifica il tipo di metadato tempo metronomico • 03: quantità di byte contenuti nella parte seguente (costante) • xxxxxx: tempo metronomico ottenuto rispetto alle possibili suddivisioni di misura secondo la formula n = (60.000 x d / 4) / bpm • 60.000 è la quantità di millisecondi per ogni nota da un quarto • d è il denominatore del metro della misura • bpm è il numero di battiti al minuto del metronomo (tempo metronomico) • 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 id dati lungh. • Si consideri il file Michelle_type0.mid • Si cerchi la prima indicazione di tempo (FF 51) FF 51 03 07 A1 1F • 07A11F16 = 499999 = n; • Per definizione n = (60.000.000 x 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 Programmazione MIDI (Prof. Luca A. Ludovico)13. Standard MIDI File: eventi MTrk
Esempio di armatura di chiave id dati lungh. • Si consideri il file Michelle_type0.mid • Si cerchi la prima indicazione di armatura (FF 59) FF 59 02 FF 00 • FF 1 bemolle • 00 modo maggiore • Tonalità: Fa Magg. Programmazione MIDI (Prof. Luca A. Ludovico)13. Standard MIDI File: eventi MTrk
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 meta-evento, la quale, non essendo presenti dati ulteriori, è appunto pari a zero. Programmazione MIDI (Prof. Luca A. Ludovico)13. Standard MIDI File: eventi MTrk