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
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.....
Hasta la vista!
[EDIT] Avis à la populaschtroumpf
(Pour l'instant avis à la populASM
)
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!)

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.

Publié : mer. 07/nov./2007 21:30
par Huitbit
un peu d'ASM
!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 !!!!!!

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!
Tant que tu es chaud, si tu peux faire disparaître ça
(tonton a expliqué mais Huitbit à pas tout compris

)
!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

!)
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
Merci !
Voilà une langue que je peux comprendre!

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

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
