新着表示
タイトル
記事No
投稿日
投稿者
参照先
KbMedia Player Version 3.15beta.2024.0621
352
2024/06/21(Fri) 00:26:50
Kobarin

https://kobarin.sakura.ne.jp/test/kbmed315_beta.exe
https://kobarin.sakura.ne.jp/test/kbmed315_beta.7z

.exe と .7z はどちらも中身は同じです。
.7z の展開の仕方が分からない方は .exe をダウンロードして下さい。

.exe だと Microsoft Edge でブロックされる方は .7z をダウンロードして下さい。
Microsoft Edge にブロックされる方は安全だと報告してくれると助かります。

起動時にエラーメッセージが表示されてプラグインが認識されない場合は
Microsoft Visual C++ 2022 再頒布可能パッケージが必要です。
https://visualstudio.microsoft.com/ja/downloads/#other-ja-family
x64 版ランタイムファイル直リンク
https://aka.ms/vs/17/release/VC_redist.x64.exe
x86 版ランタイムファイル直リンク
https://aka.ms/vs/17/release/VC_redist.x86.exe
(x64 版の動作には vc_redist.x64.exe と vc_redist.x86.exe の両方が必要です)

VS2019 のランタイムでも動作はするようですが、念のため VS2022 のランタイムを
入れて下さい。

β版は Windows XP のサポートを打ち切りました。XP 環境だと一部のプラグインが
動作しません。Windows XP で使いたい方は正式版をお使い下さい。


v3.15beta での変更点

・各種プラグイン/DLL の開発環境を VS2022 17.10.3 に更新
・MIMPI WRD(*.wrd) に対応
 ・DECO さん制作「DECOPLAY」の MIMPI WRD 再生プラグイン「DPWWRD.DPX」(戸上山さ
  ん制作)を使用
  ・http://cgi.members.interq.or.jp/ox/izu/
 ・「ツール」->「環境設定」->「MWRD」で DPWWRD.DPX のパスを設定
  ・既定では DPWWRD.DPX は DECOPLAY のインストールフォルダから検索
  ・HKEY_LOCAL_MACHINE\SOFTWARE\Deco\Decoplay for Windows\ExeDir
   から DPW.EXE のパスを取得、同じフォルダ内の DPWWRD.DPX
 ・DPWWRD.DPX のパス以外の設定も本体の環境設定画面で行えるようにする予定だが未
  実装
  ・現状はウィンドウを右クリック->「設定」で表示されるダイアログで設定
 ・DPWWRD.DPX の設定は以下のレジストリに保存(DECOPLAY とは異なる場所)
  ・HKEY_CURRENT_USER\Software\Kobarin's Soft\KbMidi Player\Dpx\DpwWRD\
 ・「最大化」「最小化」「閉じる」ボタンは無視される
  ・「最大化」と「最小化」はレジストリを直接編集しても無視
 ・以下の設定は無視される(常に無効、レジストリを直接編集しても無視)
  ・640x400画面を使う
  ・GiveIO を使う
  ・DPEV_STEP16を使う(時間の進み方がおかしくなる、有効化しても次回再生時に無
   効に戻す)
 ・拡張子.dv/.dvs を MWRD として扱うようにした(DPWWRD.DPX が対応している為)
・WRD(MWRD/SWRD/NWRD) に関する以下の修正
 ・「表示」->「WRD」のチェックが有効時は WRD を再生/無効時は WRD を再生しない
  ように仕様変更
  ・今まではウィンドウが閉じられて非表示になったときに表示させるだけで、内部
   では常に再生していた
 ・本体がフォーカスを持っていなくても WRD を表示&再生するようにした
  ・「表示」->「WRD」が無効時は再生しない
  ・今まではフォーカスがないときは表示しなかった(内部では再生していた)
・kbmod.kpi に関する以下の修正
 ・libopenmpt を 0.7.8(2024/06/09) に更新
・kbGuru2SMF.kpi に関する以下の修正
 ・GuruGuruSMF4.dll に関する以下の修正
  ・64bit 版の本体から使うと再生中 DDE がまともに機能しなくなるのを修正
   ・関連付け起動時にファイルを開くまで異常に時間がかかる等
 ・設定画面のヘルプを修正


You さんの協力のおかげで MIMPI WRD に対応することが出来ました。
まだやるべきことが残っていますが、それなりに完成度が上がって来たので一先ず
公開することにします。

DECOP + DPWWRD.DPX の組み合わせと再生結果が異なるものがあったら教えて下さい。
試した限りでは大丈夫そうです。

DV2WRD32.DLL が必要なデータは手元に1つしかありませんが、再生が出来ることは
確認しました。同一フォルダに .wrd がなくても .dv か .dvs があれば再生出来ます。


「表示」メニューの「WRD」の仕様変更により、「WRD」のチェックが入っていないと
WRD は表示されませんので注意して下さい。

今までは表示/非表示を切り替えるというより、非表示状態だったのを表示させるものでした。

本バージョンからは「WRD」のチェックマークを外すと WRD データを再生しません。
WRD を含む曲データを BGM として連続再生したい場合などはチェックを外して下さい。


あと SWRD/NWRD でもそうでしたが、WRD データの長さが MIDI の曲長より長いと最後が
再生されません。

midiOut で再生したときのみ、MIDI の方の演奏が終わっても 5 秒程度時間が進むように
してありますので MIDI より 5 秒長い程度までなら最後まで再生されます。

最後のノートオン/オフより後の MIDI イベントを捨てる仕様になっている為、このような
動作になってしまいます。

いずれ対応したいと考えていますが意外と難しいです。


今回の MWRD 対応のせいで、もしかしたら 32bit 版の kbrunkpi.exe がウイルス対策ソフト
に誤検知されやすくなったかもしれません。

再生に必要な WRD 関連ファイルの取得の為、 DPXWRD.DPX の CreateFileA という API
の呼び出しをフックする為です。

他にも LoadLibraryA とレジストリアクセス関係の API もフックします。

CreateFileA のフックはアーカイブ内の MWRD を再生する場合に WRD の内容を本体側では
調べず、再生に必要なものだけを展開して対応するようにする為に必要です。

データによっては .COM や .EXE を開きに来るようですが PC98 用に作られたこれらの
実行ファイルを DPWWRD.DPX がエミュレートするんでしょうか。
(そのデータのアーカイブには .COM も .EXE も含まれてはいませんでした)
pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^9: MWRD 対応協力者(開発者)募集
351
2024/06/19(Wed) 23:16:24
Kobarin

hpDataTop32 の詳細は分かりませんが、DPWWRD.DPX が見てるのは各 MIDI イベントの
Tick 値のようです。エンドオブトラックの値だけでも良いことが分かりました。

要するに曲の長さですね。

見てるとしてもセットテンポ(0x51)と拍子(0x58)のメタイベントとデルタタイムだけ
だろうと思ってましたが、デルタタイムだけのようです。そもそもセットテンポは
入ってないっぽい。

hpDataTop32 に入ってるデルタタイムは累積値のようです。

hpDataTop32 は曲データに対して16の倍数でそれなりに大きなサイズになりますが、
DPWWRD.DPX に見せる分には 16 バイトあれば十分なのが分かりました。

hpDataTop32 は関係ない曲データのものでもほとんど問題なく再生出来てしまうの
ですが、途中で再生が止まってしまうデータがあったんですよね。

4分くらいの曲データの hpDataTop32 を使っても 20分の曲が最後まで再生出来てたり
するのは TimeBase が違うからだったんですね。

そういう訳で hpDataTop32 の件は無事に解決出来たっぽいです。

曲の長さを見るなら m_pSongProp->dwTime の方にしてくれてたらこんなに苦労しな
かったのに…。
pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^8: MWRD 対応協力者(開発者)募集
350
2024/06/19(Wed) 00:45:00
Kobarin

> 解決に繋がりそうで何よりです。

とても助かりました。

お蔭様で本体との連携もうまく行って手元の最新版では MWRD を再生出来るように
なりました。アーカイブ内の曲データにも対応、64bit 版の本体でも動作します。

kbrundpx.exe の処理は kbrunkpi.exe の 32bit版に組み込むことにしました。


まだ調査が十分ではありませんが、hpDataTop32 は関係ない MIDI データのものを
使っても問題なく再生出来てしまう感じがします。

セットテンポメタイベントを複数回使うデータのタイミングが合いませんでしたが
m_pPlayStat->dwTempoTime/dwTempoTick を参照してるようで、適切な値を入れる
ようにしたら解決出来ました。hpDataTop32 は関係ありませんでした。

関係ない曲データの hpDataTop32 を使用して色々試していますが、今のところ正常に
再生出来ないデータが見つかりません。

適当に作成した MIDI から生成した hpDataTop32 のバイナリデータをリソースにする
かファイルとして同梱するだけで良かったりしたら楽なんですが…。

hpDataTop32 を DPW.EXE から取得するのはパフォーマンスを考えても出来れば
避けたいです。

> もう必要ないでしょうが、テストプログラムを一部修正したので添付します。
> プラグインの拡張子が .DPX ではない場合、設定画面を表示できない等の現象が発生するようです。

本当に何度も協力して下さってありがとうございます。
右クリックに気づいてないのかと思ってましたが設定画面が出なかったんですね。
pagetop
タイトル
記事No
投稿日
投稿者

Re^7: MWRD 対応協力者(開発者)募集
349
2024/06/18(Tue) 21:06:53
You
解決に繋がりそうで何よりです。

hpDataTop32 の仕様はさすがに私にはどうしようもないですね。
仕様が出ていたとしても NIFTY SERVE だったのではないでしょうか。
解析するなら自前で単純なMIDIファイルを作ってみて…でしょうか?

ちゃんとしたデータを設定したいなら DPW.EXE から取得するのかなとは私も考えていました。
・hpDataTop32 取得用のプラグインを作成し、プロセス間通信や共有メモリで kbrundpx.exe に送信する
・DPW.EXE から ReadProcessMemory() 等を使用して直接読み取る

ReadProcessMemory() は対象のアドレスが変動するかもしれないので、プラグイン方式でしょうかね。
・kbrundpx.exe で共有メモリ1を確保して「DPW.EXE "****.mid"」を起動
・プラグインの dpxChangeSong() がコールされたら共有メモリ2を確保して hpDataTop32 を設定
・kbrundpx.exe で共有メモリ2を読んだらプラグインで dpxCmdExit() をコール
※共有メモリ1は同期用のイベントハンドル等通知用、共有メモリ2は hpDataTop32 のデータ設定用
※パイプで hpDataTop32 を送信するのも有り?


もう必要ないでしょうが、テストプログラムを一部修正したので添付します。
プラグインの拡張子が .DPX ではない場合、設定画面を表示できない等の現象が発生するようです。

(272KB)

pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^6: MWRD 対応協力者(開発者)募集
348
2024/06/18(Tue) 19:15:09
Kobarin

hpDataTop32 の仕様が分かればそれに越したことはありませんが、最悪分からなくても
DPW.EXE から取得することが出来ます。

出来れば DPW.EXE は介さずに DPWWRD.DPX だけを使用したいですけど。

なので、ここまで来れば原理的には MWRD に対応出来ると思います。
You さんのおかげで何とかなりそうです。本当にありがとうございます。
pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^5: MWRD 対応協力者(開発者)募集
347
2024/06/18(Tue) 02:25:41
Kobarin

> dpxGetEventEx で DPEV_STEP16 を返す頻度で再生の進み方が変わる感じですね。

これはプラグインの設定で DPEV_STEP16 を使うのチェックを入れてたからのようです。
チェックを外せば試したデータではタイミングもバッチリですね。

ちなみに DPWWRD.DPX の設定画面はウィンドウ上で右クリックメニューからです。

演出くんメカを使うデータはフォントも設定しておかないとひらがなとかを表示
出来ないみたいです。

演出くんメカコマンドを有効に

のチェックを外せばフォントを設定しなくても表示されます。

関係ない曲データの hpDataTop32 と dwDataLen を使っても見かけ上は問題なく
表示されてるっぽい。

もっと色んなデータでテスト出来るように本体と連携出来るようにします。
かなり希望が見えて来た気がします。
pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^4: MWRD 対応協力者(開発者)募集
346
2024/06/18(Tue) 02:19:13
Kobarin

ありがとうございます。

こんなやり方があるんですね。流石です。

m_pSongProp->dwDataLen
m_pSongProp->hpDataTop32

NULL でも落ちなかったから無関係だと思ってましたがこの2つが関係してそうですね。
dwDataLen は hpDataTop32 のサイズのようです。なのでどちらも 0 なら落ちません。

試しに hpDataTop32 の中身をファイルにダンプしてそれを kbrundpx.exe で読み込ませると
時間の進み方はおかしいですが、最後まで表示することが出来ました。
サイズだけ確保しておいて hpDataTop32 の中身をゼロクリアすると再生が進みません。

dpxGetEventEx で DPEV_STEP16 を返す頻度で再生の進み方が変わる感じですね。

hpDataTop32 は開いてる MIDI データによって変わりますが MIDI データそのものとは
違うようです。この仕様が分かれば対応出来るかもしれませんが非公開では難しいかも
しれません。プラグインが参照してるなら公開されてた時期があるのかな。

おかげでかなり前進しましたが、逆に対応が難しいことが分かった気もします。
hpDataTop32 の仕様を解析しなければならなそうなので。

デルタタイムと MIDI イベントを並べたもののような感じがしないでもないですが…。
私の解析力では無理かもしれない…。

まだタイミングは出鱈目ですが、一応最後まで表示出来るようにはなったので、本体と
kbrundpx.exe を連携出来るようにして色々なテストデータで試せるようにしてみるかな。

もう少し頑張ってみます。ここまで来たら何とか対応させたい。
pagetop
タイトル
記事No
投稿日
投稿者

Re^3: MWRD 対応協力者(開発者)募集
345
2024/06/18(Tue) 00:27:24
You
古いSDKは多分構造体のいくつかのメンバが Reserved に戻っているだけのような気がしますね。

参考になるか分かりませんが、こちらで作成したテスト用プラグインを添付しておきます。
(DPW.EXE や *.DPX, *.DLL の転載要件を満たしていませんが、テスト用なのでご容赦を…)

このプラグインは、内部で DPWWRD.DPX をロードして独自に作成した CDpx を渡して動作させる物です。
DPWWRD.DPX に渡す CDpx はSDK(2.2)の物ですが、DPWWRD.DPX は正常に動作しているように見えます。

DPW.EXE に返す idExtension を 5 にしてみたりもしましたが DPWWRD.DPX の動作は特に変わりません。

DpwWrdProxy.cpp と CDpxProxy.cpp を見てもらえば大体わかると思います。
CDpxProxy にロギングを仕込めば値を追跡したり出来そうですが、そこまでは手が回りませんでした。

(271KB)

pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^2: MWRD 対応協力者(開発者)募集
344
2024/06/17(Mon) 19:12:47
Kobarin

ありがとうございます。

私も VC6 でのビルドは試していました。
サンプルプラグインを動かした結果から、もしかして開発環境の違いのせいで
プラグイン <=> DECOP 相互の API を正しく呼べてないのかもしれないと思ったので。
ですが、VS2022 でビルドしたときと動作は変わりありませんでした。

プラグインの仕組みはある程度理解出来ました。 むしろ他のプラグインより MWRD/SWRD
のプラグインを動かすのが最も簡単そうに思えるくらいなのですが、何をきっかけにして
再生が始まるのかが未だに理解出来ません。

サンプルプラグインを動かした結果が絶望的に意味が分からないんですよね。
なぜこの動作で MWRD/SWRD が再生出来るのかが…。

諦めようかとも思うのですが、SWRD を再生出来てしまったせいで諦めきれません。

関係ないのかもしれないけど DECOP 1.2 の頃の SDK を見てみたい。
DPWWRD.DPX と DPWSWRD.DPX の _ExtProp::idExtansion の値が 5(SDK では 6) なのが
とても気になります。

サンプルプラグインで値を 5 にしても特に何も変わりない気がするので
DECOP 側でプラグインに対して何かしてるということもなさそう。
pagetop
タイトル
記事No
投稿日
投稿者

Re: MWRD 対応協力者(開発者)募集
343
2024/06/17(Mon) 00:51:01
You
とりあえず触ってみて、テストプログラムの画面が最初の文字が出ただけで変化しないことと、
ちゃんと動くようにするのが大変そうだなと言う事は確認しました。

DPW.EXE は古いプログラムなので、WinXP&VC++6.0の開発環境を作って
テストプログラムをビルドしてみましたが、結果は同じでした。

状態確認用にプラグインを作成したりもしましたが、すぐに把握できる規模ではありませんね…
これはちょっと今は手が出せません。
pagetop

- Web Forum v8.0 -
++ Edited by Hamel ++