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

 Delphi Discussion :

Son ne fonctione pas avec un exemple de la FAQ ?


Sujet :

Delphi

  1. #1
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut Son ne fonctione pas avec un exemple de la FAQ ?
    Bonjour,

    Je n'ai pas de son qui est généré sur ma carte son avec l'exemple ci-dessous :
    http://delphi.developpez.com/faq/?pa...otesurcarteson

    Pouvez-vous me dire si vous avez le même problème chez vous ?

    Merci,
    ZiP

  2. #2
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 205
    Points : 92
    Points
    92
    Par défaut
    Bonjour,

    je n'ai pas constaté ce problème : l'exemple marche très bien chez moi.
    .
    J'en profite pour poser une question.
    En mettant deux boutons, le premier correspondant à la note La durant 5 secondes, le second à son harmonique principal durant 1 seconde :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
         MakeSound(440, 5000, 60);
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
         MakeSound(880, 1000, 20);
    end;
    si on clique sur Button1 puis immédiatement sur Button2, le second attend que le premier ait fini de s'exécuter pour commencer lui-même. Ceci est normal, puique c'est prévu de cette façon dans le code.
    Comment pourrait-on faire pour que le second son n'attende pas la fin du premier, mais qu'il s'exécute immédiatement lorqu'on clique sur Button2 ?
    Ceci sans couper le premier son (c'est à dire que l'on ait alors un son constitué du fondamental et de l'harmonique). Bien entendu, sans programmer la fonction périodique correspondante, puiqu'on ne sait pas à quel instant on cliquera sur Button2, ni si cela se produira lorsque le premier son est en cours ou après qu'il ait terminé, ou encore si au contraire c'est Button1 qui est cliqué après button2.

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 758
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 758
    Points : 13 357
    Points
    13 357
    Par défaut
    En supprimant simplement SND_SYNC dans sndPlaySound.

  4. #4
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 205
    Points : 92
    Points
    92
    Par défaut
    Bonjour Andnotor,

    s'il suffisait de supprimer SND_SYNC ce serait facile, mais ce n'est pas satisfaisant, en tout cas pas chez moi.
    En effet, avant de poser la question, j'avais essayé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sndPlaySound(MS.Memory, SND_MEMORY);
    Mais cela ne satisfait pas à :
    " Ceci sans couper le premier son (c'est à dire de telle sorte que l'on ait alors un son constitué du fondamental et de l'harmonique). Bien entendu, sans programmer la fonction périodique correspondante, puiqu'on ne sait pas à quel instant on cliquera sur Button2, ni si cela se produira lorsque le premier son est en cours ou après qu'il ait terminé, ou encore si au contraire c'est Button1 qui est cliqué après button2."
    Merci quand même d'avoir pris en compte mon intervention.

  5. #5
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut
    Bonjour,

    Savez-vous ce qui peut poser problème chez moi ?

    Le code doit marcher sur toutes les cartes son ?

    J'ai essayé sur un second ordinateur et pas de son audible...

    Merci,
    ZiP

  6. #6
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 205
    Points : 92
    Points
    92
    Par défaut
    Bonjour [Zip],

    J'ai aussi essayé sur un deuxième ordinateur et on a bien le son.
    Puisqu'on ne peut pas reproduire le défaut que tu observes, il est difficile de comprendre.
    Pourrais-tu mettre sur le forum ton code complet (avec les uses, etc.) ?

  7. #7
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut
    Bonjour,

    Ci-joint mon code :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, MMSystem, StdCtrls;
     
    type
      TVolumeLevel = 0..127;
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure MakeSound(Frequency{Hz}, Duration{mSec}: Integer; Volume: TVolumeLevel);
    var
      WaveFormatEx: TWaveFormatEx;
      MS: TMemoryStream;
      i, TempInt, DataCount, RiffCount: integer;
      SoundValue: byte;
      w: double; // omega=2*pi*fréquence
    const
      Mono: Word = $0001; //Son Mono
      SampleRate: Integer = 11025; // autres taux d'échantillonnage possibles 8000, 11025, 22050, or 44100
     
      //Champs de l'en-tête d'un fichier .WAV
      RiffId: string = 'RIFF';
      WaveId: string = 'WAVE';
      FmtId: string = 'fmt ';
      DataId: string = 'data';
    begin
      //si la fréquence de la note est trop élevée par rapport au taux d'échantillonnage
      if Frequency > (0.6 * SampleRate) then
      begin
        //... on considère que la note sera injouable.
        ShowMessage(Format('Un taux d''échantillonage de %d est trop bas pour jouer une tonalité de %dHz',
          [SampleRate, Frequency]));
        Exit;
      end;
     
      with WaveFormatEx do
      begin
       //Paramètres d'un en-tête de fichier WAV au format PCM
        wFormatTag := WAVE_FORMAT_PCM;
        nChannels := Mono;
        nSamplesPerSec := SampleRate;
        wBitsPerSample := $0008;
        nBlockAlign := (nChannels * wBitsPerSample) div 8;
        nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;
        cbSize := 0;
      end;
     
      MS := TMemoryStream.Create;
      with MS do
      begin
        //Calcule la longueur des données du son à jouer et celle du fichier WAV qui en découle
        DataCount := (Duration * SampleRate) div 1000; // sound data
        RiffCount := Length(WaveId) + Length(FmtId) + SizeOf(DWORD) +
          SizeOf(TWaveFormatEx) + Length(DataId) + SizeOf(DWORD) + DataCount; // données du fichier
        //écriture de l'en-tête du fichier WAV dans le flux mémoire
        Write(RiffId[1], 4); // 'RIFF'
        Write(RiffCount, SizeOf(DWORD)); // taille du fichier
        Write(WaveId[1], Length(WaveId)); // 'WAVE'
        Write(FmtId[1], Length(FmtId)); // 'fmt '
        TempInt := SizeOf(TWaveFormatEx);
        Write(TempInt, SizeOf(DWORD)); // taille de TWaveFormat
        Write(WaveFormatEx, SizeOf(TWaveFormatEx)); // taille d'un enregistrement WaveFormatEx
        Write(DataId[1], Length(DataId)); // 'data'
        Write(DataCount, SizeOf(DWORD)); // taille des données du son
        //calcule et écrit le signal sonore
        // calcul des valeurs qui composent le son,
        // c'est une courbe sinusoïdale dont les valeurs sont comprises entre 0 et 255,
        //donc l'axe médian de la sinusoïde est en y=127)
        w := 2 * Pi * Frequency; // omega
        for i := 0 to DataCount - 1 do
        begin
          SoundValue := 127 + trunc(Volume * sin(i * w / SampleRate));  // explication : wt = w * i / SampleRate
         //on écrit notre "point" de la courbe dans notre fichier WAV
          Write(SoundValue, SizeOf(Byte));
        end;
        //Maintenant on joue le son en disant à Windows :
        //-SND_MEMORY : c'est un son écrit dans un flux mémoire
        //-SND_SYNC : de jouer le son de façon synchrone (tant que le son n'est pas terminé, le code ne se déroule plus.
    	// Ainsi, un deuxième appel consécutif à notre procédure ne "coupera pas le sifflet" du premier appel.
    //    MS.SaveToFile(ExtractFilePath(Application.ExeName) + 'essai.wav');
        sndPlaySound(MS.Memory, SND_MEMORY or SND_SYNC);
        MS.Free;
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
         MakeSound(440, 5000, 60);
    end;
     
    procedure TForm1.Button2Click(Sender: TObject);
    begin
         Windows.Beep(1981,100);
         Windows.Beep(1197,100);
         Windows.Beep(2110,100);
         Windows.Beep(1358,100);
         Windows.Beep(2400,100);
    end;
     
    end.
    Cordialement,
    ZiP

  8. #8
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    205
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 205
    Points : 92
    Points
    92
    Par défaut
    Chez moi, ton code marche bien : j'ai bien le son de la carte son avec Button1 et les beeps avec Button2.
    Remarque : j'ai supprimé Variants des uses (Variants.dcu inutile)
    Donc, je regrette, je n'ai aucune explication.

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/02/2015, 11h18
  2. [son] marche mais pas avec des écouteurs
    Par oligig dans le forum Matériel
    Réponses: 0
    Dernier message: 04/10/2007, 16h04
  3. Fonction ne marchant pas avec FomShow
    Par PadawanDuDelphi dans le forum Delphi
    Réponses: 3
    Dernier message: 02/10/2006, 14h59
  4. Fonction JS qui fonctionne avec Mozilla mais pas avec IE.
    Par etiennegaloup dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 31/10/2005, 13h58
  5. CSS: cursor:hand; ne fonction pas avec Netscape/firefox
    Par pierrot10 dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 26/09/2005, 11h12

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