タイトル
記事No
投稿日
投稿者
: kbdmusic.kpi代替のMIDI再生プラグインを作成しました
: 240
: 2024/01/30(Tue) 20:20:09
: You
タイトル
記事No
投稿日
投稿者
: Re: kbdmusic.kpi代替のMIDI再生プラグインを作成しました
: 241
: 2024/01/30(Tue) 20:31:36
: You
タイトル
記事No
投稿日
投稿者
: Re^2: 修正版
: 242
: 2024/01/31(Wed) 01:30:08
: You
タイトル
記事No
投稿日
投稿者
: Re^3: 修正版
: 243
: 2024/01/31(Wed) 10:35:11
: El-halo
こんにちは。
kbGuru2SMF.kpiを試してみたのですが、
プラグイン設定のTypeがFailed to load Plug-inとなって使用不能状態になります。
本体は64bit 32bitともに挙動は同じです。
なにか必要なDLLはありますか?
Visual Studio 2015-2022 Redistributable Package 14.38.33130.0
は導入済みです。
タイトル
記事No
投稿日
投稿者
: Re^4: 修正版
: 244
: 2024/01/31(Wed) 16:46:48
: You
kbGuru2SMF.kpiはKbMedia Player Ver3系 32bit版用の演奏プラグインなので、
x86のPlayerフォルダ以下に配置してみてください。
○ kbmed312_beta\x86\Player\
× kbmed312_beta\x86\Plugins\
× kbmed312_beta\x64\Player\
× kbmed312_beta\x64\Plugins\
上記×のフォルダに配置した場合は「Failed to load Plug-in」になることを確認しています。
「Microsoft Visual C++ 2022 再頒布可能パッケージ」がインストールされていて
KbMedia Playerがエラー無く起動するなら、他にDLL等は不要です。
タイトル
記事No
投稿日
投稿者
: Re^5: 修正版
: 245
: 2024/01/31(Wed) 22:09:36
: El-halo
> ○ kbmed312_beta\x86\Player\
演奏プラグインということを失念しておりました。
上記のディレクトリに配置して、無事再生を確認しました。
タイトル
記事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 以外のプラグインで何かを再生
・プラグイン設定画面を閉じる
の後であれば再生出来るようになります。
プラグイン設定画面を閉じるとき、それまでロードしていた
プラグインのうち、その時点で使用されていないものは全て
アンロードする仕様になっています。
タイトル
記事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つしか使えない何らかのリソースを開いたままなのだと思います。
タイトル
記事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 の改変が必要になりそうです。
タイトル
記事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 の方でも試行錯誤してみます。
タイトル
記事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]の物を修正せず確定版としておきます。
タイトル
記事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 の根本的な対処方法についてはすぐには分かりませんでした。
しばらく更新さぼってましたが少しやる気が出て来ました。
タイトル
記事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 はこれからです。これからが本番。
- Web Forum v8.0 -
++ Edited by Hamel ++