Page 1 sur 1

Son2D Volume / Pan & Doppler Effect

Publié : mar. 29/oct./2013 8:08
par G-Rom
Y a quelques mois, j'avais codé un petit moteur de son 2D, ce moteur gère le volume & le pan de manière automatique en fonction de la position de celui qui l'écoute
mais en plus il prend en compte la vélocité du mouvement pour simulé l'effet doppler, pour faire cours sur l'effet doppler :

Image
http://youtu.be/eo_owZ2UK7E?t=15s

et le code , multiplate-forme, offcourse...
exemple en pied de code commenté.

Code : Tout sélectionner

; /////////////////////////////////////////////////////////////////////////////
;
; Sound Effect by G-Rom
; ---------------------
; This file provide function for simulate doppler effect in 2D environement
;
;
;
; /////////////////////////////////////////////////////////////////////////////





; /////////////////////////////////////////////////////////////////////////////
;
; /////////////////////////////////////////////////////////////////////////////
#SOUND_SPEED_PIXEL_PER_SECOND = 340

Structure sSound
  mSoundID.i
  mChannel.i
  mPositionX.i
  mPositionY.i
  mRadius.i
  mListenerX.i
  mListenerY.i
  mFrequency.i
  mVolume.i
  mPlay.b
  mDopplerTime.i
  mOldX.i
  mOldY.i
  mSpeedX.i
  mSpeedY.i
  mOldLenght.d
  mLenght.d
  mValid.l
EndStructure

Global NewList *soundPlaying.sSound()

; /////////////////////////////////////////////////////////////////////////////
;
; /////////////////////////////////////////////////////////////////////////////
Procedure.i LoadSoundFromFile(filename.s, radius.l)
  *s.sSound = AllocateMemory(SizeOf(sSound))
  If *s
    *s\mSoundID   = LoadSound(#PB_Any,filename)
    *s\mFrequency = GetSoundFrequency( *s\mSoundID)
    *s\mRadius    = radius
    ProcedureReturn *s
  EndIf 
EndProcedure

; /////////////////////////////////////////////////////////////////////////////
;
; /////////////////////////////////////////////////////////////////////////////
Procedure.i LoadSoundFromMemory(soundID.l, radius.l)
  *s.sSound = AllocateMemory(SizeOf(sSound))
  If *s
    *s\mSoundID   = soundID
    *s\mFrequency = GetSoundFrequency(*s\mSoundID)
    *s\mRadius    = radius
    ProcedureReturn *s
  EndIf 
EndProcedure

; /////////////////////////////////////////////////////////////////////////////
;
; /////////////////////////////////////////////////////////////////////////////
Procedure deleteSound(*s.sSound)
  If *s
    FreeSound(*s\mSoundID)
    FreeMemory(*s)
  EndIf 
EndProcedure

; /////////////////////////////////////////////////////////////////////////////
;
; /////////////////////////////////////////////////////////////////////////////
Procedure playSoundAtPosition(*s.sSound,x.i, y.i ,flag.l)
  If *s
    *s\mChannel   = PlaySound(*s\mSoundID, #PB_Sound_MultiChannel | flag)
    *s\mPositionX = x
    *s\mPositionY = y
    *s\mValid     = #True 
    AddElement(*soundPlaying())
    *soundPlaying() = *s
  EndIf 
EndProcedure

; /////////////////////////////////////////////////////////////////////////////
;
; /////////////////////////////////////////////////////////////////////////////
Procedure computeSound(*s.sSound, listenerX.i, listenerY.i)
  If *s

    dx.i   = listenerX-*s\mPositionX
    dy.i   = listenerY-*s\mPositionY
    d.q    = (dx*dx) + (dy*dy)
    rMax.i = *s\mRadius * *s\mRadius

    ;
    ; Compute volume
    ;
    If d < rMax   
      vs.i = d * 100 / rmax
    Else
      vs.i = 100
    EndIf 
    
    If vs < 0
      vs = 0
    EndIf 
    
    If vs > 100
      vs = 100
    EndIf 

    SoundVolume(*s\mSoundID,100-vs,*s\mChannel)
    
    ;
    ; Compute pan
    ;
    If vs < 100
      ; source sound is on left
      If listenerX > *s\mPositionX
        SoundPan(*s\mSoundID,-vs,*s\mChannel)
      ElseIf listenerX < *s\mPositionX ; on right
        SoundPan(*s\mSoundID,vs,*s\mChannel)
      Else ; same position
        SoundPan(*s\mSoundID,0,*s\mChannel)
      EndIf 

    EndIf 
    
    ;
    ; Doppler effect
    ;
    
    If *s\mDopplerTime < ElapsedMilliseconds()
      *s\mDopplerTime = ElapsedMilliseconds() + 10
      
      dx.i = *s\mPositionX - listenerX
      dy.i = *s\mPositionY - listenerY
      
      *s\mSpeedX = dx - *s\mOldX
      *s\mSpeedY = dy - *s\mOldY
      
      *s\mOldX = dx
      *s\mOldY = dy
      
      *s\mOldLenght = *s\mLenght
      *s\mLenght    = Sqr(d)

    EndIf 
    
    
    dirX.i = listenerX-*s\mPositionX
    dirY.i = listenerY-*s\mPositionY
    
    If l>0
      dirX / l
      dirY / l
    EndIf 
    
    If *s\mLenght < *s\mOldLenght
      v.f = -Sqr(  ((*s\mSpeedX**s\mSpeedX) + (*s\mSpeedY**s\mSpeedY))   )
    Else
      v.f = Sqr( ((*s\mSpeedX**s\mSpeedX) + (*s\mSpeedY**s\mSpeedY)) )
    EndIf 
    
    
    
    w1.i = *s\mFrequency * (1-v/#SOUND_SPEED_PIXEL_PER_SECOND) 
    
    SetSoundFrequency(*s\mSoundID,w1,*s\mChannel)
  
  EndIf 
EndProcedure

; /////////////////////////////////////////////////////////////////////////////
;
; /////////////////////////////////////////////////////////////////////////////
Procedure soundEngineRun(listenerX.i, listenerY.i)
  
  
  ForEach *soundPlaying()
    
    computeSound(*soundPlaying(),listenerX, listenerY)
    
    status.l = SoundStatus(*soundPlaying()\mSoundID,*soundPlaying()\mChannel)
    
    If status = #PB_Sound_Stopped
      *soundPlaying()\mValid = #False 
      DeleteElement(*soundPlaying())
      Continue
    EndIf 
    
  Next
EndProcedure

; /////////////////////////////////////////////////////////////////////////////
;
; /////////////////////////////////////////////////////////////////////////////
Procedure soundIsValid(*s.sSound)
  If *s
    If *s\mValid
      ProcedureReturn #True 
    Else
      ProcedureReturn #False 
    EndIf
  EndIf 
EndProcedure

; /////////////////////////////////////////////////////////////////////////////
;
; /////////////////////////////////////////////////////////////////////////////
Procedure moveSound(*s.sSound, x.i, y.i)
  If *s
    *s\mPositionX = x
    *s\mPositionY = y
  EndIf
EndProcedure

; /////////////////////////////////////////////////////////////////////////////
;
; /////////////////////////////////////////////////////////////////////////////
Procedure resetAndPauseSound(*s.sSound)
  If *s
    PauseSound(*s\mSoundID,*s\mChannel)
    SetSoundPosition(*s\mSoundID,0,#PB_Sound_Millisecond,*s\mChannel)
  EndIf
EndProcedure


; /////////////////////////////////////////////////////////////////////////////
;-EXAMPLE
; /////////////////////////////////////////////////////////////////////////////
; InitSound()
; 
; SoundRadius = 7000
; 
; ; by this way
; *buffer = CatchSound(#PB_Any, ?memory)
; *sound = LoadSoundFromMemory(*buffer,SoundRadius)
; 
; ;or by file
; *snd = LoadSoundFromFile("file",SoundRadius)
; 
; ; position of listener (you) and the sound in 2D space
; ListenerX = 0
; ListenerY = 0
; SoundX    = 0
; SoundY    = 0
; 
; 
; 
; Repeat
;   
;     ; move listener
;     ListenerX = 5000 * Cos(ElapsedMilliseconds() / 500)
; 
;     moveSound(*snd,SoundX,SoundY)
;     soundEngineRun(ListenerX,ListenerY)
; 
; Until whatever

Re: Son2D Volume / Pan & Doppler Effect

Publié : mer. 30/oct./2013 16:13
par G-Rom
Un petit exemple graphique & sonore dans cette archive :

https://drive.google.com/file/d/0B8rcgU ... sp=sharing

Re: Son2D Volume / Pan & Doppler Effect

Publié : mer. 30/oct./2013 17:59
par Kwai chang caine
Ca marche de la balle la police :D

Image

Merci GRom 8) pour le code et aussi pour le lien spécial attardé :mrgreen:

Re: Son2D Volume / Pan & Doppler Effect

Publié : jeu. 31/oct./2013 2:40
par G-Rom
Kwai chang caine a écrit :Ca marche de la balle la police :D

Image

Merci GRom 8) pour le code et aussi pour le lien spécial attardé :mrgreen:
Merci pour ton com, t'est un sacré numéro kcc ^^
tu vois, pourquoi ce casser la tête ? je met un code + une archive, aucun feedback , je met un code plus compliqué sur svn, 2 pages de coms , pas un feedback...
on est sur un Forum de programmation ? :mrgreen:

Re: Son2D Volume / Pan & Doppler Effect

Publié : jeu. 31/oct./2013 3:02
par graph100
on n'a pas forcément le temps de tout tester !

En tout cas merci, si le besoin vient, il pourra être satisfait :lol:

Re: Son2D Volume / Pan & Doppler Effect

Publié : jeu. 31/oct./2013 10:06
par Ar-S
J'ai ouvert la page de telech, pas eu le temps de recupe, je me bats avec un vieux boosin sous xp depuis hier ^^
Dans mon blède en ce moment c'est la fête à la carte réseau cramée par les surtensions dues à la foudre, je teste ça des que possible et n'hésiterai pas à commenter.. mais pas de suite ;)

Re: Son2D Volume / Pan & Doppler Effect

Publié : jeu. 31/oct./2013 10:36
par Backup
Ar-S a écrit :c'est la fête à la carte réseau cramée par les surtensions dues à la foudre,

ou par .... EDF ;)

la foudre ,elle a souvent bon dos ...

Re: Son2D Volume / Pan & Doppler Effect

Publié : jeu. 31/oct./2013 10:42
par Ar-S
Dobro a écrit :
Ar-S a écrit :c'est la fête à la carte réseau cramée par les surtensions dues à la foudre,

ou par .... EDF ;)

la foudre ,elle a souvent bon dos ...
[hs]Vu les derniers orages et la façon dont la foudre a explosée la toiture de mes derniers clients, y'a pas photo ^^[/hs]

Re: Son2D Volume / Pan & Doppler Effect

Publié : jeu. 31/oct./2013 11:12
par Kwai chang caine
GRom a écrit :on est sur un Forum de programmation ?
Bah le probleme c'est qu'on est qu'une poignée.... :cry:
Sur le US y'a deja plus de monde, mais on est pas nombreux aussi au final :(

Perso je ne connaissais pas ce SVN, normal j'suis un "trisoformatique", mais j'suis sur que des centaines peut etre aussi des milliers de personnes passent par la maintenant.

Je pense qu'on est surtout devenu une bande de copains virtuels, qui se reunissent autour d'une même passion l'informatique et du même langage, dont certains ont la gentillesse et la générosité de partager leurs sources, d'autres leurs programmes, d'autres leurs combines...etc..

Je trouve que VBFrance, Developpez sont peut etre des vrais forums de programmation, et encore faudrait il definir ce qu'est un "vrai" forum...mais on s'y fait ch.. à mort (M'en fou j'ai pas le même pseudo :mrgreen:)
Tu poses ta question et deux jours apres t'as une reponse....voir deux ou trois, rarement des discussions, des echanges....on se croirait à l'armée...(oh pardon !!!! :oops: :wink:)

Perso j'ai plaisir a venir lire mon petit journal tous les matins, m'enquerir de ce qu'on fait ma poignée de barjos comme moi, mais monté bien moins fin que moi :oops: , et je suis tout emoustillé de tomber sur des codes ou je reste plombé devant mon ecran, ou bien une combine que je connaissais pas (ça c'est tous les jours :oops:)
Je comparerais plutot ce forum à un cani, ou se retrouveraient tous les pilliers de comptoirs pour parler de leur passion, un genre de club quoi...

C'est le plaisir qui me fait venir, bien plus que le besoin, alors que sur les autres, je viens je pose ma question, comme je poserais ma peche, et je m'en vais...un genre de WC quoi:
"J'y vais quiiiiiin jé béééééééésoin, ............le fouroooooom au faaaand di jaaaaaaaaaaaaaardin !!!!" :mrgreen:
Bien que je respecte tous les autres membres de ces supers forums de programmation, et que je les remercie de leur aide si précieuse 8)
Le forum PB, c'est peut etre moins qu'un forum de programmation, mais à la fois plus qu'un forum de programmation.

Pour ma part, je parle de vous dans la vie courante, a des copains, ma femme, le gamin, de vos exploits dans votre vie quand vous les donnez, de vos caracteres "de merde" pour certains, mais aussi de votre coté attachant, généreux, gentil, etc...

Un de mes plus grand soucis, c'est que la vie me force comme vous tous, à utiliser d'autres langages, je commence à chercher comme je l'avais fait pour PB, la facilité pour faire du JAVA, du PHP, car on a pas le choix pour ces put... de smartphone, et ces saloperie de sites de plus en plus évolués :?
Et bien ....une de mes grandes peurs, outre le fait que de recommencer à zero, me prouvera encore plus mon incapacité à la "comprenette" , c'est de quitter mes copains, mon petit monde... :cry:

Je l'ai souvent dit, ici c'est presque une famille, avec ces membres qui ne s'aiment pas, d'autres qui s'adorent, et tout ça sur un fond de passion commune.
En fin de compte ce forum, est comme son langage, il fait tellement de choses, qu'on en arrive à oublier qu'il n'est pas parfait, et qu'il a aussi ses limites :oops:
PB et vous, m'avez ammené tellement de choses, de l'ecoute, de la gentillesse, de la rapidité...alors j'essaie le "CARPE DIEM" tant que je le peux, bien que j'aime pas trop etre du même avis :lol:

Et si tu as eu la générosité de lire jusqu'à cette ligne, bien que je comprenne pas vraiment ce que tu fait, et bien ça m'a l'air drolement costaud en prog...comme tous ceux qui font du jeu.

Finalement pour faire un "retourback"...et bien c'est bizarre, car j'ai une micro coupure aux premiers passages, puis au bout de plusieurs c'est plus "fluide", mais encore une fois...mon avis vaut ce qu'il vaut :cry:

Re: Son2D Volume / Pan & Doppler Effect

Publié : jeu. 31/oct./2013 11:21
par Kwai chang caine
Aaah!!!! une derniere chose....j'ai pas tout dit :mrgreen: :oops:
Tu vois que je pense à toi, comme aux autres n'importe ou...
Ce matin sous ma douche, en faisant couler le savon sur mon "frout frout" en plastique, ce qui me sert de cerveau a une une mini lueur comme cela lui arrive de temps en temps :idea:
J'ai trouvé pour "G-Rom"..et ben parce que ton petit nom c'est "Gerome"... :D
J'adore les jeux de mots..... 8)

Re: Son2D Volume / Pan & Doppler Effect

Publié : jeu. 31/oct./2013 19:59
par G-Rom
Mes pseudo on toujours eu un sens, à l'époque de Cpl.Bator, c'était un blague à la con à l'armée, un mot valise capor'albator, adjudantifrice, ou encore capitaine flamme ( il existe en vrai celui la , mais il était caporal chef :D ), on envoyais de pauvre type sous un pseudonyme à la con aller cherché la clé du pas de tir ou encore le fil de ligne de mire (ligne imaginaire de visée) , le marteau à bombé le verre... Généralement on l'envoyais vers un gradé de la vieille école , c'était plus marrant , car lui même le renvoyais voir un autre gars à l'autre bout du régiment, sachant que mon camp faisait 45km de large.... y a de quoi faire...
Sinon G-Rom , car Jérôme avec un J.
C'est le plaisir qui me fait venir, bien plus que le besoin, alors que sur les autres, je viens je pose ma question, comme je poserais ma peche, et je m'en vais...un genre de WC quoi
On à donc un point commun, c'est uniquement le plaisir de lire tes pâtés et ceux des autres qui me font venir. mais on "pourrie" le forum sans le faire exprès, on se l'accapare en racontant nos lifes et on s'éloigne du sujet principal , la programmation ;)

Re: Son2D Volume / Pan & Doppler Effect

Publié : jeu. 31/oct./2013 22:48
par Kwai chang caine
Oui tu as raison :oops:
Maintenant, J'suis pas sur que si on enlevais tout ce qui ne concerne pas la prog, et qu'on s interdisait de causer à travers par ci par la, y aurait plus de codes ou de codeurs..
Le grand mal a été fait lors de nos prises de bec a coups de poisson pas frais, pas mal de bons sont partis, et déjà qu'on etais pas nombreux. ..
Enfin c'est la vie...je pense qu'il faut profiter de ce que ce forum nous donne et pas les autres. ..et inversement, c'est juste un peu plus chiant d'alterner entre plusieurs.
Et puis rien est perdu. ..déjà y a un paillon qui a pas eu d'accrochage et c'est super..donc avec le temps y aura d'autres nouveaux et bons comme falsam ou autres qui viendront..soyons patient.

Moi aussi j'en ai fait des conneries a l'armée, perdu un famas, couché un camion berliet et sa belle mère un total de 15 metres de long dans un fossé, ya fallu déplacer le genie pour le sortir, degondé une porte pour que le copain qui rentre s'expose avec elle par terre, tremper mes doigts dans la bouffe des gradé que je servais,15 jous de tole, 3 jour de rab,....et encore d'autre joyeuserie ,enfin mon année a été courte, mais j'avais des copains de tranchées, car comme tu le vois. J'ai toujours été un rigolo et.la discipline et moi...j'ai que des bons souvenirs. .

Si j'avais su que les allemands etaient si forts a l'époque en informatique, j'en aurais kidnappé un.

En tout cas merci de cette causette, même si c'est pas bien...
Bon courage pour ton code et bonne nuit

Re: Son2D Volume / Pan & Doppler Effect

Publié : ven. 01/nov./2013 10:57
par Backup
Kwai chang caine a écrit :Le grand mal a été fait lors de nos prises de bec a coups de poisson pas frais, pas mal de bons sont partis, et déjà qu'on etais pas nombreux. ..
non , tu te trompe , cela est vrais seulement apres votre arrivée sur le forum , quand je dis "Votre" c'est celle de ta generation d'abonnés !

je te l'ai deja expliqué , "avant" , des prises de courges, il y en avait mais .... ça débouchait toujours sur des délires de codes ...

"le chant des mots" .... "divers Defis de code Demos" ...etc ....

parceque avant "votre" generation d'abonnés ... les Prises de tete etaient TOUJOURS du second degrés

vous etes arrivés avec vos gros sabots, en prenant tout au premier degres ... ça a commencé comme ça le "malaise" (si si )

puis ça a glissé petit a petit vers des discussions Politique... et la on a atteints le Point culminant .....
car nous etions passé de la discussion "Délirium" a la discussion Premier Degres ....


a l'epoque j'avais tiré le system d'alarme , j'ai vu venir le truc ... mais vous avez poursuivi dans ce sens....
je vous prevenais , que le Forum , etait Spécial , et qu'il fallait apprendre a le connaitre avant de tirer des conclusions ....
je disait, qu'il n'avait rien a voir avec les Forums qu'on trouve sur Internet , que nous formions une espece de communauté
ou deja la plupart d'entre nous , nous nous connaissions du Forum Dark Basic ....
et que certains , on se parlait deja depuis 6-8 ans .....
je ne me souviens plus de ma date D'achat de Purebasic.... je pourrai la retrouver en cherchant dans mes comptes...
jamais il n'y eu de clashs au point de ce que j'ai vécu par la suite (en etant Modo d'ailleurs ... c'est pour ça que j'ai cessé
je ne pouvais plus donner mon avis sans qu'on me reproche de le faire sous couvert d'etre Modo )

si je peux me permettre de dire cela , c'est parceque j'ai cotoyé le Forum 4- 5 ans (peut etre plus ....)avant la venu de cette Génération de membres
qui ont débarqué d'un coup en n'ayant pas compris comment marchait notre Forum ....

je te garanti que des discussions a bâton rompu , on en a eu des centaines , sans que jamais cela n'ai dérapé comme apres ...
les anciens comme Cederavick , Garzul , Le soldat inconnu , Denis,Chris,Oliv, Flype, etc ... pourraient en témoigner ....

au contraire , ça finissait toujours par une bonne bache , et des Codes :)

les "bons" qui comme tu le dis , sont partis ... ne sont pas partis parce qu'il y avait des Clash , mais parceque justement c'etait plus les memes clahs !
d'autres "bons" sont parti , parceque justement ils faisaient parti de cette nouvelle generations , qui n'as pas compris notre forum ...
quand a d'autres , parceque leur Vie le demandais ....

(mais on sort du Sujet .. je m'arrete là ! )

[reedit]

regarde l'un de tes premiers message sur le Forum , montre a quel point tu etait decalé ....
maintenant que tu connais un peu , tu va t'en rendre compte :
ici :
http://www.purebasic.fr/french/viewtopi ... 697#p55697

tu dis :
Bonjour FLYPE

Comme tu le sais peut etre, je suis nouveau sur ce forum.
Et je ne veux en aucun cas etre en dehors de ses régles.
@Cls, Je te remercie beaucoup

Comme, je l'ai dit plus haut mon intention n'est pas de nuire, mais de me defendre. Mais tu as raison, il n'y a que ma parole ....

En tout cas, je continue ma recherche et je te remercie pour l'info.

Je suppose donc que si par miracle j'arrive à faire ce petit keylogger, il vaut mieux que je ne donne pas le code sur le forum. :oops:

Zut pour une fois que j'aurais pu donner un code :lol:

Quoi qu'il en soit, je ne ferais rien qui puisse facher la majorité des membres de ce forum.
Je ne suis pas comme les virus, je ne detruit pas la main qui me nourrit :P

Bonne journée
ces phrases en Surligné , montre que deja tu part sur un plan qui n'est meme pas abordé par les Membres qui te répondent .. ù
ces phrases sont completement hors sujet ...
mais montre dans quel etat d'esprit tu etait en arrivant sur le Forum .... (rien a voir avec notre ambiance )
message du 07/Oct/2006
ton inscription : 23/Sep/2006 18:32

personne ne te parlais de regles .... personne ne te reprochait quoique ce soit ...
mais tu etais deja dans cet etat d'espris ..... :roll:

juste pour te prouver que l'ambiance etait deja Hot avant ton arrivé , mais ne finissait pas mal

ici http://www.purebasic.fr/french/viewtopi ... 700#p55700
je traite SPH de Gros Naze , de nul qui n'a pas de cerveau etc....
ça a fini sur du code :)
l'ambiance etait cool :)
petite prise de bec en 2004
http://www.purebasic.fr/french/viewtopi ... 9288#p9288
ça a bien fini :)
et je ne parle pas du dialogue avec LNA :lol: (c'te quiche )


mais bon , ça redeviens cool , on va pas s'prendre le choux hein .... :)

Re: Son2D Volume / Pan & Doppler Effect

Publié : ven. 01/nov./2013 11:33
par Ar-S
Enfin tu tester ton archive en ce jour de glandouille.
Le rendu pan/freq/volume est bien géré, merci pour ce partage.