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()