Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

ws1617:the_art_of_music:protokolle:03

Dies ist eine alte Version des Dokuments!


2017-01-12:

  • microlistener.py (s.u.) zum Laufen gebracht
#!/usr/bin/python
# coding=utf8
 
from __future__ import division
 
import pyaudio
import time
 
 
### Diese Klasse wird im Modul microlistener definiert.
### Sie kann in allen Projekten verwendet werden, die eine
### kontinuierliche Audio-Eingabe brauchen.
 
 
class MicroListener(object):
	def __init__(self,rate,channels,chunk,callback,playback=False):
		'''kreiert einen Stream, der mit der Samplerate 'rate'
		und 'channels' Kanälen über das Microphon Audio aufnimmt.
		Nach jeweils 'chunk' Frames wird die callback-Funktion
		aufgerufen. 
 
		Falls playback==True, werden die Daten an den Lautsprecher
		durchgereicht.
 
		Die Callback-Funktion nimmt als Argumente 
 
		(in_data, frame_count, time_info, status)
 
		und gibt ein Tupel zurück, dessen erster Eintrag die
		Daten (für Playback), dessen zweiter Eintrag ein Signal
		ist, sollte pyaudio.paContinue sein.
 
		Also z. B. (mit einer globalen Variable CHANNELS)
 
 
		def micro_callback(in_data, frame_count, time_info)
			y=np.fromstring(in_data,dtype=np.short)
			if CHANNELS==2:
				y=y.reshape((y.shape[0]//2,2))
			else:
				y=y.reshape((y.shape[0],1))
			##  y enthält danach die Daten des letzten Abschnitts
			##  aus chunk samples.
			## jetzt irgendwas mit den Daten machen	
			##
			return (in_data, pyaudio.paContinue)
		'''
 
		self.p = pyaudio.PyAudio()
		self.stream = self.p.open(format=pyaudio.paInt16 ,
                channels=channels,
                rate=rate,
                input=True,
                output=playback,
                stream_callback=callback,
                frames_per_buffer=chunk)
 
		self.stream.start_stream()
		time.sleep(0.5)
 
	def __del__(self):
		self.stream.stop_stream()
		self.stream.close()
		self.p.terminate()
 
 
#########################################################################
###  Test-Sektion #######################################################
#########################################################################
 
 
 
if __name__=='__main__':
 
	import numpy as np
 
	###########################
 
	### GLOBALE VARIABLEN
 
	CHANNELS=2
	RATE=44100
	CHUNK=2**11
 
 
	def micro_callback(in_data, frame_count, time_info,status):
		'''callback Funktion: wird vom PyAudio-Objekt aufgerufen,
		wenn CHUNK Frames von der Soundkarte (Mikrophon) gelesen wurden'''
		y=np.array(np.fromstring(in_data,dtype=np.short),dtype=np.float)
		if CHANNELS==2:
			y=y.reshape((y.shape[0]//2,2))
		else:
			y=y.reshape((y.shape[0],1))
		print int(np.linalg.norm(y[:,0])/2000.)*'*'
		return (in_data, status)
 
	listen=MicroListener(RATE,CHANNELS,CHUNK,micro_callback)
	while True:
		pass
  • Um nicht nur die Lautstärke mit Sternchen in einer Eingabeauffordeung visualisiert zu bekommen, sondern pro Frequenz den Anteil, nun zusätzlich die DFT (discrete fourier transform) genutzt, bevor visualiert wird.
#!/usr/bin/python
# coding=utf8
 
from __future__ import division
 
import pyaudio
import time
 
 
### Diese Klasse wird im Modul microlistener definiert.
### Sie kann in allen Projekten verwendet werden, die eine
### kontinuierliche Audio-Eingabe brauchen.
 
 
class MicroListener(object):
	def __init__(self,rate,channels,chunk,callback,playback=False):
		'''kreiert einen Stream, der mit der Samplerate 'rate'
		und 'channels' Kanälen über das Microphon Audio aufnimmt.
		Nach jeweils 'chunk' Frames wird die callback-Funktion
		aufgerufen. 
 
		Falls playback==True, werden die Daten an den Lautsprecher
		durchgereicht.
 
		Die Callback-Funktion nimmt als Argumente 
 
		(in_data, frame_count, time_info, status)
 
		und gibt ein Tupel zurück, dessen erster Eintrag die
		Daten (für Playback), dessen zweiter Eintrag ein Signal
		ist, sollte pyaudio.paContinue sein.
 
		Also z. B. (mit einer globalen Variable CHANNELS)
 
 
		def micro_callback(in_data, frame_count, time_info)
			y=np.fromstring(in_data,dtype=np.short)
			if CHANNELS==2:
				y=y.reshape((y.shape[0]//2,2))
			else:
				y=y.reshape((y.shape[0],1))
			##  y enthält danach die Daten des letzten Abschnitts
			##  aus chunk samples.
			## jetzt irgendwas mit den Daten machen	
			##
			return (in_data, pyaudio.paContinue)
		'''
 
		self.p = pyaudio.PyAudio()
		self.stream = self.p.open(format=pyaudio.paInt16 ,
                channels=channels,
                rate=rate,
                input=True,
                output=playback,
                stream_callback=callback,
                frames_per_buffer=chunk)
 
		self.stream.start_stream()
		time.sleep(0.5)
 
	def __del__(self):
		self.stream.stop_stream()
		self.stream.close()
		self.p.terminate()
 
 
#########################################################################
###  Test-Sektion #######################################################
#########################################################################
 
 
 
if __name__=='__main__':
 
	import numpy as np
	import matplotlib.pyplot as plt
	import scipy.fftpack
 
	###########################
 
	### GLOBALE VARIABLEN
 
	CHANNELS=2
	RATE=44100
	CHUNK=2**11
 
 
	def micro_callback(in_data, frame_count, time_info,status):
		'''callback Funktion: wird vom PyAudio-Objekt aufgerufen,
		wenn CHUNK Frames von der Soundkarte (Mikrophon) gelesen wurden'''
		y=np.array(np.fromstring(in_data,dtype=np.short),dtype=np.float)
		yf = scipy.fftpack.fft(y)
		xf = np.linspace(0.0, (2.0*RATE), CHUNK/2)
		plt.plot(yf) 
		plt.show()
		if CHANNELS==2:
			y=y.reshape((y.shape[0]//2,2))
		else:
			y=y.reshape((y.shape[0],1))
		print int(np.linalg.norm(y[:,0])/2000.)*'*'
		return (in_data, status)
 
	listen=MicroListener(RATE,CHANNELS,CHUNK,micro_callback)
	while True:
		pass
ws1617/the_art_of_music/protokolle/03.1485444665.txt.gz · Zuletzt geändert: 2017/01/26 16:31 von fabi_an