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 :

Faire un zoom sur courbe Wave avec déplacement


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 Faire un zoom sur courbe Wave avec déplacement
    Bonjour,

    Je cherche à afficher une courbe d'un wave(PCM) à l'écran. J'ai trouvé des explications sur ce site. Jusque la pas de problème pour afficher mon traçé en entier sur un TImage avec une taille fixe.

    Mais je voudrais réaliser un zoom sur ce tracé. Mon idée était de définir un nombre de pixel par seconde, par exemple (100px/sec), et d'afficher la courbe en entier sur mon TImage avec cette échelle. Donc j'aurais un TImage d'une certaine longeur avec mon traçé.
    Puis pour déplacer mon traçé, je glisse simplement mon TImage en dehors de l'écran sur la gauche (donc monimage->Left devient négatif...)...
    Mais je suis sur que ce n'est pas la bonne méthode.

    Mais quand le fichier sonore est très long, alors mon TImage devient très grand, et mon application plante à cause de la mémoire (taille de mon TImage->Width=41000).

    J'aurais voulu savoir comment faire un vrai zoom d'une courbe wave, et que l'on puisse la déplacer avec des scrollbars sans tout faire planter et sans faire ramer l'ordinateur....
    Auriez-vous des idées à me proposer ?

    Merci d'avance.
    Fred

  2. #2
    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 !

    Si ton wav est en mémoire, il suffit de travailler avec un Index.
    Cet index représente la position, dans le tableau, du sample le plus à gauche
    de l'écran et peut, par exemple, être donné par un ScrollBar->Position...
    Rappel : dans un fichier wav, les samples commencent après le header.

    A partir de là, tu peux te déplacer dans ce tableau, depuis l'index, sur
    un nombre calculable de samples puisqu'il dépend de la largeur de la fenêtre
    et du facteur zoom.
    Si x est la position à écran, la position du sample dans le wav est :
    - Pour un signal mono :
    int pos = Index + (x * Zoom);
    - Pour un signal stéréo :
    int gauche = Index + (x * Zoom * 2);
    int droite = Index + (x * Zoom * 2) + 1;
    Celà suppose donc de vérifier dans la boucle si l'on est bien dans le tableau !

    Les repères temporels demandent un peu plus de réflexion puisqu'il peut s'agir
    d'une simple grille fixe (simple indication) ou d'une grille flottante
    (indication réelle en fonction de la position de l'index dans le wav)...

    Je ne sais pas quelle version BCB tu utilises, mais personnellement, avec ma
    version BCB3 Pro, je dessine sur un bitmap que je recopie ensuite sur la form.
    Ceci permet de supprimer les scintillements. Au cas où...

    A plus !

  3. #3
    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
    Salut,

    for (int X=0; X < iDataSize; X+=16) {
    pTmp->Picture->Bitmap->Canvas->LineTo((X*pImage->Width) / iDataSize , ((pData[X]+1)*pImage->Height)/2);
    }
    pImage->Picture->Bitmap->Canvas->Draw(0,0, pTmp->Picture->Graphic);
    X+=16 pour sauter un petit peu des donnees pour aller un peu plus vite
    iDataSize = Taille totale des donnees de mon wav
    pTmp = TImage temporaire pour dessiner dessus la courbe
    pImage = Mon TImage d'origine ou apparaitra ma courbe
    pData = contient la valeur à afficher

    Donc avec ce code, j'affiche la courbe au complet dans mon TImage.

    Pourrais-tu stp m'expliquer comment utiliser ta fonction :
    int pos = Index + (x * Zoom);
    avec mon code ci dessus ? Désolé mais je ne saisi pas trop ......


    Merci
    Fred

  4. #4
    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
    Merci beaucoup Henderson..

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/05/2008, 20h11
  2. Comment faire un zoom sur un bloc html ?
    Par vodnok dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 12/07/2007, 14h51
  3. Réponses: 3
    Dernier message: 19/06/2007, 22h34
  4. Faire un zoom sur un TImage
    Par Archimède dans le forum Langage
    Réponses: 6
    Dernier message: 28/01/2006, 11h12
  5. Faire un zoom sur un picture
    Par dibeloni dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 14/12/2005, 08h14

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