2017-03-09 4 views
3

Je voudrais jouer différents fichiers wav avec une longueur différente "même temps" indépendamment les uns des autres comme un vrai jeu de batterie.joue plusieurs fichiers wav en même temps, pour boîte à rythmes en Python

J'ai trouvé différentes bibliothèques pour le contrôle audio tels que PyAudio, etc .. Pydub et je pense que le résoudre de ce problème est le filetage .. mais il ne joue pas du tout son

from pydub import AudioSegment 
from pydub.playback import play 
import thread 

def play_sound(f_directory,f_file): 
    audio = AudioSegment.from_file(f_directory+f_file) 
    play(audio) 

thread.start_new_thread(play_sound,("drum samples/","ride_crash.wav")) 
thread.start_new_thread(play_sound,("drum samples/","crash_hi.wav")) 
thread.start_new_thread(play_sound,("drum samples/","kick.wav")) 

si je modifie ce code à ceci

from pydub import AudioSegment 
from pydub.playback import play 
import thread 

def play_sound(f_directory,f_file): 
    audio = AudioSegment.from_file(f_directory+f_file) 
    play(audio) 

thread.start_new_thread(play_sound("drum samples/","ride_crash.wav")) 
thread.start_new_thread(play_sound("drum samples/","crash_hi.wav")) 
thread.start_new_thread(play_sound("drum samples/","kick.wav")) 

Il joue seulement le premier.

La raison pour laquelle j'ai utilisé PyDub au lieu de PyAudio est que je pense que l'utilisation de PyDub est beaucoup plus simple, mais peut-être inutile pour cette situation. J'ai également utilisé la superposition, mais le problème avec ça, c'est que tous les fichiers sont lus pour la durée du premier fichier.

Je voudrais savoir, quel est le problème ou s'il vous plaît, laissez-moi savoir s'il y a une meilleure solution, peut-être une autre bibliothèque, mais si possible, je voudrais éviter PyGame ou Pyglet etc ... parce que je pense Cela ralentira mon programme. Sinon, j'attends avec impatience.

+0

La lecture de pydub utilise pyaudio lorsqu'elle est disponible et ffplay comme solution de repli. Les deux sont destinés à une utilisation de débogage rapide et facile, bien que le [mécanisme pyaudio] (https://github.com/jiaaro/pydub/blob/master/pydub/playback.py#L22) _peut être étendu pour une utilisation en production (Je promets, vous ne voulez pas que ffplay pour quelque chose de réel). Fondamentalement, vous feriez seulement les morceaux beaucoup plus petits (comme 10ms si c'est une quantité acceptable de latence, c'est probablement le cas) et combiner tous les signaux audio en cours de lecture 10ms à la fois avant d'écrire dans le flux. – Jiaaro

Répondre

1

multithreading est pas la solution car pour autant que je sache, toutes les méthodes de lecture que les utilisations PyDub sont limitées à un seul cours d'eau ne

Je crains que vous aurez besoin d'utiliser une api plus basse altitude après tout, vous permet d'ouvrir plusieurs canaux audio en même temps. Peut-être que vous pouvez le faire avec pyaudio vous-même en ouvrant plusieurs flux à partir du même contexte Pyaudio

J'ai pris un itinéraire différent moi-même; Je mélange tous les échantillons en un seul échantillon de sortie résultant qui est joué sur un seul flux de sortie.

+0

Donc, je devrais ouvrir des flux différents pour chaque tambour/cymbale puis le mélanger en une seule sortie? – bence1971387

+0

ou les échantillons eux-mêmes? alors, sont-ils encore assez contrôlables? – bence1971387

+0

Je mélange moi-même les données d'échantillon en un seul échantillon stéréo de sortie et je les reproduis sur un seul flux de sortie audio. Que voulez-vous dire par "contrôlable"? Je suppose que cela dépend totalement de la façon dont vous faites le mixage. Je suggère de regarder en jouant des flux de sortie séparés via pyaudio premier –