一括表示
タイトル
記事No
投稿日
投稿者
参照先
DECOPLAY の MWRD プラグイン
338
2024/06/04(Tue) 22:40:27
Kobarin

DECOPLAY の MWRD プラグインを使って MIMPI WRD 対応

に挑戦しています。今までも何度もプラグイン SDK を眺めては絶望して何もしない
で諦めていました。

今回は何とかなりそうな気がしたので再挑戦しています。
ウィンドウや設定画面を表示するところまでは出来たのですが、その先に進めず
また挫折しそうです。画面が真っ黒のまま再生が始まってくれない。

もしかしたら手元にある SDK(2.2/2.3) が新し過ぎるせいなのかもしれないです。
古いSDK(2.2/2.3 より古いもの) が見てみたいけどインターネットアーカイブで
探しても見つけることが出来ません。DECO さんのサイトに行っても SDK や
プログラムはニフティに置いてたみたいで辿り着くことが出来ませんでした。

v2.2/2.3 の SDK では DpwDef.h の EXT_ID_WINDOW の値が 6 ですが、この値が
5 になってる SDK が欲しいです。

MWRD プラグインが返すのは 5 になっています。

もしかしたら 6 と同じ扱いで良いのかもしれませんが、MWRD プラグインの
ドキュメントを読むと DECOPLAY 1.2 の当時の SDK で作られてるようです。

プラグインを作る場合には最新の SDK だけ見れば良いですが、プラグインを使うと
なるとそうも行かないのですよね。使いたいのは MWRD のプラグインだけですし。
他のプラグインはやるとしても MWRD の後です。ちなみに SWRD のプラグインも 5
を返します。

それか、むしろ手元にある MWRD プラグインが古すぎるとか?(v1.4)

ちなみに DECOPLAY の MWRD プラグインは

http://cgi.members.interq.or.jp/ox/izu/

こちらにあります。20年以上ほぼ管理されていないっぽいにも関わらず未だサイトが
消滅せず、掲示板には20年以上前の私の恥ずかしい書き込みが今も残っています。
戸上山さんに MWRD 再生ライブラリみたいなのを作って欲しくて書いたんですけどね。

20年以上もの間 SPAM に荒らされることもなく残ってるというのは凄いことのような
気がします。もしかして管理されてるのだろうか。
pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re: DECOPLAY の MWRD プラグイン
339
2024/06/05(Wed) 19:50:15
Kobarin

SWRD プラグインの方は映像が動くように出来ました。

肝心の MWRD がまだですが、真っ黒のまま何も再生されないのは解消されたので
少し前進しました。

まだ何とも言えませんが古い SDK はなくても大丈夫かもしれません。

念願の MWRD 対応が現実味を帯びて来た感じです。

自力で対応出来ないので SWRD や NWRD みたいにウィンドウの大きさを自由に
変えられないのが難点ですが…。
pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^2: DECOPLAY の MWRD プラグイン
341
2024/06/08(Sat) 01:25:00
Kobarin

やっぱり挫折しそうです。

DPWSWRD.DPX の方では SWRD を最後まで表示出来るのですが、肝心の DPWWRD.DPX の
方は最初の1~2秒だけそれっぽい表示がされるだけ。

DECOP のサンプルプラグインを VS2022 でビルドして DECOP の動作(プラグインに
対して何をするか、DECOP が公開している変数がどうなってるか等)を確認してみた
けど、サンプルプラグイン自体が正常に動作しないし、なんか DECOP の挙動が変な
んですよね。

DPWSWRD.DPX で SWRD 再生出来たときはついに念願の MWRD 対応実現出来るかも、と
思いましたが、まだのようです。


もう少し調べてみてどうしても分からなかったらテストプログラムとそのソースを
公開するので、誰か協力して欲しいです。
pagetop
タイトル
記事No
投稿日
投稿者
参照先
MWRD 対応協力者(開発者)募集
342
2024/06/10(Mon) 20:33:32
Kobarin

DECOPLAY(以下、DECOP) のプラグインを使用しての MWRD 対応、色々試してみました
がやはりうまく行きません。

SWRD の再生が出来てあと一歩と思ったのですが、その後ほとんど進展していません。
なんかもうお手上げと言う感じです。

https://kobarin.sakura.ne.jp/test/kbrundpx_20240610.7z

こちらにテストプログラムのソースコードを置いておきます。
ソースコードのみですので、開発者でない方はダウンロードしても無意味です。

このテストプログラムで MWRD を最後まで再生させる方法を教えて頂けませんか。

http://cgi.members.interq.or.jp/ox/izu/

こちらで DPWMWRD.DPX と DPWSWRD.DPX、および DECOP がダウンロード出来ます。

MWRD の再生には DPWWRD.DPX が必要ですがまだ動作しません。

DPWSWRD.DPX があれば SWRD の再生は出来ます。GuruGuruSMF4.DLL を使った簡易
MIDI プレイヤーで再生するとタイミングもばっちりです。
(途中でテンポが変わるデータはタイミングがずれるかもしれないです)

DECOP はテストプログラム自体の動作には必要ありませんが、本テストプログラム
に同梱の DECOP のサンプルプラグインの動作確認に必要です。

サンプルプラグインを DECOP 上で動作させるとなんか変です。うまく説明出来ません
が、テストプログラムの動作結果と辻褄が合わない感じがするのですよね。

SWRD を再生出来たのは良いけど、その為にしたこととも矛盾してるんですよね。
pagetop
タイトル
記事No
投稿日
投稿者

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

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

状態確認用にプラグインを作成したりもしましたが、すぐに把握できる規模ではありませんね…
これはちょっと今は手が出せません。
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^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^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^5: MWRD 対応協力者(開発者)募集
347
2024/06/18(Tue) 02:25:41
Kobarin

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

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

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

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

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

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

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

もっと色んなデータでテスト出来るように本体と連携出来るようにします。
かなり希望が見えて来た気がします。
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^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^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^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^10: MWRD 対応協力者(開発者)募集
354
2024/06/21(Fri) 22:39:31
Kobarin

v3.15beta を公開後、DECOP+DPWWRD.DPX や TMIDI、WFP と比べて明らかに表示
がずれるデータがあることに気づきました。

MIDI データを調べると途中で拍子情報が何度か変わるもので、DPWWRD.DPX は
hpDataTop32 の拍子情報も参照してることが分かりました。

このデータは動作確認中何度も再生していたのですが、むしろ hpDataTop32 に拍子情報を
含めない方がタイミングがばっちり合ってしまう(だから気づかなかった)のですよね。
なので修正すると前よりむしろタイミングがずれてしまうのですが、他のソフトと比べて
ずれるのは良くないので。

本家の MIMPI で再生するとどうなるのかは分かりません。

WFP の MIMPI WRD 設定の「拍子変更を無視する」とか「拍子変更時の動作を真似る」を
変えたら v3.15beta と同じタイミングになることを期待しましたが、そうはならない
ようでした。
pagetop

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