新着表示
タイトル
記事No
投稿日
投稿者
参照先
kbGuru2SMF.kpi v0.02
256
2024/03/01(Fri) 10:47:29
Kobarin

kbGuru2SMF.kpi v0.02 のソース

https://kobarin.sakura.ne.jp/kpi/kbGuru2SMF_002s.7z


GuruGuruSMF4.dll のソースコード改変箇所については

kbGuru2SMF_memo.txt

を参照して下さい。


v4.0.7 がFreeLibrary 時にフリーズする件については、実は VS2022 でビルドした
場合には、その為の対策をしなくても発生を確認出来ていません。

ただ、DllMain 内で出来ることは限られているので、ここで後始末の処理をしている
ことが問題である可能性は非常に高いと考えています。

メモリリークは曲データを1度開く度にサイズが 0 の配列と12バイトの解放し忘れ
なのでとても軽微なものです。発生箇所を特定するのに苦労しましたが。
pagetop
タイトル
記事No
投稿日
投稿者
参照先
KbMedia Player Version 3.12beta2.2024.0301
255
2024/03/01(Fri) 02:05:27
Kobarin

https://kobarin.sakura.ne.jp/test/kbmed312_beta2.exe
https://kobarin.sakura.ne.jp/test/kbmed312_beta2.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 環境の人は除きます。

Windows XP で使いたい方は

https://kobarin.sakura.ne.jp/wforum/wforum.cgi?mode=read&no=181&reno=180&oya=180&page=0#181

こちらを参考にして古いランタイムをインストールして下さい。一応まだ
XP でも動作するようです。


v3.12beta2 での変更点

・各種プラグイン/DLL の開発環境を VS2022 17.9.1 に更新
・GuruGuruSMF4.dll を使用して DirectMusic で MIDI を再生する演奏プラグイン
 kbGuru2SMF.kpi を同梱
 ・You さんがサポート掲示板で公開された v0.01 を Kobarin が引き継ぐ
・kbGuru2SMF.kpi に関する以下の修正(掲示板で公開された v0.01 からの変更点)
 ・You さん製作の kbGuru2SMF.kpi v0.01 の開発を Kobarin が引き継ぐ
 ・GuruGuruSMF4.dll を v4.0.6 から v4.0.7(を VS2022 でビルドしたもの)に変更
 ・GuruGuruSMF4.dll を LoadLibrary して使うようにした
 ・GuruGuruSMF4.dll に対する以下の修正
  ・VS2022 でビルド
  ・メモリリーク修正
  ・スリープ時にデバイスを閉じる処理が原因と思われる不具合(FreeLibrary 時にフ
   リーズ)の修正
  ・↑の為、GuruGuruSMF4.dll に後始末用API(GGS4Uninialize_k) を追加(他に方法
   が思いつかなかった)
 ・GuruGuruSMF4.dll のパスを設定出来るようにした
  ・オリジナルの v4.0.7 は正常動作しない(v4.0.6 なら動作する)
・kbfmp.kpi に関する以下の修正
 ・64bit版 WinFMP.dll が公開されたことに伴い、64bit 版の kbfmp.kpi_ のファイル
  名を kbfmp.kpi に変更
・kbviv.kpi に関する以下の修正
 ・本体の CoInitializeEx の呼び出しの有無やパラメータによらず動作するようにし
  た
・kbpsf2.kpi に関する以下の修正
 ・boost ライブラリを 1.84.0.0 に更新
・ループタグ(LOOPSTART/LOOPLENGTH)を含む曲データのフェードアウト時に落ちること
 があるのを修正
・64bit 版で rcpcv.dll のロードに失敗すると以後 rcpcv.dll を導入しても本体を再
 起動するまでロードしなくなる(バージョン情報ダイアログでは導入済みと表示される
 が正しい情報を表示しない)のを修正
・本体の COM の初期化を STA から MTA に変更
 ・kbviv.kpi が動作しなくなったがプラグイン側で対処


You さんの kbGuru2SMF.kpi を kbdmusic.kpi に組み込もうと思いましたが
kbGuru2SMF.kpi の開発を私が引き継ぐ形を取り、本体に標準同梱することに
しました。

kbGuru2SMF.kpi は配布サイトを置かず、ソース・バイナリ自由に改変して良いとの
ことでしたのでそれで構いませんよね? => You さん

GuruGuruSMF4.dll は v4.0.7 の改造版を同梱しています。
公式版だと FreeLibrary 時にフリーズしますが改造版は大丈夫な筈です。
メモリリーク等、いくつかの不具合も修正しています。

フリーズするのはスリープ時にデバイスを閉じる処理の為のスレッドを DllMain の
DLL_PROCESS_DETACH 内で終了させようとしてるからだと思います。
GuruGuruSMF4.dll に後始末用の API を新設する以外に対処する方法を思いつきません
でした。

kbdmusic.kpi の方はまだ何も手をつけていませんが、本体が COM を MTA で初期化する
ようにしたので kbGuru2SMF.kpi v0.01(GuruGuruSMF4.dll v4.0.6) を使っても動作に
支障は出なくなっています。

GuruGuruSMF4.dll v4.0.7 をベースにしてる kbGuru2SMF.kpi v0.02 の方は本体の
COM の初期化が STA/MTA どちらであっても kbdmusic.kpi の動作には影響しません。

過去にあった要望の対応、他のプラグインのライブラリの更新はこれから少しずつ
進めていきます。
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
タイトル
記事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

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