_____Pour ceux qui veulent créer des .Wav____

Programmation d'applications complexes
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

_____Pour ceux qui veulent créer des .Wav____

Message par Mytic »

Bon… j’ai essayé d’adapté des codes en C et des cours d’ondes pour PureBasic et ça à donner ça :
Vous pourrez maintenant créer des fichiers wav opérationnels et connaître le secret de leurs entête !
Voici le code :
:)

Code : Tout sélectionner

;============================================================;

Global Freq_E.l = 44100
Global Bit_16.w = 16
Global fmt.l = 16
Global Mono.w = 1
Global PCM_Format.w = 1
Global blockAlign.w = 2
Global Pi.d = 6.28


Dim buffer.w(99)
Global compteur.L ;Variable de comptage pour l'état du buffer
Global t.L;Temps total

Global longueur.L ;longueur du son en échantillons

Global FreqBip1.D ;en Hz
Global FreqBip2.D ;en Hz
Global FreqBip3.D ;modulation de phase en Hz
Global Qte.D ;amplitude de la modulation de phase

Global Volume.W ;entre 0 et 32767

Global tmpFreq.D ;variables temporaires
Global TmpDbl.D

Global tmpLong.L


;Valeurs a ajuster par l'utilisateur
FreqBip1 = 1200
FreqBip2 = 200
FreqBip3 = 10
Qte = 3
longueur = 88200
Volume = 5000

FreqBip1 = FreqBip1 / Freq_E ;calcul des frequence à l'échelle de l'échantillon
FreqBip2 = FreqBip2 / Freq_E
FreqBip3 = FreqBip3 / Freq_E

TmpDbl = (FreqBip2 - FreqBip1) / (2 * longueur);'calcul du pas pour la fréquence

ReDim buffer.w(511)

OpenFile(1,"c:\test.wav")
;En tête
WriteString(1,"RIFF")
tmpLong = longueur * 2 + 36
WriteLong(1,tmpLong)
WriteString(1,"WAVEfmt ")
WriteLong(1,fmt)
WriteWord(1, PCM_Format)
WriteWord(1, Mono)
WriteLong(1,Freq_E)
tmpLong = Freq_E * (Bit_16 / 8) * Mono
WriteLong(1, tmpLong)
WriteWord(1,blockAlign )
WriteWord(1,Bit_16 )
WriteString(1,"data")
tmpLong = longueur * 2
WriteLong(1, tmpLong)
;Fin en tête

Repeat
compteur = 0
Repeat
tmpFreq = Pi * (FreqBip1 + t * TmpDbl) ;calcul de la frequence du son a produire
buffer(compteur) = Int(Volume * Sin(t * tmpFreq + (Qte * Sin(Pi * t * FreqBip3))))
t = t + 1
compteur = compteur + 1
Until t = longueur Or compteur = 512

If t = longueur
ReDim buffer.w(compteur - 1) 
EndIf

For i = 0 To compteur-1
WriteWord(1, buffer(i))
Next i
Until t = longueur

CloseFile(1)


InitSound()
LoadSound(1,"c:\test.wav")
PlaySound(1)

Delay(3000)
End

:idea:
Mwoua
Messages : 44
Inscription : lun. 24/oct./2005 10:28

Message par Mwoua »

Excellent ! :lol:

Juste quand j'en avais besoin, en plus ! 8)

Merci Mytic ! :wink: :D
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

oui ! tres cool !! :)
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

En plus vous pouvez exécuter le wav sans l’enregistré directement en mémoire avec la commande >CatchSound<.
:idea:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

c'est du bon boulot tout ça :D
Répondre