See site in english Voir le site en francais
Website skin:
home  download  forum  link  contact

Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length

Author Topic: [Tutorial] Note sur la SDK d'OrbiterSound 3.5 - Votre addon vous parle !  (Read 8888 times)

0 Members and 1 Guest are viewing this topic.

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
01 August 2007, 15:51:55

Cliquez le lien ci-dessous pour retourner au sommaire des "tutorials pour créer une DLL Orbiter"
http://orbiter.dansteph.com/forum/index.php?topic=6335.msg95352#msg95352


Note sur la SDK d'OrbiterSound 3.5 - Votre addon vous parle !


1-Le principe
2-Une fonction tout en un
3-Comment fabriquer un son de voix



1-Le principe

Si on implémente un vessel avec par exemple un voix qui donne des infos (comme le DGIV) ou beaucoup de son différent joué ponctuellement on arrive vite à la limite des 60 "slots" sans compter que le code devient inutilement compliqué avec nos 60 wav chargés alors qu'on en joue un de temps en temps.

Heureusement depuis la version 3.5 d'OrbiterSound on peut charger et jouer un son tout de suite après.
Avec cette solution on peut jouer virtuellement des milliers de sons !

Comme il est peut probable que la dame dise "il n'y a plus de fuel" en même temps que "ok le pleins est fait"
la solution est d'utiliser à chaque fois le même slot pour jouer ces sons.

Exemple en pseudoCode:
 
Code: [Select]
 //Dans le header:
  #define SLOTVOIX  45  // on utilise le slot 45 par exemple

  //Dans vos code CPP:

  if(Fuel==Pleins)
  {
        LoadVesselWav(SLOTVOIX,"LePleinEstFait.wav")
        playVesselWav(SLOTVOIX);
  }

  if(Fuel==Vide)
  {
        LoadVesselWav(SLOTVOIX,"OnAPlusDeFuel.wav")
        playVesselWav(SLOTVOIX);
  }

ATTENTION: cette solution n'est valide que pour des sons joué ponctuellement et de temps en temps ! Comme le son est chargé depuis le disque si vous faite ca toute les deux trois images vous allez transformer Orbiter en slideShow ! Ceci dis sur un ordi moderne le fait de charger un son depuis le disque toutes les "nn" secondes ou minutes ne ce remarque pratiquement pas...

ATTENTION2: Vous devez bien prevenir l'utilisateur de votre addon d'avoir OrbiterSound 3.5 installé, le truc de charger et jouer tout de suite après ne marche pas avec les version précédentes, dans ce cas il ne ce passerais rien, pas de son.

Cette solution est valide pour:
-Des sons de boutons différent "fuel enclenché" "post combustion" ou "click" "clock "proutch"
-Des voix qui donne des feedbacks sur les systèmes "Auto pilot enclenché" "mise a feux dans 10 secondes"


Il faut bien reflechir à vos besoin et à la solution avant de coder:

il est très peu probable de cliquer en même temps sur deux boutons mais si un des son dure plus d'une seconde voir même 5 la probabilité augmente fortement, dans ce cas le sons du premier bouton sera coupé abruptement et remplacé par le nouveau. Cette probabilité est très forte si vous utilisez le même slot pour des son de voix "attention porte du sas ouverte" et des boutons.

On peut donc repartir les son sur plusieurs slot un "SLOTVOIX" un "SLOTBOUTON" par exemple.

En plus de cette répartition on peux envisager de tourner sur plusieurs slot qui seront chargé et joué alternativement
si par exemple on utilise 3 slots on a une capacité de jouer trois son en même temps et la, la probabilité qu'un son soit coupé par un autre diminue fortement.



Message modifié ( 01-08-2007 18:10 )

« Last Edit: 01 August 2007, 18:16:07 by DanSteph »

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #1 - 01 August 2007, 16:50:46
2- Une fonction tout en un "ChargeEtJoue()"

Comme on va parsemer notre code de voix ou de son ponctuel on va simplifier au maximum de facon à n'avoir qu'une
seul ligne pour charger et jouer un son, cette fonction utilisera aussi trois slots alternativement pour minimiser le
risque de coupure. Dès lors faire "parler" votre vaisseau ou utiliser des centaines de son différent pour les boutons
sera extrement simple: Il suffira de donner le nom du fichier a jouer.

Exemple:
Code: [Select]
   if(bPlusDeFuel==TRUE)
    {
            ChargeEtJoue("PlusDeFuelCaptain.wav");
    }


Implémentation de la fonction "ChargeEtJoue":

Dans le header de votre classe ("MaClasseAddon.h") ou à coté de vos autres définition de son tapez les trois lignes suivante: (si les slot 50-52 sont déjà utilisé changer les nombre mais faite attention qu'il ce suivent)

Code: [Select]
//MaClasseAddon.h En dehors de la classe
#define SLOTVOIX1             50
#define SLOTVOIX2             51
#define SLOTVOIX3             52

Toujours dans le header de votre classe ("MaClasseAddon.h") mais cette fois ci dans votre classe, tapez le code suivant: (en gras)

Code: [Select]
[i]class MonAddon: public VESSEL2 {
public: [/i]

[b]     void ChargeEtJoue(char* NomWav);
     int iSlotChargeEtJoue;[/b]

Dans un cpp par exemple "OrbiterSound35.cpp" à la fin rajoutez le corp de la fonction:

Code: [Select]
////////////////////////////////////////////////////////////////////////////////////////////////
// ChargeEtJoue - Charge et joue immediatement un son
////////////////////////////////////////////////////////////////////////////////////////////////

void MonAddon::ChargeEtJoue(char* NomWav)
{

   iSlotChargeEtJoue++;  // utilisera le slot suivant
   // assure qu'on utilise bien nos trois slots et pas d'autres (pas besoin d'initialiser cette variable du coup)
   if(iSlotChargeEtJoue>SLOTVOIX3||iSlotChargeEtJoue           iSlotChargeEtJoue=SLOTVOIX1;

   char FilenamePath[200]={0};
   sprintf(FilenamePath,"Sound\\[glow=yellow,2,300][b]MonAddon[/b][/glow]\\%s",NomWav);
   RequestLoadVesselWave3(MyID,iSlotChargeEtJoue,FilenamePath,INTERNAL_ONLY);
   PlayVesselWave3(MyID,iSlotChargeEtJoue);

}

Attention à changer le nom de répertoire ou seront vos sons ("MonAddon" en jaune dans le code en dessus)

C'est fini, Votre addon est près à vous parler:

Code: [Select]
   // depuis n'importe ou (vous devez avoir le son wav of course ;) )
      ChargeEtJoue("SalutVieuxJoe.wav");



Message modifié ( 01-08-2007 17:25 )

« Last Edit: 01 August 2007, 18:16:07 by DanSteph »

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #2 - 01 August 2007, 17:28:05
3-Comment fabriquer un son de voix

Avec un synthetiseur de voix que nous allons modifier pour donner un timbre plus "radio"

Allez sur ce site et tapez un texte en anglais:
http://www.research.att.com/~ttsweb/tts/demo.php

Tapez par exemple: "warning, orbiter is too cool !" et cliquez sur "speak"
sauvez le son sur votre hd et faite le jouer.

Ca donne ca:
http://www.dansteph.com/publie/forum/tutorialOrbiterSound35_a.wav

Ensuite avec un logiciel de traitement de son on peut appliquer un filtre de frequence pour donner le son "radio"
pour ca le gag c'est de couper les frequences en dessous de 400 hz et celle en dessus de 8000 hz
Perso je part de 320hz le maximum a 2000hz et je coupe a 8000hz:



Ensuite un petit filtre pour normalisez le son (rendre plus fort vu que le filtre a beaucoup coupé)
ca qui donne ca au final:
http://www.dansteph.com/publie/forum/tutorialOrbiterSound35_b.wav

Vous trouverez sur cette page des logiciels gratuit de traitement de son, audacity est pas mal, (moi j'utilise toujours mon vieux cooledit qui date de 96, il marche impec)
http://www.snapfiles.com/freeware/gmm/fwaudiorecorder.html


FORMAT DU SON: OrbiterSound joue a 22050hz maximum, pour un son qui a les frequences coupée a 8khz ca ne sert a rien de l'enregistrer en 22khz, enregistrez le en 11khz mono ca suffit pour de la voix et ca prendra moins de place (les wav ca peut facilement monter à plusieur mega octet pour quelques secondes)


Voila c'est tout, Faite parler l'addon !!!!! :badsmile:

Dan



Message modifié ( 01-08-2007 18:08 )

« Last Edit: 01 August 2007, 18:16:07 by DanSteph »

Offline picto

  • Legend
  • ******
  • Posts: 5014
  • Country: France fr
  • Karma: 24
  • Criiii Crii Crii
Reply #3 - 01 August 2007, 17:39:58
4-Comment fabriquer un son de voix plus naturelle

Audacity pour éditer.
http://www.clubic.com/telecharger-fiche10372-audacity.html

DSpeech pour synthétiser en Sapi5 ( meilleure qualité disponible)
http://www.clubic.com/telecharger-fiche34129-dspeech.html

Des voix en SAPI5

Acapela, pour moi, les meilleures.
http://www.acapela-group.com/demos/desktop.asp

Loquendo, pas mal non plus
http://actor.loquendo.com/actordemo/default.asp?language=fr

Et Cepstral
http://www.cepstral.com/downloads/

Le Sapi5 c'est lourd, en moyenne une voix c'est 150MO.
Mais les voix sont plus naturelles, c'est bien pour faire des copilotes.
Genre : Tuaspilotécommeundieuaujourdhui.wav
ou Cestlheuredelabouffe.wav

Pour les voix synthétiques façon ordi de bord ton logiciel est plus adapté



Message modifié ( 01-08-2007 18:20 )

« Last Edit: 01 August 2007, 18:16:07 by picto »
Pic

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #4 - 01 August 2007, 18:16:07

Cliquez le lien ci-dessous pour retourner au sommaire des "tutorials pour créer une DLL Orbiter"
http://orbiter.dansteph.com/forum/index.php?topic=6335.msg95352#msg95352


« Last Edit: 01 August 2007, 18:16:07 by DanSteph »