creation de bruit en format wave.

Partagez votre expérience de PureBasic avec les autres utilisateurs.
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

creation de bruit en format wave.

Message par tonton »

exactement comme le faisait le yamaha DX 7 et DX 11.
un exemple de création de son par modulation de frequence.
(sans debugger) .

Code : Tout sélectionner

InitSprite()                                    
InitKeyboard()                                  
InitSound()

  ;------ création bruit  ---------------------
  !MOV  dword[add_dat],0
  e.f=1
  For br=0 To 15000;- bruit de 15000 double echantillons 
  a.f+0.25  ;creation onde sinus 1   
  b.f+0.05;creation onde sinus 2
  c.f+0.77;creation onde sinus 3
  d.f+0.09;creation onde sinus 4
  e-0.00029;son regressif
    brh0.f=((Sin(a)+Sin(b)+Sin(c)+Sin(d))*32000/4)*e  ;mixe le tout. 
  brsong.w=brh0
   !PUSH eax
   !PUSH ebx
   !PUSH edi
   !MOV  ax,word[v_brsong]
   !LEA  edi,[donne]  ;on place les echantillon a l adresse "donne" 
   !ADD  edi,[add_dat]
   !ADD  dword[add_dat],4
   !MOV  word[edi],ax
   !MOV  word[edi+2],ax
   !POP  edi
   !POP  ebx
   !POP  eax
   Next br
   CatchSound(0,?music);on pointe le debut du fi
   SoundVolume(0, 100);volume de 0 a 100
   SoundFrequency(0, 5000);frequence du son de 1000 a 100000
   If OpenScreen(0, 0, 8, "8")  
   Repeat  
                                           
 ExamineKeyboard()  
 
 If KeyboardPushed(#PB_Key_Space) ;joue le son si la touche espace pressée
   If  ver_bruit=0 
  ver_bruit=1
   PlaySound(0,0)
    EndIf
     Else
     ver_bruit=0
      EndIf
  
         ;---------  
 Until KeyboardPushed(#PB_Key_Escape)        
 EndIf 
 End  

!section '.data' align 16

 !add_dat:
  !dd  0
  music: ;ici 'l entete du fichier wave juste avant les echantillons
  
  !db   052h,049h,046h,046h; (4 octets) : Constante "RIFF"         (0x52,0x49,0x46,0x46)
  !tail8:
  !dd   15000-8 ;  (4 octets) : Taille du fichier moins 8 octets
  !db   057h,041h,056h,045h  ;   (4 octets) : Format = "WAVE"      (0x57,0x41,0x56,0x45)
  !db   066h,06dh,074h,020h ;   (4 octets) : Identifiant "fmt "   (0x66,0x6D,0x74,0x20)
  !dd   16  ;   (4 octets) : Nombre d'octets utilisés pour définir en détail le contenu
  !dw   1  ;    (2 octets) : Format de fichier (1: PCM,  ...)
  !dw   2  ;  (2 octets) : Nombre de canaux (1 pour mono ou 2 pour stéréo)
  !dd   22050 ;  (4 octets) : Fréquence d'échantillonnage (en Hertz)
  !dd   88200 ; (4 octets) : Nombre d'octets par seconde de musique
  !dw   4 ; (2 octets) : Nombre d'octets par échantillon
  !dw   16; (2 octets) : Nombre de bits par donnée
  !db   064h,061h,074h,061h; (4 octets) : Constante "data"                  (0x64,0x61,0x74,0x61)
  !tail44:
  !dd   15000-44; (4 octets) : Taille du fichier moins 44 octets

  !donne:  ;ici les echantillons
  !rb  500000
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message par Huitbit »

Merci tonton !
Un petit pas pour toi, un grand pour la communauté Purebasic
Tu nous offres la LIBERTE

Question
Sans assembleur c'est possible ?
Parce que j'suis pas tombé dedans quand j'étais petit :lol:

Pour mon jeu de voiture ça serait top, pas de fichier joint, un moteur qui chante en fonction de la vitesse, des freins qui couinent..... :P

Hasta la vista!

[EDIT] Avis à la populaschtroumpf
(Pour l'instant avis à la populASM :lol: )
Pourquoi ne pas enrichir ce post avec plinplin de sons "qui le font"
(explosions, mitraillettes, shabbap, blop,pop,.. whizzzzzzzZZ! [EDIT]
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Pas mal, mais au débugger, ça me donne un message d'erreur

Ca colore en rouge la ligne "ExamineKeyboard()" et ça me met
"Line 35 - OpenScreen() or OpenWindowedScreen must be called before use the keyboard commands" dans la StatusBar du debugger.

Bizarre, parce que le OpenScreen() est pourtant bien présent avant l'appel de la fonction ExamineKeyboard(). (Ma version de PB : PB 4.02)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

je n'ai pas ce message avec la 4.10 beta 4. et le son fonctionne avec le déboguer.
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message par Huitbit »

@Chris
tonton wrote :
un exemple de création de son par modulation de frequence.
(sans debugger) .
(sans debugger) : il nous avait prévenus ! (j'ai la même version de PB que toi!)
:lol: :lol:
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message par tonton »

bien sur que c' est possible!
j ai codé avec un peu d' asm par déformation professionnel, mais on peut tres bien faire la liste d' échantillon en basic, avec "dim(machin)
ou data section truc.
et pointer "CatchSound(numero du bruit,debut des datas ).
mais il ne faut oublier de metre l' entete avant la liste d' échantillon.

052h,049h,046h,046h; (4 octets) : Constante "RIFF"
taille-8 ; (4 octets) : Taille du fichier moins 8 octets
057h,041h,056h,045h ; (4 octets) : Format = "WAVE"
066h,06dh,074h,020h ; (4 octets) : Identifiant "fmt "
16 ; (4 octets) : Nombre d'octets utilisés pour définir en détail le contenu .
1 ; (2 octets) : Format de fichier (1: PCM, ...)
2 ; (2 octets) : Nombre de canaux (1 pour mono ou 2 pour stéréo)
22050 ; (4 octets) : Fréquence d'échantillonnage (en Hertz)
88200 ; (4 octets) : Nombre d'octets par seconde de musique
4 ; (2 octets) : Nombre d'octets par échantillon
16; (2 octets) : Nombre de bits par donnée
064h,061h,074h,061h; (4 octets) : Constante "data"
taille -44; (4 octets) : Taille du fichier moins 44 octets
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Bon, ben t'as plus qu'à nous faire un émulateur de DX7, maintenant. :lol:
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message par Huitbit »

un peu d'ASM
8O 8O 8O
!PUSH eax
!PUSH ebx
!PUSH edi
!MOV ax,word[v_brsong]
!LEA edi,[donne] ;on place les echantillon a l adresse "donne"
!ADD edi,[add_dat]
!ADD dword[add_dat],4
!MOV word[edi],ax
!MOV word[edi+2],ax
!POP edi
!POP ebx
!POP eax
Heureusement que tu te retiens !!!!!! :lol:
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Comme je n'y connais rien en assembleur , j'ai peut-être fait une boulette avec les adresses ? ça fonctionne, mais j'ignore si j'écris bien dans la bonne zone ?

ça c'est pour supprimer les lignes qui dérangeaient huitbit :)

Code : Tout sélectionner

InitSprite()                                   
InitKeyboard()                                 
InitSound()

;------ création bruit  ---------------------
e.f=1
  
*Ptr=?music+44 ; 44 octets pour l'entête
  
For br=0 To 15000;- bruit de 15000 double echantillons
  a.f+0.25  ;creation onde sinus 1   
  b.f+0.05  ;creation onde sinus 2
  c.f+0.77  ;creation onde sinus 3
  d.f+0.09  ;creation onde sinus 4
  e-0.00029 ;son regressif
  brh0.f=((Sin(a)+Sin(b)+Sin(c)+Sin(d))*32000/4)*e  ;mixe le tout.
  brsong.w=brh0
  
  PokeW(*Ptr,brsong) ;Haut parleur gauche
  *Ptr+2
  PokeW(*Ptr,brsong) ;Haut parleur droit
  *Ptr+2
Next br

CatchSound(0,?music);on pointe le debut du fi
SoundVolume(0, 100);volume de 0 a 100
SoundFrequency(0, 5000);frequence du son de 1000 a 100000

If OpenScreen(0, 0, 8, "8") 
  Repeat 
                             
    ExamineKeyboard() 
   
    If KeyboardReleased(#PB_Key_Space) ;joue le son si la touche espace pressée
      PlaySound(0,0)
    EndIf

  Until KeyboardPushed(#PB_Key_Escape)       
EndIf

End 

!section '.data' align 16

 !add_dat:
  !dd  0
  music: ;ici 'l entete du fichier wave juste avant les echantillons
 
  !db   052h,049h,046h,046h; (4 octets) : Constante "RIFF"         (0x52,0x49,0x46,0x46)
  !tail8:
  !dd   15000-8 ;  (4 octets) : Taille du fichier moins 8 octets
  !db   057h,041h,056h,045h  ;   (4 octets) : Format = "WAVE"      (0x57,0x41,0x56,0x45)
  !db   066h,06dh,074h,020h ;   (4 octets) : Identifiant "fmt "   (0x66,0x6D,0x74,0x20)
  !dd   16  ;   (4 octets) : Nombre d'octets utilisés pour définir en détail le contenu
  !dw   1  ;    (2 octets) : Format de fichier (1: PCM,  ...)
  !dw   2  ;  (2 octets) : Nombre de canaux (1 pour mono ou 2 pour stéréo)
  !dd   22050 ;  (4 octets) : Fréquence d'échantillonnage (en Hertz)
  !dd   88200 ; (4 octets) : Nombre d'octets par seconde de musique
  !dw   4 ; (2 octets) : Nombre d'octets par échantillon
  !dw   16; (2 octets) : Nombre de bits par donnée
  !db   064h,061h,074h,061h; (4 octets) : Constante "data"                  (0x64,0x61,0x74,0x61)
  !tail44:
  !dd   15000-44; (4 octets) : Taille du fichier moins 44 octets

  !donne:  ;ici les echantillons
  !rb  500000
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message par Huitbit »

@Comtois
Sympa! :D

Tant que tu es chaud, si tu peux faire disparaître ça
(tonton a expliqué mais Huitbit à pas tout compris :oops: )
!section '.data' align 16

!add_dat:
!dd 0
music: ;ici 'l entete du fichier wave juste avant les echantillons

!db 052h,049h,046h,046h; (4 octets) : Constante "RIFF" (0x52,0x49,0x46,0x46)
!tail8:
!dd 15000-8 ; (4 octets) : Taille du fichier moins 8 octets
!db 057h,041h,056h,045h ; (4 octets) : Format = "WAVE" (0x57,0x41,0x56,0x45)
!db 066h,06dh,074h,020h ; (4 octets) : Identifiant "fmt " (0x66,0x6D,0x74,0x20)
!dd 16 ; (4 octets) : Nombre d'octets utilisés pour définir en détail le contenu
!dw 1 ; (2 octets) : Format de fichier (1: PCM, ...)
!dw 2 ; (2 octets) : Nombre de canaux (1 pour mono ou 2 pour stéréo)
!dd 22050 ; (4 octets) : Fréquence d'échantillonnage (en Hertz)
!dd 88200 ; (4 octets) : Nombre d'octets par seconde de musique
!dw 4 ; (2 octets) : Nombre d'octets par échantillon
!dw 16; (2 octets) : Nombre de bits par donnée
!db 064h,061h,074h,061h; (4 octets) : Constante "data" (0x64,0x61,0x74,0x61)
!tail44:
!dd 15000-44; (4 octets) : Taille du fichier moins 44 octets

!donne: ;ici les echantillons
!rb 500000
Je compte faire une recherche sur le net car dans les anciens bouquins d'amstrad, de spectrum,... il y avait des exemples de sons(sur le livre de mon MSX, en quatre ou cinq lignes de basic on avait sa p'tite explosion qui n'avait rien à envier à celles d'aujourd'hui :wink: !)


Hasta la vista!

PS : vous avez remarqué, le son de l'exemple ressemble à celui qui attire les hôtesses dans les avions !
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Si j'ai du temps je ferai autrement (DataSection pour l'entête)

Code : Tout sélectionner


InitSprite()                                   
InitKeyboard()                                 
InitSound()

;------ création bruit  ---------------------
e.f=1

*Mem=AllocateMemory(44+15000*2*SizeOf(Word)) ;44 entêtes + 15000 * 2 échantillons  

*Ptrb.byte = *Mem
*Ptrb\b='R' : *Ptrb + 1
*Ptrb\b='I' : *Ptrb + 1
*Ptrb\b='F' : *Ptrb + 1
*Ptrb\b='F' : *Ptrb + 1
*Ptrl.long = *Ptrb
*Ptrl\l=15000-8 : *Ptrl + 4
*Ptrb.byte = *Ptrl
*Ptrb\b='W' : *Ptrb + 1
*Ptrb\b='A' : *Ptrb + 1
*Ptrb\b='V' : *Ptrb + 1
*Ptrb\b='E' : *Ptrb + 1
*Ptrb\b='f' : *Ptrb + 1
*Ptrb\b='m' : *Ptrb + 1
*Ptrb\b='t' : *Ptrb + 1
*Ptrb\b=' ' : *Ptrb + 1
*Ptrl.long = *Ptrb
*Ptrl\l=16  : *Ptrl + 4
*Ptrw.Word=*Ptrl
*Ptrw\w=1   : *Ptrw + 2
*Ptrw\w=2   : *Ptrw + 2
*Ptrl.long = *Ptrw
*Ptrl\l=22050  : *Ptrl + 4
*Ptrl\l=88200  : *Ptrl + 4
*Ptrw.Word=*Ptrl
*Ptrw\w=4   : *Ptrw + 2
*Ptrw\w=16  : *Ptrw + 2
*Ptrb.byte = *Ptrw
*Ptrb\b='d' : *Ptrb + 1
*Ptrb\b='a' : *Ptrb + 1
*Ptrb\b='t' : *Ptrb + 1
*Ptrb\b='a' : *Ptrb + 1
*Ptrl.long = *Ptrb
*Ptrl\l=15000-44 : *Ptrl + 4

*Ptr= *Mem+44; 44 octets pour l'entête
 
For br=1 To 15000;- bruit de 15000 double echantillons
  a.f+0.25  ;creation onde sinus 1   
  b.f+0.05  ;creation onde sinus 2
  c.f+0.77  ;creation onde sinus 3
  d.f+0.09  ;creation onde sinus 4
  e-0.00029 ;son regressif
  brh0.f=((Sin(a)+Sin(b)+Sin(c)+Sin(d))*32000/4)*e  ;mixe le tout.
  brsong.w=brh0
 
  PokeW(*Ptr,brsong) ;Haut parleur gauche
  *Ptr+2
  PokeW(*Ptr,brsong) ;Haut parleur droit
  *Ptr+2
Next br

CatchSound(0,*Mem);on pointe le debut du fi
SoundVolume(0, 100);volume de 0 a 100
SoundFrequency(0, 5000);frequence du son de 1000 a 100000

If OpenScreen(0, 0, 8, "8")
  Repeat
                             
    ExamineKeyboard()
   
    If KeyboardReleased(#PB_Key_Space) ;joue le son si la touche espace pressée
      PlaySound(0,0)
    EndIf

  Until KeyboardPushed(#PB_Key_Escape)       
EndIf

End
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Avatar de l’utilisateur
Huitbit
Messages : 940
Inscription : jeu. 08/déc./2005 5:19
Localisation : Guadeloupe

Message par Huitbit »

@Comtois
Attention au dopage! Deux codes en moins d'une heure!
Si tu codes trop vite, tu vas te faire flasher 8O

Merci !
Voilà une langue que je peux comprendre!
:P
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

Bon allez dernière version,

Code : Tout sélectionner

Structure s_Entete
    Constante.b[4]   ;Constante 'RIFF'
    Taille8.l        ;Taille fichier - 8
    Format.b[4]      ;Format
    Ident.b[4]       ;Identifiant 
    NbByte.l         ;Nombre d'octets utilisés pour définir en détail le contenu
    File.w           ;Format de fichier (1: PCM,  ...)
    Canaux.w         ;Nombre de canaux (1 pour mono ou 2 pour stéréo)
    Freq.l           ;Fréquence d'échantillonnage (en Hertz)
    ByteSec.l        ;Nombre d'octets par seconde de musique
    ByteEchant.w     ;Nombre d'octets par échantillon
    BitData.w        ;Nombre de bits par donnée
    CData.b[4]       ;Constante "data"                 
    Taille44.l       ;Taille du fichier moins 44 octets
EndStructure

InitSprite()                                   
InitKeyboard()                                 
InitSound()

;------ création bruit  ---------------------
e.f=1

Echantillons.l=15000
*Mem=AllocateMemory(44+Echantillons*2*SizeOf(Word)) ;44 entêtes + 15000 * 2 échantillons  

Define *Entete.s_Entete
*Entete=*Mem
With *Entete
  \Constante[0]='R'
  \Constante[1]='I'
  \Constante[2]='F'
  \Constante[3]='F'
  \Taille8     =Echantillons-8
  \Format[0]   ='W'
  \Format[1]   ='A'
  \Format[2]   ='V'
  \Format[3]   ='E'
  \Ident[0]    ='f'
  \Ident[1]    ='m'
  \Ident[2]    ='t'
  \Ident[3]    =' '    
  \NbByte      =16   
  \File        =1
  \Canaux      =2
  \Freq        =22050  
  \ByteSec     =88200
  \ByteEchant  =4
  \BitData     =16
  \CData[0]    ='d'
  \CData[1]    ='a'    
  \CData[2]    ='t' 
  \CData[3]    ='a'              
  \Taille44    =Echantillons-44   
EndWith  

*Ptr.word = *Mem+44; 44 octets pour l'entête
 
For br=1 To Echantillons;- bruit de 15000 double echantillons
  a.f+0.25  ;creation onde sinus 1   
  b.f+0.05  ;creation onde sinus 2
  c.f+0.77  ;creation onde sinus 3
  d.f+0.09  ;creation onde sinus 4
  e-0.00029 ;son regressif
  brh0.f=((Sin(a)+Sin(b)+Sin(c)+Sin(d))*32000/4)*e  ;mixe le tout.
  brsong.w=brh0
 
  *Ptr\w=brsong ;Haut parleur gauche
  *Ptr+2
  *Ptr\w=brsong ;Haut parleur droit
  *Ptr+2
Next br

CatchSound(0,*Mem);on pointe le debut du fi
SoundVolume(0, 100);volume de 0 a 100
SoundFrequency(0, 5000);frequence du son de 1000 a 100000

If OpenScreen(0, 0, 8, "8")
  Repeat
                             
    ExamineKeyboard()
   
    If KeyboardReleased(#PB_Key_Space) ;joue le son si la touche espace pressée
      PlaySound(0,0)
    EndIf

  Until KeyboardPushed(#PB_Key_Escape)       
EndIf
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

comtois a écrit :Bon allez dernière version,

Code : Tout sélectionner

Structure s_Entete
    Constante.b[4]   ;Constante 'RIFF'
    Taille8.l        ;Taille fichier - 8
    Format.b[4]      ;Format
    Ident.b[4]       ;Identifiant 
    NbByte.l         ;Nombre d'octets utilisés pour définir en détail le contenu
    File.w           ;Format de fichier (1: PCM,  ...)
    Canaux.w         ;Nombre de canaux (1 pour mono ou 2 pour stéréo)
    Freq.l           ;Fréquence d'échantillonnage (en Hertz)
    ByteSec.l        ;Nombre d'octets par seconde de musique
    ByteEchant.w     ;Nombre d'octets par échantillon
    BitData.w        ;Nombre de bits par donnée
    CData.b[4]       ;Constante "data"                 
    Taille44.l       ;Taille du fichier moins 44 octets
EndStructure
ca ressemble beaucoup à la structure WAVEFORMATEX
en fait cet exemple c'est du son au format PCM et le "fichier" est au format wav

Dri
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Pourquoi vous n'essayez pas de vous mettre à l'assembleur? On contrôle tout et c'est plutôt rigolo! On a vraiment l'outil idéal avec Purebasic. Je ne dis pas que c'est indispensable, mais parfois ça rend service. Et puis c'est bon pour sa culture de programmeur 8)
Moi faudrait que je me mette aux API mais dès que y'a du windows ça me saoule... Déjà que je me bats avec access au bureau :(
Répondre