-------------------------------------------------------------------------------
【  名  称  】 Z-MUSIC Decoder
【ファイル名】 kbzmdrive.kpi
【バージョン】 0.15alpha
【対応拡張子】 zms/zmd
【 Platform 】 x86(32bit)/x64(64bit)
【 公 開 日 】 2021/05/04
-------------------------------------------------------------------------------

【概要】

FIXER さん制作の ZMDRIVE を使用して Z-MUSIC を再生するためのプラグインです。対
応拡張子は zms/zmd です。

内蔵音源のみに対応します。MIDI と内蔵音源の両方を含む場合、MIDI 部分は再生され
ません。MIDI のみの場合、無音が再生されます。


【導入方法】

プラグインの置き場所については同梱の install.txt の通りです。

本プラグインを使用するには、FIXER さん制作の ZMDRIVE が必要です。
ZMDRIVE 0.4C は本プラグインに同梱されています。

ZMDRIVE には 0.4C よりも新しいバージョンが存在します。本プラグインは新版の
ZMDRIVE にも対応しています。動作確認したのは 2018/03/16 版です。

まーくん２さんのツイッター：https://twitter.com/markun2

固定されたツイートのリンクを開くと怪しげな(笑)ファイル・フォルダ群が出てきます
がその中に ZMDRIVE 2018/03/16 版があります。(「公開」フォルダの下にあります)


本プラグインには m_puusan 氏制作の X68Sound.dll の RuRuRu 氏による改造版
(2020/06/14版) が組み込まれています。

通常、ZMDRIVE の動作には X68Sound.dllが必要となりますが、本プラグインに内蔵し
ているので X68Sound.dll がなくても動作します。

内蔵ルーチンを使わず、使用する X68Sound.dll を設定することも出来ます。
X68Sound.dll はまーくん２さんのところでも配布されていますし、他にもありますの
で探してみて下さい。


【設定】

プラグイン設定画面がヘルプを兼ねていますので参照して下さい。

ZMDRIVE には、新旧ともに X68Sound を使わない再生モードがありますが、本プラグイ
ンが対応するのは X68Sound を使う再生モードのみです。


【データを再生出来ない場合】

ZMS/ZMD は厄介な形式で、単独で再生しても正しく再生出来ないものがあります。再生
出来ない(音が鳴らないか、鳴ってもおかしい)場合は以下を疑って下さい。

１．マーキュリーユニット対応
２．中身が MIDI である
３．内蔵音源と MIDI の両方を含む
４．内蔵音源だが事前に別のファイルを再生する必要がある

１．はよく分かりません。本プラグインが対応する再生モードでは ZMDRIVE も対応しな
いようです。

２．の場合は本プラグインでは対応出来ません。本体で MIDI として再生して下さい。
ZtoM 等の導入が必要です。

３．の場合は内蔵音源部分のみ本プラグインで再生するか、MIDI 部分のみ ZtoM 等で
MIDI に変換して本体での再生となります。

ZMDRIVE は MIDI にも対応していますが本プラグインでは未対応です。現状は MIDI 部
分は無音が再生されます。

内蔵音源と MIDI に関しては後述の zmsetup.ini に情報を記述することで、本プラグイ
ンで再生するか本体で MIDI に変換して再生するか判断することが出来ます。

４．は例えば a.zmd を正しく再生するために b.zmd を事前に再生しなければならなか
ったり、c.zpd も再生しなければならないが、a.zmd にその情報が含まれていないよう
なケースです。

このようなデータを ZMDRIVE で正しく再生するには、事前に再生すべきデータを再生し
てから再生することで実現出来ますが、本プラグインでは再生する度に ZMDRIVE を再起
動してしまうため、出来ません。

仮に出来るようにしてもプレイリスト上で連続再生するときに何かと支障が出ます。例
えばランダム再生が出来ませんし、そもそも .zpd ファイルはリストに追加すべき曲デ
ータとは言えません。

そこで、そのようなデータのフォルダに zmsetup.ini というファイルを置いて再生に必
要な初期化ファイルを記述することで対応することにしました。


【zmsetup.ini】

音源の設定をするためのファイルと演奏ファイルが分かれているものがあります。
例えば foo.zmd を再生するために bar.zmd が必要になることがあります。
ZMDRIVE では先に bar.zmd を再生してから foo.zmd を再生させなければならないよう
なデータです。

このようなデータを正しく再生するためには、演奏ファイルと同じフォルダに
zmsetup.ini というファイルを作成し、

[foo.zmd]
SetupFile=bar.zmd

のように記述します。同じフォルダにある全ての演奏ファイルが bar.zmd を必要とす
る場合は、[Default] セクションに記述することも出来ます。

例：
[Default]
SetupFile=bar.zmd


例えば、

https://web.archive.org/web/20071121130328/http://www27.tok2.com/home/studioMM/MusicRoom/msc_index.html

にある「LAST FORCE」の ZMD を正しく再生するためには、

[Default]
SetupFile=LastForce [00] SET UP.ZMD

という内容の zmsetup.ini を LastForce [00] SET UP.ZMD と同じフォルダに作成しま
す。

同様に、「Royal Squash」を正しく再生するためには

[Default]
SetupFile=RoyalSquash(YM2151) [00] SetUp_ZPD_BlockData.ZMD

という内容の zmsetup.ini を RoyalSquash(YM2151) [00] SetUp_ZPD_BlockData.ZMD
と同じフォルダに作成します。

SetupFile に指定できるファイルの拡張子は ZMD/ZMS のいずれかのみです。


同様に、再生するために ZPD ファイルが必要なのに自動的に ZPD が読み込まれないよ
うな曲データを再生するには、「SetupFile」キーではなく、「ZPDFile」キーに必要な
ZPD ファイル名を記述します。

例：
[Default]
ZPDFile=aaa.zpd

ZPDFile に指定できるファイルの拡張子は ZPD のみです。


SetupFile と ZPDFile の両方を指定しないと正しく再生出来ない曲があります。

例えば、

https://web.archive.org/web/20070811231625/http://www.xacs.jp/zmusic.html

にある「Cylips」の曲データを正しく再生するには、

[Default]
SetupFile=CY_VOICE.ZMD
ZPDFile=VA.ZPD

のように記述します。


また、「FMADPCM」キーと「MIDI」キーに記述することで対象データが内蔵音源や MIDI
を含むか本プラグインに判別させることが出来ます。

例えば対象データと同じフォルダのデータは全て内蔵音源と MIDI の両方を使用する場
合は

[Default]
FMADPCM=1
MIDI=1

のように記述します。

FMADPCM キーと MIDI キーがない場合は自動判別するようにする予定ですが現状では未
対応です。それぞれ FMADPCM=1, MIDI=0 と見なします。


圧縮ファイル内に zmsetup.ini が存在する場合にも正常に再生されます。


【既知の不具合】

・ZMDRIVE を(本プラグインを介さずに)起動中、本プラグインで開いてる曲を再生出来
　ない(演奏を停止していても)
　・ZMDRIVE のファイルオープン時の共有モードと KbMedia Player 本体の相性問題で
　　対応は困難(プラグイン側では対応不可)

【使用上の注意】

本プラグインは動作原理が極めて特殊です。ZMDRIVE は動作確認に用いたものと「全く
同じ」バージョンをお使い下さい。

動作確認した ZMDRIVE のバージョンと更新日時は

ZMDRIVE(旧版): バージョン0.4C 更新日時 2002/06/15 00:35 (本プラグインに同梱）
ZMDRIVE(新版): バージョン不明 更新日時 2018/03/16 15:03

となります。

確認しているより新しいものでも動作するかどうかは分かりません。使用する ZMDRIVE
のパスを設定時にハッシュ値をチェックし、動作確認したのと異なるものであった場合
には警告を出すようになっています。

警告を無視して動作確認したのと異なるバージョンを使うことも出来ますが、予期せぬ
結果になることがありますのでくれぐれもご注意下さい。

このプラグインは永久にα版です。自己責任で使用して下さい。

-------------------------------------------------------------------------------

【更新履歴】

Version 0.15alpha(2021/05/03)

・「ウィンドウ表示」有効時、ZMDRIVE に対するキーボード操作、右クリック、ドラッ
　グアンドドロップを受け付けないようにした(フリーズ回避)
・ループしない曲の演奏終了検出に対応
　・0.12alpha まで(処理方法は異なるが)実装していたが 0.13alpha で廃止していた
　・処理済みの位置と ZMDRIVE が表示する再生位置との差が一定値を超えたら終了と見
　　なす
　・本体の無音検出より早く検出されるので無音の再生時間が短くて済む(ZMDRIVE が正
　　しい曲長を返さない場合は特に)
・zmsetup.ini に関する設定項目追加
　・詳細は設定画面のヘルプ参照
・zmsetup.ini に MIDI キーと FMADPCM キーにより MIDI 使用か内蔵音源使用か記述可
　能にした
　・記述がない場合は自動判別とする予定(現状未対応。FMADPCM=1, MIDI=0 と見なす)
　・プラグインの設定により MIDI 使用データを本体に任せるかプラグインが再生する
　　か選択可能にした(プラグインで再生しても MIDI の音は鳴らない)
・ZMDRIVE 起動時にカレントフォルダをプラグインが作成する一時フォルダに設定する
　ようにした(エラーがあるとカレントに ZM_ERROR.ERR が作成されるため)
・タイミング次第で曲長を正しく取得出来ないことがあるのを修正(?)(まだ自信がない)

/*---------------------------------------------------------------------------*/

Version 0.14alpha(2021/05/01)

・新ZMDRIVE 使用時に関する以下の改善
　・シークが大幅に高速化
　・「ウィンドウ表示」有効時のタイトルのスクロール速度が新ZMDRIVE をプラグイン
　　を介さずに起動したときとほぼ同じになった
　・「ウィンドウ表示」有効時、ZMDRIVE を終了したときのウィンドウの位置によって
　　は ZMDRIVE が行方不明になるのを修正
　・「ウィンドウ表示」有効時、タイトル等が正常に描画されないことがあるのを修正
　・本プラグインが新ZMDRIVE を使用中だと新ZMDRIVE を起動出来ないのを修正
　・曲長が 0 のデータを開くと ZMDRIVE がフリーズするのを修正
　・再生中に ZMDRIVE のウィンドウを閉じてもフリーズしなくなった
　　・フリーズする原因は他にもあるので完全ではない
・設定画面で ZMDRIVE 2018/03/16 版のハッシュ値が間違ってた(2018/03/16版を指定し
　ても警告ダイアログを出していた)のを修正

/*---------------------------------------------------------------------------*/

Version 0.13alpha(2021/04/27)

・64bit 版作成
・内蔵 X68Sound.dll を Rururu 氏の 2020/06/14 版に更新
　・44100Hz/48000Hz の再生音が 2013/08/03 版や他所で入手可能な X68Sound.dll と
　　明らかに異なるので、気に入らない場合は他所で入手可能な X68Sound.dll を使っ
　　て下さい
・ZMDRIVE の新版に対応(動作確認したのは 2018/03/16 版)
・X68Sound.dll を内蔵ルーチンか外部 DLL を使用するか選択出来るようにした
・ZMDRIVE を旧版(同梱v0.4C) か新版か選択出来るようにした
・設定項目追加
　・X68Sound.dll のパス
　　・未指定の場合は内蔵ルーチンを使う
　　・64bit 版プラグインでも X68Sound.dll は 32bit 版でなければならない
　・X68Soundl.dll を使う
　・新ZMDRIVE のパス
　・新ZMDRIVE を使う
　・再生周波数(22050/44100/48000/62500/96000Hz)(62500と96000は新ZMDRIVEのみ)
　・音量
　・ウィンドウ表示(動作確認用)
・ZMDRIVE.exe から応答がないときにダイアログを表示して強制終了出来るようにした
・メモリリーク修正

/*---------------------------------------------------------------------------*/

Version 0.12alpha3(2016/10/03)

・v2.80beta29 のプラグイン仕様に対応(インターフェースのみ)
・インターフェースのみの対応なのでバージョン番号変更せず

/*---------------------------------------------------------------------------*/

Version 0.12alpha2(2016/08/22)

・v2.80beta23 のプラグイン仕様に対応(インターフェースのみ)
・インターフェースのみの対応なのでバージョン番号変更せず

/*---------------------------------------------------------------------------*/

Version 0.12alpha(2016/08/16)

・v2.80beta21 のプラグイン仕様に対応(インターフェースのみ)
・コンパイラを VS2015 update 3 に変更

/*---------------------------------------------------------------------------*/

Version 0.11alpha(2016/01/25)

・新プラグイン仕様に対応
・ZMDRIVE の新バージョン(2013/05/16 版が最新?)には未対応
・アーカイブ内の zmsetup.ini や zpd ファイル等にきちんと対応
・X68Sound.dll を 2013/08/03 版相当に差し替え
　・ZMDRIVE.exe が X68Sound.dll を LoadLibrary するのをフックして kbzmdrive.kpi
　　が X68Sound.dll のフリをする。そのルーチンの差し替え
　・X68Sound.dll の内部実装にも依存するため、X68Sound.dll をプラグインから切り
　　離す(kbzmdrive.kpi の修正なしに X68Sound.dll を差し替える)ことは出来ない
・本体が 2.70alpha 以降だと再生位置を戻すと演奏が止まる現象等を回避
　・ZMDRIVE.exe がファイルを開くときの共有モードと新プラグイン仕様(に伴う本体
　　の仕様変更)との相性問題
　・再生するファイルとその関連ファイルのコピーをテンポラリフォルダに作成して
　　コピーを開くことで対処
　・v0.10alpha(公開し忘れ?) の対処法は Windows10 では機能しない

/*---------------------------------------------------------------------------*/

Version 0.10alpha(2005/11/??)(公開し忘れ?)

・CreateFileA の共有モードを強制的に FILE_SHARE_READ|FILE_SHARE_WRITE にする
　ようにした
　・再生中のファイルを同時に開けない(＆2.70alpha 以降ではシークすると演奏が止ま
　　る)のを回避するため
　・MFC42.dll のバージョンによっては kernel32.dll の CreateFileA のフックが出
　　来ないため機能しない(少なくとも Windows10 では NG)

/*---------------------------------------------------------------------------*/

Version 0.09α(2005/03/15)

・曲を切り替えるとき（ファイルを閉じるとき）に落ちることがあるバグを修正
・zmsetup.ini に関する以下の修正
  ・SetupFile キーではなく、ZPDFile キーで ZPD を指定するように仕様変更
・細かい修正

/*---------------------------------------------------------------------------*/

Version 0.08α(2005/03/13)

・zmsetup.ini に関する以下のバグを修正
  ・SetupFile を指定するとフリーズすることがあるのを修正
  ・ZPD を指定しても反映されないのを修正
  ・ファイル名によっては反映されないことがあるバグを修正

/*---------------------------------------------------------------------------*/

Version 0.07α(2005/03/13)

・ZMDRIVE.exe の終了処理を修正
・ZMDRIVE.exe のプロセス優先を「高」ではなく「通常」にした
・CreateRemoteThread が使える環境（NT 系）では CreateRemoteThread を使うように
  した
・音源設定用に事前にファイルを開いておかないと正常に再生出来ないデータに対応

/*---------------------------------------------------------------------------*/

Version 0.06α(2005/03/11)

・データによっては演奏開始後直ちに演奏終了してしまうバグを修正

/*---------------------------------------------------------------------------*/

Version 0.05α(2005/03/10)

・曲長計算が高速化
・演奏終了の検出結果がタイミングに依存しなくなった
・ZMDRIVE.exe の midiOut 系 API 呼び出しを防止するようにした

/*---------------------------------------------------------------------------*/

Version 0.04α(2005/03/08)

・プロセス・スレッド間の同期処理を改良して動作が少し高速化
・ループしない曲の演奏終了を検出するようにした
・FIXER 氏（の代理人？）の許可を頂いたので、ZMDRIVE 0.4C を同梱することにした
・kmp_Config を廃止（ZMDRIVE の同梱により、パスを設定する必要がなくなったため）

/*---------------------------------------------------------------------------*/

Version 0.03α(2005/03/07)

・音とびやテンポよれを大幅に改善
・等速以外の速度でもきちんと再生されるようになった

/*---------------------------------------------------------------------------*/

Version 0.02α(2005/03/05)

・再生周波数要求に応じるようにした（48000Hz, 44100Hz, 22050Hz のみ）
・X68Sound.dll の細かいバグ（稀に演奏が始まらないことがある）を修正して
  kbzmdrive.kpi に内蔵。これにより、
  ・X68Sound.dll が導入されていなくても動作するようにした
  ・稀に演奏が始まらずにいきなり演奏終了してしまうことがあるのを修正

/*---------------------------------------------------------------------------*/

Version 0.01α(2005/03/05)

・初版

-------------------------------------------------------------------------------
Kobarin(hidkob@pb.highway.ne.jp)
http://kobarin.sakura.ne.jp/
