木曜日, 1月 25, 2007

「なでしこ」絵音プログラム(Ver.0.8)

なでしこ」でフォトmusicシリーズ、プログラムもかなり修正しているので、この辺でもう一度プログラムを載せておく(とりあえず、プログラム名は「絵音」。Versionは、0.8ぐらいにしておきます)。このプログラムを使って、また曲をいくつか作ってみたい。

まずは、パラメータ項目を簡単に説明する。

画像の色コードがTR(1)、赤(R)がTR(2)、緑(G)がTR(3)、青(B)がTR(4)のように対応する。

◇タイトル
 ・曲のタイトルを指定する。
 ・ここで指定した文字列がTrackNameとして使われる。

◇音素画像
 ・音に変換する素材になる画像を指定する。
 ・入力欄をダブルクリックするとファイル選択画面が出る。
 ・入力が無い場合は、eoto.jpgを指定したものとする

◇画素数
 ・音に変換するための縮小画素数を指定する。
 ・縦(10ピクセル)×横(画素数/10)に縮小する。
 ・MMLは、この縮小画像の先頭から横方向にSCANして作成される。
 ・画素数が音符の数になる。

◇楽器_?
 ・色コードおよびRGBに対応する楽器名を音色名か音色番号で指定する。
 ・入力欄をダブルクリックするといくつかの名前を選択すことができる。
 ・楽器の名前を指定しない(NULL)と、当該トラックは生成されない。
 ・色コードやRGBの好きなものに楽器を割り当て、ソロから4重奏までが可能。

◇音階_?
 ・色コードおよびRGBに対応する音階を「/」で区切ってMML形式で指定する。
 ・音階の数はいくつあっても良い。この中からランダムに音が選ばれる。
 ・区切りの中に音列(複数の音)を指定することもできる。
 ・この欄を空白にすると、乱数範囲で指定したノート番号をランダムに生成する。

◇楽器_?_パラメータ
 ・楽器毎のパンやボリュームなどをMML形式で指定する。

◇音符種類
 ・音符の種類(n部音符)を「,」で区切って指定。
 ・2,2,2,4 と指定すれば、2部音符と4部音符が3:1の割合でランダムに作成される。

◇乱数範囲
 ・音階を指定しなかった場合の、ランダムな音の範囲をノート番号で指定する。
 ・最小値-最大値の形式で/で区切って楽器毎に指定する。
 ・一つしか指定が無い場合は、この値が全ての楽器に適用される。

◇演奏速度
 ・テンポ(Tempo=)を指定する。

◇鍵盤表示アプリ
 ・鍵盤表示ボタンで実行するアプリケーションを指定する。
 ・省略した場合は、C:\Program Files\TMIDI Player\TMIDI.EXE

◇楽譜表示アプリ
 ・楽譜表示ボタンで実行するアプリケーションを指定する。
 ・省略した場合は、C:\Program Files\PrintMusic 2006J Demo\PrintMusic.exe

◇音源拡張
 ・音源を拡張するための、固有のIncludeファイル等の指定を行う。

eoto.iniがあると、このファイルからパラメータを読み込む。eoto.iniをエディタ等で作成しておけば、項目記入を簡略化できる。ただし、この場合はコメント等の記述はできない。



//eoto 絵を素材に音を作る
母艦="絵音"

入力項目=「タイトル=
音素画像=?f(写真|*.jpg|全て|*.*)
音素数=200
楽器_C=?(Koto|Shamisen|Shakuhachi|Marimba|GrandPiano|Flute|Violin)Koto
楽器_R=?(Koto|Shamisen|Shakuhachi|Marimba|GrandPiano|Flute|Violin)Koto
楽器_G=?(Koto|Shamisen|Shakuhachi|Marimba|GrandPiano|Flute|Violin)Koto
楽器_B=?(Koto|Shamisen|Shakuhachi|Marimba|GrandPiano|Flute|Violin)Koto
音階_C=レ/"ソ/"ラ/シ♭/レ/ミ♭/ソ/ラ/シ♭/`レ/`ミ♭/`ソ/`ラ
音階_R=レ/"ソ/"ラ/シ♭/レ/ミ♭/ソ/ラ/シ♭/`レ/`ミ♭/`ソ/`ラ
音階_G=レ/"ソ/"ラ/シ♭/レ/ミ♭/ソ/ラ/シ♭/`レ/`ミ♭/`ソ/`ラ
音階_B=レ/"ソ/"ラ/シ♭/レ/ミ♭/ソ/ラ/シ♭/`レ/`ミ♭/`ソ/`ラ
楽器_C_パラメータ=v.Random(60) REV(80) V(100) P(64) o5
楽器_R_パラメータ=v.Random(60) REV(80) V(100) P(64) o5
楽器_G_パラメータ=v.Random(60) REV(80) V(100) P(64) o5
楽器_B_パラメータ=v.Random(60) REV(80) V(100) P(64) o5
音符種類=2,4,8
乱数範囲=40-90
演奏速度=96
鍵盤表示アプリ=
楽譜表示アプリ=
音源拡張=Include(xg.h); Include(voice-xg-mu-1000.h);

もし(存在("eoto.ini")==1)ならば
 読む(入力項目,"eoto.ini")
入力内容=項目記入(入力項目)
もし(入力内容@音素画像=="")ならば
 入力内容@音素画像="eoto.jpg"
もし(入力内容@音素画像=="")ならば
 言う("画像ファイルを選択してください")
 入力内容=項目記入(入力項目)
もし(入力内容@鍵盤表示アプリ=="")ならば
 入力内容@鍵盤表示アプリ="C:\Program Files\TMIDI Player\TMIDI.EXE"
もし(入力内容@楽譜表示アプリ=="")ならば
 入力内容@楽譜表示アプリ="C:\Program Files\PrintMusic 2006J Demo\PrintMusic.exe"

楽器[1]=入力内容@楽器_C
楽器[2]=入力内容@楽器_R
楽器[3]=入力内容@楽器_G
楽器[4]=入力内容@楽器_B
音階[1]=区切(入力内容@音階_C "/")
音階[2]=区切(入力内容@音階_R "/")
音階[3]=区切(入力内容@音階_G "/")
音階[4]=区切(入力内容@音階_B "/")
PM[1]=入力内容@楽器_C_パラメータ
PM[2]=入力内容@楽器_R_パラメータ
PM[3]=入力内容@楽器_G_パラメータ
PM[4]=入力内容@楽器_B_パラメータ

WK=区切(入力内容@乱数範囲 "/")
4 回
 もし(WK[回数-1]=="")ならば; WK[回数-1]=WK[0]
 範囲[回数]=区切(WK[回数-1] "-")
ここまで

Ysize=10; Xsize=入力内容@音素数/Ysize; 画素数=Xsize*Ysize

画像WKとはイメージ; FN=入力内容@音素画像; 画像WKの画像=FN
画像FL=ファイル名抽出(FN)
画像リサイズ(画像WK,Xsize,Ysize)
表示("{画像FL} を 横={Xsize} 縦={Ysize} に変換しました (画素数={画素数})")

RGBリスト="連番,X座標,Y座標,色コード,R,G,B,音(C),音(R),音(G),音(B)"

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

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

曲名=「{波カッコ}"{入力内容@タイトル}"{波カッコ閉じ}」
楽譜[0]="{入力内容@音源拡張} "
楽譜[0]=楽譜[0]&"TrackName={曲名} Tempo={入力内容@演奏速度}"

4 回
 もし(楽器[回数]!="")ならば
  楽譜[回数]="TR({回数}) 音色({楽器[回数]}) {PM[回数]} "
 ここまで
ここまで

P=1
Xsize*Ysize 回
 T=1
 4 回
  もし(楽器[回数]!="")ならば
   音長="l"&RandomSelect(入力内容@音符種類)
   もし(音階[回数]!="")ならば
    音程=(RGBリスト[P,T+2]%配列要素数(音階[T]))
    音符="{音長}{音階[T,音程]}"
   違えば
    音程=(RGBリスト[P,T+2]%(範囲[回数,1]-範囲[回数,0]))+範囲[回数,0]
    音符="{音長}n({音程})"
   ここまで
   楽譜[回数]=楽譜[回数]&音符; RGBリスト[P,T+6]=音符
  ここまで
  T=T+1
 ここまで
 P=P+1
ここまで

4 回
 もし(楽器[回数]!="")ならば
  楽器名=「{波カッコ}"{楽器[回数]}"{波カッコ閉じ}」
  楽譜[回数]=楽譜[回数]&" CH(16) TrackName={楽器名}"
 ここまで
ここまで

RGB表示とはグリッド; そのW=560; そのアイテム=RGBリスト
表示(楽譜[0])
4 回
 もし(楽器[回数]!="")ならば
  表示(LEFT(楽譜[回数],72)&"・・・・")
 ここまで
ここまで

PX=230;PY=20;PS=80

演奏開始ボタンとはボタン;そのX=PX+PS*0;そのY=PY
演奏開始ボタンをクリックした時は
 MML演奏(楽譜)

鍵盤表示ボタンとはボタン;そのX=PX+PS*1;そのY=PY
鍵盤表示ボタンをクリックした時は
 MML変換(楽譜,"temp.mid")
 起動("{入力内容@鍵盤表示アプリ} temp.mid")

楽譜表示ボタンとはボタン;そのX=PX+PS*2;そのY=PY
楽譜表示ボタンをクリックした時は
 MML変換(楽譜,"temp.mid")
 起動("{入力内容@楽譜表示アプリ} temp.mid")

MIDI保存ボタンとはボタン;そのX=PX+PS*3;そのY=PY
MIDI保存ボタンをクリックした時は
 MML変換(楽譜,保存ファイル選択("*.mid"))

終了ボタンとはボタン;そのX=PX+PS*4;そのY=PY
終了ボタンをクリックした時は
 終了

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

●RGB分解(C,{参照渡し}R,{参照渡し}G,{参照渡し}B)
 R=INT(C/(256*256))
 G=INT((C-R*256*256)/256)
 B=C-R*256*256-G*256

//ここまで