スライダで再生速度を変える。
昨日の日記をふまえて、読み込んだ音声ファイルの再生速度を動的に変えてみる。その際GUIのスライダを作り、それによりコントロールする。GUIはwxPythonを使います。
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ボタンを押しスライダを動かせば再生速度が変わるはずです。