IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Affichage courbe wav


Sujet :

C++Builder

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Points : 146
    Points
    146
    Par défaut Affichage courbe wav
    Bonjour,

    Je suis à la recherche d'informations sur l'affichage de la courbe d'un son au format wav.

    Ou puis-je trouver des exemples ?

    En fait, je voudrais savoir comment afficher à l'écran les données que j'ai récupérer du fichier wav.


    Merci d'avance
    Fred

  2. #2
    Membre chevronné
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Points : 1 911
    Points
    1 911
    Par défaut
    La question n'est pas tellement d'afficher une représentation mais de connaître le format. À partir du moment où vous connaissez la façon dont les données sont structurées dans un fichier de ce genre, vous pouvez oeuvrer comme vous l'entendez.

    La bonne question est donc : où peut-on trouver des informations sur le format wave? Je connais des sites sur le format MIDI par exemple mais rien sur le wave. Ça devrait malgré tout exister.

    À bientôt
    Gilles

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    On trouve tout .... ou presque tout sur WOTSIT.

    A plus !

  4. #4
    Invité
    Invité(e)
    Par défaut
    henderson a raison:

    http://www.wotsit.org/search.asp?page=8&s=music

    en passant: merci henderson ce site je le connaissais pas lol
    mais j'ai regardé et directement ajouté dans mes favoris ^^ tres bon site et pas mal de bonnes infos!

  5. #5
    Membre chevronné
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Points : 1 911
    Points
    1 911
    Par défaut
    Comme quoi en posant la bonne question, on a plus de chance d'avoir la bonne réponse.

    Merci pour cette excellente adresse et à bientôt
    Gilles

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Points : 146
    Points
    146
    Par défaut
    Bonjour,

    Merci pour vos réponses.
    Encore une question :

    Si j'ai 44100 octets pour 1 seconde, comment je fais pour afficher tout ca sur mon écran ?
    Faut-il que je prenne qu'une partie des octets de l'échantillon pour chaque seconde ?

    Admettons que je veuille que 60 pixels de mon canvas corresponde à 1s, il me faudra donc 60 octets pour définir une seconde.
    Mais j'ai 44100 octets pour 1s ?
    Je prends donc qu'une partie des octets ? c'est ca ?
    Mais lesquels ? ca ne fausse pas trop la courbe ?

    Je suis désolé de poser peut-être des questions simples, mais je débute et je cherche à comprendre.

    Merci
    Fred

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    Le cas le plus ennuyeux est lorsque l'algorithme entre en "résonnance"
    avec la périodicité des échantillons. Ca donne un trait continu et si
    par malheur tu est en début de phase, lorsque le signal est une sinusoïde
    par exemple, alors tu as l'impression de ne rien afficher !

    Il te faut calculer le pas d'une boucle si ta fenêtre est plus petite que
    le nombre total d'échantillons :
    Pas = Nombre Echantillons / Nombre de points de l'Image :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for(int e = 0; e < 44100; e+=Pas)
    {
    ...Signal[e]..
    }
    Tu peux aussi représenter une partie du fichier. Par blocs de 200ms
    dans une fenêtre de 128 pixels (ou...) de largeur... La encore il te faudra
    calculer le pas d'une boucle, avec plus ou moins de précision.

    Pourquoi pas par blocs d'échantillons ?

    Au niveau du graphisme, tu as le choix entre 3 possibilités :

    - Pointillisme.
    Selon le signal, ça peut être désastreux (sinusoïdale, bruit blanc)
    ou au contraire excellent (carré et rectangulaire)
    - Barres
    Ici, il s'agit de tracer un segment de l'axe (0) vers la valeur (+ ou -).
    Ca donne un résultat désastreux avec des signaux visuellement identifiables
    (sinusoïde, carré, triangle etc...) mais donne une belle apparence pour des
    échantillons pseudo-aléatoires.
    - Ligne brisée
    Ici, il s'agit de tracer une courbe (ligne brisée) de point et point.
    Le résultat peut sembler meilleur que les précédents mais a tendance à
    représenter les transitions d'un signal carré... ce qui peut faire sourire...
    mais c'est encore ce qu'il y a de mieux !

    Il existe aussi des représentations en 3D, mais ça concerne surtout l'analyse
    par FFT... à moins de représenter les composantes (canaux) sous cette forme...
    mais ça demande plus de temps au niveau graphisme !

    A plus !

  8. #8
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Points : 146
    Points
    146
    Par défaut
    Bonjour,

    Merci pour ta réponse.

    Par contre j'ai inséré ce code :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    unsigned char *pBuffer = new unsigned char [iSizeTotal];
    ../..
         pFile = fopen(aPath.c_str(), "rb");
         fseek(pFile,iStartPos,SEEK_SET);
         fread(pBuffer, iSizeTotal, 1, pFile);
    ../..
    Il me récupère bien les données, mais pas toute. Car en fait si il rencontre un octet à 0, il s'arrête car il l'interprète comme une fin de ligne. Donc je n'ai pas tous les octets de mon sample.
    J'ai essayé avec __int8 *Buffer à la place de char *Buffer, mais idem....

    Comment dois-je faire pour récupérer tous les octets de mon sample, même si il y a un octet à 0 à l'intérieur de mon sample ?

    Merci
    Fred

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    Avant toute chose voici une classe premettant d'accéder facilement
    au header d'un fichier WAV au format WINDOWS, sans compression.
    Certaines propriétés doivent être : RIFF, WAV, fmt, data. et les
    autres déterminent soit des tailles de bloc soit des valeurs liées
    à la reproduction du son.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class FileWaveHeader
    {
    public :
    char            groupID[4];         /*      'RIFF'      4*/
    int             size;               /*                  4*/
    char            rifftype[4];        /*      'WAV '      4*/
    char            format[4];          /*      'fmt '      4*/
    int             formatsize;         /*                  4*/
    short           wFormatTag;         /*                  2*/
    unsigned short  wChannels;          /*                  2*/
    unsigned long   dwSamplesPerSec;    /*                  4*/
    unsigned long   dwAvgBytesPerSec;   /*                  4*/
    unsigned short  wBlockAlign;        /*                  2*/
    unsigned short  wBitsPerSample;     /*                  2*/
    char            ckID[4];            /*      'data'      4*/
    int             NbBytes;            /*                  4*/
    /* TOTAL 44 octets*/
    };
    NbBytes représente le nombre d'octets et non pas le nombre d'échantillons
    qui sont stockés juste après, donc à partir du 44ème octet du fichier.

    La méthode que j'ai utilisé pour charger le fichier en mémoire en supposant :

    Byte *pBuffer;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    if(OpenDialog1->Execute())
        {
        if(pBuffer != NULL)
            {
            delete pBuffer;
            }
        char *buf = new  char[MAX_PATH];
        strcpy(buf, OpenDialog1->FileName.c_str());
        int handle = open(buf,O_BINARY, O_RDONLY);
        int Length = filelength(handle);
        close(handle);
        pBuffer = new Byte[Length];
        FILE *lpFilepointer = fopen(buf, "rb");
        fread(pBuffer, Length, 1, lpFilepointer);
        fclose(lpFilepointer);
        delete buf;
        //Représenter une partie des échantillons...
        //le reste lors d'un OnChange d'un TScrollBar ?
        }
    donc pour accéder au header et en déduire ce qu'il faut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FileWaveHeader *header = (FileWaveHeader*)pBuffer;
    //lire les données du header

    les échantillons commenceront donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *Ici = pBuffer + 44; //8 bits
    mais aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    short *Ici = (short*)pBuffer + 22; //16 bits
    Je t'envoie en mp de quoi lire ce header à l'aide d'un TMemo

    A plus !

  10. #10
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Points : 146
    Points
    146
    Par défaut
    Bonjour henderson,

    Merci beaucoup pour ton aide et ton exemple.

    Fred

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ZedGraph: Affichage courbe Y=0
    Par Arnaoud dans le forum Windows Forms
    Réponses: 2
    Dernier message: 02/02/2010, 13h53
  2. affichage courbe jfreechart
    Par rezguiinfo dans le forum NetBeans
    Réponses: 1
    Dernier message: 10/04/2009, 12h06
  3. Affichage courbe Excel sur un GUI
    Par gmachi10 dans le forum Interfaces Graphiques
    Réponses: 9
    Dernier message: 09/07/2008, 08h57
  4. Réponses: 13
    Dernier message: 06/06/2008, 11h47
  5. Affichage courbe dynamique
    Par Polux95 dans le forum Qt
    Réponses: 11
    Dernier message: 14/03/2007, 13h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo