MoonShell Plugin converted by Moonlight.
---

MSPはMoonShellVer1.6/Ver1.71どちらでも使えるプラグインフォーマットです。

補足。

NDSで間に合うようにハードウェアLFOやエンベロープジェネレータなどをかなり相当間引きしています。
デフォルトで1/90秒単位になっていますが、アルベジオやソフトLFOなどがおかしく聞こえるときが多々あります。
mdx.iniのFramePerSecondを240くらいにすると気にならなくなりますが、曲によっては音飛びすると思います。

PDXを読み込むときは、MargeMDXPDX.exeでMDXとPDXを一つに纏めたMPXファイルを再生してください。
適当に作ったのでMDXと同名のPDXファイルしか認識しません。（MDXファイル中のPDX指定は無視します）
MDXと同名のINIファイルを置いておくと、曲ごとに設定を変えることができます。書式はmdx.iniと同じです。
MPX作成時にZLIBで圧縮しますがあまり小さくなった気がしません。

PCMデータがメモリに入りきらないデータは再生できません。500kbyteくらいが限界だと思います。
足りないときは、日本語フォントをはずすと1MByteくらいまで大丈夫だと思います。

16kHzで合成しているので（一応二倍オーバーサンプリングしますが）高音域がはげしく化けます。
mdx.iniで任意の周波数に変更することができますが、20kHz辺りが限界です。曲によっては16kHzでも音飛びします。

ToDo.

PCM8の発音タイミングがずれている？
フェードアウトするときにPCM8にボリュームが適用されません。
最適化するときにアルゴリズムの接続を間違えた気がします…。

---


MDX player
for UNIX-like environment
=========================


 UNIX-like な環境 ( 要 DSP デバイス ) で、いにしえの X68k 他で鳴り響
 いていたFM 音源サウンドを再現します。
 高性能な YM2151 エミュレータ (from MAME) の使用により、オリジナルの
 音源に非常に近いサウンドを得ることが出来ます。
 また、Linux では内蔵 FM 音源 (OPL3) を使用した演奏も可能です。

 YM2151 のエミュレータに付いては、MAME 附属の ym2151.[ch] 
 (Jarek Burczynski <s0246@goblin.pjwstk.waw.pl> 氏作)を若干改造したも
 のを使用しています。

 Linux (OSS, Alsa) 用ドライバおよび EsounD 用ドライバを内蔵しています。
 またそれ以外でも、標準出力にデータを吐き出すことも可能ですので、適当な 
 player で受けることで如何なる環境でも演奏が可能ではないかと思われます。


INSTALL
=======

  適当な場所にアーカイブを展開し、

   % ./configure ; make ; make install

  してください。./configure --help で、各種設定可能項目が見れますが、
  とりあえずは何も手を付けなくてもきちんと動作すると思います。

  以前は setuid することでテンポ処理の精度が上がる機能がありましたが、
  20051015 以降の版では、それ無しでもそれなりに演奏できるようになって
  いますので、なるべく setuid しないようにしてください。

USAGE
=====

  % mdxplay (options) <mdx_filenames>

  で MDX ファイルを演奏します。--help か -h でオプション一覧が出ます。

  PDX ファイルがあれば、それを読み込んで演奏に使用します。PDX ファイルの
  置き場所は、

   カレントディレクトリ
   mdx ファイルが置いてあるディレクトリ
   オプション -p <dir> / --pdx-path <dir>
   環境変数 PDX_PATH で示される場所

  の順に探します。
  日本語な PDX ファイルだった場合は読み込めない場合があります。諦めるなり
  MDX ファイルのヘッダを適当に書き換えるなりしてください。

  複数の MDX ファイルを指定した場合は、演奏が終了する、あるいは
  Ctrl+C で強制停止すると、コマンドラインの次のデータを演奏します。
  曲と曲の間の隙間 (約 500ms) でもう一度 Ctrl+C を押すと、全演奏を中断
  できます。

  無限ループの曲でも、オプション -l を使用することで、適当な繰り返し回数で
  自動的に終了 (フェードアウト) することが出来ます。


 *********************************************************************
 *                                                                   *
 * プログラムが暴走した場合は、あっさりシステムがロックするはずです。*
 *                 *それ相応の覚悟の上ご利用下さい*                  *
 *                                                                   *
 *********************************************************************


MDX File
========

  X68000/030 という personal workstation 上で動作した内蔵音源ドライバ
  'MXDRV.X' 用のデータです。OPM(YM2151) と呼ばれる 4 オペレータ、
  8 音同時発声の FM 音源と、ADPCM (4bit,15kHz max) を同時に制御する
  ことができました。
  ADPCM に付いては、別に提供された専用ドライバ(PCM8)を併用すること
  により、同時に 8 音の再生が可能となりました。その機能を利用した
  データも多数製作されました。


NOTES
=====

  初期段階では OPL3 の実力の片鱗に触れようプロジェクトだったんですが、
  ym2151.[ch] のあまりの性能の良さに、すっかり普通の MDX player と
  なってしまいました。
  こうなってしまった以上、OPL3 操作部分は取っ払ちゃってもいいんですけど、
  一応意地みたいなものもありますゆえ。

  一応 X68000 XVI (24MHz、PCM 高音質化等々改造割と沢山) を数年程所持
  していた私が聴く限りでは、この OPM エミュレータが吐く音は、かなり、
  というか、ほぼ完璧な音なのではないかと思います。

  PCM と FM 音源のバランスが悪いことがありますけど、その場合には
  --fm-volume か --pcm-volume で適当に調整してください。それぞれ
  127 で最大音量、0 で最小音量です。

  演奏中に CPU に負荷を掛けると、音がボトボト落ちます。全体としての
  演奏のタイミングはずれないはずですけど。
  これは、まぁそういうものだと諦めて頂くのが正解なんですが、たとえば
  root で実行したり setuid root したりすると、ちょっとだけ幸せになれる
  かもしれません。

  それでもマトモに音が出ないぞ、と云う場合は、オプションとして '-A'
  というものを用意しています。2048 バイトほどバッファを確保して、
  そのサイズで dsp device に書き出すようになります。

  esd にも対応してますんで、esd が動く環境なら何処に持っていっても演奏
  できると思います。更にネットワーク透過にもなります。便利だ。

  esd が無い場合ですが、OSS & Alsa 用のドライバ (と OPL3) は自前で
  用意してますので、そういう環境では演奏が出来ます。一応コンパイル時と
  演奏時それぞれで自動認識しますので、出力先に付いてはそう気にする必要も
  無いと思いますが。
  OSS 用とは云いつつ、Linux x86 環境以外でマトモに動くかどうかは保証の
  限りでは有りません。stdout に吐かせて、適当な native の wave player で
  受ける方が安定する、という御報告も受けています。


USING OPL3
==========

  プログラム自体に setuid root されているか、root 権限を持つユーザーで
  実行するか、いずれかでない限り OPL3 では演奏出来ません。I/O を直接操作
  しているためです。

  4 オペレータモードでも、後ろ 2 つのチャンネルは 2 オペレータで
  鳴らしています。そもそも OPL3 は 4 オペレータでは同時に 6 音しか
  出せないからです。しかしそいつらに加えて更に 2 オペを 6 音も出せるのは
  割と納得いかんです > YAMAHA

  --fm-waveform なんてオプションも付けてみました。OPL3 が持っている
  源波形を 0 〜 7 の範囲で選べます。
  この機能を使うと、PSG な曲を演奏する時は逆に完璧な音を得ることも
  できます。--no-fm-voice --fm-waveform 6 あるいは --psg を指定して
  みてください。
  但し、エンベロープ回りが完全に無視されますので、あまり嬉しくないかも
  しれません。

  更に意味無く --opl2 というオプションで 2 オペレータな音を聴くことも
  できます。とはいえ、OPL2 では使えないんですけど。

  /dev/dmfm にも対応してみたかったのですが、最早これが動く環境もなく…


OTHER INFORMATIONS
==================

  MDX データの作者さんによっては、互換性等の問題からオリジナルの X68k
  以外での再生を嫌う方もいらっしゃいます。しかもこの mdxplay では全く
  性質的に異なる音源で演奏することになるわけですから、作者さんの意図
  完全無視モードです。
  そーいうわけですので、演奏はそれ相応の心構えでお聴きください。

  セキュリティ的に怖いことをしたくない場合は、mdxplay 本体に対し
  setuid root しないことです。
  但し、当然これをやると OPL3 を使用しての演奏できなくなりますし、
  スケジューリングの調整も出来なくなります。まぁ、別に構わないと云えば
  構わないんですけど。

  稀に "Alarm" と表示して演奏もせずにすぐに終了してしまうことがあります
  が、運悪くタイミングが取れなかったためです。再起動しましょう。

  なお、top で CPU 占有率を調べても、mdxplay は大嘘こいてますので
  表示された値は信用しないで下さい。
  ただ、-s を付けて標準出力に吐き出した際には、sleep 関係の処理を行いま
  せんので、top が正しい値を認識できる可能性があります。

  ちょっと重いかなーという時は、pcm8.h 中の PCM8_MASTER_PCM_RATE を
  適当な値にしてみてください。11025 の偶数値倍しか効かないとは
  思いますけど。
  ちなみに、486DX2 の 50MHz では、11025 Hz でも全くダメでした。とほほ。


DISCLAIMER
==========

  本プログラムを使用して利用者に発生したいかなる事態に関しても、
  製作者である私および関係者は一切その責を負いかねます。
  自己責任のもとでご利用ください。
  配布条件は GPL2 に従います。同梱の COPYING を参照して下さい。

  潜在的にセキュリティの問題を内包しています。不完全、あるいは壊れた
  データを読み込む可能性があり、さらにそれを判断する方法が無い以上、
  完全なデバッグは不可能です。
  同時に、実行時に setuid root されている場合、不具合が発生した場合の
  被害は相当のものとなることが予想されます。重要なデータを保持、および
  重要なサービスを提供しているシステム、更にネットワークに接続された
  システム上での動作はなるべく避けて下さい。


ym2151.[ch]
===========

  同梱の ym2151.c および ym2151.h は、Jarek Burczynski
  <s0246@goblin.pjwstk.waw.pl> 氏が "MAME" 用に製作されたものを、
  本システム用に若干修正したものです。MAME 本体およびその配布条件等に
  ついては、xmame project homepage <http://xmame.retrogames.com/> を
  参照してください。


AVAILABILITY
============

  mdxplay の最新版は、以下の URL から辿れる場所に置いてあるはずです。

             http://member.nifty.ne.jp/Breeze/index.html


REFERENCES
==========

  これを読めば同じ物が作れます。多様は善。:

  Programmer's Guide to Yamaha YMF 262/OPL3 FM Music Synthesizer
               ( Vladimir Arnost, QA-Software <xarnos00@dcse.fee.vutbr.cz> )
  Programming the AdLib/Sound Blaster FM Music Chips
               ( Jeffrey S. Lee <jlee@smylex.uucp> )
  mdxform.doc  ( こうの たけし )
  MXDRVWIN.PAS ( Moonlight <monlight@tkb.att.ne.jp> )
  Linux I/O ポートプログラミング
               ( Riku Saikkonen <rjs@spider.compart.fi> )
               ( 日本語訳:川島 浩 <kei@sm.sony.co.jp> )
  Inside X68000
               ( Masahiko Kuwano, SOFTBANK, 1992 )


AUTHORS
=======

 Original authors in X68k:
  milk.K, K.MAEKAWA, Missy.M

 Linux / UNIX port:
  NAGANO Daisuke < breeze.nagano@nifty.ne.jp >
  http://member.nifty.ne.jp/Breeze/index.html

 YM2151 Emulator:
  Jarek Burczynski <s0246@goblin.pjwstk.waw.pl>
