新着表示
タイトル
記事No
投稿日
投稿者
参照先
kbGuru2SMF.kpi v0.04
266
2024/03/09(Sat) 00:43:39
Kobarin

kbGuru2SMF.kpi v0.04 のソース(バイナリは v3.12beta4 に同梱しています)

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

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

kbGuru2SMF_memo.txt

を参照して下さい。

バージョンアップの度にプラグインのソースを公開するのはこれで最後にします。
GuruGuruSMF の作者様への不具合報告の意味も込めて公開していましたが、v4.0.8
で対応されたようですので。v4.0.8 の不具合は確認出来ていません。


非ループ曲のループがおかしくなるのは作者様によると仕様だそうです。
演奏がおかしくなるデータは1つしか見つけることが出来ませんでしたが、GGS4Play() の
option に対応するついでにプラグイン設定で非ループ曲のループに GuruGuruSMF の機能を
使うか設定出来るようにしました。


 ・DirectMusic 関連のオブジェクトの全ての操作をそれを作成したスレッド内のみで
  行うようにした(Port.cpp を大幅修正)

これは実際は必要ない気もしますがちょっと頑張ってみました。
もし v0.04 がまともに動作しなくなったならこれに関する修正が原因になると思います。
ベースとした公式版 v4.0.8 には何の罪もありません。

まともに動作しないようなら公式版 v4.0.8 をダウンロードし、プラグイン設定の
GuruGuruSMF4.dll のパスで公式版のv4.0.8 のパスを指定して下さい。

http://gurugurusmf.migmig.net/
pagetop
タイトル
記事No
投稿日
投稿者
参照先
KbMedia Player Version 3.12beta4.2024.0309
265
2024/03/08(Fri) 23:40:08
Kobarin

https://kobarin.sakura.ne.jp/test/kbmed312_beta4.exe
https://kobarin.sakura.ne.jp/test/kbmed312_beta4.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.12beta4 での変更点

・kbGuru2SMF.kpi に関する以下の修正
 ・GuruGuruSMF4.dll に関する以下の修正
  ・ベースを v4.0.8 に更新
  ・DirectMusic 関連のオブジェクトの全ての操作をそれを作成したスレッド内のみ
   で行うようにした(Port.cpp を大幅修正)
  ・GGS4CloseDevice を呼んでから FreeLibrary すればフリーズしなくなった為、
   フリーズ対策として新設した後始末用API(GGS4Uninialize_k)を廃止
 ・GuruGuruSMF が演奏停止を返してもすぐに本体には停止を返さず、1秒経過してか
  ら返すようにした
  ・連続再生時に曲によっては最後の音が切れた感じになるため
 ・GGS4Play() の option に渡す設定に対応
  ・ループ再生
  ・冒頭の空白をスキップ
  ・末尾の空白をスキップ
  ・マスターピッチ
  ・ノーマライズ
  ・エクスクルーシブ
・本体の更新はバージョン情報のみ


kbGuru2SMF.kpi 以外の更新はありませんので、kbGuru2SMF.kpi を使う予定がない人は更新
しなくても良いと思います。

GuruGuruSMF の作者様に不具合報告をしたら早速 v4.0.8 で対応されました。
プラグイン同梱の GuruGuruSMF4.dll も早速 v4.0.8 をベースにしましたが、それに対して
内部的に大きな修正(Port.cpp)をしているので、もし動作がおかしかったら知らせて下さい。

Port.cpp の修正は v4.0.8 に何か問題があったとかではなく、複数インスタンス対応と同じか
それ以上に趣味に近い修正です。

もし同梱の GuruGuruSMF4.dll の動作に問題があるようなら公式版 v4.0.8 を使用してみて下さい。
v4.0.7 の不具合が修正されていますのでフリーズすることはないと思います。

http://gurugurusmf.migmig.net/


kbGuru2SMF.kpi は致命的なバグがない限り今度こそほぼ完成かな。
DLS 対応だけ気になってますが対応するデータ(DLS を使うことで制作者が意図した再生を
することが出来るような MIDI と DLS のセット)が手元にないのでやる気がしません。
pagetop
タイトル
記事No
投稿日
投稿者

Re: kbGuru2SMF.kpi v0.03
264
2024/03/05(Tue) 23:17:36
You
更新ありがとうございます。
気になるけれど私は踏み込まなかったDLLの改造までお疲れ様です。
あまり動作確認のパターンは取れませんが、正常動作しているように思います。

kbGuru2SMF.kpi についても、気になる点はすべて解消しました。
あえて言うなら kbGuru2SMF.txt の「【 公 開 日 】 2024/03/??」と「Version 0.03(2024/03/??)」ぐらいですね。
単曲リピートは「送る」に外部ツール「GGSLight」を設定して対応していましたが、本体のみで完結できるようになりました。

おかげさまでだいぶストレスフリーな再生環境になりました。
pagetop
タイトル
記事No
投稿日
投稿者
参照先
kbGuru2SMF.kpi v0.03
263
2024/03/04(Mon) 00:21:33
Kobarin

kbGuru2SMF.kpi v0.03 のソース(バイナリは v3.12beta3 に同梱しています)

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


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

kbGuru2SMF_memo.txt

を参照して下さい。

ほぼ完成と言えるくらいにはなったと思います。
ただ、非ループ曲の単曲リピートがおかしくなるデータを1つだけ見つけました。
ループを GuruGuruSMF に任せず、再生が終わったら本体に Play を呼んででもらって
再生し直すと問題ありません。

取り敢えず全データで GuruGuruSMF に任せるようにしています。
pagetop
タイトル
記事No
投稿日
投稿者
参照先
KbMedia Player Version 3.12beta3.2024.0304
262
2024/03/04(Mon) 00:06:38
Kobarin

https://kobarin.sakura.ne.jp/test/kbmed312_beta3.exe
https://kobarin.sakura.ne.jp/test/kbmed312_beta3.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.12beta3 での変更点

・各種プラグイン/DLL の開発環境を VS2022 17.9.2 に更新
・kbGuru2SMF.kpi に関する以下の修正
 ・タイミングによってデバイスを開けずに再生開始出来ないことがあるのを修正
 ・複数のインスタンスを同時に作成出来るようになった
  (プラグイン情報の Reentrant が Yes(MultipleInstance=∞) になった)
  ・GuruGuruSMF4.dll の API を新設
  ・公式版 GuruGuruSMF4.dll も使用可能(Reentrant が No になる)
  ・大変だった割にはメリットがほとんどない
  ・互換性は残してあるので、公式版の GuruGuruSMF4.dll を使用する他のアプリケ
   ーションからも使用可能(公式版同様アンロード時にフリーズする可能性はある)
 ・CC111 を使用したループ曲を開いたときは KPI_MEDIAINFO::qwLoop に -1 を設定す
  るようにした
  ・v3.12beta3 の仕様変更によるもの
  ・qwLoop を設定しないと本体はループ非対応のプラグインと見なして単曲リピート
   時でも本体の設定に応じた回数とフェード時間の SMF を生成して渡す
  ・その場合、プラグインがループ再生しようとしてもフェードアウトが終わってか
   らループポイントに戻ることになって無音になってしまう
・kbasio.kpi に関する以下の修正
 ・本体の COM の初期化(STA/MTA)に影響せずに動作するようにした
  ・v3.12beta2 で動作しなくなった為
  ・プラグイン自身で作成したスレッド内で STA として COM を初期化
   (MTA だと動作せず)
 ・IASIO::setSampleRate の戻り値をチェックするようにした
  ・サポート掲示板で指摘された件
・MIDI 対応演奏プラグインに関する以下の修正(本体の修正)
 ・プラグインに SetRepeat を呼ばないのを修正
 ・プラグインが CC111(ループ)に対応していてもループ再生が機能しないのを修正
  ・本体が渡す SMF データ自体がループとフェード処理を施したものである為、フ
   ェードアウトしてからループポイントに戻ることになり、戻っても無音が再生さ
   れてしまっていた
 ・単曲リピート時、プラグインがループ対応のときはフェード処理を施さないデータ
  を渡すようにした
 ・↑の必要有無を判断するため、ループ曲のときは KPI_MEDIAINFO::qwLoop の値を
  0 以外の値(具体的なループ時間または-1)に設定する必要がある
 ・単曲リピートの設定変更時に曲データを開き直すようにした
  ・プラグインがループ非対応の場合は常にフェードアウトするデータを渡す
  ・プラグインがループ対応の場合は
   ・単曲リピートが有効のときはフェードアウトしないデータを渡す
   ・単曲リピートが無効のときはフェードアウトするデータを渡す
  ・ループ対応の判定の為、ループ対応の MIDI 演奏プラグインは単曲リピート時に
   同じデータ(プラグインに渡すデータとしては違うデータ)を2度開くことになる


ループもほぼ問題なく動作するようになったし、kbGuru2SMF.kpi はほぼ完成といって良いかな。
ただ、非ループ曲の単曲リピートがおかしくなるデータを1つだけ見つけました。
非ループ曲についてはループを GuruGuruSMF に任せないようにする(再生が終わったら本体に Play
を呼んでもらって再生し直す)ことも考えましたが取り敢えず全データで有効にしています。
pagetop
タイトル
記事No
投稿日
投稿者
参照先
ASIO が使えない
261
2024/03/03(Sun) 14:29:50
Kobarin

ASIO が使えなくなっていますね。

原因は本体が 3.12beta2 から COM の初期化を STA から MTA に変更したこと
のようです。STA に戻したら普通に動作しました。

kbviv.kpi の動作よりもっと重要な何かがあった気がしたのですが、敢えて
STA にしていたのはこの為だったのでしょう。

kbasio.kpi 側で対応するには少し大掛かりな修正が必要ですね。

どうしようかな…。
pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^4: kbGuru2SMF.kpi v0.02
260
2024/03/03(Sun) 14:26:18
Kobarin

> ※13:48追記
> 再生開始までの時間は、v4.0.7のソース GuruGuruSMF\Core\Ggs4Controller.cpp の
> GgsController::Play() で1秒のウェイトが入っていたので気にしないでください。

デバイスを開き損なう件の回避の為なのかも、と思って手元の最新版ではウェイトを
入れないようにしていますが特に問題は確認出来ていません。

あとループ(無限ループ)が正しく機能していませんがこれは本体側の問題です。

本体が SetRepeat を呼んでくれないのもありますが、無視して無限ループしようとしても
うまくいきません。これはプラグイン側ではどう頑張っても対処出来ない問題でした。

本体の設定に応じたループ回数、フェード時間の SMF を本体が生成して、それが渡されてるので。
ループMIDI に非対応である筈のプラグインが、単曲リピートが無効なときには本体のループ回数と
フェード時間に対応してるかのように見えた動作をするのはその為です。

MIDI 対応演奏プラグインが今の本体の動作のままループに対応しようとしても、フェードアウトして
からループポイントに戻ってしまうので2ループ目は音が鳴らなくなります。そもそもフェードアウト
したら無限ループの意味がありません。

結構厄介でしたが手元の最新版では解決しています。少し強引で無駄がある方法で、きちんとやるには
少しだけプラグイン仕様の変更が必要となります。
pagetop
タイトル
記事No
投稿日
投稿者

Re^3: kbGuru2SMF.kpi v0.02
259
2024/03/03(Sun) 11:43:36
You
プラグインの設定で GuruGuruSMF4.dll のパスを指定できるのは、確かに安全とは言い切れませんね。
v4.0.7改とv4.0.6の両方のDLLを同梱して設定で選択できるようにする、ぐらいが良いかも知れません。
同梱しているDLLを上書きして公式版v4.0.7が呼ばれてしまう可能性は有りますが、それはさすがに自己責任でしょう。

GuruGuruSMF4.dll のシングルトンは意図が掴みかねますが、デバイスをオープンし直すのを嫌ったのは有り得そうです。
DLL内部にプレイリストを持つような仕様なども含め、イマイチ使い勝手が良くないところは有りますね。
ただ、演奏プラグインとしての機能は現状でも十分だと思いますし、
色々な改造をしてみるのは研究にとどめておくぐらいが良いかもしれません。

v4.0.6よりv4.0.7の方が再生開始まで微妙に時間がかかるのは、
v4.0.7がワーカースレッドで初期化処理するようになった影響でしょうか?(未調査です)
微妙に気になりますが、安定性とのトレードオフなら許容できる時間ではありますね。

※13:48追記
再生開始までの時間は、v4.0.7のソース GuruGuruSMF\Core\Ggs4Controller.cpp の
GgsController::Play() で1秒のウェイトが入っていたので気にしないでください。
pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^2: kbGuru2SMF.kpi v0.02
258
2024/03/02(Sat) 11:45:17
Kobarin

> ただ、64bit版本体で起動直後の kbGuru2SMF.kpi の再生や、kbdmusic.kpi → kbGuru2SMF.kpi の切り替え後の再生が出来ないことが有りました。

検証ありがとうございます。
私も確認していて、手元の最新版では解決済みでした。原因となる箇所はご指摘の通りです。

後で気づきましたが FreeLibrary 時のフリーズは、スリープ時にデバイスを閉じるスレッドだけ
でなくて Port.cpp 内で作成したスレッドも関係してますね。

> 解放処理用の関数をexportし、FreeLibrary() の前に呼ぶのは解決法として間違っていないと思います。

何度考えても他に良いやり方が思いつきませんでした。
あえてやるなら、GGS4CloseDevice を呼ぶ度に内部で作成したインスタンスを破棄すること
でしょうか。そうすると GGS4CloseDevice を呼び出した後は GGS4GetSmfInformation 等の
結果も破棄されてしまうので、そうならないようにきちんと対応しようとすると結構大変
そうです。

VS2022 でビルドしたものだとフリーズは確認出来ないのですが、多分偶然だと思うのですよね。
API の新設以外に解決手段がないなら、公式版 GuruGuruSMF4.dll のパスを設定して使用出来る
ようにする現在の仕様は危険なのかもしれません。


手元の最新版では複数のインスタンスを同時に作成可能な作りにしてみました。
それ用の API を DLL に新設しなければなりませんが。

公式版があえてインスタンスを1つしか作らずに使い回すようにしてるのは、
デバイスを開く処理が何度も行われなくする為なのだろうとは思いますが、
ちょっと使い辛いんですよね。

インスタンスの使い回しは DLL を使う側で工夫してやれば良いかと思って。

でも苦労した割にほとんどメリットがないことが分かってしまいました。(笑)
64bit 版の本体から使う分には意味ないですし、32bit 版でも今の本体の仕様だと
やっぱりほとんど意味がないです。

演奏プラグイン仕様にフェードアウト用の API を追加するか本体が SetVolume を
駆使してフェードアウトを行ってクロスフェードに対応すれば 32bit 版でだけ意味
が出てくるかもしれないです。
pagetop
タイトル
記事No
投稿日
投稿者

Re: kbGuru2SMF.kpi v0.02
257
2024/03/02(Sat) 10:41:41
You
更新ありがとうございます。
kbGuru2SMF.kpi の取り込みも本当にありがとうございます。
ソースを引き継いで本体に同梱するのはこちらも想定していた形ですので全く問題ありません。

動作確認してみたところ、kbGuru2SMF.kpi → kbdmusic.kpi の切り替えは問題なく再生されました。
ただ、64bit版本体で起動直後の kbGuru2SMF.kpi の再生や、kbdmusic.kpi → kbGuru2SMF.kpi の切り替え後の再生が出来ないことが有りました。

ソースも公開されているので調査してみたところ、GuruGuruSMF\dxmus.core\Port.cpp に原因がありそうです。
理屈としては起動直後以外のタイミングや32bit版の本体でも発生するはずですが、今のところ発生を確認できていません。
修正したソースを添付しますので確認してみてください。


Port::Open() 内の処理で、PostCommand() でOpenコマンドをキューに追加して
Wait(1) でワーカースレッド Port::OnWorker() の処理完了を待っていますが、
ワーカースレッドが Sleep(1) を実行しているタイミングで Wait(1) が呼ばれると、
処理完了を待たずに Wait(1) を抜けてしまい、その結果未初期化の変数 resultOpen が Port::Open() の戻り値になります。

KbGuru2SMFPlayer::Open() 内で呼んでいる m_pGGS->OpenDevice() の戻り値は未初期化の resultOpen の値がそのまま返されるので
GuruGuruSmf::GgsError::NoError にならず、KbGuru2SMFPlayer::Open() が FALSE を返すことになりそこで処理が中断されます。

対策として、Port::Wait() でスピンロックに使用している isBusy を
true に設定する場所を Port::PostCommand() の commands.push() の直後に移し、
false に設定する場所を Port::OnWorker() の commands.pop() の直後に移すことで、
PostCommand() → OnWorker() で Open2() を実行 → 処理完了後に Wait() から抜ける の順序を保証出来るようにしました。


v4.0.7での FreeLibrary() 時のフリーズも解消しているようです。
DllMain() でスレッドの同期をしてはいけないのは、マイクロソフトの開発者向けページでも明記されていますね。
https://learn.microsoft.com/ja-jp/windows/win32/dlls/dynamic-link-library-best-practices
解放処理用の関数をexportし、FreeLibrary() の前に呼ぶのは解決法として間違っていないと思います。

(9KB)

pagetop

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