Canalblog
Editer l'article Suivre ce blog Administration + Créer mon blog
Publicité
Mon petit train train
Mon petit train train
Publicité
Archives
Newsletter
15 décembre 2013

Les sons.

J'ai commencé par tester en logiciel mes "briques de base". Précédemment j'ai parlé des afficheurs pour le panneau de la gare.

Maintenant je m'attaque aux sons. En effet il n'y aura pas de belle animation sans les sons qui vont avec ...

L'environnement Windows offre différentes possibilités.

  • La fonction son de base Windows.
  • La fonction diffusion de musique de Windows.
  • La fonction synthèse vocale.

La fonction de base est celle qui permet de diffuser les "bips" que l'on entend lorsque l'on travaille dans l'environnement Windows. Je l'utilise parfois pour repérer des événement comme, par exemple, la commande d'un aiguillage. En VB, cette fonction est invoquée de la façon suivante :

 System.Media.SystemSounds.Hand.Play()

Différents sons sont disponibles. Cette fonction très accessoire n'est pas gérée au sein de ma fonction son mais directement dans le code. Je l'utilise assez peu, elle est surtout destinée à me permettre de repérer certains fonctionnements particuliers de mon logiciel.

La fonction diffusion de musique joue un son en "BackGround", en VB,elle est invoquée de la façon suivante :

My.Computer.Audio.Play("chemin complet et nom du fichier"), AudioPlayMode.Background)

Lorsqu'un son est en cours et qu'un nouveau son est demandé, le précédent est interrompu, d'où la nécessité de gérer le temps utile pour les sons demandés. C'est la raison pour laquelle une liste des sons est réalisée avec le temps imparti à chacun. Cela permet de gérer un indicateur d'occupation de cette fonction.

 

dureSon(0) = 3000 'gingle SNCF 3 secondes

dureSon(1) = 2000 'sifflet chef de gare 2 secondes

dureSon(2) = 5000 'afficheurs panneau

'etc ...

 

L'AudioPlayMode peut être "BackGround" pour une diffusion unique ou " BackGroundLoop" pour une diffusion en boucle.

La fonction synthèse vocale nécessite l'ajout de la référence au module system.speech (en VB) :

Menu "Projet" rubrique "Ajouter une référence" choisir "System.Speech".

Puis l'importation du module de synthèse placée en tête de module avant la déclaration de class :

Imports System.Speech.Synthesis

Enfin la fonction peut être invoquée de la façon suivante :

speaker.SpeakAsync("texte")

A noter que la version de base de Windows 7 ne comprend qu'une voie Anglaise de bonne qualité. Pour obtenir une voie française acceptable il faut télécharger le(s) fichier(s) suivants puis les installer.

rssolo4french.zip

Ce qui permet d'avoir la voix : "ScanSoft Virginie_Dri40_16kHz", de loin la meilleure même si elle n'est pas parfaite. Comme souvent dans l'environnement Windows, tout cela est un peu confus mais il y a beaucoup de discussions en ligne qui peuvent aider.

formSon

Dans mon application, des sons peuvent être demandés à n'importe quel moment, le module qui gère les automatismes du train ne doit pas avoir en plus à gérer les sons.

J'ai donc centralisé la gestion des sons dans un module qui prend en charge leur diffusion. En fait c'est une "Form" au sens VB qui contient seulement deux objets et le code associé à la gestion des sons.

  • Une liste des sons (BackGround) qui sont des gingles comme le gingle SNCF ou le sifflet du chef de gare ou encore le sons des afficheurs du panneau d'affichage. Cette liste est ordonnée et chaque son a un index qui permet de définir sa durée (voir plus haut).
  • Une liste montée en FIFO (First In - First Out / premier entré - premier sorti) dans laquelle je mémorise les demandes de diffusion.

Ainsi le module qui gère les automatisme peut demander deux sons presqu'en même temps, ils seront pris en charge par la fonction sont puis diffusés l'un après l'autre dans l'ordre d'arrivée des demandes.

La FIFO est une fonction quasi naturelle d'un objet de type "ListBox", en effet les éléments ajoutés se mettent à la suite les uns des autres. Il suffit de toujours prendre le premier élément (index 0) puis de le retirer quand il est exploité. Lorsque la liste est vide, le travail est entièrement accompli. C'est très pratique.

J'ai par ailleurs défini trois types de demandes de diffusion (pour le moment) :

  • Type 0 : gingle SNCF suivi d'une annonce.
  • Type 1 : sifflet du chef de gare seul.
  • Type 2 : son des afficheurs des panneaux d'affichage en gare.

Chaque type correspond à un traitement différent.

  • Le type 0 envoie le son BackGround puis, lorsque celui ci est terminé, envoie l'annonce textuelle.
  • Le type 1 envoie directement le son BackGround.
  • Le type 2 est particulier, en effet il faut attendre que tous les afficheurs aient terminé leur mouvement pour arrêter le son. Cela donne un traitement comme ceci.

If affichageEnCour = True Then

   affichageEnCour =False

   For j = 0 To nombreDeLignes

     For i = 0 To nombreDeColonnes

       If afficheurActif = True Then

          affichageEnCour =True

          Exit For 'j'en ai trouvé un c'est suffisant pour laisser le son     

         End If

      Next  

     Next      

  If affichageEnCour = False Then

    My.Computer.Audio.Stop() 'arrête le son   

  End If

End If

 

Chaque fonction son invoquées dispose d'un indicateur d'occupation qui permet de ne pas écraser un son par l'autre.

Les annonces sont constituées à l’aide des informations contenues dans la ligne de script complétées de textes usuels pour l’information des voyageurs.

Exemple, (les textes en bleu sont issus directement ou indirectement des informations du script) :

Le train CORAIL, numéro 2332, en provenance de Limoges et à destination de Paris, départ 9h34, va entrer en gare voie 4, éloignez vous de la bordure du quai.

Voila pour les sons, cela fonctionne plutôt bien et ma brique est prète à l'emploi. A noter que les gingles que j'ai récupérés ont un écho assez réaliste pour le son dans une gare, ce sont des enregistrements réels, par contre la synthèse vocale, directement issue du PC n'en a pas, il va falloir que je regarde cela de près.

Bientôt je ferai une petite vidéo avec les sons.

PhB

 

 

 

 

Publicité
Publicité
Commentaires
Publicité