スクリプト

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 pokemiku

pygame.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]=i

synonym=(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