スライダで再生速度を変える。

昨日の日記をふまえて、読み込んだ音声ファイルの再生速度を動的に変えてみる。その際GUIのスライダを作り、それによりコントロールする。GUIwxPythonを使います。

from sndobj import *
import wx

class SndSpeed:
    def __init__(self, name="loop.wav" ):
        self.filename = name
        self.wave = SndWave(self.filename,READ)
        self.sr = self.wave.GetSr()
        self.size = self.wave.GetDataFrames()
        self.freq = self.sr / self.size
        self.tab = SndTable(self.size, self.wave)
        self.osc = Oscili(self.tab, self.freq, 5000)
        self.rtout = SndRTIO(1, SND_OUTPUT)
        self.rtout.SetOutput(1, self.osc)
        self.thread = SndThread()
        self.thread.AddObj(self.wave, SNDIO_IN)
        self.thread.AddObj(self.osc)
        self.thread.AddObj(self.rtout, SNDIO_OUT)
    def setFreq(self, n):
        self.osc.SetFreq(n)
    def play(self):
        self.thread.ProcOn()
    def stop(self):
        self.thread.ProcOff()

class MyApp(wx.App):
    def OnInit(self):
        self.beep = SndSpeed()
        self.frame = wx.Frame(None, -1, "slider test", size=(350, 200))
        self.panel = wx.Panel(self.frame, -1)
        self.vbox = wx.BoxSizer(wx.VERTICAL)
        self.hbox = wx.BoxSizer(wx.HORIZONTAL)
        self.slider = wx.Slider(self.panel, -1, 1, 0, 200, (10, 10), (300, 50), wx.SL_AUTOTICKS | wx.SL_HORIZONTAL | wx.SL_LABELS)
        self.slider.Bind(wx.EVT_SLIDER, self.freq)
        self.btn1 = wx.Button(self.panel, -1, "play")
        self.btn2 = wx.Button(self.panel, -1, "stop")
        self.btn1.Bind(wx.EVT_BUTTON, self.play)
        self.btn2.Bind(wx.EVT_BUTTON, self.stop)
        self.vbox.Add(self.slider, 0, wx.ALIGN_CENTRE)
        self.hbox.Add(self.btn1, 0, wx.RIGHT, 10)
        self.hbox.Add(self.btn2, 0)
        self.vbox.Add(self.hbox, 0, wx.ALIGN_CENTRE | wx.ALL, 20)
        self.panel.SetSizer(self.vbox)
        self.SetTopWindow(self.frame)
        self.frame.Show(True)
        return True
    def play(self, evt):
        self.beep.play()
    def stop(self, evt):
        self.beep.stop()
    def freq(self, evt):
        self.pos = self.slider.GetValue()
        self.beep.setFreq(self.pos * 0.05)

app = MyApp(0)
app.MainLoop()

実行し、playボタンを押しスライダを動かせば再生速度が変わるはずです。