Benutzer-Werkzeuge

Webseiten-Werkzeuge


ws1617:the_art_of_music:protokolle:03

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
ws1617:the_art_of_music:protokolle:03 [2017/01/26 16:20]
fabi_an angelegt
ws1617:the_art_of_music:protokolle:03 [2017/01/26 16:31] (aktuell)
fabi_an
Zeile 1: Zeile 1:
 ====== 2017-01-12: ====== ====== 2017-01-12: ======
-  * microlistener.py+  * microlistener.py ​zum Laufen gebracht
  
 <code python> <code python>
Zeile 102: Zeile 102:
  while True:  while True:
  pass  pass
 +</​code>​
 +
 +  * 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.
 +
 +<code python>
 +#​!/​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
 +
 </​code>​ </​code>​
ws1617/the_art_of_music/protokolle/03.1485444005.txt.gz · Zuletzt geändert: 2017/01/26 16:20 von fabi_an