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

Programmation multimédia/Jeux Python Discussion :

[Carte Son] Générer un son défini avec python (fréquence, forme du signale etc..)


Sujet :

Programmation multimédia/Jeux Python

  1. #1
    Membre habitué Avatar de moumine
    Profil pro
    Étudiant
    Inscrit en
    Août 2008
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2008
    Messages : 237
    Points : 178
    Points
    178
    Par défaut [Carte Son] Générer un son défini avec python (fréquence, forme du signale etc..)
    Bonjour,

    J’aimerais savoir si c’est possible de générer un son avec python. (Définir la forme du signal et la fréquence pour balancer tout ça à la carte son).
    Est-ce possible ?

    Autre variante : brancher un haut parleur sur un port série pour ensuite générer ce son. Mais le souci c’est que je ne sais pas comment je pourrais faire ça. Et avec quel module peut-on avoir accès aux ports du pc ?

    Quelqu'un pourrait me mettre sur la bonne voix ?
    Merci d’avance et bonne journée
    On rêvait tous d'une Barack blanche pour Obama

  2. #2
    Membre habitué Avatar de moumine
    Profil pro
    Étudiant
    Inscrit en
    Août 2008
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2008
    Messages : 237
    Points : 178
    Points
    178
    Par défaut
    Comment pourrais-je avoir accès au DSP ? (avec python bien sûr)
    Bon, pour ce qui est de la forme du signal je suppose que je n’ai pas trop le choix? (Singnal carré)

    A+
    On rêvait tous d'une Barack blanche pour Obama

  3. #3
    Membre averti

    Inscrit en
    Juillet 2008
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 186
    Points : 350
    Points
    350
    Par défaut
    Bonjour,

    Pour utiliser la carte son, il y a plein de modules python.

    Pour jouer ou enregistrer le son, tu utilises ossaudiodev, et pour générer ou analyser un signal, il y a audioop.

    Didier

  4. #4
    Membre habitué Avatar de moumine
    Profil pro
    Étudiant
    Inscrit en
    Août 2008
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2008
    Messages : 237
    Points : 178
    Points
    178
    Par défaut
    Salut,

    Merci de ta réponse.
    Si j'ai bien compris, ces modules servent à travailler avec des sons (wave).
    Mais je ne peux pas générer de son avec ces modules ?!
    Par exemple je veux générer (créer) une signale carré de 1[kHz], et que je veux balancer le tout sur ma carte son, est-ce possible avec ces modules?
    Bonne journée
    On rêvait tous d'une Barack blanche pour Obama

  5. #5
    Membre averti

    Inscrit en
    Juillet 2008
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 186
    Points : 350
    Points
    350
    Par défaut
    Un son wave ne signifie pas forcement un fichier .wav ! Un son wave, c'est une série d'échantillons (des valeurs) qui forment un signal (une forme d'onde = waveform). On peut les représenter graphiquement sous forme d'une courbe avec en abscisse le temps (ou l'index d'échantillon) et en ordonnée la valeur de chaque échantillon.

    Ainsi, si tu crées une wave (c'est une string python) contenant les valeurs '\x7f\x7f\x7f\x7f\x80\x80\x80\x80' et que te l'envoies sur la carte son (ossaudiodev.open('/dev/dsp', 'w')), tu endendras quelque chose. Ce quelque chose va dépendre de la fréquence à laquelle sont joués ces échantillons. Par exemple avec un mode 8 kHz, 8 bits non signé, la forme ci-dessus générera un signal carré de fréquence 2 kHz (enfin, il faut répéter cette série de valeurs pour que le signal se répète, sinon, le son durera 1 milliseconde seulement)

    Didier

  6. #6
    Membre habitué Avatar de moumine
    Profil pro
    Étudiant
    Inscrit en
    Août 2008
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2008
    Messages : 237
    Points : 178
    Points
    178
    Par défaut
    Nickel!!!

    C'est très clair ainsi.
    Merci de tes réponses.
    Je vais tester ça et je te redis ce qu'il en est.
    Bonne journée
    On rêvait tous d'une Barack blanche pour Obama

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2008
    Messages : 76
    Points : 94
    Points
    94
    Par défaut
    Salut !

    Si jamais, tu peux utiliser pygame pour créer un son à partir d'un tableau (qui contient l'amplitude du son à un instant donné), avec le module sndarray.

  8. #8
    Membre habitué Avatar de moumine
    Profil pro
    Étudiant
    Inscrit en
    Août 2008
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2008
    Messages : 237
    Points : 178
    Points
    178
    Par défaut
    Citation Envoyé par dtrosset Voir le message
    Un son wave ne signifie pas forcement un fichier .wav ! Un son wave, c'est une série d'échantillons (des valeurs) qui forment un signal (une forme d'onde = waveform). On peut les représenter graphiquement sous forme d'une courbe avec en abscisse le temps (ou l'index d'échantillon) et en ordonnée la valeur de chaque échantillon.

    Ainsi, si tu crées une wave (c'est une string python) contenant les valeurs '\x7f\x7f\x7f\x7f\x80\x80\x80\x80' et que te l'envoies sur la carte son (ossaudiodev.open('/dev/dsp', 'w')), tu endendras quelque chose. Ce quelque chose va dépendre de la fréquence à laquelle sont joués ces échantillons. Par exemple avec un mode 8 kHz, 8 bits non signé, la forme ci-dessus générera un signal carré de fréquence 2 kHz (enfin, il faut répéter cette série de valeurs pour que le signal se répète, sinon, le son durera 1 milliseconde seulement)

    Didier
    Salut,

    Merci de vos réponses.
    Est-ce que tu pourrais développer car je ne crois pas avoir tout saisi.
    ('\x7f\x7f\x7f\x7f\x80\x80\x80\x80' -> correspond à quoi?)
    Merci d'avance et bonne journée.
    On rêvait tous d'une Barack blanche pour Obama

  9. #9
    Membre habitué Avatar de moumine
    Profil pro
    Étudiant
    Inscrit en
    Août 2008
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2008
    Messages : 237
    Points : 178
    Points
    178
    Par défaut
    Et aussi pour le module "ossaudiodev" est-ce que je dois l'ajouter?
    Car quand je fais:
    cela me donne une erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Traceback (most recent call last):
      File "F:\son\son.py", line 3, in <module>
        import ossaudiodev
    ImportError: No module named ossaudiodev
    ps: Je crois que ce module fonctionne uniquement pour Linux

    This module allows you to access the OSS (Open Sound System) audio interface. OSS is available for a wide range of open-source and commercial Unices, and is the standard audio interface for Linux and recent versions of FreeBSD.
    Merci d'avance et bonne journée
    On rêvait tous d'une Barack blanche pour Obama

  10. #10
    Membre averti

    Inscrit en
    Juillet 2008
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 186
    Points : 350
    Points
    350
    Par défaut
    Bonjour,

    J'ai un peu tout appris là : http://wiki.python.org/moin/Audio

    Avec Windows, pour jouer les sons sur la carte son, il semble qu'il faille passer par PyAudio http://people.csail.mit.edu/hubert/pyaudio/ (à la place de ossaudiodev).

    Par contre, le reste des opérations est similaire, notamment audioop et le format des données son : '\x7f\x7f\x7f\x7f\x80\x80\x80\x80'. Elles sont stockées sous forme de chaîne de caractères qui contiennent les valeurs hexadécimales des échantillons. \x7f = 127, \x80 = -128. Ainsi le son ci dessus a 4 échantillons au max, suivis de 4 échantillons au mini.

    Cela dit, c'est vrai uniquement si on joue ce son dans la bonne configuration. Et c'est là qu'il te faudra configurer PyAudio pour qu'il joue ce son en 8 bits signés à la fréquence que tu souhaites.

    Didier

  11. #11
    Membre habitué Avatar de moumine
    Profil pro
    Étudiant
    Inscrit en
    Août 2008
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2008
    Messages : 237
    Points : 178
    Points
    178
    Par défaut
    Ok, merci beaucoup Didier.
    Je vais essayer de me débrouiller avec ça.
    On rêvait tous d'une Barack blanche pour Obama

  12. #12
    Membre habitué Avatar de moumine
    Profil pro
    Étudiant
    Inscrit en
    Août 2008
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2008
    Messages : 237
    Points : 178
    Points
    178
    Par défaut
    Salut,
    Pour finir j'utilise ça(pour créer mon son):
    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
    import math, numarray as NA, wave
    def sound_creator():
        freq = 1000.
        freqech = 44100
        duree = 5.
        omega = 2 * math.pi * freq
        son = NA.arange(0., duree, 1./freqech, NA.Float64)
        son = NA.sin(omega * son)
        son *= 32768.
        son = son.astype(NA.Int16)
     
        wavfile = wave.open('AutreAmplitude.wav','w')
        wavfile.setparams((1, 2, freqech , len(son), 'NONE', 'not compressed'))
        wavfile.writeframes(son.tostring())
        wavfile.close()
    sound_creator()
    et j'utilise ça pour jouer le son:
    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
    import pyaudio, wave, sys
    def sound_play():
        print "Lecture en cours.."
        chunk = 1024
     
        wf = wave.open("AutreAmplitude.wav",'r')
     
        p = pyaudio.PyAudio()
     
        # open stream
        stream = p.open(format =
                        p.get_format_from_width(wf.getsampwidth()),
                        channels = wf.getnchannels(),
                        rate = wf.getframerate(),
                        output = True)
     
        # read data
        data = wf.readframes(chunk)
     
        # play stream
        while data != '':
            stream.write(data)
            data = wf.readframes(chunk)
     
        stream.close()
        p.terminate()
    sound_play()
    Mais c'est pas vraiment ce que je souhaitais (même si le résultat est identique).
    Je crois que je vais me contenter de ça.
    Merci de toutes vos réponses et bonne nuit.
    On rêvait tous d'une Barack blanche pour Obama

  13. #13
    Membre habitué Avatar de moumine
    Profil pro
    Étudiant
    Inscrit en
    Août 2008
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2008
    Messages : 237
    Points : 178
    Points
    178
    Par défaut


    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    # -*- coding: cp1252 -*-
    import math, numarray as NA, wave, audioop, sys, pyaudio
    from Tkinter import*
    
    def sound_creator():
        varFreq = float(eval(Freq.get()))   # Reception des valeures
        varDuree = float(eval(Duree.get()))
        freqech = 44100
        omega = 2 * math.pi * varFreq
        son = NA.arange(0., varDuree, 1./freqech, NA.Float64)
        son = NA.sin(omega * son)
        son *= 32768.
        son = son.astype(NA.Int16)
     
        wavfile = wave.open('AutreAmplitude.wav','w')
        wavfile.setparams((1, 2, freqech , len(son), 'NONE', 'not compressed'))
        wavfile.writeframes(son.tostring())
        wavfile.close()
        sound_play()
    
    
    def sound_play():
        chunk = 1024
    
        wf = wave.open("AutreAmplitude.wav",'r')
    
        p = pyaudio.PyAudio()
    
        # open stream
        stream = p.open(format =
                        p.get_format_from_width(wf.getsampwidth()),
                        channels = wf.getnchannels(),
                        rate = wf.getframerate(),
                        output = True)
    
        # read data
        data = wf.readframes(chunk)
        
        # play stream
        while data!='' :
            stream.write(data)
            data = wf.readframes(chunk)
        stream.close()
        p.terminate()
    
    def sound_break():      # Fonction pour stop
        stop=2
    
        
    ######################### Création de la fenètre #########################
    
    fen1 = Tk()                                                             
    fen1.title("Sound Player")                                                                 
    
    # 3ème Colonne.
    TextFreq = Label(fen1, text="Fréquence [Hz]").grid(row=1, column=3)
    TextDuty = Label(fen1, text="Durée [s]").grid(row=2, column=3)
    
    #Frequency
    varFreq =StringVar()
    Freq = Entry(fen1, textvariable= varFreq)
    Freq.grid(row=1, column=4)
    varFreq.set("500")
    
    #Durée
    varDuree =StringVar()
    Duree = Entry(fen1, textvariable= varDuree)
    Duree.grid(row=2, column=4)
    varDuree.set("10")
    stop=0
    #Bouton n°1 (Lecture)
    Inter = Button(fen1,text="Lecture", command=sound_creator)
    Inter.grid(row=3, column=3, columnspan=2)
    
    #Bouton n°2 (Stop)
    Inter2 = Button(fen1,text="Stop", command=sound_break)
    Inter2.grid(row=3, column=4, columnspan=2)
    
    fen1.mainloop()
    J’aurais un autre souci.
    J’aimerais arrêter la lecture du son quand on clique sur « Stop ».
    Mais voila, pendant la lecture je ne peux pas faire de détection de clique sur Stop.
    Si quelqu'un aurait une idée. ?
    Ps:Si vous désirez faire le test il faudra ajouter le module numarray et pyaudio
    Merci d’avance et bonne journée
    On rêvait tous d'une Barack blanche pour Obama

  14. #14
    Membre averti

    Inscrit en
    Juillet 2008
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 186
    Points : 350
    Points
    350
    Par défaut
    Bonjour,

    Comme écrit sur le site PyAudio :
    PyAudio is designed to work with the PortAudio v19 API 2.0. Note that PyAudio currently only supports blocking-mode audio I/O.

    Donc je crois que ce que tu veux n'est pas possible en utilisant PyAudio ...

    Didier

  15. #15
    Membre habitué Avatar de moumine
    Profil pro
    Étudiant
    Inscrit en
    Août 2008
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2008
    Messages : 237
    Points : 178
    Points
    178
    Par défaut
    Euh pourrais-tu traduire ça, car je suis nul en anglais
    Mais d'après ce que j'ai compris et d'après mon ami google, cela donne:
    PyAudio est conçu pour fonctionner avec le PortAudio V19 API 2.0. Notez que PyAudio actuellement ne supporte que le blocage en mode audio I / O.
    Sa veut pas dire que je ne peux pas faire ce que je veux faire.
    Ou bien ai-j mal compris ?
    A+
    On rêvait tous d'une Barack blanche pour Obama

Discussions similaires

  1. Réponses: 23
    Dernier message: 17/06/2019, 16h59
  2. jouer un son (*.wav ou *.mid) avec python
    Par - Glop - dans le forum Programmation multimédia/Jeux
    Réponses: 18
    Dernier message: 22/02/2010, 19h38
  3. [Turbo Pascal] Générer du son sur la carte son
    Par boudakou dans le forum Turbo Pascal
    Réponses: 1
    Dernier message: 20/02/2009, 19h23
  4. [son] générer un son
    Par _yeye_ dans le forum SDL
    Réponses: 1
    Dernier message: 10/06/2008, 19h45

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