Formats de fichiers: LE FORMAT WAV


    CEÇI EST UNE DESCRIPTION DU FORMAT WAV D'APRÈS DES DOCUMENTS EN ANGLAIS .



    D'après ce que j'ai compris, le format WAV est inclue dans une structure appelée RIFF utilisée pour les applications multimédias.
    La structure RIFF est décomposée en plusieurs blocs :

        Le premier bloc : "RIFF" LE HEADER
        Le 2ième bloc

        : "WAVE"

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

        Les blocs 4 à 7 sont 'optionnels'

    Chaque bloc possède 4 octets (caractère) pour son identification (ID) (ex : RIFF, fmt, ...) et 4 octets pour indiquer sa taille (longueur) (LEN) (on peut appeler ça le header du bloc) sauf pour bloc WAVE (= rDATA) qui est un ensemble de blocs dont la taille est indiquée par le premier bloc.
    Attention: la taille ne comprend pas les 4 octets d'identification, ni les 4 octets de la taille (= 8 octets du header de bloc).


        LE HEADER :

        Voici le premier bloc :

        OFFSET NOM TAILLE DESCRIPTION
        00H
        04H
        rID
        rLEN
        4
        4
        Contient les caractères "RIFF"
        La longueur des données pour le prochain bloc.
        08H rDATA rLEN Les données du prochain bloc.


        LE FORMAT WAV :

        Le bloc rDATA est encore divisé en plusieurs blocs :
        Il contient tout les blocs :

        rDATA
        OFFSET

        NOM

        TAILLE

        DESCRIPTION
        00H wID 4 Contient les caractères "WAVE"
        04H

        **
        18H
        ou ??
        **
        Format chunk

        * AUTRE BLOC
        WAVE DATA
        CHUNK
        * AUTRE BLOC
        ?

        ??
        ??

        ??
        Bloc format : contient les données
        qui explique le format.
        OPTIONNEL
        BLOC qui contient les données audio

        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
        04H
        fID
        fLEN
        4
        4
        Contient les caractères "fmt "
        Contient la longueur du bloc format chunk
        08H
        0AH
        0CH
        0EH
        10H
        WformatTAG
        Nchanel
        Fréquence
        nAvgByte...
        nBlocAlign.
        2
        2
        2
        2
        2
        * indique le format
        Nombre de canal : 1 = MONO 2 = STÉREO
        FRÉQUENCE (nombre de sample par seconde)
        **
        ***
        12H FormatSpe.. ? **** Zone de donnée spécifique du format


        REMARQUE : CE BLOC PEUT ETRE DE TAILLE VARIABLE (voir fLEN)
        QUI DÉPEND DU FORMAT.

        * Indique le type de format :


              LES PLUS UTILISÉS :
              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'octets à transférer par seconde
        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 égal à :

        nombre de canal * fréquence * (nombre de bits par sample / 8)


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


        **** Spécificité d'un format :
        pour le format WAVE_FORMAT_PCM (de microsoft) :

        le premier mot indique le nombre de bits par sample
        ( d'après la DOC que j'ai, c'est le seul mot qu'il y a ).

        Mais après expérimentation, j'ai remarqué qu'il y avait 2
        autres mots (sûrement une évolution du format).

        D'après moi, il faut tester le premier mot et s'il est différent de 0,
        le premier mot indique le nombre de bits par sample et c'est le seul.

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

        Le 2ième MOT indique :

        si = 1
        si = 2
        :
        :
        données audio non signées
        données audio signées


        Le 3ième MOT indique le nombre de bits par sample :

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


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

        data
        chunk
        OFFSET


        NOM


        TAILLE


        DESCRIPTION
        00H
        04H
        dID
        dLEN
        4
        4
        Contient les caractères "data"
        Longueur du bloc WAVE DATA CHUNK
        08H dDATA dLEN LES DONNÉES AUDIO


        Voici une description de l'emplacement des données en PCM :


        POUR DES SONS 8 BITS MONO :


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

        POUR DES SONS 8 BITS STÉRÉO :


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

        POUR DES SONS 16 BITS MONO :


        OCTET
        OCTET
        OCTET
        OCTET
        OCTET
        etc.
        1
        2
        3
        4
        5
        >--->
        >--->
        >--->
        >--->
        >--->
        SAMPLE
        SAMPLE
        SAMPLE
        SAMPLE
        SAMPLE
        1
        1
        2
        2
        3
        Octet de poids FAIBLE (8 bits inférieurs)
        Octet de poids FORT (8 bits supérieurs)
        Octet de poids FAIBLE
        Octet de poids FORT
        Octet de poids FAIBLE

        POUR DES SONS 16 BITS STÉRÉO :


        OCTET
        OCTET
        OCTET
        OCTET
        OCTET
        OCTET
        OCTET
        OCTET
        etc.
        1
        2
        3
        4
        5
        6
        7
        8
        >--->
        >--->
        >--->
        >--->
        >--->
        >--->
        >--->
        >--->
        SAMPLE
        SAMPLE
        SAMPLE
        SAMPLE
        SAMPLE
        SAMPLE
        SAMPLE
        SAMPLE
        1
        1
        1
        1
        2
        2
        2
        2
        GAUCHE
        GAUCHE
        DROITE
        DROITE
        GAUCHE
        GAUCHE
        DROITE
        DROITE
        Octet de poids FAIBLE
        Octet de poids FORT
        Octet de poids FAIBLE
        Octet de poids FORT
        Octet de poids FAIBLE
        Octet de poids FORT
        Octet de poids FAIBLE
        Octet de poids FORT

        -----------------------------------------------------------------------------------------------------------
        LES BLOCS OPTIONNELS :


        Le bloc fact (FACT CHUNK) :

        fact
        chunk
        OFFSET


        NOM


        TAILLE


        DESCRIPTION
        00H
        04H
        ID
        LEN
        4
        4
        Contient les caractères "fact"
        Longueur du bloc FACT CHUNK
        08H NSam 4 Nombre de sample



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

        Ce bloc permet de repérer (ou identifier) une série de positions dans les données AUDIO

        cue
        chunk
        OFFSET


        NOM


        TAILLE


        DESCRIPTION
        00H
        04H
        ID
        LEN
        4
        4
        Contient les caractères "cue"
        Longueur du bloc CUE CHUNK
        08H NPos 4 Nombre de position
        Ce qui suit est à répéter autant de fois qu'il y a de positions :
        08H
        0CH
        10H
        14H
        18H
        1CH
        Name
        Pos
        chunkID
        chunkst
        blocst
        Soffset
        4
        4
        4
        4
        4
        4
        Nom de position
        Indique la position (en sample)
        le chunkID ?? : souvent "data"
        ??
        ??
        ??



        Le bloc playlist (PLAYLIST CHUNK) :

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

        playlist
        chunk
        OFFSET


        NOM


        TAILLE


        DESCRIPTION
        00H
        04H
        ID
        LEN
        4
        4
        Contient les caractères "plst"
        Longueur du bloc PLAYLIST CHUNK
        08H NPos 4 Nombre de segments PLAY
        Segment PLAY : (à répéter plusieurs fois suivant le nombre de segments)
        0CH
        10H
        14H

        Name
        cLEN
        Ntim

        4
        4
        4

        Nom du "cue-point" (position)
        Longueur du cue-point en sample
        Indique le nombre de fois qu'il
        faut jouer le cue-point



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

        Ce bloc permet de donner plus d'infos complémentaires .
        ce bloc comporte plusieurs blocs :

        LIST
        chunk
        OFFSET


        NOM


        TAILLE


        DESCRIPTION
        00H
        04H
        ID
        LEN
        4
        4
        Contient les caractères "LIST"
        Longueur du bloc LDATA CHUNK
        08H LDATA LEN Les données


        Ce bloc (LDATA) contient plusieurs blocs (optionnels ?)

        LDATA
        chunk
        OFFSET


        NOM


        TAILLE


        DESCRIPTION
        00H ID 4 Contient les caractères "adtl"
        04H
        ??H
        ??H
        ??H
        label
        note
        text
        file
        ??
        ??
        ??
        ??
        Le bloc LABEL
        Le bloc NOTE
        Le bloc TEXT
        Le bloc FILE



        LE BLOC LABEL CHUNK :

        Contient le titre à associer avec un "cue-point"

        LABEL
        chunk
        OFFSET


        NOM


        TAILLE


        DESCRIPTION
        00H
        04H
        ID
        LEN
        4
        4
        Contient les caractères "labl"
        Longueur du bloc LABEL CHUNK
        08H
        0CH

        NDATA
        data

        4
        LEN-4 ?

        Contient le nom du cue-point
        Donnée indiquant le titre (doit se
        terminer par 00H )



        LE BLOC NOTE CHUNK :

        Contient un commentaire à associer avec un "cue-point"

        NOTE
        chunk
        OFFSET


        NOM


        TAILLE


        DESCRIPTION
        00H
        04H
        ID
        LEN
        4
        4
        Contient les caractères "note"
        Longueur du bloc NOTE CHUNK
        08H
        0CH

        NDATA
        data

        4
        LEN-4 ?

        Contient le nom du cue-point
        Donnée indiquant le commentaire
        (doit se terminer par 00H )



        LE BLOC TEXT CHUNK :

        TEXT
        chunk
        OFFSET


        NOM


        TAILLE


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



        LE BLOC FILE CHUNK :

        FILE
        chunk
        OFFSET


        NOM


        TAILLE


        DESCRIPTION
        00H
        04H
        ID
        LEN
        4
        4
        Contient les caractères "file"
        Longueur du bloc FILE CHUNK
        08H
        0CH
        24H
        NDATA
        type
        data
        4
        4
        LEN-8 ?
        Contient le nom du cue-point
        ??
        Contient le fichier média ??