MIDI入力

MIDIキーボードなどのデバイスからOscili()の周波数を変えてみましょう。

from sndobj import *
import time

MidiDeviceList() #利用可能なMIDIデバイスを表示します
port = int(raw_input("Enter MIDI port:")) #入力待ち
midi = SndMidiIn(port) 
note = MidiIn(midi) #SndMidiInからMIDIナンバー
ntab = NoteTable() #MIDIナンバーを周波数に変換
convert = Lookup(ntab, 0, note)
tab = HarmTable()
osc = Oscili(tab, 440, 3000, convert)
rtout = SndRTIO(1, SND_OUTPUT)
rtout.SetOutput(1, osc)

thread = SndThread()
thread.AddObj(midi, SNDIO_IN)
thread.AddObj(note)
thread.AddObj(convert)
thread.AddObj(osc)
thread.AddObj(rtout, SNDIO_OUT)

thread.ProcOn()
time.sleep(60)
thread.ProcOff()

1つ1つ解説します。まず利用可能なMIDIバイスが一覧表示され、入力待ちになります。使用したいMIDIバイスの番号を押してください。僕の場合、MIDIキーボード持ってないのでPyPortMidiからデータを送信する為にMIDI Yokeを選択。MIDIキーボードの動作確認ができていませんが多分オッケーでしょう。次にSndMidiInから受け取ったメッセージからMidiInがMIDI番号を取り出します。第2引数で他の情報を取り出すこともできます。これをLookupで周波数にしてOsciliの第4引数に繋げます。