[Python] A créé une classe pour jouer des vagues de péché en arrière-plan avec pyaudio

(Modifié le 20/03/07 11:52) En réponse à votre indication, nous avons modifié la déclaration des variables. De plus, le message d'erreur a été modifié pour ne s'afficher qu'une seule fois dans la fonction createData. (Modifié le 20/03/07 à 18h52) Ajout de la fonction de fermeture.

introduction

J'ai essayé de jouer des vagues de péché tout en effectuant d'autres tâches en Python, mais je n'ai pas pu trouver une telle bibliothèque, alors je l'ai créée en utilisant le threading. Une fonction qui renvoie l'entrée micro est également incluse en bonus lol

Code Python

sinwave.py


import threading
import time
import pyaudio
import numpy as np
import struct


class SinWave():
    # settings
    INPUT = True
    OUT_FORMAT = pyaudio.paInt16
    IN_FORMAT = pyaudio.paFloat32
    RATE = 44100
    CHUNK = 1024

    L = 1
    R = 2
    LR = 3

    def __init__(self):
        self.pos = 0
        self.flagl = False
        self.flagr = False
        self.fvpp_list = [[0, 0, 0, 3]]
        self.stream_state = True

        self.pa = pyaudio.PyAudio()
        self.out_stream = self.pa.open(format=self.OUT_FORMAT,
                                       channels=2,
                                       rate=self.RATE,
                                       input=False,
                                       output=True,
                                       frames_per_buffer=self.CHUNK)
        self.thread = threading.Thread(target=self.output)
        self.thread.start()

        if self.INPUT:
            self.in_stream = self.pa.open(format=self.IN_FORMAT,
                                          channels=1,
                                          rate=self.RATE,
                                          input=True,
                                          output=False,
                                          frames_per_buffer=self.CHUNK)

    def output(self):
        while self.stream_state:
            data, self.pos = self.createData(
                self.fvpp_list, start_pos=self.pos)
            self.update(self.out_stream, data)

    def update(self, stream, data):  #Fonction de lecture, flux et données de forme d'onde comme arguments
        sp = 0  #Pointeur de position de lecture
        buffer = data[sp:sp + self.CHUNK * 2]
        while buffer:
            stream.write(buffer)
            sp = sp + self.CHUNK * 2
            buffer = data[sp:sp + self.CHUNK * 2]

    def createData(self, fvpp, start_pos=0):  #Oscillateur
        datal = []
        datar = []

        end_pos = start_pos + 0.05 * 44100
        for n in np.arange(start_pos, end_pos):
            sl = 0.0  #Effacer les données de forme d'onde à zéro
            sr = 0.0
            for f in fvpp:
                sl += np.sin(2 * np.pi * f[0] * n /
                             44100 + f[2]) * f[1] * (f[3] % 2)
                sr += np.sin(2 * np.pi * f[0] * n /
                             44100 + f[2]) * f[1] * (f[3] // 2)
                #Clipping lorsque l'amplitude est grande
                if sl > 1.0:
                    sl = 1.0
                    if self.flagl:
                        print("WARNING! Left Max Volume!!")
                        self.flagl = False
                if sr > 1.0:
                    sr = 1.0
                    if self.flagr:
                        print("WARNING! Right Max Volume!!")
                        self.flagr = False
                if sl < -1.0:
                    sl = -1.0
                if sr < -1.0:
                    sr = -1.0

            datal.append(sl)  #Ajouter à la fin
            datar.append(sr)
        datal = [int(x * 32767.0) for x in datal]  #Valeur de 32767-Entre 32767
        datar = [int(x * 32767.0) for x in datar]
        s_data = np.array([datal, datar]).T.flatten()
        data = s_data.tolist()
        #Convertir en binaire
        data = struct.pack("h" * len(data), *data)  #lister*Les arguments sont développés lorsque

        return data, end_pos

    def play(self, freq, vol, phase, pan):
        self.fvpp_list.append([freq, abs(vol), phase, pan])
        self.flagl = True
        self.flagr = True

    def stop(self, freq):
        if freq in [row[0] for row in self.fvpp_list]:
            del self.fvpp_list[[row[0] for row in self.fvpp_list].index(freq)]
            return 0
        else:
            print("This frequency is not played!")
            return -1

    def input(self):
        ret = self.in_stream.read(self.CHUNK, exception_on_overflow=False)
        ret = np.fromstring(ret, np.float32)

        return ret

    def close(self):
        #Arrêt de fil
        self.stream_state = False
        self.thread.join()
        #Fin du flux
        self.out_stream.stop_stream()
        self.out_stream.close()
        if self.INPUT:
            self.in_stream.stop_stream()
            self.in_stream.close()
        self.pa.terminate()

Comment utiliser

Importez cette classe à partir d'un autre fichier python dans le même répertoire.

main.py


from sinwave import SinWave
import numpy as np

sw = SinWave()

main.py


#Jouer du son
sw.play(la fréquence,Le volume(0~1),phase(0~2π),Désignation LR)
#Exemple:440Hz,Volume maximum,Phase 0,Pour l'oreille gauche uniquement
sw.play(440,1,0,sw.L)
#Exemple:880Hz,Volume 80%,Phase π,Pour les deux oreilles
sw.play(880,0.8,np.pi,sw.LR)

#Arrêter le son
sw.stop(la fréquence)
#Exemple:Arrêtez le son de 880Hz
sw.stop(880)#La valeur de retour est 0
#Exemple:Arrêtez le son de 440Hz
sw.stop(440)#La valeur de retour est 0

Quand j'essaye d'arrêter le son à 440Hz qui ne sonne plus à l'accord suivant

main.py


sw.stop(440)

Afficher Cette fréquence n'est pas lue! Sur la ligne de commande. La valeur de retour de la fonction est -1. Lorsque vous quittez le programme

main.py


sw.close()

Ce code arrêtera les threads et les flux. Je pense que c'est le codage d'un débutant, mais j'espère que cela vous sera utile.

Les références

Je veux générer et lire des formes d'onde en temps réel avec teratail - python

Recommended Posts

[Python] A créé une classe pour jouer des vagues de péché en arrière-plan avec pyaudio
Comment utiliser la méthode __call__ dans la classe Python
Installez Pyaudio pour lire des vagues en python
J'ai créé une classe pour obtenir le résultat de l'analyse par MeCab dans ndarray avec python
[Python] Récupérez les fichiers dans le dossier avec Python
[REAPER] Comment jouer à Reascript avec Python
Comment obtenir une liste de fichiers dans le même répertoire avec python
Comment convertir / restaurer une chaîne avec [] en python
Convertissez l'image au format .zip en PDF avec Python
Remplissez l'arrière-plan d'une seule couleur avec OpenCV2 + Python
Je veux travailler avec un robot en python.
[Python] Création d'une méthode pour convertir la base en 1 seconde
Publier / télécharger une bibliothèque créée en Python vers PyPI
[Python] Road to the Serpent (5) Jouez avec Matplotlib
Automatisez la suppression de l'arrière-plan pour les derniers portraits dans un répertoire avec Python et API
Comment identifier l'élément avec le plus petit nombre de caractères dans une liste Python?
Comment utiliser le multitraitement python (suite 3) apply_async en classe avec Pool en tant que membre
Essayez d'exécuter python dans l'environnement Django créé avec pipenv
Changer la destination de sortie standard en un fichier en Python
Probablement le moyen le plus simple de créer un pdf avec Python 3
[Python] Comment jouer avec les variables de classe avec décorateur et métaclasse
Comment obtenir la dernière (dernière) valeur d'une liste en Python
J'ai créé une classe en Python et essayé de taper du canard
Obtenez de manière récursive la liste Excel dans un dossier spécifique avec python et écrivez-la dans Excel.
[Note] Une histoire sur la tentative de remplacer une méthode de classe avec deux barres inférieures dans la série Python 3.
J'ai aussi essayé d'imiter la fonction monade et la monade d'état avec le générateur en Python
J'ai écrit un doctest dans "J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python"
Dans la commande python, python pointe vers python3.8
Examiner la classe d'un objet avec python
[Python] Hériter d'une classe avec des variables de classe
Comment démarrer par lots un programme Python créé avec le notebook Jupyter
Jouez des sons en Python en supposant que le clavier est un clavier de piano
[Road to Intermediate Python] Appelez une instance de classe comme une fonction avec __call__
[Introduction à Python] Comment fractionner une chaîne de caractères avec la fonction split
J'ai créé une bibliothèque Python pour appeler l'API de LINE WORKS
Comment vérifier la taille de la mémoire d'une variable en Python
Exportez le contenu de ~ .xlsx dans le dossier en HTML avec Python
[Python] Un mémo pour faire fonctionner une ROM créée avec GBDK avec PyBoy
[Introduction à Python] Comment utiliser l'opérateur in dans l'instruction for?
Comment vérifier la taille de la mémoire d'un dictionnaire en Python
Lisez le fichier en Python avec un chemin relatif depuis le programme
Je voulais résoudre le problème ABC164 A ~ D avec Python
[ROS2] Comment lire un fichier bag avec le lancement au format python
Résolvez les problèmes de somme partielle avec une recherche complète en Python
Comment envoyer une requête à l'API DMM (FANZA) avec python
[Python] Créez un programme qui supprime les sauts de ligne dans le presse-papiers + Enregistrez-vous comme raccourci avec Windows
Une histoire qui n'a pas fonctionné lorsque j'ai essayé de me connecter avec le module de requêtes Python
Générer une collection de première classe en Python
Livre en spirale en Python! Python avec un livre en spirale! (Chapitre 14 ~)
Créer un décorateur de fonction Python avec Class
[Introduction à Python] Comment utiliser la classe en Python?
Essayez de vous connecter à qiita avec Python
Un mémo organisé en renommant les noms de fichiers dans le dossier avec python
[Introduction à Udemy Python3 + Application] 47. Traitez le dictionnaire avec une instruction for
Ecrire le test dans la docstring python
[Python] Explique comment utiliser la fonction range avec un exemple concret
Comment envoyer une image visualisée des données créées en Python à Typetalk