一括表示
タイトル
記事No
投稿日
投稿者

kbdmusic.kpi代替のMIDI再生プラグインを作成しました
240
2024/01/30(Tue) 20:20:09
You
未完成のkbdmusic.kpiに代わって、DirectMusicでMIDIファイルを快適に再生するために
GuruGuruSMF4.dllを使用してDirectMusicでMIDI再生するプラグインを作成してみました。

kbGuru2SMF.kpiの機能
・DirectMusicを使用してMIDIデータを再生する
・ボリューム設定に対応
・再生速度の設定に対応
・シークに対応
・一時停止からの再開に対応
・kbdmusic.kpiで音色が欠落するGSやXG音源向けのデータでも(多分)正常に再生可能
・kbdmusic.kpiで2ループ目以降が無音になる、CC#111がTick=0に有るデータも正常に再生可能
・kbdmusic.kpiに比べてリバーブが弱い
・DLSファイルには未対応

kbGuru2SMF.kpi は kbdmusic.kpi のソースを基にして作成しました。
配布サイトを設置する予定は有りません。
添付ファイルのバイナリ・ソース共に自由に利用してください。

添付ファイルはVirusTotalでウィルスチェック済みです。
kbGuru2SMF.zip https://www.virustotal.com/gui/file/7008bfa56383d113bd15df5f5229024e0a78c59355750a4f1146428e2fe5c8dc
kbGuru2SMF_src.7z https://www.virustotal.com/gui/file/bdbc9ded78f4cbbfb4bc5f219ef716448677be1d6bfe76253c3957177e0f2f4a

(138KB)

pagetop
タイトル
記事No
投稿日
投稿者

Re: kbdmusic.kpi代替のMIDI再生プラグインを作成しました
241
2024/01/30(Tue) 20:31:36
You
VirusTotalでkbGuru2SMF.kpiのみをチェックした場合、1件誤検知されるようです。
https://www.virustotal.com/gui/file/ec0749e359619e235b31a1fec11f47418e273036bb7b5ef38a70a5129411d9dc

ローカルの開発環境でチェックしても検出されませんが、心配ならソースからビルドしたものをご利用ください。
pagetop
タイトル
記事No
投稿日
投稿者

Re^2: 修正版
242
2024/01/31(Wed) 01:30:08
You
しょうもない誤字が有ったので修正版を添付します。

VirusTotalのチェックは相変わらず kbGuru2SMF.kpi で1件誤検知されるようです。
kbGuru2SMF.zip https://www.virustotal.com/gui/file/91e249530deb13d913733684924892ec5811c29279bde313a552198eeecc0a0a
kbGuru2SMF_src.7z https://www.virustotal.com/gui/file/9335b6f008c4c26d21d4d8a015c9e0ec4118625d1cc50936cc771cda1dfea865
kbGuru2SMF.kpi https://www.virustotal.com/gui/file/1d2f28406bbaf0a0d0c7e90787b9863f26d7797cacb99e3a73c56042569b3e2a

(138KB)

pagetop
タイトル
記事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
は導入済みです。
pagetop
タイトル
記事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等は不要です。

pagetop
タイトル
記事No
投稿日
投稿者

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

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