PSGConverterの改良

マビノギで打楽器などが実装された。さて、これをWebで再生しようとすると問題が起きる。現在知る限りのMMLの変換スクリプトは、処理に差こそあれ、ドラムパートを使う仕様は追加されていない。というより、MIDI規格においてドラムパートは奇妙な規格である。

どういう風に奇妙か?MIDIで音楽を作ったことがある人ならばわかるが、MIDIで音楽を作ると必ずドラムパートのチャンネルは10になっている。また、他の楽器と異なり、音階ごとに別の楽器が鳴るようになっているのだ。同じ音色でも音階ごとに別の波形を使うというのは普通にあるが、ドラムパートの場合全部違う。まぁ、こればっかりは考えても仕方がない。そういうものだと思うべきだろう。やれXGだGSだという話題は、もはや前世紀の話。今はみんなDAWやっているか、VSTの音源を使ってどのチャンネルがどの楽器だなんて考えていないことだろう。悲しいかな。これが時代の変化というやつだ。

と、話が横にそれた。まず、PSGConverter.phpとmabimml.js(以下JS版PSGConverter)の出力するMIDIを比べてみる。すると、奇妙なことに気がつく。前者のMIDI出力はMidi Format 1(マルチトラック)形式で、後者はMidi Format 0(トラック無し)で出力されているのだ。前者のスクリプトを参考にしたとJS版PSGConverterには書かれているが、やってる処理はあまり似ているとは言い難い。恐ろしくきれいなソースコードである。残念ながらちょこっと小細工しないとIEでは使えないため今回はスルーだが。

PSGConverter.phpの場合、どういうわけかトラックごとに別のチャンネルを割り当てている。一応MIDIの規格上別のトラックに同じチャンネルを入れても問題ないことになっている。たとえば、ドラムパートをパッカーションごとにトラック分けして作業をしやすくしている人もいるくらいである。とりあえず、ここのソースの修正から入ろう。

$midiText[] = '0 PrCh ch='.($tn).' p='.$inst;

この行で、トラックの引数とチャンネルの引数がごっちゃになってるな(汗。どうせだったら、ドラムトラックに対応するためにクエリからチャンネルを指定できるようにしよう。

こんな感じで作業作業っと。結局気がついたら

  1. チャンネルを1本化
  2. クエリからチャンネル指定可能に
  3. GMリセット自動入力できるオプション
  4. パンポット
  5. エフェクト

対応してしまった。はっきり言って3以降は、無駄な機能。ドキュメントを用意しないと。でもいくら、再配布改造自由って書いてあるとはいえ、ドキュメントを作る前に一応連絡入れておいた方がいいな。

mabimmlプラグイン?

お世辞にもきれいとはいえないこのプログラム。結構ずさんな設計である。そもそも、何でこうなってしまったのか?合奏させようなんて考えたからであるこれはプラグイン側でmabimm_1_mmlみたいな感じでJavaScriptに渡す引数を生成し、その都度プレイヤーをdocument.writeで描画、再生ボタンを押したところで楽譜ごとにidを割り当て、その都度MIDIプレイヤー(QuickTime)を呼び出すという仕様である。。どういう原理で合奏しているのかというと、単にJavaScriptでその生成したMIDIプレイヤーにRewindとPlayの命令を一度に送り、2つのMIDIファイルを同時再生することで合奏を実現しているのだ。しかも、決め打ち。

当時(去年の今頃)DOMなんてさっぱりわからんという状態で力ずくでかいたため、こんなになってしまった。そうなると、0から設計しないまでも見直すべき場所は山のようにある。少なくとも、去年少し作ったGoogleMaps for Mabinogiぐらいレベルのソースに書き直すべきだろう。

こんな汚いソースで、特定利用者向けの狭い需要しかなさそうなプログラムでも、利用率が異様に高いのが不思議である。ダウンロード回数が、初版で90件って絶対おかしい。多くて30件ぐらいが適正だろう。(ジャンルそのものが狭い上に、自分で設置したPukiWikiでMabinogi関連のサイト作っている人いないだろうし。)まぁ、需要があることはとりあえず、いいことなのでがんばるとしますか。