Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[module wave] wave.writeframes(data)

5 réponses
Avatar
Doug713705
Bonjour à toutes, tous,

Je suis en train d'essayer d'écrire un petit script en python permettant
la création d'un fichier wav à partir d'un fichier binaire (en fait un
k7towav pour faire revivre un antique Thomson TO7/70).

J'arrive bien à produire un fichier wav avec le module wave mais grâce
à l'analyse du fichier avec audacity, je suis presque certain que ce
fichier n'a pas le contenu que je souhaite.

Théoriquement ce fichier devrait contenir plus ou moins une belle courbe
sinusoïdale à fréquence variable et autant l'algorythme de mon code me
semble valable (merci samuel Devulder), autant je tatonne pour
comprendre quelle forme doit avoir "data" dans wave.writeframes(data).

Jusque là il m'a été impossible de trouver un tutoriel qui explique ça
en détail et je m'inspire sans succès de bouts de code trouvés ça et là.

Quelqu'un ici aurait-il déjà manipulé le module wave pour produire
avec succès des fichiers .wav ou un lien vers une explication un peu
plus détaillé que la doc python qui me semble succinte
( http://docs.python.org/library/wave.html ) ?

Merci d'avance pour vos réponses.
--
@+
Doug - Linux user #307925 - Slackware64 roulaize ;-)
[ Plus ou moins avec une chance de peut-être ]

5 réponses

Avatar
NicolasP
Bonjour,

Doug713705 a écrit :
Bonjour à toutes, tous,

Je suis en train d'essayer d'écrire un petit script en python permettant
la création d'un fichier wav à partir d'un fichier binaire (en fait un
k7towav pour faire revivre un antique Thomson TO7/70).

J'arrive bien à produire un fichier wav avec le module wave mais grâce
à l'analyse du fichier avec audacity, je suis presque certain que ce
fichier n'a pas le contenu que je souhaite.

Théoriquement ce fichier devrait contenir plus ou moins une belle courbe
sinusoïdale à fréquence variable et autant l'algorythme de mon code me
semble valable (merci samuel Devulder), autant je tatonne pour
comprendre quelle forme doit avoir "data" dans wave.writeframes(data).

Jusque là il m'a été impossible de trouver un tutoriel qui explique ça
en détail et je m'inspire sans succès de bouts de code trouvés ça et là.

Quelqu'un ici aurait-il déjà manipulé le module wave pour produire
avec succès des fichiers .wav ou un lien vers une explication un peu
plus détaillé que la doc python qui me semble succinte
( http://docs.python.org/library/wave.html ) ?



Je ne connais pas le module wav. Par contre je connais bien le format wav.
En ce qui concerne les données, leur "forme" est dépendante du format d'enregistrement du fichier.
Le format wav n'est qu'un conteneur. Ce conteneur contient des chunks. Chaque chunk contient des données spécifiques. Par exemple, le chunk "data" contient les données audio, le chunk "fmt " contient les caractéristiques du flux audio : fréquence d'échantillonnage, taille des échantillons audio, nombre de canaux...
Un peu plus d'infos ici : http://fr.wikipedia.org/wiki/Wav
On peut donc penser que le format des données passées en paramètre à wave.writeframes() est dépendant de la configuration utilisée pour ton fichier wav.
Pour faire des expérimentations, je recommande le mode un canal, PCM en 16 bits signé. Le PCM, c'est comme du raw : 1 valeur = 1 échantillon.
Pour générer des mots de 16 bits en signé, voir la fonction pack() du module struct.

Nicolas


Merci d'avance pour vos réponses.


Avatar
Doug713705
Dans fr.comp.lang.python NicolasP nous expliquait:

Quelqu'un ici aurait-il déjà manipulé le module wave pour produire
avec succès des fichiers .wav ou un lien vers une explication un peu
plus détaillé que la doc python qui me semble succinte
( http://docs.python.org/library/wave.html ) ?



Pour faire des expérimentations, je recommande le mode un canal, PCM en 16 bits signé. Le PCM, c'est comme du raw : 1 valeur = 1 échantillon.
Pour générer des mots de 16 bits en signé, voir la fonction pack() du module struct.



Merci, je n'avais pas compris que la fonction pack ne fonctionnait que
pour du 16 bits signé (ou alors je n'ai rien compris mais cela ne
m'étonnerai pas plus que ça !)

Toutefois pour du 8 bits non signé cela ne semble pas fonctionner comme
je l'aurais voulu et le signal est mochement altére (euphémisme).

En reprennant tout le code et en m'inspirant du peu d'exemples que j'ai
pu trouver, j'ai fini par me résigner au 16 bits signé et réussir !

Merci encore.
--
@+
Doug - Linux user #307925 - Slackware64 roulaize ;-)
[ Plus ou moins avec une chance de peut-être ]
Avatar
NicolasP
Doug713705 a écrit :
Dans fr.comp.lang.python NicolasP nous expliquait:

Quelqu'un ici aurait-il déjà manipulé le module wave pour produire
avec succès des fichiers .wav ou un lien vers une explication un peu
plus détaillé que la doc python qui me semble succinte
( http://docs.python.org/library/wave.html ) ?



Pour faire des expérimentations, je recommande le mode un canal, PCM en 16 bits signé. Le PCM, c'est comme du raw : 1 valeur = 1 échantillon.
Pour générer des mots de 16 bits en signé, voir la fonction pack() du module struct.



Merci, je n'avais pas compris que la fonction pack ne fonctionnait que
pour du 16 bits signé (ou alors je n'ai rien compris mais cela ne
m'étonnerai pas plus que ça !)



On peut dire que t'as rien compris ;)
La fonction pack() ne fonctionne pas que pour du 16 bits signé.

La fonction pack() est configurable à l'aide d'une chaine qui lui est passée en paramètre.
Pour générer des 16 bits signés : val16s = struct.pack('<h', -10)
Pour générer des 16 bits non signés : val16u = struct.pack('<H', 10)
Pour générer des 8 bits signés : val8s = struct.pack('<b', -10) # le '<' n'est pas obligatoire
Pour générer des 8 bits non signés : val8u = struct.pack('<B', 10) # le '<' n'est pas obligatoire

Le '<' indique à la fonction pack() qu'elle doit générer des valeurs en mode little-endian (les fichiers wav sont au format little-endian).

Pour la doc complète :
import struct
help(struct)


Toutefois pour du 8 bits non signé cela ne semble pas fonctionner comme
je l'aurais voulu et le signal est mochement altére (euphémisme).



Essaie encore... ;)


En reprennant tout le code et en m'inspirant du peu d'exemples que j'ai
pu trouver, j'ai fini par me résigner au 16 bits signé et réussir !



C'est un bon départ.


Merci encore.



Pas de quoi

Nicolas
Avatar
Doug713705
Dans fr.comp.lang.python NicolasP nous expliquait:

Doug713705 a écrit :
Dans fr.comp.lang.python NicolasP nous expliquait:

Quelqu'un ici aurait-il déjà manipulé le module wave pour produire
avec succès des fichiers .wav ou un lien vers une explication un peu
plus détaillé que la doc python qui me semble succinte
( http://docs.python.org/library/wave.html ) ?



Pour faire des expérimentations, je recommande le mode un canal, PCM en 16 bits signé. Le PCM, c'est comme du raw : 1 valeur = 1 échantillon.
Pour générer des mots de 16 bits en signé, voir la fonction pack() du module struct.



Merci, je n'avais pas compris que la fonction pack ne fonctionnait que
pour du 16 bits signé (ou alors je n'ai rien compris mais cela ne
m'étonnerai pas plus que ça !)



On peut dire que t'as rien compris ;)
La fonction pack() ne fonctionne pas que pour du 16 bits signé.



Et bien figure toi que cela ne m'étonne pas plus que ça ;-)

La fonction pack() est configurable à l'aide d'une chaine qui lui est passée en paramètre.
Pour générer des 16 bits signés : val16s = struct.pack('<h', -10)
Pour générer des 16 bits non signés : val16u = struct.pack('<H', 10)
Pour générer des 8 bits signés : val8s = struct.pack('<b', -10) # le '<' n'est pas obligatoire
Pour générer des 8 bits non signés : val8u = struct.pack('<B', 10) # le '<' n'est pas obligatoire



Ah, ok ! Comme ça c'est clair.

Le '<' indique à la fonction pack() qu'elle doit générer des valeurs en mode little-endian (les fichiers wav sont au format little-endian).



Parfait !

Toutefois pour du 8 bits non signé cela ne semble pas fonctionner comme
je l'aurais voulu et le signal est mochement altére (euphémisme).



Essaie encore... ;)



C'est bien ce que je m'apprète à faire parce que justement c'est du 8
bits mono qu'il me faut.

Merci.
--
@+
Doug - Linux user #307925 - Slackware64 roulaize ;-)
[ Plus ou moins avec une chance de peut-être ]
Avatar
cyril-hic
Doug713705 a écrit le 11/01/2010 à 00h02 :
Bonjour à toutes, tous,

Je suis en train d'essayer d'écrire un petit script en python
permettant
la création d'un fichier wav à partir d'un fichier binaire (en
fait un
k7towav pour faire revivre un antique Thomson TO7/70).

J'arrive bien à produire un fichier wav avec le module wave mais
grâce
à l'analyse du fichier avec audacity, je suis presque certain que ce
fichier n'a pas le contenu que je souhaite.

Théoriquement ce fichier devrait contenir plus ou moins une belle
courbe
sinusoïdale à fréquence variable et autant l'algorythme de
mon code me
semble valable (merci samuel Devulder), autant je tatonne pour
comprendre quelle forme doit avoir "data" dans
wave.writeframes(data).

Jusque là il m'a été impossible de trouver un tutoriel qui
explique ça
en détail et je m'inspire sans succès de bouts de code
trouvés ça et là.

Quelqu'un ici aurait-il déjà manipulé le module wave pour
produire
avec succès des fichiers .wav ou un lien vers une explication un peu
plus détaillé que la doc python qui me semble succinte
( http://docs.python.org/library/wave.html ) ?

Merci d'avance pour vos réponses.
--
@+
Doug - Linux user #307925 - Slackware64 roulaize ;-)
[ Plus ou moins avec une chance de peut-être ]


Bonsoir,

Une commande k72wav permet la conversion des fichiers .k7 en .wav.
Ecrite en C POSIX, elle est déjà compilée pour Linux, mais aussi pour Windoz (cygwin).

pour rappel :

http://k72wav.sourceforge.net

Cordialement

Cyril