2017-09-19 4 views
3

Voici ce que j'ai. La variable de durée est définie pour jouer la tonalité pendant 4 secondes, mais lorsque le code est exécuté, il ne joue que pendant environ 1,5 seconde. J'ai frappé un mur avec celui-ci; toute aide serait grandement appréciée.Travail sur un programme générateur de sons. La variable 'durée' (en secondes) ne détermine pas correctement la durée de la tonalité pour

import pyaudio 
import numpy as np 

p = pyaudio.PyAudio() 

volume = 0.5  # range [0.0, 1.0] 
fs = 44100  # sampling rate, Hz, must be integer 
duration = 4.0 # in seconds, may be float 
f = 440.0  # sine frequency, Hz, may be float 

# generate samples, note conversion to float32 array 
samples = (np.sin(2*np.pi*np.arange(fs*duration)*f/fs)).astype(np.float32) 

# for paFloat32 sample values must be in range [-1.0, 1.0] 
stream = p.open(format=pyaudio.paFloat32, 
       channels=1, 
       rate=fs, 
       output=True) 

# play. May repeat with different volume values (if done interactively) 
stream.write(volume*samples) 

stream.stop_stream() 
stream.close() 

p.terminate() 
+0

btw, vous devriez essayer d'éviter toutes les copies lors de l'initialisation de 'samples'. Notez également qu'un seul appel à 'stream.write' n'est pas interruptible. – o11c

Répondre

2

Quelque chose semble buggy avec la détection de la taille du tableau de stream.write. Je suppose qu'il divise par la taille du format quand il ne devrait pas.

L'appel stream.write(volume*samples, len(samples)) fonctionne pour moi.