スクリプト
Win32 (VISTA) Python2.6で動作確認。
運がよければRaspberryPiでも動くのではないかと思います(未確認)
スクリプトファイルは2つ
lyricsend.py
#!/usr/bin/env python
# -*- coding: utf8 -*-"""Contains an example of midi input, and a separate example of midi output.
By default it runs the output example.
python midi.py --output
python midi.py --input"""
txt=u"""あたまをくもおのうえにだあし
しほうのやあまをみおろおしいて
かみなりさあまあをしたにきく
ふじわにぽんいちのやま
"""txt="".join(txt.split("\n"))
import sys,time,os
import pygame
import pygame.midi
from pygame.locals import *
import pokemikupygame.midi.init()
def lilgen(txt):
d=pokemiku.kanadict
while 1:
for t1,t2 in zip(txt[0:-1],txt[1:]):
if not t2 in d:
t=t1+t2
else:
t=t1
if t in d :
yield t,d[t]
elif t1 in d:
yield t1,d[t1]
t=txt[-1]
if t in d:
yield t,d[t]class MyMIDI(object):
def __init__(self):
pygame.init()
pygame.fastevent.init()
pygame.midi.init()
def get_device_info(self):
self.devlist=[]
for i in range( pygame.midi.get_count() ):
r = pygame.midi.get_device_info(i)
(interf, name, input, output, opened) = r
in_out = ""
if input:
in_out = "(input)"
if output:
in_out = "(output)"print ("%2i: interface :%s:, name :%s:, opened :%s: %s" %
(i, interf, name, opened, in_out))
self.devlist.append((interf, name, opened, in_out))
if output and "NSX-39" in name:
self.default_output_id=i
print "self.default_output_id",i,name
elif input and "NSX-39" in name:
self.default_input_id=i
def quit(self):
pygame.midi.quit()
def input_main(self):
input_id =self.default_input_id
output_id=self.default_output_id
midiout = pygame.midi.Output( output_id )g=lilgen(txt)
midiin = pygame.midi.Input( input_id )
going = True
ja=pokemiku.kanadict[u"じゃ"]
nn=pokemiku.kanadict[u"ん"]
t,c=g.next()
midiout.write_sys_ex(0,
[0xF0,0x43,0x79,0x09,0x11,0x0a,0x00,c,0xF7])
try:
while going:
if 1 and midiin.poll():
midi_events = midiin.read(10)
for m_e in midi_events:
[[status,data1,data2,data3],timestamp]=m_e
if status == 0x80: # note on ch 0
note=data1
velocity=data2
t,c=g.next()
midiout.write_sys_ex(0,
[0xF0,0x43,0x79,0x09,0x11,0x0a,0x00,c,0xF7])
except Exception ,e:
print e
del midiin
del midiout
pygame.midi.quit()
if __name__ == '__main__':
mymidi=MyMIDI()
mymidi.get_device_info()
mymidi.input_main()
pokemiku.py
仮名と文字コードの変換テーブル
上記のスクリプトへインポートしています
# -*- coding: utf8 -*-
kana=(u"あ い う え お か き く け こ が ぎ ぐ げ ご "+
u"きゃ きゅ きょ ぎゃ ぎゅ ぎょ "+
u"さ すぃ す せ そ ざ ずぃ ず ぜ ぞ "+
u"しゃ し しゅ しぇ しょ じゃ じ じゅ じぇ じょ "+
u"た てぃ とぅ て と だ でぃ どぅ で ど "+
u"てゅ でゅ ちゃ ち ちゅ ちぇ ちょ つぁ つぃ つ つぇ つぉ "+
u"な に ぬ ね の にゃ にゅ にょ は ひ ふ へ ほ "+
u"ば び ぶ べ ぼ ぱ ぴ ぷ ぺ ぽ "+
u"ひゃ ひゅ ひょ びゃ びゅ びょ ぴゃ ぴゅ ぴょ "+
u"ふぁ ふぃ ふゅ ふぇ ふぉ ま み む め も "+
u"みゃ みゅ みょ や ゆ よ ら り る れ ろ "+
u"りゃ りゅ りょ わ うぃ うぇ うぉ "+
u"ん んm んN んJ んn")kanadict={}
for i, k in enumerate(kana.split(u" ")):
kanadict[k]=isynonym=(u"ざ,づぁ ずぃ,づぃ ず,づ ぜ,づぇ ぞ,づぉ "+
u"うぃ,ゐ うぇ,ゑ うぉ,を")for s in synonym.split(u" "):
s1,s2=s.split(",")
kanadict[s2]=kanadict[s1]if __name__=="__main__":
for i, k in enumerate(kana.split(u" ")):
print hex(i) ,k