MatPlotlibでキーボード入力をしたい
Wave音源のスペクトルアナライザを作ろうとしています。
そのさいキーボード入力を取得しようとしていて、Matplotlibの"key_press_event"を使おうとしているのですが、うまく取得できません。具体的には、”you pressed”が表示されないので、イベント自体取得できていないと思われます。
どのようにしたらキーボード入力を取得できるでしょうか。
使用したソースコード
環境:Python 2.7.16
MacBookAir 2019(OS:Catalina)
Visual Studio Code
# -*- coding: utf-8 -*- TK_SILENCE_DEPRECATION=1 import os import sys import tkinter import tkinter.messagebox import tkinter.filedialog import wave import pyaudio import numpy as np import matplotlib.pyplot as plt import scipy.fftpack import wx from blessed import Terminal import pylab t = Terminal() sample_rate=0.25 CHUNK=1024*4 freq_max=2000 #描画する周波数の最大値 max_Amplitude=300 Status_Play=0 def ReadFilePass(): #ファイルのパスを取得 root = tkinter.Tk() root.withdraw() filetype = [("", "*.wav")] dirpath = os.path.abspath(os.path.dirname(__file__)) tkinter.messagebox.showinfo('テスト', 'ファイルを選択してください') # 選択したファイルのパスを取得 filepath = tkinter.filedialog.askopenfilename(filetypes = filetype, initialdir = dirpath) # 選択したファイル名を表示 #tkinter.messagebox.showinfo('テスト', filepath) return filepath def WaveInfo(WavePass): #Waveファイル読み込み if(WavePass!=None): wf=wave.open(WavePass,"r") return wf def FFT(data): #フーリエ変換 f=np.fft.rfft(data) amp=[np.sqrt(c.real**2+c.imag**2) for c in f] return amp def FFT_Freq(data,rate): freq=np.fft.rfftfreq(len(data),1.0/rate) return freq def Stereo_to_Monoral(Stereo): Monoral=[] for i in range(len(Stereo)/2): Monoral.append(Stereo[2*i]+Stereo[2*i+1]) return Monoral def Make_Data(data,freqList,number): Number_freq=len(freqList) Data_renew=[] freq_renew=[] if(number==0): for i in range(len(freqList)): freq_renew.append(freqList[i]) if(freqList[i]>freq_max): Number_freq=i break if(number!=0): freq_renew=freqList for k in range(len(freq_renew)): Data_renew.append(data[k]) return Data_renew,freq_renew def onkey(event): print('you pressed', event.key, event.xdata, event.ydata) return event.key def road_wave(file): Status_Play=1 number=0 p=pyaudio.PyAudio() stream=p.open(format=p.get_format_from_width(file.getsampwidth()),channels=file.getnchannels(),rate=file.getframerate(),output=True) if(Status_Play==1): buf=file.readframes(CHUNK) if(Status_Play==0): buf=np.zeros(len(buf)) data=[] buf2=[] channels=file.getnchannels() buf2=np.frombuffer(buf, dtype= "int16") / 32768.0 if(channels==2): data=Stereo_to_Monoral(buf2) freqList=FFT_Freq(data,rate=file.getframerate()) amplitudeSpectrum=FFT(data) amplitudeSpectrum,freqList=Make_Data(amplitudeSpectrum,freqList,number) fig, ax = plt.subplots(1, 1) ax.set_ylim((0, max_Amplitude)) time=float(CHUNK)/(float(file.getframerate()*file.getnchannels()))-0.001 print(time) while buf!='': if(number!=0): buf2=np.frombuffer(buf, dtype= "int16") / 32768.0 if(channels==2): data=Stereo_to_Monoral(buf2) amplitudeSpectrum=FFT(data) amplitudeSpectrum,freqList=Make_Data(amplitudeSpectrum,freqList,number) line.remove() word=plt.connect('key_press_event', onkey) print(word) stream.write(buf) line, = ax.plot(freqList, amplitudeSpectrum) plt.pause(time) number=number+1 #stream.write(buf) buf=file.readframes(CHUNK) #line.remove() stream.stop_stream() stream.close() p.terminate() sys.exit() FilePass=ReadFilePass() wave_file=WaveInfo(FilePass) road_wave(wave_file)
あなたの回答
tips
プレビュー