Il formato MP3
Cos'è e cosa contiene un Mp3
La sigla Mp3 deriva dalla più complicata dicitura MPEG Layer 3: MPEG è l'acronimo di Moving Picture Experts Group, ossia il
gruppo di lavoro che ha sviluppato tale codifica e che ha elaborato il formato mp3. Questo è un formato compresso, ossia i dati che
riproducono la forma d'onda del suono sono stati fatti passare attraverso un algoritmo che ne ha ridotto la dimensione in termini di spazio
occupato in memoria a danno, però, della qualità. L'mp3 infatti comporta una perdita di dati, anche se lieve, durante il
processo di codifica e viene perciò definito lossy (da "loose", perdere): tale perdita non costituisce, comunque, un
danno grave, poiché solo le informazioni di minore importanza vengono tralasciate e il risultato finale rimane pressochè
lo stesso. In questo tutorial non mi occuperò di come viene scritta a livello tecnico l'informazione audio e di come viene trasformata in suono
vero e proprio dalla macchina, ma solamente di come reperire tutte le informazioni possibili sul file e sul suo contenuto. Questo processo
viene compiuto attraverso l'analisi di due parti fondamentali del file: l'header e i tag ID3.Tuttavia, prima di passare all'analisi di questi due segmenti di informazione, è necessario conoscere almeno qualcosina sulle onde.
Un po' di teoria sulle onde e sul campionamento
Un'onda (meccanica) è semplicemente una perturbazione di un mezzo materiale, e si propaga in esso con velocità finita. L'onda
di cui ci si occpuerà in questo tutorial è il suono. Esso ha una natura leggermente diversa dalle onde meccaniche come possono
essere le increspature nell'acqua generate da un sassolino che vi cade, ma per mancanza di tempo e per amor di semplicità, lo
tratterò esattamente allo stesso modo, anche perchè questo approccio non è sbagliato (le formule e i meccanismi
sono gli stessi), solo leggermente incompleto.Un suono qualsiasi può essere visto come la sovrapposizione di più onde semplici, delle quali è possibile dare una descrizione matematica precisa. Ogni onda elementare dipende da tre fattori fondamentali:
- Ampiezza: posto che ogni punto del mezzo materiale (aria in questo caso) oscilla quando viene investito dall'onda, l'ampiezza rappresenta la distanza che tale punto percorre partendo dalla posizione di quiete per arrivare alla posizione di massimo spostamento quando l'onda è al culmine
- Frequenza: rappresenta quante oscillazioni vengono compiute in un secondo
- Lunghezza d'Onda: è la distanza alla quale due punti si muovono esattamente nello stesso modo
Grafico spazio-spazio
Prodotto con MGraphing
Prodotto con MGraphing
Il grafico qua sopra mostra l'onda vista "di fianco": ogni suo punto è un punto del mezzo attraversato che ha diversa posizione su y. Il grafico che segue, invece, è una legge spazio-tempo che definisce la posizione y di un punto al passare del tempo:
Grafico spazio-tempo
Prodotto con MGraphing
Prodotto con MGraphing
Sembrano uguali, in effetti, ma in questo caso la distanza tra due creste o due ventri è una grandezza misurata in secondi e si chiama periodo, ossia quel lasso di tempo trascorso il quale il punto si ritova nella stessa posizione y. Il reciproco del periodo (1 / Periodo) è la frequenza, misurata in Hertz (Hz). Dal grafico appena sopra possiamo vedere che il punto ritorna alla posizione y = 0 dopo circa 6 secondi (2 volte pi greco per la precisione): diremo quindi che il suo periodo è 6 secondi e che la sua frequenza è 1/6 Hz, mentre la sua ampiezza è 4.
Un suono, composto dalla sovrapposizione di più onde, può anche non assomigliare a queste belle sinusoidi, ma potrebbe presentarsi con un profilo di questo tipo:
Grafico di quattro onde sovrapposte
Prodotto con MGraphing
Prodotto con MGraphing
O, addirittura, potrebbe essere all'apparenza del tutto irregolare, come i prossimi due esempi:
Grafico di quattro onde sovrapposte
Prodotto con Waves
Prodotto con Waves
Zoom sull'onda di un file mp3 (Aherit's Theme)
Prodotto con Audacity
Prodotto con Audacity
Avendo visto questo esempi, appare facile capire che un normale player non deve cercare di estrapolare tutte le singole onde semplici che formano il risultato finale, ma deve solamente cercare di riprodurre, seguendo la stessa sinusoide, il suono che è stato codificato all'interno del file musicale. Questo viene fatto mediante un dispositivo interno al computer, chiamato Digital to Analog Converter (DAC), che converte il segnale digitale in una data differenza di potenziale e quindi in un segnale elettrico trasmesso agli altoparlanti, i quali fanno di conseguenza vibrare le membrane al loro interno per produrre il suono desiderato. Da questo punto di vista, il funzionamento è semplice, ma se lo guardassimo dal lato opposto?
L'Analog to Digital Converter (ADC) è quello che ci interessa per comprendere alcuni concetti usati più avanti. Poiché svolge il compito inverse, l'ADC converte un suono reale in formato digitale, ed è qui che iniziano i problemi. L'onda sonora che spinge sulle membrane del microfono viene trasformata in segnale elettrico attraverso particolari materiali detti "piezoelettrici" (ossia in grado di generare elettricità quando vengono sottoposti a pressione), i quali trasmettono il loro output all'ADC. Ora la macchina deve convertire un segnale analogico, ossia reale, fisico, in digitale. Il primo problema consiste nel trovare un modo per determinare l'ampiezza dell'onda (e quindi il volume): ammettendo che i metriali testé citati possano generare una differenza di potenziale variabile tra -10V e +10V, si ha un range di 20V. Tuttavia nella realtà il segnale è continuo, ossia in termini semplici, esiste sempre una via di mezzo tra due misure: in questo caso potremmo avere una tensione di 5V, ma anche di 5,1V, ma anche di 5,01V, ma anche di 5,00000000001V e così via all'infinito. Digitalmente, questo non è riproducibile, in quanto si dispone di una quantità fissa di memoria e di risorse e si dice, perciò, che il segnale digitale è discreto [Se fate mente locale sulla differenza tra l'insieme dei numeri Reali e quello dei numeri Naturali, forse, vi verrà più facile capirlo]. È stato convenuto, quindi, di dividere il range a disposizioni in 65535 parti, ossia tutti i possibili valori che un intero a 4 bytes (Int32) può assumere (da -32767 a +32768), ottenendo una sensibilità abbastanza elevata da poter riprodurre ampiezze indistingibili all'orecchio umano.
Il secondo problema è simile, ma riguarda il tempo. Guardate questi due grafici:
Onda analogica e onda digitale
L'onda in rosso è quella analogica (quella che noi sentiamo), mentre quella in blu sarebbe la sua ripdoruzione digitale: non ci assomiglia molto. In questo esempio, la posizione y di ogni punto viene rilevata a intervalli di tempo di 1 secondo, ossia la sua frequenza di campionamento è 1Hz. Si definisce frequenza di campionamento (o sampling frequency) la frequenza con la quale viene rilevata la posizione di tutti i punti che oscillano. Risulta evidente che questa frequenza è troppo bassa per riprodurre fedelmente l'onda originale. Aumentandola, si aumenterà anche la somiglianza fra le due versioni, fino a renderle quasi irriconoscibili, anche se saranno pur sempre diverse. Tuttavia, esiste un teorema, noto come Teorema del campionamento di Nyquist-Shannon il quale afferma che superata una certa frequenza di campionamento fn, almeno doppia della massima frequenza rilevabile fM, l'orecchio umano non percepisce più alcuna differenza.
fn >= 2fM
Dato che l'uomo medio riesce a percepire da 20Hz fino a 20'000Hz, si è stabilito che 44'100Hz fosse un buon valore per la frequenza di campionamento (dato che è superiore a 20'000Hz * 2).
N.B.: la frequenza di campionamento non è il bitrate: la prima determina quante rilevazioni l'ADC debba fare al secondo, mentre il secondo determina la quantità di dati da riprodurre in un secondo.
Ora veniamo alla parte pratica.
L'Header
L'header costituisce la "testata" del file e contiene informazioni generali sulle modalità di riproduzione e altri aspetti che
riguardano la versione di codifica eccetera. Anche se si potrebbe pensare così, non è posto sempre all'inizio dello stream,
poiché, come vedremo, altre informazioni possono essere stipate prima dell'header principale. Esso è costituito da una
sequenza ininterrotta di 32 bits, così suddivisi:
| Offset | Lunghezza | Descrizione | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 0 | 11 | Bits di riconoscimento Questi 11 bits servono per riconoscere l'inizio dell'header. Tutti e undici sono impostati a 1 ed è quindi molto facile individuarli. Tanto per curiosità il numero binario da 11 bits 11111111111 è uguale al decimale 2047. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 11 | 2 | Bits di formato Questi due bits possono assumere quattro diverse disposizioni, a seconda delle quali vengono distinte le diverse versioni del formato MPEG, secondo questo semplice schema:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 13 | 2 | Bits di layer Questi altri due bits servono invece a distinguere quale Layer, ossia quale codifica e per quali tipi di dato, venga usata. Ci sono tre tipi di Layer (1, 2, 3), e quello che stiamo analizzando è, ovviamente, il Layer 3 di Mp3. Le combinazioni possibili usate sono:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 15 | 1 | Bit di protezione Questo singolo bit determina se il file è protetto da Crc. In questo caso, seguiranno altri 16 bits di controllo di cui non ci occuperemo. Il Crc è un sistema di controllo che serve per calcolare il checksum, di cui certamente avrete già sentito parlare. O no? Beh, in caso contrario forse questo vi rinferscherà la memoria. Avete mai provato ad aprire un file compresso corrotto (ad esempio zip o rar) e ricevere il messaggio "Checksum errato"? Il Checksum è un metodo che serve per controllare l'integrità di dati contenuti in un file e si attua, nel caso più semplice, sommando alcuni bytes di informazione e memorizzando il valore di questa somma. Il bit in questione, quindi, può essumere due valori: 1 se il file è protetto da questa mostruosità, altrimenti 0. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 16 | 4 | Bits di bitrate Questi quattro bit indicano il bitrate del file, ossia quanti dati vengono eseguiti in un secondo, ed è misurato in kilobits per secondo (kbps). Anche in questo caso, la sequenza di bits non esprime un numero ma corrisponde a certi valori determinati che variano in funzione della versione del formato e del tipo di codifica. Se a qualche masochista interessa, ecco una tabella di tutti i valori supportati:
I valori in cui è riportato il testo "Libero" sono arbitrariamente calcolabili dall'applicazione che legge il file. Gli altri valori, invece, rappresentano precisi bitrate che rimangono costanti per tutto il tempo di riproduzione. Ci sono, invero, altre particolari tecniche che consentono di cambiare il bitrate durante la riproduzione, ma non sono argomento trattato in questo tutorial. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 20 | 2 | Bits per la frequenza di campionamento Questi due bits rappresentano la frequenza di campionamento usata. I valori che possono assumere i due bits sono:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 22 | 1 | Bit di riempimento Questo è un bit di controllo e serve per stabilire se i frames presenti nel corpo del files (ossia i singoli pezzi di dato) abbiano una dimensione normale o leggermente eccedente. Viene usato dall'applicazione che legge e riproduce il file e può assumere i due valori 0 (dimensione normale) o 1 (dimensione eccedente). |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 23 | 1 | Bit privato Questo è un bit cosiddetto "privato", ossia non ha alcuno scopo nel file, ma è, per così dire, "regalato" al programmatore che ne può cambiare il valore a piacimento a seconda di cosa voglia fare l'applicazione. Ad esempio potrebbe essere impostato a 0 per i brani non ancora ascoltati e su 1 per quelli già ascoltati. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 24 | 2 | Bits di canale Altri bits che servono, stavolta, per determinare la modalità di riproduzione.
Dual-Channel è invece la tecnologia di un componente hardware che serve per raddopiare la velocità di trasferimento dei dati da e verso la RAM. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 26 | 2 | Bits di informazione sul canale Stereo Questi due bits servono per determinare quale tipo di stereo venga usato se nel Layer III viene attivata la modalità Joint-Stereo (essi hanno una funzione diversa per i layer 1 e 2, ma noi ora ci stiamo occupando solo di mp3). Il primo bit determina se è attivo il MS-Stereo, mentre il secondo se è attivo l'Intensity Stereo. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 28 | 1 | Bit di Copyright Questo bit determina se c'è un Copyright sul file. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 29 | 1 | Bit di originalità E questo determina se il file è un prodotto multimediale originale o se ne è una copia: 1 se è originale, altrimenti 0. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 30 | 1 | Bits di Emphasis Gli ultimi due bits determinano l'Emphasis. Questo parametro viene utilizzato per determinare in che modo elminare il rumore dal suono, ma non è molto usato. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Riassumendo, quindi:
- 11 bits di riconoscimento
- 2 bits per la versione MPEG
- 2 bits per il Layer
- 1 bit per la protezione CRC
- 4 bits per il bitrate
- 2 bits per la frequenza di campionamento
- 1 bit di riempimento
- 1 bit privato
- 2 bits per il canale
- 2 bits per l'estensione di Stereo
- 1 bit per il CopyRight
- 1 bit per la copia
- 2 bits per l'emphasis
Una prova pratica
Ora che siamo a conoscenza della struttura di un header, perchè non curiosare un po' dei file mp3? Non scriveremo un programma (per ora)
ma ci limiteremo a fare una cosa manuale.Prima di tutto, serve un Hex Editor, un programma che sia in grado di farci vedere un file aperto in modalità binaria, e che possa rappresentare ogni byte in binario, esadecimale e decimale. Se non possedete un Hex Editor (o se ce l'avete ma volete seguire il mio esempio), potete scaricare Neo Hex Editor Free: nonostante sia una versione freeware ha una quantità spropositata di funzioni ed è molto buono (oltre ad avere una bella interfaccia). Il file che analizzeremo è reperibile qui: si tratta della rapsodia ungara numero 2, di Franz Liszt, uno dei miei brani preferiti. Scaricatela e ascoltatela... poi continuate a leggere.
Aprite il file con l'hex editor. Per prima cosa dobbiamo individuare gli 11 bits di riconoscimento, e per fare questo, dato che i dati vengono rappresentati un byte alla volta (8bit), iniziamo col cercare un byte pieno di valore
Primo risultato
Il primo risultato che appare è un byte
ff 54 = 11111111 00110110
Noi però sappiamo che i bits di riconoscimento sono 11, mentre qui ce ne sono solo 8 di fila, quindi questo non è l'header del file mp3. Il secondo segno rosso indica i primi tre byte sotto forma di caratteri che iniziano il file: essi sono "ID3". Come vedremo, l'ID3 è un sistema di tag e frame usato per incapsualre all'interno del file mp3 informazioni aggiuntive. Poiché anch'esso ha una sua specifica dimensione era ovvio che quel byte non potesse essere l'inzio dell'header principale, ma questo non lo potevate sapere. Nel tutorial successivo è spiegato anche come leggere questi tag. Per ora continuaimo la ricerca, premendo F3. Arriviamo all'indirizzo
Vediamo che sono presenti gli 11 bits di riconoscimento. In verità, non conoscendo la grandezza del tag ID3 (che è variabile), potrebbe anche essere una coincidenza. Esaminiamo i bit che vengono dopo, ossia
- un formato MPEG qualsiasi perchè non sappiamo con cosa sia stato prodotto
- e il layer 3, perchè questo è un file mp3
- 11 -> MPEG 1
- 01 -> Layer 3
Il byte 90
- 4 bits di bitrate: dato che siamo in un MPEG 1, Layer 3, i bits
1001 corrispondo a 128kbps, valore che coincide con quello mostrato da media player e dall'explorerIl bitrate è proprio 128kbps - 2 bits per la frequenza di campionamento: 00 in MPEG 1 corrispondono a 44'100Hz
- 1 bit di riempimento: 0, ossia lunghezza dei frames normale
- 1 bit privato: 0, non ancora utilizzato oppure impostato su False, chissà per quali scopi
The Totem's Lair - Copyright (C) 2009
È vietata la riproduzione sia totale che parziale del sito.



