火曜日, 12月 05, 2006

「なでしこ」で百人一首music(楽譜編)

「なでしこ」で百人一首musicで作った曲を、楽譜にすることができないかというご要望をいただいた。

MIDIフィルを読み込んで楽譜を表示できるソフトがあるので、MIDIファイル経由で楽譜表示機能を実現してみる。

楽譜を表示できるソフトとして、PrintMusicという有名なソフトがある。デモ版をダウンロードできるので、これをインストールして使ってみることにする。

PrintMusic デモ(体験)版
http://www.cameo.co.jp/printmusic/download.html

アプリケーションを作る場合、他のプログラムを利用して機能を付加するために、プログラムの中からプログラムを呼び出すことはよくある。「なでしこ」には、外部のプログラムを呼び出すための「起動」命令というのがある。

起動
http://nadesi.com/doc/cmd/doc.cgi?mode=cmd&id=520

データを起動するプログラムに渡したい場合は、テンポラリーファイルを一時的に作成し、プログラムにデータを渡した段階で、このテンポラリーファイルを削除するというようにする。

ということで、「なでしこ」で百人一首music その12 のプログラムに楽譜表示機能を付けてみた。

//百人一首music_12_1
母艦のタイトル="百人一首 de MUSIC"; 母艦の背景色=RGB(220,180,200)

入力項目=「音程=ミ/"ラ/"シ/ド/ミ/ファ/ラ/シ/`ド/`ミ/`ファ/`ラ/`シ
和歌1=秋の田の 仮庵の伊庵の 苫をあらみ わが衣出は 露に濡れつつ
和歌2=春過ぎて 夏来にけらし 白砂の 衣ほすてふ 天の香具山
楽器1=?(Koto|Shamisen|GrandPiano|Flute|Violin)Koto
楽器2=?(Koto|Shamisen|GrandPiano|Flute|Violin)Koto
音量1=100
音量2=100
音長1=80
音長2=80
位置1=0
位置2=127
速度=60
繰回=1


入力内容=項目記入(入力項目)

音階=区切(入力内容@音程 "/")
和歌[1]=入力内容@和歌1; 楽器[1]=入力内容@楽器1
位置[1]=入力内容@位置1; 音量[1]=入力内容@音量1; 音長[1]=入力内容@音長1
和歌[2]=入力内容@和歌2; 楽器[2]=入力内容@楽器2
位置[2]=入力内容@位置2; 音量[2]=入力内容@音量2; 音長[2]=入力内容@音長2

楽譜[0]="Tempo={入力内容@速度}"

2 回
 音色=楽器[回数]; PAN=位置[回数]; VOL=音量[回数]; GATE=音長[回数]
 "歌{回数} = "&和歌[回数]を表示
 歌音="[{入力内容@繰回} "
 歌音変換(和歌[回数],歌音)
 楽譜[回数]="TR({回数}) 音色({音色}) P({PAN}) V({VOL}) q({GATE}) v.Random(60) REV(100)"&歌音&"]"
ここまで

表示(楽譜)

演奏開始ボタンとはボタン; 演奏開始ボタンをクリックした時は
 MML演奏(楽譜)
楽譜表示ボタンとはボタン; 楽譜表示ボタンをクリックした時は
 MML変換(楽譜,"temp.mid")
 起動("C:\Program Files\PrintMusic 2006J Demo\PrintMusic.exe temp.mid")
 ファイル完全削除("temp.mid")
MIDI保存ボタンとはボタン; MIDI保存ボタンをクリックした時は
 MML変換(楽譜,保存ファイル選択("*.mid"))
終了ボタンとはボタン; 終了ボタンをクリックした時は
 終了

●歌音変換({参照渡し}和歌,{参照渡し}歌音)
 文字=和歌を文字列分解したもの
 和歌の文字数 回
  弦番号=ASC(文字[回数-1])%配列要素数(音階)
  もし(文字[回数-1]=" ")ならば
   音符="r4"
  違えば、もし(文字[回数-1]>"ん")ならば
   音符=音階[弦番号]&"2"
  違えば
   音符=音階[弦番号]&"4"
  ここまで
  歌音=歌音&音符

//ここまで



[楽譜表示]ボタンを押すと、PrintMusicが起動して、下のような楽譜が表示される。