-------------------------------------------------------------------------------
【  名  称  】 GuruGuruSMF Player
【ファイル名】 kbGuru2SMF.kpi
【バージョン】 0.09
【対応拡張子】 mid
【 Platform 】 x86(32bit) のみ / x64(64bit) なし
【 公 開 日 】 2024/04/21
-------------------------------------------------------------------------------

【概要】

  GuruGuruSMF4.dll を使用して、DirectMusic で MIDI を再生するプラグインです。
  kbdmusic.kpi よりはるかに高品質な MIDI 再生が出来ます。

  「デバイス設定」で kbGuru2SMF.kpi を選択することで、GuruGuruSMF4.dll で MIDI
  を再生することが出来ます。

  You 様が KbMedia Player のサポート掲示板にて公開された kbGuru2SMF.kpi v0.01
  の開発を Kobarin が引き継ぐ形を取ることにしました。

  GuruGuruSMF については

  http://gurugurusmf.migmig.net/

  を参照して下さい。

【GuruGuruSMF4.dll】

  本プラグインの動作に必要になります。Kobarin による改造版を本プラグインに同梱
  しています。ベースにした DLL のバージョンは v4.0.8 です。

  プラグイン設定で DLL の場所を設定することで、公式版の DLL を使うことも出来ま
  す。公式版を使用する場合は v4.0.8 以降をお勧めします。

  改造版の主な変更点は以下となります。詳細は更新履歴を参照して下さい。

  ・複数ポート対応(最大4ポート)
  ・GM/GS/XG のマスターボリュームに対応
  ・リズムパートの SysEx を使う曲データで演奏が不自然になりにくい

以下は GuruGuruSMF の著作権表示、及びライセンス条文です。

------------------------------------------------------------------------------
Copyright (C) 2010-2024 卯如
All rights reserved.
------------------------------------------------------------------------------

ソースコード形式かバイナリ形式か、変更するかしないかを問わず、以下の条件を満たす場合に限り、再頒布および使用が許可されます。

  * ソースコードを再頒布する場合、上記の著作権表示、本条件一覧、および下記免責条項を含めること。
  * バイナリ形式で再頒布する場合、頒布物に付属のドキュメント等の資料に、上記の著作権表示、本条件一覧、および下記免責条項を含めること。
  * 書面による特別の許可なしに、本ソフトウェアから派生した製品の宣伝または販売促進に、作者の名前またはコントリビューターの名前を使用してはならない。

本ソフトウェアは、著作権者およびコントリビューターによって「現状のまま」提供されており、明示黙示を問わず、商業的な使用可能性、および特定の目的に対する適合性に関する暗黙の保証も含め、またそれに限定されない、いかなる保証もありません。著作権者もコントリビューターも、事由のいかんを問わず、 損害発生の原因いかんを問わず、かつ責任の根拠が契約であるか厳格責任であるか（過失その他の）不法行為であるかを問わず、仮にそのような損害が発生する可能性を知らされていたとしても、本ソフトウェアの使用によって発生した（代替品または代用サービスの調達、使用の喪失、データの喪失、利益の喪失、業務の中断も含め、またそれに限定されない）直接損害、間接損害、偶発的な損害、特別損害、懲罰的損害、または結果損害について、一切責任を負わないものとします。

-------------------------------------------------------------------------------

【更新履歴】

Version 0.09(2024/04/21)

・以下、GuruGuruSMF4.dll に関する修正
・リズムパートの SysEx を使用する曲データが正常に再生されないのを改善
　・ピアノになってしまうことがある曲データ
　・チャンネルボリュームが利かないことがある曲データ
　・最初の発音までの時間の進み方が遅くなった(MIDI イベントによっては送信前後に
　　ウェイトを置く為)
　・根本的な原因(ピアノになるデータとならないデータの違い、チャンネルボリューム
　　が利くデータと利かないデータの違い)が分からず、対症療法的な措置
・冒頭の空白をスキップ、シークに関する以下の修正
　・リズムパートの SysEx を使う曲データで正常に再生されなくなることがあるのを改
　　善(冒頭の空白をスキップ、シークをしなければ正常に再生出来るデータ)
　・たまに再生がおかしくなるデータはまだ存在するがその確率は低くなった
　・演奏スレッドと同じスレッド内で処理するようにした
　・処理に時間がかかるようになった
　　・MIDI イベントによっては送信前後にウェイトを置く為
　　・特に冒頭付近が時間かかるので曲データによっては冒頭の空白スキップがあまり
　　　機能しなくなった
　　・処理中は進捗状況に応じた位置を返すようにした
・以下の SysEx を無視するようにした
　・テキスト表示、ドット絵、PatchName、XG のSysEx(マスターボリュームはチャンネ
　　ルボリュームに置換)
・非ループ曲(CC111 を含まない曲)でリセットを含む曲データのループ時は先頭に戻っ
　たときにリセットを送信するようにした
　・非ループ曲の2周目以降が不自然になる曲データの改善
　・「非ループ曲のループ再生」を true にするデメリットが少なくなった
　・リセットを含まない曲データでは2週目以降が不自然になる可能性があるが、
　　GuruGuruSMF の仕様に合わせて敢えてリセットは送信しない

/*---------------------------------------------------------------------------*/

Version 0.08(2024/04/08)

・「同梱の 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 の回数で判定していたのを実際の経過時間で判定
　・フェードアウト中にフェードアウトが呼ばれても無視するようにした
　　(最初のフェードアウトが続行されるのみ)
　・フェードイン中にフェードアウトが呼ばれた場合は同時に進行するようにした
　　(フェードインしてる分だけ直ぐには音量が下がらず、音量が下がり始めるのが遅く
　　なるがフェードアウトが終わるのは呼ばれてから指定時間経過後)

/*---------------------------------------------------------------------------*/

Version 0.07(2024/03/29)

・プラグイン設定で音量を設定出来るようにした
　・他の MIDI 対応プラグインと比べて音量が大きいと感じる場合の調整用
　・最大値(127)と異なる値にするのは推奨はしない
・本体から SetVolume が呼ばれたときに GuruGuruSMF の SetVolume に渡す値を修正
　・渡された音量(%)値と実際に鳴る音量が感覚的に合致するようになった(と思う)
・演奏開始前に本体から SetVolume/SetTempo を呼ばれても反映されないのを修正
　・音量が100%でない状態のときに曲を切り替えた場合等
・GuruGuruSMF4.dll に関する以下の修正
　・以下は全て DirectMusic 使用時のみ(本プラグインでは DirectMusic しか使用しな
　　いが)
　・GM/GS/XG のマスターボリュームSysExに対応
　　・SysEx でフェードアウトしながら演奏終了する曲でフェードアウトが利くように
　　　なった
　　・DirectMusic のマスターボリュームSysExへの対応が不安定なのでチャンネルボリ
　　　ュームに置き換えて処理
　・処理が大幅に遅れているときに遅れを取り戻さないようにした
　　・スリープモードからの復帰時や極端にPCに負荷がかかっている場合等
　　　(デバッグ中の動作が気になっていた)
　・DirectMusic使用時はスリープモードに入ったらデバイスを閉じる処理を無効化
　　・処理の遅れを取り戻さなくすることで長時間のスリープからの復帰でも問題なく
　　　なった筈なので(他にも理由があってこの機能があるのかもしれないけど)
　　・スリープからの復帰時に本体によって演奏終了と見なされて曲が切り替わってい
　　　たのが切り替わらずに演奏が再開されるようになった

/*---------------------------------------------------------------------------*/

Version 0.06(2024/03/24)

・GuruGuruSMF4.dll に関する以下の修正
　・デバイスクローズ時に150msのウェイトをかけていたのを辞めた
　　・曲の切り替えが高速化
　　・リセット SysEx の完了待ちのようだが送信後はデバイスを閉じて音が止まるだ
　　　けなので待ちは不要と判断

/*---------------------------------------------------------------------------*/

Version 0.05(2024/03/16)

・DLS に対応
　・プラグイン設定で DLS のパスを設定(| で区切ることで複数ファイル指定可)
　・曲データと同じフォルダに DLS があればそれも使う
　・音色が被る場合の優先順位は
　　・曲データと同じフォルダ(見つかった順) => プラグイン設定(記述順)
　・動作確認出来るデータがない

/*---------------------------------------------------------------------------*/

Version 0.04(2024/03/09)

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

/*---------------------------------------------------------------------------*/

Version 0.03(2024/03/04)

・タイミングによってデバイスを開けずに再生開始出来ないことがあるのを修正
・複数のインスタンスを同時に作成出来るようになった
　（プラグイン情報の Reentrant が Yes(MultipleInstance=∞) になった)
　・GuruGuruSMF4.dll の API を新設
　・公式版 GuruGuruSMF4.dll も使用可能(Reentrant が No になる)
　・大変だった割にはメリットがほとんどない
　・互換性は残してあるので、公式版の GuruGuruSMF4.dll を使用する他のアプリケー
　　ションからも使用可能(公式版同様アンロード時にフリーズする可能性はある)
・CC111 を使用したループ曲を開いたときは KPI_MEDIAINFO::qwLoop に -1 を設定する
　ようにした
　・v3.12beta3 の仕様変更によるもの
　・qwLoop を設定しないと本体はループ非対応のプラグインと見なして単曲リピート時
　　でも本体の設定に応じた回数とフェード時間の SMF を生成して渡す
　・その場合、プラグインがループ再生しようとしてもフェードアウトが終わってから
　　ループポイントに戻ることになって無音になってしまう

/*---------------------------------------------------------------------------*/

Version 0.02(2024/03/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 なら動作する)

/*---------------------------------------------------------------------------*/

Version 0.01(2024/01/31)

・初版

-------------------------------------------------------------------------------
Kobarin(hidkob@pb.highway.ne.jp)
https://kobarin.sakura.ne.jp/
