45 votes

Génération / synthèse de sons avec python ?

Est-il possible de faire en sorte que python génère un son simple comme une onde sinusoïdale ?

Existe-t-il un module disponible pour cela ? Si ce n'est pas le cas, comment procéder pour créer le vôtre ?

De plus, faut-il un environnement hôte pour que python fonctionne afin de jouer du son, ou cela peut-il être réalisé simplement en faisant des appels à partir du terminal ?

Si la réponse dépend de l'OS, j'utilise un mac.

36voto

Liam Points 1982

Je cherchais la même chose. Finalement, j'ai écrit ce code qui fonctionne bien.

import math        #import needed modules
import pyaudio     #sudo apt-get install python-pyaudio

PyAudio = pyaudio.PyAudio     #initialize pyaudio

#See https://en.wikipedia.org/wiki/Bit_rate#Audio
BITRATE = 16000     #number of frames per second/frameset.      

FREQUENCY = 500     #Hz, waves per second, 261.63=C4-note.
LENGTH = 1     #seconds to play sound

if FREQUENCY > BITRATE:
    BITRATE = FREQUENCY+100

NUMBEROFFRAMES = int(BITRATE * LENGTH)
RESTFRAMES = NUMBEROFFRAMES % BITRATE
WAVEDATA = ''    

#generating wawes
for x in xrange(NUMBEROFFRAMES):
 WAVEDATA = WAVEDATA+chr(int(math.sin(x/((BITRATE/FREQUENCY)/math.pi))*127+128))    

for x in xrange(RESTFRAMES): 
 WAVEDATA = WAVEDATA+chr(128)

p = PyAudio()
stream = p.open(format = p.get_format_from_width(1), 
                channels = 1, 
                rate = BITRATE, 
                output = True)

stream.write(WAVEDATA)
stream.stop_stream()
stream.close()
p.terminate()

16voto

acsmith Points 579

Je sais que je suis un peu en retard sur ce sujet, mais il s'agit d'un projet python assez fantastique pour la synthèse et la composition audio : https://github.com/hecanjog/pippi

Il est toujours en cours de développement, mais il existe depuis un certain temps.

7voto

J. Katzwinkel Points 1690

Après avoir perdu du temps sur des projets irréalisables ou inexistants, j'ai découvert le module python maître des ondes qui permet de générer un ou plusieurs canaux d'ondes sinusoïdales, carrées et combinées. Les résultats peuvent être écrits soit dans un fichier d'ondes, soit dans un fichier de données. sys.stdout d'où ils peuvent être interprétés directement par aplay en temps réel. Quelques exemples utiles sont expliqués ici et sont incluses dans le projet page github .

5voto

Octipi Points 779

Je travaille sur un puissant synthétiseur en python. J'ai utilisé des fonctions personnalisées pour écrire directement dans un fichier .wav. Il existe des fonctions intégrées qui peuvent être utilisées à cette fin. Vous devrez modifier l'en-tête du fichier .wav pour refléter la fréquence d'échantillonnage, les bits par échantillon, le nombre de canaux et la durée de la synthèse.

Voici une première version d'un générateur d'ondes sinusoïdales qui produit une liste de valeurs qui, après application de bytearray, devient adaptée à l'écriture dans le paramètre de données d'un fichier wave. [modifier] Une fonction de conversion devra transformer la liste en valeurs hexagonales little endian avant d'appliquer le bytearray. Voir le lien vers le format de fichier son PCM WAVE ci-dessous pour plus de détails sur la spécification .wav. [/edit]

def sin_basic(freq, time=1, amp=1, phase=0, samplerate=44100, bitspersample=16):
    bytelist = []
    import math
    TwoPiDivSamplerate = 2*math.pi/samplerate
    increment = TwoPiDivSamplerate * freq
    incadd = phase*increment
    for i in range(int(samplerate*time)):
        if incadd > (2**(bitspersample - 1) - 1):
            incadd = (2**(bitspersample - 1) - 1) - (incadd - (2**(bitspersample - 1) - 1))
        elif incadd < -(2**(bitspersample - 1) - 1):
            incadd = -(2**(bitspersample - 1) - 1) + (-(2**(bitspersample - 1) - 1) - incadd)
        bytelist.append(int(round(amp*(2**(bitspersample - 1) - 1)*math.sin(incadd))))
        incadd += increment
    return bytelist

Une version plus récente peut utiliser des formes d'onde pour moduler la fréquence, l'amplitude et la phase des paramètres de la forme d'onde. Le format des données rend trivial le mélange et la concaténation des ondes. Si cela vous intéresse, jetez un coup d'œil à Format de fichier son WAVE PCM .

5voto

eggsyntax Points 160

La page wiki Python In Music n'a pas été très bien entretenue, mais c'est un bon point de départ. http://wiki.python.org/moin/PythonInMusic

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X