Page 1 sur 1

créer un son avec CatchSound

Publié : mer. 26/mai/2010 16:47
par SPH
Je voulais créer moi meme un son en banque et le jouer mais il y a un probleme et je ne le vois pas :!: :idea: :

Code : Tout sélectionner

If InitSound() = 0
  MessageRequester("Error", "Sound system is not available",  0)
  End
EndIf

*MemoireID = AllocateMemory(50000)

If *MemoireID
  For i=0 To 49999
    PokeB(*MemoireID+i,Random(255)) ; creation du son
  Next
  CatchSound(0,*MemoireID,50000) ; on catch le son comme ca ?
  PlaySound(0)
  Delay(1000)
  FreeMemory(*MemoireID)
EndIf


Re: créer un son avec CatchSound

Publié : mer. 26/mai/2010 18:20
par flaith

Re: créer un son avec CatchSound

Publié : mer. 26/mai/2010 18:52
par SPH
Ton code est trop long et je vois le pointeur d'un pointeur et ca, je capte pas.
De plus, je souhaite synthétiser des cordes de guitare (Dobro va aimer) donc, il me faut a la base mon code car il est extremement petit MAIS MAIS MAIS.... YA UN BUUUUUUUG :cry: :oops:

Re: créer un son avec CatchSound

Publié : mer. 26/mai/2010 22:12
par PAPIPP
Bonjour à tous
@ SPH
On ne peut réaliser un fichier ou une zone son en tirant les caractères au hasard.
Structure d'un fichier son suivant WIKIPEDIA
Généralités [modifier]

Le format WAV est une extension de fichiers audio, il s'agit d'un conteneur capable de recevoir des formats aussi variés que le MP3, le WMA, l'ATRAC3, l'ADPCM, le PCM. C'est ce dernier qui est cependant le plus courant, et c'est pour cela que l'extension .wav est souvent — et donc à tort — considérée comme correspondant à des fichiers « sans pertes » (communément désignés par le mot anglais lossless). Le format WAV est standardisé sous Windows ; son pendant sous la plate-forme Macintosh est l'AIFF/AIFC.

* Le conteneur WAV est désormais ancien, et peu pratique.
* Son système d'étiquettes est des plus rudimentaires, ce qui ne permet pas de décemment s'en servir pour l'organisation d'une large bibliothèque de fichiers. Des logiciels tels que foobar2000 et Winamp permettent bien d'ajouter des étiquettes au format APEv2[1], mais cette solution n'est pas standardisée et pourrait poser des difficultés à d'autres logiciels.
* En outre, et à l'instar de l'AIFF, ce format ne permet pas de créer des fichiers de grande taille (maximum 2 Gio), ce qui le rend inapte au travail moderne sur des fichiers haute-définition. En effet, la limite de 2 Gio est atteinte avec à peine 20 minutes d'informations au format 5.1 en 24 bit/96 kHz. C'est une des raisons ayant incité Apple à développer un nouveau conteneur nommé Core Audio Format (CAF).
* Enfin, le format WAV ne contient aucune information sur le niveau absolu du son qu'il contient, ce qui le rend inutilisable pour des applications du domaine de la mesure.
* Néanmoins, le format WAV reste incontournable sous plate-forme Windows. Enfin, le format est supporté par plusieurs baladeurs (lorsqu'un flux PCM ou parfois ADPCM est présent), bien que la taille de ces fichiers soit par conséquent très volumineuse.
* Chez les professionnels, le BWF lui succède.

Structure des fichiers WAV [modifier]

Les fichiers au format WAV (portant l'extension .wav) ont le format suivant (dans la majorité des cas). Ils se composent d'un en-tête de fichier, suivi des données.
En-tête de fichier WAV [modifier]

L'en-tête d'un fichier WAV commence dès le premier octet (offset 0). Il a une taille de 44 octets, et est constitué des champs suivants (listés dans l'ordre) :

[Bloc de déclaration d'un fichier au format WAVE]
FileTypeBlocID (4 octets) : Constante «RIFF» (0x52,0x49,0x46,0x46)
FileSize (4 octets) : Taille du fichier moins 8 octets
FileFormatID (4 octets) : Format = «WAVE» (0x57,0x41,0x56,0x45)

[Bloc décrivant le format audio]
FormatBlocID (4 octets) : Identifiant «fmt » (0x66,0x6D, 0x74,0x20)
BlocSize (4 octets) : Nombre d'octets du bloc - 8 (0x10)

AudioFormat (2 octets) : Format du stockage dans le fichier (1: PCM, ...)
NbrCanaux (2 octets) : Nombre de canaux (de 1 à 6, cf. ci-dessous)
Frequence (4 octets) : Fréquence d'échantillonnage (en Hertz) [Valeurs standardisées : 11025, 22050, 44100 et éventuellement 48000 et 96000]
BytePerSec (4 octets) : Nombre d'octets à lire par seconde (i.e., Frequence * BytePerBloc).
BytePerBloc (2 octets) : Nombre d'octets par bloc d'échantillonnage (i.e., tous canaux confondus : NbrCanaux * BitsPerSample/8).
BitsPerSample (2 octets) : Nombre de bits utilisées pour le codage de chaque échantillon (8, 16, 24)

[Bloc des données]
DataBlocID (4 octets) : Constante «data» (0x64,0x61,0x74,0x61)
DataSize (4 octets) : Nombre d'octets des données (i.e. "Data[]", i.e. taille_du_fichier - taille_de_l'entête (qui fait 44 octets normalement).
DATAS[] : [Octets du Sample 1 du Canal 1] [Octets du Sample 1 du Canal 2] [Octets du Sample 2 du Canal 1] [Octets du Sample 2 du Canal 2]

* Les Canaux :
1 pour mono,
2 pour stéréo
3 pour gauche, droit et centre
4 pour face gauche, face droit, arrière gauche, arrière droit
5 pour gauche, centre, droit, surround (ambiant)
6 pour centre gauche, gauche, centre, centre droit, droit, surround (ambiant)

NOTES IMPORTANTES : Les octets des mots sont stockés sous la forme (i.e., en "little endian")
[87654321][16..9][24..17] [8..1][16..9][24..17] [...
en reprenant l'exemple sur PB

Code : Tout sélectionner

If InitSound()=0
  MessageRequester("Erreur","Le sytème son n'est pas valable",0)
  End
EndIf
SoundFileName$ = OpenFileRequester("Choisir un fichier *.wav", "", "Fichier wav|*.wav",0)
Debug SoundFileName$ 
If SoundFileName$
  If LoadSound(0, SoundFileName$)
    PlaySound(0, #PB_Sound_Loop)
    MessageRequester("Sound", "Joue le son en boucle..."+#LF$+"Cliquer pour quitter..", 0)
  Else
    MessageRequester("Error", "Ne peut charger le fichier son", 0)
  EndIf
EndIf
End   
A+

Re: créer un son avec CatchSound

Publié : jeu. 27/mai/2010 10:33
par SPH
Ok ca marche. J'hésite a lancer un grand concours sur les meilleurs sons générés par des formules mais si vous avez des créations interessantes, je suis partant pour les écouter :

Code : Tout sélectionner

If InitSound() = 0
  MessageRequester("Error", "Sound system is not available",  0)
  End
EndIf

*MemoireID = AllocateMemory(43660)

If *MemoireID
  For i=0 To 43
    b.b
    Read.b b
    PokeB(*MemoireID+i,b) ; creation du son
  Next
  ;;;;;;;;;;;;;;;
  For i=44 To 43659 ; la création du son d'environ 1 seconde se passe ici :
    
    b=Sin(i/10)*127
    PokeB(*MemoireID+i,b) ; creation du son
    
  Next ; fin de la création du son
  ;;;;;;;;;;;;;;;
  CatchSound(0,*MemoireID,43660) ; on catch le son comme ca ?
  PlaySound(0)
  Delay(1000)
  FreeMemory(*MemoireID)
EndIf


DataSection
  ; le mot "RIFF"
  Data.b 82,73,70,70
  ; taille du fichier -8
  Data.b 132,170,0,0
  ;Data.b 16,0,0,0
  ; le mot "WAVEfmt" 
  Data.b 87,65,86,69,102,109,116,32
  ; nombre d'octets du bloc -8
  Data.b 16,0,0,0
  ; format de stockage
  Data.b 1,0
  ; nombre de canaux
  Data.b 1,0
  ; frequence
  Data.b 68,172,0,0
  ; 
  Data.b 136,88,1,0
  Data.b 2,0,16,0
  ; le mot "data"
  Data.b 100,97,116,97
  ; data size - 44
  Data.b 96,170,0,0
EndDataSection

Re: créer un son avec CatchSound

Publié : jeu. 27/mai/2010 15:30
par Huitbit
Hello,

Tonton avait lancé un truc en assembleur, ça a fini comme ça !

http://www.purebasic.fr/french/viewtopic.php?t=9027
http://www.purebasic.fr/french/viewtopi ... hilit=adsr

Originale ton idée de mettre l'entête en data :P !

Mais si c'est pour de la musique, il y a mieux et sans API !
http://www.purebasic.fr/french/viewtopi ... moulinette
Je compte bientôt poster un sujet plus complet dessus !

Hasta la vista !

Re: créer un son avec CatchSound

Publié : jeu. 27/mai/2010 15:40
par SPH
Huitbit a écrit :Originale ton idée de mettre l'entête en data :P !
C'est un minimum. Mais j'ai triché car j'ai échoué a la déclaration de la grosseur du wav. Alors j'ai fais l'inverse : créer un wav d'a peu pres la taille de 50k sous AUDACITY (freeware que j'aime bien) et j'ai repompé en data l'entete...

PS : moi aussi, élevé au MSX (VG8010 puis MSX2 NMS8220 pour jouer a vampire killer)
Image Image

Re: créer un son avec CatchSound

Publié : ven. 28/mai/2010 20:49
par lepiaf31
J'ai testé le code de huitbit et il est juste énorme ! oO

Re: créer un son avec CatchSound

Publié : ven. 28/mai/2010 21:03
par Cool Dji
P'tain un Msx avec Vampire Killer et Meteal Gear...ouargh clac aie un coup de fouet...je suis moooooooooooooooooort

Re: créer un son avec CatchSound

Publié : sam. 29/mai/2010 9:22
par SPH
Cool Dji a écrit :P'tain un Msx avec Vampire Killer et Meteal Gear...ouargh clac aie un coup de fouet...je suis moooooooooooooooooort
Pour vampire killer, j'ai plusieurs fois été dégouté car a un certain niveau, on pouvait se retrouver bloqué dans le décors quand on sautait. Franchement, la raaaage :twisted:

@lepiaf : oui, j'ai testé aussi