2016年3月1日火曜日

MMLとの戦い

FM音源のVSTインストでドラゴンスピリットのジャングルの曲を作ってみた。
MDXからMIDIにコンバートして、CUBASE上でエディット。

さすが名曲、ちゃんと鳴るまで色々と工程は必要だったけど、キモチのいい
音になって満足。

そして、次の工程、にせぱんの新曲をFM音源でMMLで発表という誰得な
ものではあるが、それをやろうと決めたので最後まで頑張る。

MMLをイチから起こすのもいいが、せっかくだったらMIDIからMMLに変換
できて、それをエディットした方が効率的な気がした。今後も新曲をその
方式で発表というのも面白い・・かな?誰得な話ではあるが。

そこで、MIDIを読み込んで、MMLを吐くコンバータ作成中。

まだデロデロの演奏ではあるが、大きくは鳴るようになってきたので、
忘れないウチにハマりポイントをメモる。

■音長が全て
音階はすぐに表現できる。

char cNoteTbl[12][3] = { "c", "c+", "d", "d+", "e", "f", "f+", "g", "g+", "a", "a+", "b" };

こんな感じでテーブルを用意して、ピッチの値を12で割ってオクターブを出して、
余りをこのテーブルに当てはめればすぐに出る。これは簡単。

しかし!音長を表現するのがものごっつい大変!!

MIDIデータは絶対時間ではなく、デルタタイムの積み重ねなので、一つデータ
を見落とすだけで後ろが全部ズレるのである。現在はズレズレである。

問題は、ノートオン→ノートオフの繰り返ししかないので、それをMMLで表現
しようと思うと、一音鳴り終わって、次鳴る時にしかMMLを吐けないのだ。

1.音が鳴った
2.音が鳴り終わった←ココではまだ表現できない
3.音が鳴った←ココで初めて1と2の評価をする
→3の音が鳴った時に全部音符でいいのか、休符を伴うのか、調査する。

※CUBASEがスタンダードMIDIファイルを吐く時、常に480の分解能で2tick程
短く発音するようになっているのだ。なんだこの仕様は!!例:480→478

これがハマりポイント!!

デルタタイムはどのように表現してもいいけど、MMLは4分音符などの音符で
表現するので、そのままストンと変換できない!!難しい!!!

そこで、以下のテーブルを作ってみた。

char cLengthTble[22][5] = {
"1", // 4.0
"2.", // 3.0
"2", // 2.0
"4.", // 1.5
"3", // 1.3333333333333333333333333
"4", // 1.0
"8.", // 0.75
"6", // 0.6666666666666666666666666
"8", // 0.5
"16.", // 0.375
"12", // 0.3333333333333333333333333
"16", // 0.25
"32.", // 0.1875
"24", // 0.1666666666666666666666666
"32", // 0.125
"64.", // 0.09375
"48", // 0.0833333333333333333333333
"64", // 0.0625
"64",
"64",
"64",
"64"
};

4分音符を1として、他の音符の割合だ。一番細かい音符は64部音符にしたけど
これが現在のバグの原因かもしれない・・。

このテーブルを使って、音や休符の長さを少しづつ削ってやることにした。そう
して、何となく表現ができるようになってきた。

でも、サンプル曲などを変換するとズレズレになってしまう。これは現在原因を
調査中である・・。

0 件のコメント:

コメントを投稿