IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

PyAudio et les notes.wav


Sujet :

Python

  1. #1
    Invité
    Invité(e)
    Par défaut PyAudio et les notes.wav
    Bonjour
    J'ai réussi à entendre une note avec pyaudio, sauf qu'après çà boucle indéfiniment
    Si on entend une note, c'est que le procédé d'écriture et de lecture a fonctionné une fois
    Je crois qu'il manque une temporisation à la boucle de lecture pour pyaudio

    Le tutoriel python : M'apprend comment utiliser PyAudio
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    import pyaudio
    import wave
     
    ex = "1 AT&T Tone.wav"
     
    def jouer(zik):
        CHUNK = 1024
        wf = wave.open(zik, 'rb')
        p = pyaudio.PyAudio()
        stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                    channels=wf.getnchannels(),
                    rate=wf.getframerate(),
                    output=True)
        data = wf.readframes(CHUNK)
        while data != '':
            stream.write(data)
            data = wf.readframes(CHUNK)
        stream.stop_stream()
        stream.close()
        p.terminate()
    L'écriture : L'indispensable pour la lecture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # Partie échantillonnage pour l'écriture de la note.wav
            nbOctet = nbCanal = 1
            fech = 64000
            niveau = float(1 / 2)
            duree = float(1 / 6)
            nbEch = int(duree * fech)
            for fy in range(7):
                toplo = self.fichnom[fy]
                manote = wave.open(toplo, 'wb')
                param = (nbCanal, nbOctet, fech, nbEch, 'NONE', 'not compressed')
                manote.setparams(param)
                freq = diato[fy]
                self.framno[fy] = freq
                amp = 127.5 * niveau
                for i in range(0, nbEch):
                    val = wave.struct.pack('B', int(128.0 + amp * math.sin(2.0 * math.pi * freq * i / fech)))
                    manote.writeframes(val)
                manote.close()
    La lecture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    # Partie lecture avec pyaudio qui après une première note.wav entendue ne réagit plus
            for fy in range(7):
                CHUNK = 1024
                toplo = self.fichnom[fy]
                wf = wave.open(toplo, 'rb')
                p = pyaudio.PyAudio()
                stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                                channels=wf.getnchannels(),
                                rate=wf.getframerate(),
                                output=True)
                data = wf.readframes(CHUNK)
                while data != '':
                    stream.write(data)
                    data = wf.readframes(CHUNK)
                stream.stop_stream()
                stream.close()
                p.terminate()
                wf.close()
            """if self.presaudio == 0:
                self.presaudio = 1
                for fu in self.fichnom:
                    winsound.PlaySound(fu, winsound.SND_FILENAME)
                    # Windsound : Ne peut être utilisé qu'avec windows"""
    Je devrais modifier à cause de """if self.presaudio == 0: Conditionnant la lecture

  2. #2
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    On ne peut pas tester ton code, il manque des choses.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par marco056 Voir le message
    On ne peut pas tester ton code, il manque des choses.
    Voilà j'envoie le code pour tester, comme çà tu pourras donner ton avis
    http://cabviva.com/programs/progamv4encore.txt

    Lignes 1830 environ, def audio(self):

    En fait ce n'est pas de la pub
    Dernière modification par Invité ; 27/02/2016 à 18h26. Motif: Situation dans le programme

  4. #4
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Je ne comprends pas, le code est toujours l'ancien, pour Windows. Or, je ne suis pas sous Windows, 99,9 % de mon temps...
    Je ne peux donc rien tester.
    Si c'est pour réaliser le code, désolé, mais j'ai du boulot.
    Cela m'intéresse, mais j'ai des choses plus urgentes...

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour désolé pour la gêne mais çà fait partie du jeu
    Pendant que d'autres travaillent

    Mais en cherchant un peu, j'ai réussi à faire tourner la boucle
    En changeant , par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    for fy in range(7):
                toplo = self.fichnom[fy]
                manote = wave.open(toplo, 'wb')
                param = (nbCanal, nbOctet, fech, nbEch, 'NONE', 'not compressed')
                manote.setparams(param)
                freq = diato[fy]
                self.framno[fy] = freq
                amp = 127.5 * niveau
                for i in range(0, nbEch):
                    val = wave.struct.pack('B', int(128.0 + amp * math.sin(2.0 * math.pi * freq * i / fech)))
                    manote.writeframes(val)
                manote.close()
                if self.presaudio == 0:
                    if fy > 6:
                        self.presaudio = 1
                        break
                    p = pyaudio.PyAudio()
                    CHUNK = 1024
                    #toplo = self.fichnom[fy]
                    wf = wave.open(toplo, 'rb')
                    stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                                    channels=wf.getnchannels(),
                                    rate=wf.getframerate(),
                                    output=True)
                    data = wf.readframes(CHUNK)
                    while len(data) > 0:
                        stream.write(data)
                        data = wf.readframes(CHUNK)
                    stream.stop_stream()
                    stream.close()
                    p.terminate()

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par toumic Voir le message
    Bonjour désolé pour la gêne mais çà fait partie du jeu
    Pendant que d'autres travaillent

    Mais en cherchant un peu, j'ai réussi à faire tourner la boucle
    En changeant , par
    C'est dommage, je n'avais pas vu les lignes rouges. Décidemment je suis TROP rapide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    C:\Users\Vincent\AppData\Local\Programs\Python\Python35-32\python.exe C:/pyprogam/progamv5encore2.py
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Users\Vincent\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 1549, in __call__
        return self.func(*args)
      File "C:/pyprogam/progamv5encore2.py", line 1823, in audio
        manote = wave.open(toplo, 'wb')
      File "C:\Users\Vincent\AppData\Local\Programs\Python\Python35-32\lib\wave.py", line 501, in open
        return Wave_write(f)
      File "C:\Users\Vincent\AppData\Local\Programs\Python\Python35-32\lib\wave.py", line 294, in __init__
        f = builtins.open(f, 'wb')
    PermissionError: [Errno 13] Permission denied: 'a7.wav'
    Exception ignored in: <bound method Wave_write.__del__ of <wave.Wave_write object at 0x0176CAB0>>
    Traceback (most recent call last):
      File "C:\Users\Vincent\AppData\Local\Programs\Python\Python35-32\lib\wave.py", line 316, in __del__
        self.close()
      File "C:\Users\Vincent\AppData\Local\Programs\Python\Python35-32\lib\wave.py", line 433, in close
        if self._file:
    AttributeError: 'Wave_write' object has no attribute '_file'
     
    Process finished with exit code 0

  7. #7
    Invité
    Invité(e)
    Par défaut
    Après avoir séparé l'écriture et la lecture de la note, les lignes rouges ont disparues
    Voici le code qui tourne dans ces conditions

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    # Partie échantillonnage
            nbOctet = nbCanal = 1
            fech = 64000
            niveau = float(1 / 2)
            duree = float(1 / 6)
            nbEch = int(duree * fech)
            for fy in range(7):
                toplo = self.fichnom[fy]
                manote = wave.open(toplo, 'wb')
                param = (nbCanal, nbOctet, fech, nbEch, 'NONE', 'not compressed')
                manote.setparams(param)
                freq = diato[fy]
                self.framno[fy] = freq
                amp = 127.5 * niveau
                for i in range(0, nbEch):
                    val = wave.struct.pack('B', int(128.0 + amp * math.sin(2.0 * math.pi * freq * i / fech)))
                    manote.writeframes(val)
                manote.close()
            if self.presaudio == 0:
                for fy in range(7):
                    p = pyaudio.PyAudio()
                    CHUNK=2048
                    wf = wave.open(self.fichnom[fy], 'rb')
                    stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                                    channels=wf.getnchannels(),
                                    rate=wf.getframerate(),
                                    output=True)
                    data = wf.readframes(CHUNK)
                    while len(data) > 0:
                        stream.write(data)
                        data = wf.readframes(CHUNK)
                    stream.stop_stream()
                    stream.close()
                    p.terminate()

  8. #8
    Invité
    Invité(e)
    Par défaut
    Je rectifie car la séparation (écriture/lecture) n'est pas en cause, puisque çà fonctionne même sans.
    Et augmenté la valeur CHUNK = buffet chaud 2048°, et en le réduisant à 1024 ERREUR!
    On peut placer le code dans une boucle de lecture d'une table menant à un fichier wave
    J'ai fait la même chose sur toutes les parties qui utilisaient "winsound", pour favoriser les accès corrects à ce programme

    Voici la lignée de l'écriture et lecture sans aucune séparation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    nbOctet = nbCanal = 1
    fech = 64000
    niveau = float(1 / 2)
    duree = float(1 / 8)
    nbEch = int(duree * fech)
    manote = wave.open(self.fichnom[n], 'wb')
    param = (nbCanal, nbOctet, fech, nbEch, 'NONE', 'not compressed')
    manote.setparams(param)
    amp = 127.5 * niveau
    for i in range(0, nbEch):
        val = wave.struct.pack('B', int(128.0 + amp * math.sin(2.0 * math.pi * freqhtz * i / fech)))
        manote.writeframes(val)
    manote.close()
    p = pyaudio.PyAudio()
    CHUNK=2048
    wf = wave.open(self.fichnom[n], 'rb')
    stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                    channels=wf.getnchannels(),
                    rate=wf.getframerate(),
                    output=True)
    data = wf.readframes(CHUNK)
    while len(data) > 0:
        stream.write(data)
        data = wf.readframes(CHUNK)
    stream.stop_stream()
    stream.close()
    p.terminate()

  9. #9
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Citation Envoyé par toumic Voir le message
    Je rectifie car la séparation (écriture/lecture) n'est pas en cause, puisque çà fonctionne même sans.
    Et augmenté la valeur CHUNK = buffet chaud 2048°, et en le réduisant à 1024 ERREUR!
    On peut placer le code dans une boucle de lecture d'une table menant à un fichier wave
    J'ai fait la même chose sur toutes les parties qui utilisaient "winsound", pour favoriser les accès corrects à ce programme

    Voici la lignée de l'écriture et lecture sans aucune séparation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    nbOctet = nbCanal = 1
    fech = 64000
    niveau = float(1 / 2)
    duree = float(1 / 8)
    nbEch = int(duree * fech)
    manote = wave.open(self.fichnom[n], 'wb')
    param = (nbCanal, nbOctet, fech, nbEch, 'NONE', 'not compressed')
    manote.setparams(param)
    amp = 127.5 * niveau
    for i in range(0, nbEch):
        val = wave.struct.pack('B', int(128.0 + amp * math.sin(2.0 * math.pi * freqhtz * i / fech)))
        manote.writeframes(val)
    manote.close()
    p = pyaudio.PyAudio()
    CHUNK=2048
    wf = wave.open(self.fichnom[n], 'rb')
    stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                    channels=wf.getnchannels(),
                    rate=wf.getframerate(),
                    output=True)
    data = wf.readframes(CHUNK)
    while len(data) > 0:
        stream.write(data)
        data = wf.readframes(CHUNK)
    stream.stop_stream()
    stream.close()
    p.terminate()
    Je veux bien me pencher sur un code qui est sensé tourner mais là, cela n'a ni queue, ni tête.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par marco056 Voir le message
    Je veux bien me pencher sur un code qui est sensé tourner mais là, cela n'a ni queue, ni tête.
    En fait çà se trouve là pour le fichier texte
    http://www.cabviva.com/programs/progamv51encore.txt


    Et là pour le fichier exécutable
    http://www.cabviva.com/programs/progamv51encore.zip

    J'ai besoin de savoir si .txt et .exe fonctionnent avec Linux ?

  11. #11
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Je viens de tester le fichier .txt, mis dans un éditeur python : cela semble fonctionner chez moi sous linux.
    Les fichiers .exe ne fonctionnent jamais sous linux, sauf à utiliser un environnement (wine) qui simule windows.
    Pour ma part, le .exe ne fonctionne donc pas chez moi mais je pense que mon wine n'est pas au point...

  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par marco056 Voir le message
    Je viens de tester le fichier .txt, mis dans un éditeur python : cela semble fonctionner chez moi sous linux.
    Les fichiers .exe ne fonctionnent jamais sous linux, sauf à utiliser un environnement (wine) qui simule windows.
    Pour ma part, le .exe ne fonctionne donc pas chez moi mais je pense que mon wine n'est pas au point...
    Merci marco056

  13. #13
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par marco056 Voir le message
    Je veux bien me pencher sur un code qui est sensé tourner mais là, cela n'a ni queue, ni tête.
    Afin de présenter le parcours de lecture / écriture / sonorité avec wave et pyaudio

    Voilà un code simple qui utilise wave et pyaudio

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    import math
    import wave
    import pyaudio
     
    freqs = [55,110,220,440,880]
    frews = ['wp1.wav','wp2.wav','wp3.wav','wp4.wav','wp5.wav']
     
    for y in range(5):
        # Partie radio fréquences graphiques
        nbOctet = nbCanal = 1
        fech = 64000
        niveau = float(1 / 2)
        duree = float(1 / 8)
        nbEch = int(duree * fech)
        freqhtz = int(freqs[y])
        manote = wave.open(frews[y], 'wb')
        param = (nbCanal, nbOctet, fech, nbEch, 'NONE', 'not compressed')
        manote.setparams(param)
        amp = 127.5 * niveau
        for i in range(0, nbEch):
            val = wave.struct.pack('B', int(128.0 + amp * math.sin(2.0 * math.pi * freqhtz * i / fech)))
            manote.writeframes(val)
        manote.close()
        p = pyaudio.PyAudio()
        CHUNK=2048
        wf = wave.open(frews[y], 'rb')
        stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                        channels=wf.getnchannels(),
                        rate=wf.getframerate(),
                        output=True)
        data = wf.readframes(CHUNK)
        while len(data) > 0:
            stream.write(data)
            data = wf.readframes(CHUNK)
        stream.stop_stream()
        stream.close()
        p.terminate()

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec les notes de bas de page
    Par moukah2 dans le forum Word
    Réponses: 3
    Dernier message: 12/04/2011, 23h01
  2. Base de données pour gérer les notes
    Par netsabes dans le forum Schéma
    Réponses: 6
    Dernier message: 23/11/2007, 18h52
  3. mon jar ne lit pas les sons wav
    Par poulette3000 dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 13/05/2007, 19h56
  4. Fichier Midi : récupérer les notes de musique
    Par zardi dans le forum Multimédia
    Réponses: 2
    Dernier message: 20/12/2005, 02h38
  5. Gérer les notes d'un examen
    Par declencher dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 31/05/2005, 12h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo