I Tag ID3 Versione 2.3
Header principale
Al contrario del suo predecessore, il sistema di tagging versione 2.3 viene posto non alla fine, ma
all'inizio del file e non ha dimensione fissa, come accennato in precedenza. Infatti in questa nuova versione
si può aggungere un numero arbitrario di informazioni al file, ognuna di questa racchiusa in un
contenitore "a tenuta stagna" separato da tutti gli altri e comunemente detto frame. I frames, a loro
volta, possono però avere lunghezza prefissata, e ne è un esempio l'header frame, ossia
il frame principale che comunica l'inizio di tutto il tag ID3.L'header frame è lungo 10 bytes e costituisce i primissimi dati inseriti all'interno del file, secondo questa semplice suddivisione:
- Identificatore tag ID3 (3 bytes) : semplicemente la stringa "ID3"
- Versione tag (2 bytes) : siccome si tratta di tag ID3, la versione è sempre 3. Perciò il
primo byte avrà valore 3, mentre il secondo 0, ossia
03 00 - Flags (1 byte) : i flags, propriamente, sono come enumeratori su bit, ossia costituiscono degli "interruttori"
che possono essere accessi o spenti. Ho trattato di questo argomento nel capitolo sugli enumeratori della
versione 2 della mia guida al Visual Basic .Net 2005, reperibile su questo sito. Comunque, ogni bit di
questo byte fornisce una diversa informazione, ma solo i primi tre bits vengono usati e hanno rispettivamente
questi significati:
- Bit 7, Desincronizzazione : se impostato su 1, viene attivata la funzione di desincronizzazione, un dettaglio che non spiegherò in questo tutorial
- Bit 6, Estensione dell'Header : se impostato su 1, indica che l'header contiene ulteriori informazioni e che quindi è necessario continuarne la lettura anche oltre. Tale header aggiuntivo in realtà contiene un solo bit aggiuntivo di informazione (sul CRC): tutto il resto dei suoi 6-10 bytes è impiegato per definire dimensioni e rapporti con l'header principale. Alquanto inutile, direi
- Bit 5, Indicatore sperimentale : usato solo quando il tag si trova in uno stato di sperimentazione
01100000 =60 =96 segnalerà queste informazioni: Desincronizzazione disattivata, Header esteso, Fase sperimentale. Gli altri bit non vengono utilizzati - Dimensione (4 bytes) : rappresenta la dimensione, in bytes, di tutto il tag ID3, ossia comprendendo tutti
i vari frames successivi ed eventualmente anche la dimensione dell'estensione dell'header stesso. Questa
dimensione non conta i primi 10 bytes originali del main header stesso. E se questa vi sembra una complicazione,
aspettate di leggere come diavolo si deve scrivere questo numero. Avendo a disposizione 4 bytes, ovviamente,
uno penserebbe di potervi inserire liberamente un intero a 32 bit: sbagliato! In questo caso molto
particolare, il primo bit di ogni byte viene sempre impostato a 0 e non può essere utilizzato (Dio sa perchè! forse per limitare
la grandezza del tag). Quindi i bit disponibili diventano 28. Ad esempio, il numero 260 dovrebbe comunemente
essere rappresentato in questo modo:
00000000 00000000 00000001 00000100 00 00 01 04
Invece, poichè si sono stati sottratti i bit iniziali di ogni byte (in grassetto), dobbiamo assumere che questi non ci siano e scrivere questo:
00000000 00000000 00000010 00000100 00 00 02 04
In questo modo, è come se il bit 7 del byte 3 si fosse spostato a sinistra di un posto. Per facilitare la compresione, si può pensare che ognuno di questi 4 bytes contenga sette bits anzichè otto
| Struttura Header principale | |||
| 3 bytes | 2 bytes | 1 byte | 4 bytes |
| Identificatore ("ID3") | Versione tag | Flags | Dimensione tag (28bit) |
Prima di continuare, vorrei riprendere in analisi la nostra ormai famosa Rapsodia Ungara per un'ulteriore chiarificazione. Apriamo il file ancora una volta con l'hex editor. Selezioniamo i primi 10 bytes, e dividiamoli secondo le specifiche dell'header principale:
49 44 33
I primi tre bytes costituiscono la stringa "ID3", ossia l'identificatore del tag03 00
Questi bytes sono la versione: infatti abbiamo la versione 3, proprio come ci aspettavamo00
Tutti i flags sono impostati su 0, quindi avremo: Desincronizzazione disattivata, Header non esteso, Fase non sperimentale. Un file, quindi, assolutamente normale00 00 lf 76
La dimensione del tag, escludendo i primi dieci bytes. Vogliamo vedere quant'è? Prima di tutto bisogna convertire questi valori in binario, e si ottiene:
00000000 00000000 00011111 01110110
Tuttavia, sappiamo che la dimensione usa solo 28 bit su 32 e scarta tutti i primi bit di ogni byte. Per ottenere la dimensione reale, quindi, eliminiamo il primo bit di ogni byte:
0000000 0000000 0011111 1110110
Convertendo questo numero in decimale, si ottiene 4086

I primi 10 bytes
In generale, in ogni frame dichiarato nel corpo del tag, i primi 10 bytes assumono sempre la stessa funzione:
- Nome del tag (4 bytes) : un titolo di un qualsiasi frame, costituito da quattro caratteri alfanumerici
- Dimensione (4 bytes) : dimensione del frame, escludendo questi 10 bytes
- Flags (2 bytes) : ovviamente, se si può sprecare dello spazio, perchè non farlo? I 6
bits usati, infatti, sono rispartiti sui primi tre bits di due bytes:
abc00000 def00000
- Preservazione frame : se un software che non riconosce il frame altera il tag ID3 in qualche modo, questo campo indica se si debba comunque mantenere il frame nel file (0), oppure se scartarlo quando il file viene modificato (1)
- Preservazione file : se un software che non riconosce il frame altera il file in qualche modo, questo campo indica se si debba comunque mentere il frame nel file (0), oppure se scartarlo (1)
- Sola lettura : se impostato a 1, questo campo indica che il frame è in sola lettura e che, quindi, la modifica di una qualsiasi delle sue parti potrebbe comportarne il malfunzionamento. Si attiva questo bit, ad esempio, quando il contenuto del frame deve essere calcolato sulla base di qualche parametro. Qualora il frame venisse modificato senza i dovuti accorigmenti, questo bit dovrebbe essere annullato (0)
- Compressione : se il contenuto del frame è stato compresso con algoritmo zip deflate (SharpZLib), questo bit è impostato su 1. In questo caso, ci saranno altri 4 bytes aggiunti alla fine dell'header che indicano la dimensione decompressa
- Cifratura : se impostato a 1, questo bit comunica che il contenuto del frame è stato criptato. Le informazioni occorrenti a un programma per decrittare correttamente tale frame vengono fornite in un header a parte, il quale contiene un identificativo della società a cui appartiene l'algoritmo di criptazione, un byte indentificativo del metodo usato e l'insieme dei dati cifrati
- Raggruppamento : questo bit indica se il frame appartiene ad un dato gruppo di frames. Se impostato a 1, ci sarà un ulteriore byte in coda a questo header che specifica il numero identificativo del gruppo in questione
| Struttura Frame Header | ||
| 4 bytes | 4 bytes | 2 bytes |
| Identificatore | Dimensione frame (28bit) | Flags |
Ciò detto, ecco una descrizione di alcuni dei più importanti frames usati.
Frame di testo
I frame di testo sono in assoluto i più importanti, poiché contengono gran parte delle
informazioni attribuite al brano e che possono essere ridotte sottoforma di stringa, come, ad esempio, il
titolo, l'autore, l'anno di pubblicazione, eccetera... In sostanza, i frame di testo sostituiscono,
integrano e ampliano di molto ciò che era prima salvato secondo le specifiche della versione 1.1.
La fisionomia di questi frames è davvero semplice: dopo l'header, che come indentificativo
conterrà una sigla di quattro lettere la prima delle quali è sempre una "T", viene un byte che
rappresenta il tipo di codifica e poi tutto il testo voluto.| Header | Contenuto | |||
| 4 bytes | 4 bytes | 2 bytes | 1 byte | x bytes |
| Identificativo | Dimensione | Flags | Codifica | Testo del frame |
Di questi frames ce n'è infatti una quantità esagerata; nella lista che segue riporterò i frames più importanti, specificando prima il loro identificativo di quattro lettere (che dovrà apparire nell'header del frame stesso) e poi la loro funzione.
- TALB
Nome dell'album o del film o della risorsa in genere da cui il brano è stato prelevato - TCOM
Nome del compositore. Se i compositori sono più di uno, si è soliti separarne i nomi con un carattere slash "/" - TCON
Il genere di appartenenza del brano. Essendo memorizzato in un frame di testo, si può benissimo scrivere a mano il nome del genere, ma nulla vieta, se vi considerate un po' tradizionalisti, di usare gli identificativi numerici utilizzati nella versione 1.1 del tag, di cui sopra è esposta una breve tabella. In questo secondo caso, il numero deve essere compreso in una coppia di parentesi, e tale numero può anche essere inserito in una frase. Ecco alcuni esempi, tutti leciti, del testo che è possibile includere in questo frame:
Esempio Commento "Classica" Semplice testo "(9)" 9 significa "Metal", come esposto nella tabella di cui sopra "(36)(26)" 36 = "Game", 26 = "Ambient"; quindi musica d'ambiente di un videogioco "forse (38)" 38 = "Gospel" "(75)((credo)" 75 = "Polka"; la doppia "(" si usa per indicare una semplice parentesi nel testo - TCOP
Copyright. Il contenuto di questo frame deve essere costituito da un anno, scritto per esteso, seguito da un carattere di spaziatura. Quindi questo frame è sempre di 5 bytes (escludendo l'header, ovviamente) - TDAT
La data di registrazione, formattata secondo la stringa DDMM. Ad esempio, la stringa "3101" indica il 31 di Gennaio. Non è necessario indicare l'anno, perchè si assume quello del copyright - TENC
Rappresenta la società o l'organizzazione che ha registrato il brano ed eventualmente può contenere alcuni messaggi riguardo al copyright. Di solito, le informazioni qui riportate vanno sotto il campo "Encoded by" della canzone - TEXT
Il nome dell'autore dei testi utilizzati. Proprio come per TCOM, se gli autori sono più di uno, i loro nomi vengono separati da un carattere slash "/" - TIME
Una stringa di quattro caratteri forattata secondo "HHMM" che indica la durata del brano - TIT1
Titolo di primo livello, che rappresenta la categoria musicale al quale il brano appartiene. Ad esempio, nella musica classica questo frame potrebbe contenere "Concerto per Pianoforte" - TIT2
Titolo di secondo livello, che rappresenta il vero nome/titolo del pezzo - TIT3
Titolo di terzo livello, che rappresenta il sottotitolo. Ad esempio "Dall'opera n.16 in F#", oppure "Concerto Live a Milano" - TKEY
La tonalità in cui inizia il pezzo (spesso usata nell'ambito della musica classica). Le note hanno il nome all'inglese (La = A, Sol = G) e sono opzionalmente seguite dall'alterazione (b bemolle, # diesis) e dal modo (m minore). Ad esempio, la famosa Sonata n.5 in Do Minore di Beethoven avrà la stringa "Cm" in questo frame - TLAN
La lingua in cui sono scritti i testi del brano - TPE1
Questo frame contiene di solito il nome o i nomi degli artisti principali e più importanti che prendono parte alla realizzazione del brano - TPE2
Ulteriori dettagli sull'orchestra o sulla band - TPE3
Nome del direttore d'orchestra - TPE4
Nel caso il brano sia stato reinterpretato, remixato o abbia subito una qualsiasi operazione di modifica da parte di terzi, questo frame contiene il nome della persona o del gruppo che ha eseguito tale operazione sul file originale - TPUB
Nome della casa discografica o della società che ha pubblicato il pezzo - TRCK
Numero della traccia, se il file è stato preso da un CD o da una playlist. Il numero può essere in valore assoluto (es. "5") oppure specificare anche la posizione relativa del brano nella collezione a cui appartiene (es. "5/12") - TSRC
International Standard Recording Code: codice a 12 cifre che identifica la registrazione - TSSE
Dettagli tecnici sull'hardware e sul software usati per produrre il pezzo - TYER
Anno di registrazione

I primi bytes
In questa immagine possiamo cogliere un frame TIT2 che riporta il titolo "Rapsodia ungara 2" e i frame TPE1 e TCOM, che contengono il nome dell'autore e compositore "Franz Liszt" (ovviamente non è Liszt che suona, ma non sapevo chi fosse il pianista).
Frame di collegamento
Tutti i frames di questa famiglia sono dello stesso genere dei frames di testo, ma le stringhe al loro
interno sono sempre collegamenti a siti web. Eccone una breve lista:
- WCOM
Contiene un collegamento all'home page dell'album o in genere ad una pagina web che conenga informazioni sul gruppo, l'artista, la casa discografica, il compositore, eccetera... - WCOP
Link alla pagina che specifica i termini del copyright - WOAR
Pagina ufficiale dell'artista/band
Riconoscimenti
Il frame dei riconoscimenti ha struttura uguale a quella dei frames di testo, ma il suo identificatore
è "IPLS". Il testo che contiene non è che un insieme di stringhe, separate da un byte nullo
(0) che rappresentano rispettivamente il ruolo della persona e il suo nome, ad esempio:
"Effetti sonori[NULL]Mario Rossi[NULL]Tecnico audio[NULL]Pinco Pallino[NULL]...".Testo della canzone
Un'altra interessante feature che i frames offrono nei tag ID3v2.3 è quella di memorizzare nel file
mp3 anche le parole del testo della canzone. Questo viene fatto mediante il frame di testo sincronizzato,
il cui indentificatore è "SYLT". Oltre all'header normale, questo frame ha un altro header, che
segue subito il primo, e i cui bytes corrispondono a queste informazioni:
- Codifica (1 byte) : questo byte indica la codifica del testo. Come accade generalmente anche negli altri frame, è impostato a 0
- Lingua (3 bytes) : la lingua in cui il testo della canzone viene scritto. Non sapendo cosa introdurre in questi misteriosi 3 bytes, è lecito lasciare anche questi dati impostati su 0
- Formato del timestamp (1 byte) : poiché ogni parte del testo viene associato ad un dato momento a cui apparire sullo schermo, deve essere seguito anche da alcune informazioni sul timestamp, ossia sul tempo trascorso dall'inizio della riproduzione. Questo byte specifica se ci si debba riferire a millisecondi (e il suo valore è 2) oppure agli stessi frame come unità (1). Io consiglio di usare la prima opzione, poiché consente una maggiore precisione
- Tipo di contenuto (1 byte) : il testo della musica può riferirsi a diversi ambiti e perciò
assumere diversi significati, tra i quali:
- Non specificato (0)
- Testo della canzone (1)
- Trascrizione del testo (2)
- Nome della parte o del movimento (3) (es. "Adagio")
- Evento di scena (4) (se si tratta della musica di un'opera o di un video
- Accordi (5)
- Altro (6)
- Descrizione del contenuto (x bytes) : una stringa che descrive il contenuto, terminata con un carattere nullo
| Header aggiuntivo | ||||
| 1 byte | 3 bytes | 1 byte | 1 byte | x bytes |
| Codifica | Linguaggio | Formato timestamp | Tipo di contenuto | Descrizione contenuto |
Dopo l'header seguono i tanti pezzetti di testo sincronizzati, ognuno dei queli è formato da due parti:
- Testo : ossia il testo che deve apparire. La stringa che lo rappresenta deve sempre terminare con un carattere nullo
- Timestamp : 4 bytes che rappresentano la posizione in millisecondi a cui deve apparire il testo
Commenti
I commenti sono altri frames di testo che contengono tutto quello che non può stare nei frames
sopra descritti. L'identificativo è "COMM". La sua struttura è molto semplice:| Struttura commento | |||
| 1 byte | 3 bytes | x bytes | x bytes |
| Codifica | Linguaggio | Descrizione contenuto | Commento |
Tutte le stringhe ivi contenute devono terminare come al solito con un carattere nullo.
Immagini allegate
Usando i tag ID3v2.3 è anche possibile allegare alcune immagini al file mp3, ad esempio quelle del
CD da cui il file è stato preso. Tutte le immagini immesse, che possono avere differente scopo,
sono incapsulate in un frame il cui identificatore è "APIC". Le informazioni che vengono dopo
l'header del frame sono:
- Codifica (1 byte)
- MIME type (x bytes) : il MIME type è una stringa che descrive il tipo del file in questione. In questo caso, sarà "image/jpeg" per le immagini con estensione *.jpg "image/png" per le png e così via. È essenziale per far sapere al programma che legge il tag come decodificare i dati immagine passati successivamene
- Tipo di immagine (1 byte) : un singolo byte che può assumere questi valori:
- 0 : Altro
- 1 : Icona 32x32 (valida solo con file *.png)
- 2 : Icona (di altro tipo)
- 3 : Copertina (fronte)
- 4 : Copertina (retro)
- 5 : Depliant
- 6 : Etichetta del CD
- 7 : Artista principale / Solista
- 8 : Artisti
- 9 : Direttore d'Orchestra
- 10 : Orchestra / Band
- 11 : Compositore
- 12 : Autore dei testi
- 13 : Località della registrazione
- 14 : Immagini prese durante la registrazione
- 15 : Immagini prese durante il concerto
- 16 : Screenshot del film/video
- 18 : Illustrazione
- 19 : Logo dell'artista
- 20 : Logo della casa discografica
- Descrizione (x bytes) : stringa con terminatore nullo (max 64 caratteri)
- Immagine (x bytes) : l'immagine stessa, byte per byte
| Struttura Immagine allegata | ||||
| 1 byte | x bytes | 1 byte | x bytes | x bytes |
| Codifica | MIME type | Tipo di immagine | Descrizione breve dell'immagine | Immagine vera e propria |
Oggetto
Oltre ad immagini, il tag può contenere anche un generico file od oggetto. In questo caso si usa
il frame identificato "GEOB" (General Encapsulated OBject). Ecco la sua struttura:| Struttura Oggetto | ||||
| 1 byte | x bytes | x bytes | x bytes | x bytes |
| Codifica | MIME type | Nome del file | Descrizione contenuto | File/Oggetto vero e proprio |
Contatore
Questo simpatico frame tiene il conto di quante volte il file viene riprodotto, e aumenta il proprio contatore
di uno ogni volta. Tutto quello che contiene è semplicemente un intero a 32 bit che indica il numero
a cui si è arrivati. Nonostante 32 bit comportino una dimensione abbastanza grande, arrivando fino
a più di 2'000'000'000, se il contatore supera questo valore si può sempre aggiungere un altro
byte all'inizio formando interi sempre più grandi (a 40, 48, 64, 72 bit, eccetera...). Il suo
identificatore è "PCNT" (Play CouNTer)Indice di gradimento
Altro simpatico frame che indica quanto è gradito il brano all'utente. Ha come indentificatore "POPM"
(POPulariMeter) e consta di tre semplici campi:
- Email ell'utente (x bytes) : stringa a terminatore nullo
- Voto (1 byte) : voto assegnato, da 1 a 255
- Contatore (4 byte) : ha la stessa funzione del frame PCNT
Informazioni di vendita
Questo frame contiene tutte le informazioni inerenti all'ente che vende e/o distribuisce il file e possiede questi campi:
- Codifica (1 byte)
- Prezzo (x bytes) : stringa a terminatore nullo che rappresenta il prezzo del file/cd
- Scadenza (8 bytes) : una stringa formattata secondo "YYYYMMDD" che rappresenta la data fino alla quale il prezzo stabilito rimane valido
- Indirizzo del venditore (x bytes) : stringa a terminatore nullo che rappresenta l'home page o l'indirizzo e-mail dell'ente che distribuisce il file
- Modalità di acquisto (1 byte) : determina come si è venuti in possesso del file. Il byte può assumere questi
valori:
- 0 : Altro
- 1 : Un CD standard, contenenta anche altre conzoni
- 2 : File audio compresso, proveniente da un CD
- 3 : Scaricato da Internet
- 4 : Scaricato in Streaming da Internet
- 5 : In allegato a uno spartito
- 6 : In allegato a un libro di spartiti
- 7 : Altri mezzi
- 8 : Proveniente da fonti non inerenti alla musica
- Nome del venditore (x bytes) : stringa a terminatore nullo che rappresenta il nome del venditore
- Descrizione del prodotto (x bytes) : stringa a terminatore nullo con una breve descrizione del file
- MIME type (x bytes) : stringa a terminatore nullo rappresentante il MIME type dell'immagine che segue
- Logo del venditore (x bytes) : immagine rappresentante il logo del venditore
| Struttura Informazioni di Vendita | ||||||||
| 1 byte | x bytes | 8 bytes | x bytes | 1 byte | x bytes | x bytes | x bytes | x bytes |
| Codifica | Prezzo | Scadenza | Indirizzo venditore | Modalità acquisto | Nome venditore | Descrizione file | MIME type | Logo venditore |
Gran parte del materiale qui riportato è stato prelevato dal sito ID3.Org
The Totem's Lair - Copyright (C) 2009
È vietata la riproduzione sia totale che parziale del sito.



