新着表示
タイトル
記事No
投稿日
投稿者
参照先
Re^7: kbdmusic.kpi代替のMIDI再生プラグインを作成しました
254
2024/02/26(Mon) 01:26:37
Kobarin

> 記憶が定かではありませんが、CoInitializeEx(NULL, COINIT_MULTITHREADED) すると動作
> しなくなる機能があったのでそういう仕様にしたのだと思います。
> 本体と kbrunkpi のソースコードを確認するとわざわざ COINIT_MULTITHREADED をコメントアウト
> して COINIT_APARTMENTTHREADED にしていました。

試しに本体と kbrunkpi 側で COINIT_MULTITHREADED に変更してみました。

kbdmusic.kpi、kbGuru2SMF.kpi の切り替えは問題なく動作するようになりましたが今度は
kbviv.kpi が動作しなくなります。


結局本体は COINIT_APARTMENTTHREADED(STA) と COINIT_MULTITHREADED(MTA) のどちらで
CoInitializeEx しておくべきなのか分からないので、kbdmusic.kpi と kbviv.kpi に
ついては本体がどちらを呼んでいても(どちらも呼んでなくても)動作するように作り直そうと
思います。

kbviv.kpi については STA/MTA どちらでも動作するように修正出来ました。
kbdmusic.kpi はこれからです。これからが本番。
pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^6: kbdmusic.kpi代替のMIDI再生プラグインを作成しました
253
2024/02/25(Sun) 13:55:11
Kobarin

検証ありがとうございます。

本体や kbrunkpi.exe でプラグインの API を呼ぶスレッドでは最初に
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED) を呼び出してるので、COINIT_MULTITHREADED
である必要があるプラグインはプラグイン自身でスレッドを作成し、その中で CoInitializeEx を
呼び出す必要があります。

記憶が定かではありませんが、CoInitializeEx(NULL, COINIT_MULTITHREADED) すると動作
しなくなる機能があったのでそういう仕様にしたのだと思います。
本体と kbrunkpi のソースコードを確認するとわざわざ COINIT_MULTITHREADED をコメントアウト
して COINIT_APARTMENTTHREADED にしていました。

原因が分からなかったので対症療法ですね。
ここらへんも含めてもう一度調査してみます。

そういう訳で、kbdmusic.kpi で CoInitialize を呼んでないのは、本体が呼んでいることを
想定しているからで、きちんとやるなら自身でスレッドを作成してその中で CoInitialize
すべきでした。

kbGuru2SMF.kpi の MIDI 再生機能はとても魅力的なので kbdmusic.kpi に取り込みたいと
考えています。

kbGuru2SMF.kpi だけでなく GuruGuruSMF4.dll のソースの方も眺めてみましたが
MIDI の根本的な対処方法についてはすぐには分かりませんでした。

しばらく更新さぼってましたが少しやる気が出て来ました。
pagetop
タイトル
記事No
投稿日
投稿者

Re^5: kbdmusic.kpi代替のMIDI再生プラグインを作成しました
252
2024/02/18(Sun) 01:45:06
You
kbGuru2SMF.kpi → kbdmusic.kpi の切り替え後に再生できない現象は、KbDMusicPlayer::Open() の
CoCreateInstance(CLSID_DirectMusicLoader, NULL, CLSCTX_INPROC, IID_IDirectMusicLoader8, (void **)&m_pDML);
がエラー「0x800401F0 : CoInitialize は呼び出されていません。」になるため発生します。
CoInitializeEx と CoUninitialize の呼び出しを追加したのは、このエラーに対応するためです。


数種類のkpiファイルを用意し、64bit版の本体で切り替えて再生できるかの確認をしました。
A : オリジナルの kbdmusic.kpi
A': A のコピー
B : CoInitializeEx と CoUninitialize の呼び出しを追加した kbdmusic.kpi
B': B のコピー
C : kbGuru2SMF.kpi
C': C のコピー

・切り替えのパターン(9種)
[A → A'][A → B][A → C]
[B → A][B → B'][B → C]
[C → A][C → B][C → C']

・結果
OK: [A → A'][A → B][A → C] [B → B'][B → C] [C → B][C → C']
NG: [B → A] [C → A]

kbGuru2SMF.kpi からの切り替え時に限らず kbdmusic.kpi で再生できない現象が発生しました。
初回の kbdmusic.kpi での再生は成功することから、kbrunkpi.exe での
CoInitializeEx と CoUninitialize の呼び出しのタイミングや対称性が影響するのかも?
と予想しますが、これ以上は調査が難しいです。

kbGuru2SMF.kpi 固有の現象ではなさそうですので、記事No[242]の物を修正せず確定版としておきます。
pagetop
タイトル
記事No
投稿日
投稿者

Re^4: kbdmusic.kpi代替のMIDI再生プラグインを作成しました
251
2024/02/07(Wed) 20:29:08
You
MIDIについては概要しか知らないので詳しい話はできませんが、
本体側に kbdmusic.kpi のためのハックが有ってGS音源用データでもいくらかマシになっているのですね。
kbGuru2SMF.kpi でもMIDIデータ製作者の想定とは違う音色になっている可能性は否めませんが、
RPGツクールやWOLF RPGエディター用のBGMをゲーム内と同様の音質で聴きたいと言う動機で作成したので良しとしています。

kbdmusic.kpi のシーク・ポーズ・再開・テンポ変更の実装には、演奏時間の計算にも手を入れる必要が有りそうですね。
ボリューム変更は一応下記コードで動作しますが、min = -3000 の根拠が無くどの動作環境でも適用できるか不明です。
void WINAPI KbDMusicPlayer::SetVolume(int Volume)
{
//// TODO: 音量0の時のminの値を調査
// Volume は 0 ~ 100
long min = -3000;
long max = 0;
long range = labs(max - min);
long vol = min + range / 100 * Volume;
m_pDMP->SetGlobalParam(GUID_PerfMasterVolume, &vol, sizeof(long));
}

kbGuru2SMF.kpi → kbdmusic.kpi の切り替え後に再生できない件は、
KbDMusicPlayer のコンストラクタで CoInitializeEx(NULL, COINIT_MULTITHREADED); を実行
KbDMusicPlayer のデストラクタで CoUninitialize(); を実行することで
本体が32bit版と64bit版のどちらでも発生しなくなることを確認しています。
ただ、これで解消する根拠が断定できないので、kbGuru2SMF.kpi の方でも試行錯誤してみます。
pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^3: kbdmusic.kpi代替のMIDI再生プラグインを作成しました
250
2024/02/04(Sun) 15:39:58
Kobarin

> 本体が32bit版の場合は、kbGuru2SMF.kpi の %Kbmplay% セクションの
> 「別プロセス経由で使用」を true にすれば特別の操作なしに
> kbdmusic.kpi と kbGuru2SMF.kpi を切り替えられるようになります。

kbGuru2SMF_module.cpp の 20行目

static const DWORD kbGuru2SMF_MultipleInstance = KPI_MULTINST_ONE;
(wchar_t になってましたが DWORD ですね)



static const DWORD kbGuru2SMF_MultipleInstance = KPI_MULTINST_ZERO;

に変更すれば、ユーザーがこのような設定をしなくても、本体が 32bit 版で
あれば kbdmusic.kpi との切り替えも問題なくなる筈です。

ただ、デバッグ中は KPI_MULTINST_ONE の方がデバッグしやすいと思います。

本体が64bit版の場合はこれだけでは解決しません。
本体側で対処することも出来なくはありませんが、それよりは、プラグイン側で
演奏停止時に何らかのリソースを開いたままになってる(と思われる)のを閉じ
るなどの対処をすべきかと思います。

GuruGuruSMF4.dll のソースコードをざっと眺めた感じでは
KPI_MULTIINST_INIFITE にするのは無理そうですね。
dll の改変が必要になりそうです。
pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^2: kbdmusic.kpi代替のMIDI再生プラグインを作成しました
249
2024/02/04(Sun) 15:16:17
Kobarin

> kbGuru2SMF.kpi で MIDI を再生後、
>
> ・kbGuru2SMF.kpi 以外のプラグインで何かを再生
> ・プラグイン設定画面を閉じる
>
> の後であれば再生出来るようになります。

本体が32bit版だと駄目みたいですね。

本体が32bit版の場合は、kbGuru2SMF.kpi の %Kbmplay% セクションの
「別プロセス経由で使用」を true にすれば特別の操作なしに
kbdmusic.kpi と kbGuru2SMF.kpi を切り替えられるようになります。

本体が 64bit 版だとこの方法ではうまく行きません。
プラグイン設定画面を閉じるしかないです。

原因は何となく分かりましたがうまく説明出来ません。
同一プロセス内で kbGuru2SMF.kpi と kbdmusic.kpi を共存
して使用することが出来ないということです。

本体で対処すべき問題かどうか、と言われると微妙です。

kbGuru2SMF.kpi を使用すると、再生を停止しても同一プロセス内で
1つしか使えない何らかのリソースを開いたままなのだと思います。
pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re: kbdmusic.kpi代替のMIDI再生プラグインを作成しました
248
2024/02/04(Sun) 14:12:46
Kobarin

ありがとうございます。
Player プラグインに対応してくれた方は初めてです。
kbdmusic.kpi より良い感じで MIDI を再生出来ますね。

> ・kbdmusic.kpiで音色が欠落するGSやXG音源向けのデータでも(多分)正常に再生可能

実は kbdmusic.kpi を使用するときは本体が

「演奏2」->「MIDI」->「Ignore BankSelect」

相当の処理を施したデータを kbdmusic.kpi に渡しているのです。
そうしないと多くの GS データでまともに音が鳴らないので。

この処理を施すかどうかはプラグインのファイル名だけで判定しているので、
例えばファイル名を _kbdmusic.kpi などにすれば余計なことはしないで
再生出来ますが、まともに再生出来るデータはほとんどありません。

本当はプラグイン側でその処理を施すべき(設定出来るようにすべき)
なんですけどね。


本プラグインのソースコードを参考にすれば kbdmusic.kpi でもシークなど
にも対応出来るようになるかもしれませんね。


kbGuru2SMF.txt の

>【既知の不具合】
>
> ・kbGuru2SMF.kpi で MIDI ファイルを再生後、kbdmusic.kpi に切り替えると再生出来ない。

直接の原因は分かりませんが、kbGuru2SMF.kpi をアンロードすると
再生出来るようにはなりますね。

今の本体の仕様だとそれを明示的に行うことは出来ませんが、

kbGuru2SMF.kpi で MIDI を再生後、

・kbGuru2SMF.kpi 以外のプラグインで何かを再生
・プラグイン設定画面を閉じる

の後であれば再生出来るようになります。

プラグイン設定画面を閉じるとき、それまでロードしていた
プラグインのうち、その時点で使用されていないものは全て
アンロードする仕様になっています。
pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re: scdファイルを再生するには
247
2024/02/04(Sun) 14:11:00
Kobarin

返事遅くなりすみません。

> タイトルの通り、kbm Playerで拡張子"scd"の音楽ファイルを再生する方法をご存知の方がいましたらご享受願えますと幸いです。

拡張子 .scd が何のファイル形式なのか私も知りません。
Super Audio CD でしょうかね。
pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re: kbvgmでは再生できないvgm
246
2024/02/04(Sun) 14:09:42
Kobarin

返事遅くなりすみません。
不具合報告ありがとうございます。

> kbvgm.kpi 0.12を使用してvgmデータを再生していたのですが
> 参照先で配布しているvgmデータが再生できませんでした。
> kbwinamp 0.17α+in_vgm v0.51.1
> を使用すると再生できました。

01_Prelude.vgm から 21_Ending.vgm まで全て試してみましたが
全て再生できました。

再生結果が kbwinamp+in_vgm と違うということでしょうか。

> 上のデータはAY-3-8910+YM2413を使用しているので
> 複数の音源を使用したデータがまずいのかと思いましたが、試した限りにおいて他のデータでは再生可能でした。

プラグイン設定の

EmulationCore セクションの AY8910 と YM2413
(どちらかが Disbaled になっている)

が怪しい気がしますがどうでしょうか

少なくともご指摘頂いたデータでは General セクションの yrw801.rom は
関係ないようです。
pagetop
タイトル
記事No
投稿日
投稿者

Re^5: 修正版
245
2024/01/31(Wed) 22:09:36
El-halo
> ○ kbmed312_beta\x86\Player\
演奏プラグインということを失念しておりました。
上記のディレクトリに配置して、無事再生を確認しました。
pagetop

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