Page 1 sur 3

creation de bruit en format wave.

Publié : mer. 07/nov./2007 19:40
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

Publié : mer. 07/nov./2007 20:51
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]

Publié : mer. 07/nov./2007 21:09
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)

Publié : mer. 07/nov./2007 21:12
par comtois
je n'ai pas ce message avec la 4.10 beta 4. et le son fonctionne avec le déboguer.

Publié : mer. 07/nov./2007 21:15
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:

Publié : mer. 07/nov./2007 21:20
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

Publié : mer. 07/nov./2007 21:26
par Chris
Bon, ben t'as plus qu'à nous faire un émulateur de DX7, maintenant. :lol:

Publié : mer. 07/nov./2007 21:30
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:

Publié : mer. 07/nov./2007 21:51
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

Publié : mer. 07/nov./2007 22:14
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 !

Publié : mer. 07/nov./2007 22:34
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

Publié : mer. 07/nov./2007 22:56
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

Publié : mer. 07/nov./2007 23:06
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

Publié : jeu. 08/nov./2007 0:50
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

Publié : jeu. 08/nov./2007 9:30
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 :(