wxPythonのwx.lib.plotでwavファイルをプロットする
ちょっと前のエントリで書いたwaveファイルのユーティリティとwxPythonのwx.lib.plotを組み合わせてwavファイルの波形を表示させるスクリプトを書いた。
それで1秒間のサイン波のwavファイルを読み込ませて動作を確認して、それではと手元にあるオーディオファイルを読みこませたらメモリだけ食いつぶされてうんともすんとも言わない。
考えてみれば当たり前で、サンプリング周波数×秒数分のデータがあるのでまともに全てのサンプルをプロットしようとするとプロットするデータが多すぎてものすごく時間がかかる。5秒だけのwavファイルでもそれなりに時間がかかってしまうので、もっとさくさく動かすにはデータを適当に間引いて表示させなきゃならないみたいだ。
mac環境だけかもしれないけれどグラフの画面がちらつく。なんか残念。
参考:
http://www.daniweb.com/code/snippet216913.html#
http://www.wxpython.org/docs/api/wx.lib.plot-module.html
# coding: utf-8 # waveファイルをプロットしてみるテスト import wx import wx.lib import wx.lib.plot as plot import waveUtil2 as util # 自作モジュール class WaveExtractor(object): def __init__(self, filename): self.wav = util.Wave(filename) def extract(self): callback = [lambda frame:frame.value, lambda frame: (frame.left + frame.right) / 2][self.wav.ch-1] return [(i, callback(self.wav[i])) for i in xrange(len(self.wav))] class Frame(wx.Frame): def __init__(self, filename): wx.Frame.__init__(self, None, size=(600, 400),title="plot") self.plotter = plot.PlotCanvas(self, size=(400,300)) self.plotter.SetEnableZoom(True) self.plotter.SetEnableLegend(True) self.plotter.SetFontSizeLegend(20) ext = WaveExtractor(filename) line = plot.PolyLine(ext.extract(), colour='blue', width=1, legend=filename) graph = plot.PlotGraphics([line], 'Wave', 't', 'f(t)') self.plotter.Draw(graph, xAxis=(0,len(ext.wav)), yAxis=(ext.wav.minvalue, ext.wav.maxvalue)) def main(): import sys if len(sys.argv) < 2: print "usage: %s wavfile" % __file__ return app = wx.PySimpleApp() Frame(sys.argv[1]).Show() app.MainLoop() if __name__ == '__main__': main()