Comment jouer deux sons qui sont dans un fichier ressource en meme temp sans passer par un mediaplayer ?
Version imprimable
Comment jouer deux sons qui sont dans un fichier ressource en meme temp sans passer par un mediaplayer ?
Personne ne sait comment ? :(
ça devient deux fichiers distincts, une fois extraits du fichier ressources, il me semble ?Citation:
deux sons qui sont dans un fichier ressource
Auquel cas ça me semble mission impossible : comment veux-tu envoyer 2 fichiers en même temps à une seule carte son, mmmh ?
--
jp
Bonjour,
Pas possible de placer le second son en thread et de synchroniser les deux ensemble, cela les mixerait-il ?Code:SndPlaySound('C:\zizique.wav', SND_ASYNC);
En électronique cela se nomme le multiplexage, en informatique, j'en sais rien encore ;)
Salut J-P !
Ah, on reconnait bien là les bidouilleurs !
J'y ai pensé une fraction de nanoseconde, mais ch'suis pas sûr que le pilote de la carte son soit d'accord, :D
Maintenant, si quelqu'un a déjà réussi ça, vite vite qu'il colle son code ici, qu'on puisse copier ! :mouarf:
Sinon, multiplexage, t'es sûr que tu confonds pas avec mixage ?
Car, pour vraiment multiplexer, il faudrait découper chaque fichier en tout 'tits' bouts que les threads (je connais quasiment pas ces bestiaux) enverraient à la carte son, ch'sais pas trop c'que ça pourrait donner...
Mes 2 cts, en attendant d'autres avis éclairés !
--
jp
Avec DirectSound :
http://sub0.developpez.com/FormatWAV/mixsound.zip
Les samples sont mis en mémoire avant la lecture. Il est possible de choisir la fréquence, le panning (balance canal droit gauche), la position de départ (offset), le volume de chaque piste. La démo utilise des samples mono. Pour jouer un sample stéréo, il faut utiliser 2 pistes. Tu trouveras des démos DirectSound pour enregistrer et jouer des samples direct-to-disk avec DirectSound sur le net. Cela permet de pouvoir jouer simultannément autant de sample que l'on veut (limité par la puissance du système).
Très joli, Sub0 ! Et + 1 !
On en apprend tous les jours, ici !
Et je me garde ce zip dans un coin (ça peut servir), merci :mrgreen:
--
jp
Cette démo est surtout destinée à être utilisée dans un petit jeu pour faire des bruitages... Mais bon, on peut l'améliorer pour en faire un programme de musique par exemple.
;) Tu trouveras d'autres sources dans cette page :
http://sub0.developpez.com/
Salut jp http://yelims.free.fr/Coucou/Coucou10.gif
http://yelims.free.fr/Jetirelalangue/Langue02.gifCitation:
Ah, on reconnait bien là les bidouilleurs !
Oui oui multiplexage, idem le principe des télécoms.Citation:
Sinon, multiplexage, t'es sûr que tu confonds pas avec mixage ?
Heureusement que Sub0 arrive à temps avant que la bagarre éclate http://yelims4.free.fr/MDR/MDR55.gif http://yelims4.free.fr/MDR/MDR85.gif
Bravo à merci à lui http://yelims.free.fr/TopOuNul/Super14.gif encore du code à piocher pour mieux apprendre !
Juste pour ajouter un mot, et Je pense que Sub0 a du faire un ptit bout de chemin dans le monde des player de mod ;)
Les sons sont des ondes, et que la résultante est la moyenne des de ondes.
Donc octet par octet des samples (ondes) (ou autre choses que octets si la précision de l'intensité est plus que du 8bits), additionner et diviser par 2.
(sans parler de toutes les triturations que l'on fait sur une onde l'étirer pour les grave, aug. le vol, effet vibrato etc...)
C'était les principes des player de modules (mod, s3m...) DOS fut un temps qui ne travaillaient que comme ca.
Et c'etait plus de l'analyse d'onde que du bidouillage pour mixer 2 ou plusieurs samples ensemble pour avoir le son résultat final ;)
Le bidouillage était au niveau des optimisations à fournir, pour effectuer le calcul le plus rapidement possible sur les pov vieille machine comme des P66 :mrgreen:
Effectivement. J'avais codé un mixeur de samples en temps réel avec TurboPascal7 en me basant sur cette méthode. Pour le mixage en 16bits, il faut "désassigner" le sample, mixer (faire la moyenne), puis remettre le sample au bon format. La démo suivante effectue cette fonction : http://sub0.developpez.com/FormatWAV/Make16ST_16MO.htm
Moi je dis qu'une chose : bravo les gars !
(mdr avec tes icônes, J-P !)
Chapeau bas,
--
jp
Merci a Sub0 ca marche impec. :D
Allez, hop, j'ai trouvé un machin qui permet de le faire en DirectX (DirectSound)
Vous trouverez une unité snd_main.pas à ajouter à votre projet.
Ensuite l'utilisation est archi-simplissime :mrgreen:
1) Vous initialisez DirectX SND_init(Handle) Handle est le Handle de la fenètre principale de votre application
2) et chargez les sons avec SND_add qui renvoi un entier qui identifie votre son de manière unique, à garder au chaud pour la suite
n1:=SND_add('son1.wav');
n2:=SND_add('son1.wav');
n3:=SND_add('son1.wav');
3) pour jouer un son, vous utilisez SND_play en lui indiquant le numéro de votre son, la position du son (X : à gauche ou à droite, Y : devant ou derrière),si vous souhaitez le jouer en boucle ou nonCode:
1
2
3
4
5
6
7
8
9
10 procedure TForm1.FormCreate(Sender: TObject); begin // Sound engine initialization if not SND_init(Handle) then Halt; // Load samples Button1.Tag := SND_add('snd1.wav'); Button2.Tag := SND_add('snd2.wav'); Button3.Tag := SND_add('snd3.wav'); end;
SND_play(n2);
4) Et pour libérer les ressources, vous terminez par :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 procedure TForm1.ButtonClick(Sender: TObject); const offset = 768; var X : Single; begin // Calc X position for sample (not listener) if Sender = Button1 then X := TrackBar3.Position else if Sender = Button2 then X := TrackBar4.Position else X := TrackBar5.Position; // Play selected sample SND_play((Sender as TButton).Tag, X * 128); end;
SND_free;
Le mieu, c'est essayer l'exemple que je vous fourni dans le zip ;)
La j'ai un probleme avec le code de waskol. Le programme marche très bien avec les sons fourni ,mais avec mes sons il plante: Lecture au-dela de la fin du fichier. Mais si je lui donne un fichier wav de meilleur qualité, il marche.
C'est marrant (enfin non :aie: ), parce que chez moi ça marche avec des sons pourris (11KHz ou 8KHz, mono).Citation:
Envoyé par poly128
Par contre, tout mes sons sont au format PCM.
Sinon, la démo est faite pour des sons de 22KHz, si tu as une impression de lecture trop rapide du son ou trop lente, c'est parce que tes sons ont un taux d'échantillonnage différent : dans ce cas utilises la trackbar du bas pour ajuster la vitesse de lecture de directX pour l'ajuster à ta fréquence d'échantillonnage.
Mais alors, je ne comprend pas encore le pourquoi du sa plante chez toi, chez moi je n'ai pas réussi à faire planter la démo :aie:
Pourrais-tu poster ici les sons (enfin, un seul peut suffire) qui te posent problème, celà me permettrait d'y voir plus clair. Merci ;)
Tout les sons de basse qualité ne marche pas. Meme les sons qui ont exactement le meme format que ceux fournie avec l'exemple ne marche pas. :cry:
Pièce jointe 6381
Yop !
Ton "son qui marche pas", effectivement, génère une erreur "Lecture au-delà de la fin du fichier" au lancement du prog de Waskol.
Je l'ai donc ouvert avec un logiciel d'édition de sons (Goldwave, pour ne pas le nommer), ai fait "Resample..." sans changer les valeurs, l'ai enregistré et là c'est tout bon.
Mes 2 cts,
--
jp
Effectivement en faisant Resample ca marche, mais pourquoi ca je sais pas.
Mille merci a Jipété et aussi a waskol pour le code, je commencais à désespérer. :mouarf:
je dis ca tout a fait au hasard, mais on sait jamais.:roll:
Est-qu'il ne peut pas y avoir une probleme de sample avec des valeurs dont les valeurs sont soit signées, soient non signées ? (2 normes différentes).
Juste qu'a une époque (lointaine certe), j'étais tombé sur ce problème...
et dans ce cas, le prog est prévu pour prendre qu'une seule norme soit signé, soit non signé... ?