LE FORMAT WAV

              ***********************************************
              * ecrit par PC-CODER pour PROGRAZINE le 09/97 *
              * E-mail :  pccoder@club-internet.fr          *
              ***********************************************
               Si vous avez des informations suplementaire
               ou si vous constater une erreur ecriver moi 
               ---------------------------------------------

CECI EST UNE DESCRIPTION DU FORMAT WAV D'APRES DES DOCUMENTS EN
ANGLAIS .

---------------------------------------------------------------------

D'apres ce que j'ai compris le format WAV est include dans une
structure appelle RIFF utilisé pour les applications multimedia .
La structure RIFF est decomposée en plusieurs bloc :

Le premier bloc :  "RIFF"   LE HEADER
Le 2éme bloc    :  "WAVE"   LE FORMAT WAV : C'est un bloc qui
                            contient tout les blocs suivant.
Le 3éme bloc    :  "fmt "   <fmt-ck>            // Format chunk
Le 4éme bloc    :  "fact"   [<fact-ck>]         // Fact chunk
Le 5éme bloc    :  "cue "   [<cue-ck>]          // Cue points
Le 6éme bloc    :  "plst"   [<playlist-ck>]     // Playlist
Le 7éme bloc    :  "LIST"   [<assoc-data-list>] // Associated data list
Le 8éme bloc    :  "data"   <wave-data>         // Wave data

Les bloc 4 à 7 sont 'optionnel'

CHAQUE BLOC POSSEDE 4 OCTET(caractere) POUR SON IDENTIFICATION (ID)
(EX: RIFF,fmt ,...)ET 4 OCTET POUR INDIQUER SA TAILLE(longueur)(LEN)
(On peut appeler ça le header du bloc)
Sauf pour bloc WAVE (=rDATA) qui est un ensemble de bloc et dont
la taille est indiquer par le premier bloc .
attention: la taille ne conprend pas les 4 octet d'identification ,
ni les 4 octet de la taille.(=8 octet du header de bloc)

LE HEADER :

Voici le premier bloc :

OFFSET +  NOM  +TAILLE+          DESCRIPTION
-------+-------+------+------------------------------------
  00H  |  rID  |   4  | Contient les caracteres "RIFF"
  04H  |  rLEN |   4  | La longueur des donnees pour le
       |       |      | prochain bloc.
-------+-------+------+------------------------------------
  08H  | rDATA | rLEN | Les données du prochain bloc .
-------+-------+------+------------------------------------

LE FORMAT WAV :

Le bloc rDATA est encore diviser en plusieur bloc :
Il contient tout les blocs :

rDATA  |
OFFSET +     NOM    +TAILLE+          DESCRIPTION
-------+------------+------+-----------------------------------
  00H  |     wID    |   4  | Contient les caracteres "WAVE"
-------+------------+------+-----------------------------------
  04H  |Format chunk|   ?  | Bloc format : contient les donneés
       |            |      | qui explique le format .
  **   |* AUTRE BLOC|  ??  | OPTIONNEL
  18H  |  WAVE DATA |  ??  | BLOC qui contient les données audio
ou ??  |    CHUNK   |      |
  **   |* AUTRE BLOC|  ??  | OPTIONNEL
-------+------------+------+-----------------------------------
REMARQUE :D'AUTRE BLOC OPTIONNEL PEUVENT S'INSERER 
(VOIR LEUR DESCRIPTION A LA FIN)

VOICI LES BLOCS CONTENU DANS LE BLOC rDATA :

Le bloc format (FORMAT CHUNK) :

format |
chunk  |
OFFSET +    NOM    +TAILLE+           DESCRIPTION
-------+-----------+------+-------------------------------------
  00H  |    fID    |   4  | Contient les caracters "fmt "
  04H  |    fLEN   |   4  | Contient la longueur du bloc format chunk
-------+-----------+------+--------------------------------------
  08H  |WformatTAG |   2  | * indique le format
  0AH  |  Nchanel  |   2  | Nombre de canal :  1=MONO   2=STEREO
  0CH  | Frequence |   2  | FREQUENCE (nombre de sample par seconde)
  0EH  |nAvgByte...|   2  | **
  10H  |nBlocAlign.|   2  | ***
-------+-----------+------+-------------------------------------
  12H  |FormatSpe..|   ?  | **** Zone de donnée specific du format
-------+-----------+------+--------------------------------------
!!!CE BLOC PEUT ETRE DE TAILLE VARIABLE (VOIR fLEN) qui depand du format .

* Indique le type de format :

             LE PLUS UTILISER :
                                 WAVE_FORMAT_PCM (0x0001)
                                 Microsoft Pulse Code
                                 Modulation (PCM) format

                                 IBM_FORMAT_MULAW (0x0101)
                                 IBM mu-law format
                                 
                                 IBM_FORMAT_ALAW (0x0102) 
                                 IBM a-law format

                                 IBM_FORMAT_ADPCM (0x0103)
                                 IBM AVC Adaptive
                                 Differential Pulse Code
                                 Modulation format
 
**    Indique la moyenne du nombre d'octet à transferer par second
      pour permettre au player(programme qui joue le son) d'estimer
      la taille d'un buffer :
      Pour le format WAVE_FORMAT_PCM(de microsoft) c'est egal à :
      
      Nombre de canal * frequence * (nombre de bit par sample / 8)

***   Bloc d'alignement ?? 
     
      nBlockAlign = nombre de canal * (nombre de bit par Sample / 8)

****  Specificiter d'un format :
      Pour le format WAVE_FORMAT_PCM (de microsoft) :
     
      le premier mot indique le nombre de bit par sample
	( d'apres la DOC que j'ai ,c'est le seul mot qu'il y'a ).

	Mais apres experimentation ,j'ai remarquer qu'il y avait 2
	autres mot (surement une evolution du format)

D'apres moi il faut tester le premier mot et s'il est different de 0
le premier mot indique le nombre de bit par sample et c'est le seul.

S'il est egal à 0 , il faut lire les 2 mot suivants :

Le 2éme MOT indique : si = 1 : données audio non signé
                      si = 2 : données audio signé

Le 3éme MOT indique le nombre de bit par sample :

08 pour 8 bits par sample et 10h pour 16 bits par sample

Le bloc de donnée (WAVE DATA CHUNK) :

data   |
chunk  |
OFFSET +    NOM    +TAILLE+           DESCRIPTION
-------+-----------+------+------------------------------------
  00H  |    dID    |   4  | Contient les caracters "data"
  04H  |    dLEN   |   4  | Longueur du bloc WAVE DATA CHUNK
-------+-----------+------+------------------------------------
  08H  |    dDATA  | dLEN | LES DONNEE AUDIO
-------+-----------+------+------------------------------------

Voici une description de l'emplacement des données en PCM :
            
POUR DES SONS 8 BITS MONO :

OCTET 1 >---> SAMPLE 1
OCTET 2 >---> SAMPLE 2
OCTET 3 >---> SAMPLE 3
OCTET 4 >---> SAMPLE 4
OCTET 5 >---> SAMPLE 5
ect...

POUR DES SONS 8 BITS STEREO :

OCTET 1 >---> SAMPLE 1 GAUCHE
OCTET 2 >---> SAMPLE 1 DROITE
OCTET 3 >---> SAMPLE 2 GAUCHE
OCTET 4 >---> SAMPLE 2 DROITE
OCTET 5 >---> SAMPLE 3 GAUCHE
ect...

POUR DES SONS 16 BITS MONO :

OCTET 1 >---> SAMPLE 1 Octet de poid FAIBLE (8 bit inferieur)
OCTET 2 >---> SAMPLE 1 Octet de poid FORT (8 bit superieur)
OCTET 3 >---> SAMPLE 2 Octet de poid FAIBLE
OCTET 4 >---> SAMPLE 2 Octet de poid FORT
OCTET 5 >---> SAMPLE 3 Octet de poid FAIBLE
ect...

POUR DES SONS 16 BITS STEREO :

OCTET 1 >---> SAMPLE 1 GAUCHE Octet de poid FAIBLE
OCTET 2 >---> SAMPLE 1 GAUCLE Octet de poid FORT
OCTET 3 >---> SAMPLE 1 DROITE Octet de poid FAIBLE
OCTET 4 >---> SAMPLE 1 DROITE Octet de poid FORT
OCTET 5 >---> SAMPLE 2 GAUCHE Octet de poid FAIBLE
OCTET 6 >---> SAMPLE 2 GAUCHE Octet de poid FORT
OCTET 7 >---> SAMPLE 2 DROITE Octet de poid FAIBLE
OCTET 8 >---> SAMPLE 2 DROITE Octet de poid FORT
ect...

---------------------------------------------------------------------
LES BLOC OPTIONNEL :

Le bloc fact (FACT CHUNK) :

fact   |
chunk  |
OFFSET +  NOM  +TAILLE +           DESCRIPTION
-------+-------+-------+-------------------------------------
  00H  |  ID   |   4   | Contient les caracters "fact"
  04H  |  LEN  |   4   | Longueur du bloc FACT CHUNK 
-------+-------+-------+-------------------------------------
  08H  |  NSam |   4   | Nombre de sample
-------+-------+-------+-------------------------------------

Le bloc cue-points (CUE-POINT CHUNK) :

Ce bloc permet de reperer (ou identifier) une serie de position
dans les données AUDIO

cue    |
chunk  |
OFFSET +  NOM  +TAILLE +           DESCRIPTION
-------+-------+-------+-------------------------------------
  00H  |  ID   |   4   | Contient les caracters "cue "
  04H  |  LEN  |   4   | Longueur du bloc CUE CHUNK 
-------+-------+-------+-------------------------------------
  08H  | NPos  |   4   | Nombre de position
-------+-------+-------+-------------------------------------
Ce qui suit est à repeter autant de fois qu'il y a de position :
-------+-------+-------+-------------------------------------
  08H  | Name  |   4   | Nom de position
  0CH  | Pos   |   4   | Indique la position (en sample)
  10H  |chunkID|   4   | le chunkID ?? : souvent "data"
  14H  |chunkst|   4   | ??
  18H  |blocst |   4   | ??
  1CH  |Soffset|   4   | ??
-------+-------+-------+-------------------------------------

Le bloc playlist (PLAYLIST CHUNK) :

Ce bloc permet d'indiquer l'ordre des "CUE-POINT"(position) à jouer.

playlist|
chunk  |
OFFSET +  NOM  +TAILLE +           DESCRIPTION
-------+-------+-------+-------------------------------------
  00H  |  ID   |   4   | Contient les caracters "plst"
  04H  |  LEN  |   4   | Longueur du bloc PLAYLIST CHUNK 
-------+-------+-------+-------------------------------------
  08H  | NPos  |   4   | Nombre de segment PLAY
-------+-------+-------+-------------------------------------
segment PLAY : (à repeter plusieurs fois suivant le nombre de segment)
-------+-------+-------+-------------------------------------
  0CH  | Name  |   4   | Nom du "cue-point" (position)
  10H  | cLEN  |   4   | Longueur du cue-point en sample
  14H  | Ntim  |   4   | Indique le nombre de fois qu'il
                       | faut jouer le cue-point
-------+-------+-------+-------------------------------------

Le bloc des données pour les info (ASSOCIATE DATA LIST CHUNK) :

Ce bloc permet de donner plus info complementaire .
ce bloc comporte plusieurs bloc :

LIST   |
chunk  |
OFFSET +  NOM  +TAILLE +           DESCRIPTION
-------+-------+-------+-------------------------------------
  00H  |  ID   |   4   | Contient les caracters "LIST"
  04H  |  LEN  |   4   | Longueur du bloc LDATA CHUNK
-------+-------+-------+-------------------------------------
  08H  | LDATA |  LEN  | Les données
-------+-------+-------+-------------------------------------

Ce bloc (LDATA) contient plusieurs bloc(optionnel ?)

LDATA  |
chunk  |
OFFSET +  NOM  +TAILLE +           DESCRIPTION
-------+-------+-------+-------------------------------------
  00H  |  ID   |   4   | Contient les caracters "adtl"
-------+-------+-------+-------------------------------------
  04H  | label |  ??   | Le bloc LABEL
  ??H  | note  |  ??   | Le bloc NOTE
  ??H  | text  |  ??   | Le bloc TEXT
  ??H  | file  |  ??   | Le bloc FILE
-------+-------+-------+-------------------------------------

LE BLOC LABEL CHUNK :
Contient le titre a associer avec un "cue-point"

LABEL  |
chunk  |
OFFSET +  NOM  +TAILLE +           DESCRIPTION
-------+-------+-------+-------------------------------------
  00H  |  ID   |   4   | Contient les caracters "labl"
  04H  |  LEN  |   4   | Longueur du bloc LABEL CHUNK
-------+-------+-------+-------------------------------------
  08H  | NDATA |   4   | Contient le nom du cue-point
  0CH  | data  |LEN-4 ?| donnée indiquant le titre (doit se
                       | terminer par 00H  )
-------+-------+-------+-------------------------------------

LE BLOC NOTE CHUNK :
Contient un commentaire a associer avec un "cue-point"

NOTE   |
chunk  |
OFFSET +  NOM  +TAILLE +           DESCRIPTION
-------+-------+-------+-------------------------------------
  00H  |  ID   |   4   | Contient les caracters "note"
  04H  |  LEN  |   4   | Longueur du bloc NOTE CHUNK
-------+-------+-------+-------------------------------------
  08H  | NDATA |   4   | Contient le nom du cue-point
  0CH  | data  |LEN-4 ?| donnée indiquant le commentaire
                       | (doit se terminer par 00H  )
-------+-------+-------+-------------------------------------

LE BLOC TEXT CHUNK :

TEXT   |
chunk  |
OFFSET +  NOM  +TAILLE +           DESCRIPTION
-------+-------+-------+-------------------------------------
  00H  |  ID   |   4   | Contient les caracters "ltxt"
  04H  |  LEN  |   4   | Longueur du bloc TEXT CHUNK
-------+-------+-------+-------------------------------------
  08H  | NDATA |   4   | Contient le nom du cue-point
  0CH  | Slen  |   4   | Longueur en sample
  10H  |purpose|   4   | ??
  14H  |country|   2   | Code du pays (Country code)
  18H  |languag|   2   | Code de la langue 
  1CH  |dialect|   2   | Code du dialect
  20H  | page  |   2   | Code page pour le texte
  24H  | data  |LEN-20H| ????
-------+-------+-------+-------------------------------------

LE BLOC FILE CHUNK :

FILE   |
chunk  |
OFFSET +  NOM  +TAILLE +           DESCRIPTION
-------+-------+-------+-------------------------------------
  00H  |  ID   |   4   | Contient les caracters "file"
  04H  |  LEN  |   4   | Longueur du bloc FILE CHUNK
-------+-------+-------+-------------------------------------
  08H  | NDATA |   4   | Contient le nom du cue-point
  0CH  | type  |   4   | ??
  24H  | data  |LEN-8 ?| Contient le fichier media ??
-------+-------+-------+-------------------------------------