一括表示
タイトル
記事No
投稿日
投稿者
参照先
KbMedia Player Version 3.13beta.2024.0408
301
2024/04/08(Mon) 00:38:56
Kobarin

https://kobarin.sakura.ne.jp/test/kbmed313_beta.exe
https://kobarin.sakura.ne.jp/test/kbmed313_beta.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 のサポートを打ち切りました。XP 環境だと一部のプラグインが
動作しません。Windows XP で使いたい方は正式版をお使い下さい。


v3.13beta での変更点

・本体の開発環境を C++Builder 12 v29.0.51961.7529 に更新
・kbGuru2SMF.kpi に関する以下の修正
 ・「同梱の GuruGuruSMF4.dll を使う」設定を追加
  ・true のときは「GuruGuruSMF4.dll のパス」を無視
  ・公式版を使いたいときにパスを設定し直すのを省ける
 ・キーシフトの設定に対応
  ・GuruGuruSMF4.dll の機能の動作確認用。通常は 0 にする
 ・マスターピッチの設定に対応(playopt のと名前が被るので表示は「ピッチ」)
  ・GuruGuruSMF4.dll の機能の動作確認用。通常は 0 にする
 ・フェードインの設定に対応
  ・GuruGuruSMF4.dll の機能の動作確認用。通常は 0 にする
 ・フェードアウトの設定に対応
  ・0 以外にすると本体の演奏停止ボタン押下時及び「演奏」メニューの「フェード
   アウト」時に指定時間かけてフェードアウトさせる
  ・現在の演奏プラグインの仕様では「演奏メニュー」の「フェードアウト」時だけ
   フェードアウトさせることが出来ない(その為の API が存在しない)
 ・GuruGuruSMF4.dll に関する以下の修正(DirectMusic 使用時)
  ・複数ポート(メタイベント0x21)に対応
   ・最大4ポート
  ・フェードイン/フェードアウト(以下フェード)中にモタるのを修正
   ・フェード中はポーリングの Sleep 時間を短くした(5ms => 1ms)
  ・フェードの終了までかかる時間が不正確なのを修正
   ・Sleep の回数で判定していたのを実際の経過時間で判定
  ・フェードアウト中にフェードアウトが呼ばれても無視するようにした
   (最初のフェードアウトが続行されるのみ)
  ・フェードイン中にフェードアウトが呼ばれた場合は同時に進行するようにした
   (フェードインしてる分だけ直ぐには音量が下がらず、音量が下がり始めるのが
   遅くなるがフェードアウトが終わるのは呼ばれてから指定時間経過後)
・kbrunkpi.exe に関する以下の修正
 ・Windows 10 バージョン 2004 以降の環境でタイマーの精度が低かったのを修正
  (Sleep 等の API を使用するプラグインの動作改善)


本体の開発環境を更新しましたがまだ XP でも動作するようです。
本バージョンからβ版は XP のサポートを打ち切ったので本バージョンでは関係ありませんが。


GuruGuruSMF で複数ポートに対応出来ました。かなり広範囲に渡って修正が必要でした。

複数ポートに対応した関係で今まで未対応だった GuruGuruSMF の機能の動作確認が必要に
なったため設定項目を増やしました。常用するべきものでないものも含みますが、お遊び
程度には面白くて良いのではないかと思います。

フェードイン/フェードアウトのモタりは DLL の呼び出し元アプリが timeBeginPeriod で
それなりの精度(出来れば1ms)に設定しておかないと解決出来ない可能性があります。

なので kbGuru2SMF.kpi に同梱の GuruGuruSMF4.dll を他のアプリで使っても、モタり
は改善してないかもしれません。公式サイトのテストプレイヤーしか対応アプリを知り
ませんが、それも含めて動作確認はしていません。
pagetop
タイトル
記事No
投稿日
投稿者

Re: KbMedia Player Version 3.13beta.2024.0408
302
2024/04/13(Sat) 19:07:13
You
GuruGuruSMF は何だか良いオモチャになっているようですね。

Win10 2004 以降では timeBeginPeriod がプロセス内に限定されるのは知りませんでした。
確かにドキュメントに明記されてましたが、こんな簡単なAPIのドキュメントは今更見ないし…

timeBeginPeriod のドキュメントにはこんな記述も有りますね。
> Windows 11以降、ウィンドウ所有プロセスがエンド ユーザーに完全に隠された、最小化された、またはその他の方法で目に見えない、
> または聞き取れなくなる場合、Windows は既定のシステム解像度よりも高い解像度を保証しません。
> この動作の詳細については、「 SetProcessInformation 」を参照してください。

実際に試してみましたが、確かにWin11だと timeBeginPeriod(1) をコールしても
ウィンドウ最小化時にタイマー精度が15ms程度に戻るようです。
ウィンドウを持たないプロセスだと設定した精度が維持されていたので、
kbrunkpi.exe 経由で実行されるプラグインは問題が起きないと思いますが、
32bit版の本体から直接実行される kbGuru2SMF.kpi は、本体を最小化した時に影響が出るかもしれません。

一応この現象のテストAPPのソースを添付しておきます。
※2024/04/13 22:26 : 添付ファイル内の誤記を修正

(70KB)

pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^2: KbMedia Player Version 3.13beta.2024.0408
303
2024/04/14(Sun) 00:16:41
Kobarin

> GuruGuruSMF は何だか良いオモチャになっているようですね。

DirectMusic でここまで MIDI をきちんと再生出来ると思ってなかったので
とても面白かったです。

そろそろやることがなくなって来ていますがここへ来て行き詰っています。

> Win10 2004 以降では timeBeginPeriod がプロセス内に限定されるのは知りませんでした。

フェードアウト時間を長めにしたとき、64bit版の本体で実行するとフェードアウトが
終わるまで設定時間より長くかかることに気づいて調べてたら timeBeginPeriod が
関係してることが分かりました。

フェードにかかる時間はタイマーの精度が低くても問題なく動作するように出来ました
がフェード中のモタりは精度が低いと発生する可能性があります。

> ウィンドウ最小化時にタイマー精度が15ms程度に戻るようです。
> ウィンドウを持たないプロセスだと設定した精度が維持されていたので、
> kbrunkpi.exe 経由で実行されるプラグインは問題が起きないと思いますが、

kbrunkpi.exe 自体はウィンドウを作成しませんが、GuruGuruSMF4.dll は内部で
隠しウィンドウを作成します。

改造版 GuruGuruSMF はフェードアウト時のモタリ以外はタイマーの精度の影響は
少ないです。公式版だとモタり以外にフェードにかかる時間にも影響します。

本体の midiOut での MIDI 再生時は Sleep(1) を多用しているので、
最小化時にタイマーの精度が下がったら影響が大きいです。

> 一応この現象のテストAPPのソースを添付しておきます。

わざわざありがとうございます。

私の環境だと最小化しても 1ms の精度で動作しているみたいです。v3.13beta を
公開前、timeBeginPeriod の実験の為に色々試していたら、何かの拍子に OS を
再起動するまで 1ms の精度のままになってしまうことがあるようでした。

なので一度再起動してみましたが結果は変わりませんでした。
pagetop
タイトル
記事No
投稿日
投稿者

Re^3: KbMedia Player Version 3.13beta.2024.0408
304
2024/04/14(Sun) 14:08:27
You
対処無しでもタイマー精度が落ちない、と言うのは謎ですね。

こちらの環境では、テストAPPを再起動せずにオプションを色々変更して実行していると、
SetProcessInformation をコールしなくてもタイマー精度が落ちなくなることが有りました。
その場合でもテストAPP再起動のみでまた再現するようになります。


テスト環境での動作結果を貼っておきます。
全て、1回実行するごとにテストAPPを再起動しています。

・①②③ ウィンドウを最小化した時のみタイマー精度が落ちる
・④⑤ timeBeginPeriod(1) のコールは必須
・⑥ SetProcessInformation と timeBeginPeriod(1) をコールすると最小化してもタイマー精度が落ちない

pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^4: KbMedia Player Version 3.13beta.2024.0408
305
2024/04/16(Tue) 20:43:46
Kobarin

すみません。実行後に表示されるダイアログの意味を勘違いしていました。

私の環境でも同じような感じになりました。

最小化するとタイマーの精度が保証されなくなるが SetProcessInformation で
それを回避することも出来るということですね。

本体でも同じことをしておけば kbrunkpi.exe の方では何もしなくても良さそうです。
本体が動作中、タイマーの精度を常時高くするのは行儀が悪いのかもしれませんが
音楽の再生を目的とするソフトなのですからやむを得ないですよね。
pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^5: KbMedia Player Version 3.13beta.2024.0408
306
2024/04/20(Sat) 21:55:29
Kobarin

You さんのテストプログラム相当の処理を KbMedia Player 本体に組み込んで実験してみました。

SetProcessInformation を使わない場合、最小化時にタイマーの精度が悪くなっていることは
確認出来ましたが、デバイスを開いている間は問題ないようです。

> Windows 11以降、ウィンドウ所有プロセスがエンド ユーザーに完全に隠された、最小化された、またはその他の方法で目に見えない、
> または聞き取れなくなる場合、Windows は既定のシステム解像度よりも高い解像度を保証しません。

デバイスを開いていると「聞き取れなくなる場合」に該当しなくなるのでしょう。
うまく出来ていますね。

ただし、例えば 64bit 版で 32bit 版のデバイスプラグインや演奏プラグインを使う場合、本体とは
別プロセスでデバイスを開くことになる為、最小化時にタイマーの精度が低くなることが確認出来ます。

ですが、最小化時においてもタイマーの精度が高くないと困るのはデバイスプラグイン/演奏プラグイン
が実際に動作しているプロセス内においてであって、本体は困りません。

したがって本体が常時タイマーの精度を高くしておく必要はなさそうです。
kbrunkpi.exe の方も、デバイスを開いている間は精度が保証されるのであればやはり
SetProcessInformation を呼び出す必要はなさそうです。

> 本体でも同じことをしておけば kbrunkpi.exe の方では何もしなくても良さそうです。

これは勘違いですね。
Win10 2004 以降では kbrunkpi.exe の方でも timeBeginPeriod は必要ですね。

You さんのテストプログラムのおかげで SetProcessInformation の使い方が簡単に理解出来た
のでとても助かりました。結果的に必要がないことが分かりましたが。
pagetop

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