木曜日, 11月 30, 2006

「なでしこ」で百人一首music その9

「なでしこ」で百人一首musicシリーズも、だんだん佳境に入ってきた。

今日は、言葉を音に換えるアルゴリズムに使っているデータ項目や、ソフトシンセを演奏させるための楽器の名前など、プログラムで使っているほとんどの変数を、プログラムの実行時に指定できるようにしてみる。

なでしこ」には、こんな時に便利な命令がある。「項目記入」という命令だ。

項目記入
http://nadesi.com/doc/cmd/doc.cgi?mode=cmd&id=2406

この「項目記入」命令を使って、1度に下記のようなパラメータを設定できるようにしてみる。

音程・・・・変換する音階を/で区切ってMML形式で指定
和歌1・・・・素材になる文字列 1
和歌2・・・・素材になる文字列 2
楽器1・・・・和歌1を演奏させる楽器の名前
楽器2・・・・和歌2を演奏させる楽器の名前
位置1・・・・和歌1を演奏させる楽器のパンの位置
位置2・・・・和歌2を演奏させる楽器のパンの位置
速度・・・・演奏速度

各パラメータには、初期値を設定してあるので、このままでも演奏できるのだが、色々と中身を変えてやってみて欲しい。

楽器の名前の指定は注意が必要だ。ここを参照して間違わないように指定してください。

GMレベルの楽器定義
http://oto.chu.jp/doc/command/index2.htm#cmd17


//百人一首music_9
母艦のタイトル="百人一首 de MUSIC"

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


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

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

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

2 回
 音色=楽器[回数]; パン=位置[回数]
 "歌{回数} = "&和歌[回数]を表示
 歌音=""
 歌音変換(和歌[回数],歌音); 楽譜[回数]="TR({回数}) 音色({音色}) P({パン}) REV(100)"&歌音
ここまで

表示(楽譜); 表示("マウスをクリックすると演奏します")

母艦をクリックした時は
 楽譜をMML演奏

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

//ここまで



これぐらいのパラメータが可変にできれば、パラメータの設定次第で無限に音楽を生成できる。