水曜日, 12月 13, 2006

「なでしこ」でフォトmusic その1

なでしこ」の画像処理もかなりわかったきたので、今日からは「絵を素材に音を作る」プログラムにチャレンジしてみる。

最初は、画像の色コードから音を作ってみる。大きな画像だと長い曲ができてしまうので、できる音が200個ぐらいになるように画像を縮小する。この縮小画像の色コードから、一定のアルゴリズムで音を生成して、ピアノで演奏させてみる。

音を作るアルゴリズムは、非常に単純だ。まず、色コードを60で割って、余りを求める。これで、0~59の数ができるので、これに40をプラスして、40~99までのノート番号に変換する。

プログラムは下記のような流れになっている。

・素材になる画像ファイルを選択する
・画像を、横が20pixel縦が10pixelに縮小する(200の音素材を作る)
・画像をSCANして、200個の色コードを配列に入れる
・画像の確認のために縮小した画像を10倍に拡大する
・MMLの初期設定
・色コードから音符(ノート番号が40~99)を200個生成
・MMLの内容を表示
・演奏ボタンを押すと演奏開始

今日は、今まで使ったことのない命令をいくつか使っている。

行揃」命令は、テキストを指定の桁数で改行を入れて折り返す。この命令を使えば、長いテキストを、画面におさまるように整形することができる。

行揃え
http://nadesi.com/doc/cmd/doc.cgi?mode=cmd&id=780

画像高速リサイズ」命令は、画像を補正処理なしてリサイズする。

画像高速リサイズ
http://nadesi.com/doc/cmd/doc.cgi?mode=cmd&id=2163

この命令を使うことで、縮小画像のピクセルをそのまま拡大することができる。プログラムでは元のサイズを10倍にしているので、1ピクセルを10ピクセルに拡大して画像を確認することが可能だ。

もう一つ、「サクラ」にあるRandomSelect相当の関数を作ってみた。これがあると、音符の長さをランダムに作る時に非常に便利だ。

//フォトmusic 1 ピアノのための絵音

Xsize=20; Ysize=10

言う("画像を選択してください")
画像WKとはイメージ; FN=ファイル選択("*.jpg"); 画像WKの画像=FN
画像リサイズ(画像WK,Xsize,Ysize)
表示("{ファイル名抽出(FN)} を 横={Xsize} 縦={Ysize} に変換しました")

RGBリスト="連番,X座標,Y座標,色コード"

N=0;Y=0
Ysize 回
 X=0
 Xsize 回
  N=N+1
  C=画像色取得(画像WK,X,Y)
  RGBリスト[N,0]=N
  RGBリスト[N,1]=X
  RGBリスト[N,2]=Y
  RGBリスト[N,3]=C
  X=X+1
 ここまで
 Y=Y+1
ここまで

画像高速リサイズ(画像WK,Xsize*10,Ysize*10)

楽譜[0]="Tempo=120"
楽譜[1]="TR(1) @(GrandPiano) v.Random(40) REV(80) "
Xsize*Ysize 回
 音程=(RGBリスト[回数-1,3]%60)+40;音長=RandomSelect("4,8")
 楽譜[1]=楽譜[1]&"n({音程}){音長}"
ここまで

表示(行揃(楽譜,80))

演奏ボタンとはボタン
演奏ボタンをクリックした時は
 楽譜をMML演奏

●RandomSelect(N)
 A=区切(N,",");R=配列要素数(A);戻る(A[乱数(R)])

//ここまで



「ピアノのための絵音」MP3で聞いてみる
http://db1.voiceblog.jp/data/mugen_blog/1165914389.mp3