------------------------------------------------------------------------------
【  名  称  】 VSTi MIDI Decoder
【ファイル名】 kbvsti_x86.kpi(32bit版) / kbvsti_x64.kpi(64bit版)
【バージョン】 0.12
【対応拡張子】 mid
【 Platform 】 x86(32bit)/x64(64bit)
【 公 開 日 】 2022/11/08
【 動作環境 】 VSTi プラグインが必要
-------------------------------------------------------------------------------

【概要】

VSTi プラグインを使用して MIDI を再生するデコーダプラグインです。
yoshi さん制作の kpi_vsti.kpi v1.01 を新プラグイン仕様に対応させたものです。

本プラグインを使用するには、VSTi プラグインが必要となります。
対応するのは VST 2.4 までです。VST 3.x には未対応です。

【使用方法】

使用する VSTi プラグインは「プラグイン設定」の「VSTi のパス」で設定します。
この設定は 32bit 版と 64bit 版とで区別されます。

動作確認した VSTi プラグインは以下となります。

・MidRadio Player (SGP2.DLL)(x86):
    http://download.music-eclub.com/midradio/index.php
・SOUND Canvas VA(製品版) (SOUND Canvas VA.dll)(x86/x64):
    https://www.roland.com/jp/products/sound_canvas_va/
・Yamaha S-YXG50 Portable VSTi v1.0.0 [2016/04/25](syxg50.dll)(x86)
    http://veg.by/en/projects/syxg50/
・VSTSynthFont (VSTSynthFont.dll(x86) / VSTSynthFont64.dll(x64)):
    https://www.synthfont.com/

MidRadio Player(32bit版のみ)と Sound Canvas VA が選択可能になっていますが、他の
プラグインを指定することも出来ます。

【使用上の注意】

kbvsti_x86.kpi で 64bit 版の VSTi プラグインを使用したり、kbvsti_x64.kpi で
32bit 版の VSTi プラグインを使用することは出来ません。

64bit 版の本体で 32bit 版の VSTi プラグインを使用したい場合は、kbvsti_x86.kpi
の方で「VSTi プラグインのパス」を設定して下さい。

【既知の不具合】

・64bit 版の Synth1 VST64.dll を使用すると本体(64bit版の場合)が強制終了する

  本体が v3.10 以前までは動作していましたが v3.11beta 以降動作しなくなりまし
  た。本体の ASLR(アドレス空間配置のランダム化) が v3.11beta 以降から有効にな
  った為(無効化すれば動作する)で、おそらく Synth1 VST64.dll のバグです。

  本体の %Kbmplay% セクションで「別プロセスで使用」を true にすれば本体は巻き
  込まれなくなりますが、再生は出来ません。
  (kbrunkpi.exe も ASLR が有効なので kbrunkpi.exe が強制終了する)

  どうしても Synth1 VST を使いたい場合は 32bit 版の Synth1 VST.dll の方をお使
  い下さい。

・再生を繰り返すと演奏がおかしくなる

  通常はプラグイン設定で「キャッシュ」を false にすれば問題なくなると思います
  が、プラグインをロードし直すことで確実性が増します。プラグインをロードし直す
  には、プラグイン設定画面で「VSTiプラグインをリロード」をクリックします。
  それでも元に戻らない場合は、一度本体を終了して再起動して下さい。

・VSTi プラグインの設定画面で設定した結果が保存・反映されないことがある

  曲を切り替えたりプレイヤーを終了すると設定が保存されないものが多いです。

  設定は VSTi プラグインのインスタンスごとに行います。kbvsti.kpi の仕様上、
  曲の切り替え時には、それまで使用していた VSTi プラグインのインスタンスを使い
  回すため、基本的には曲の切り替え後にも設定の変更が適用されます。

  ただし、クロスフェードした場合には曲の切り替え前後でインスタンスが変わるため
  設定が変わってしまう可能性があります。

  複数ポート使用する曲の再生時は使用中の VSTi プラグインの設定画面を最大4ポート
  まで同時に表示します。

・レベルメータのようなものがある VSTi プラグインの設定画面の動きが再生と連動し
  ない＆設定変更が反映されるまで時間がかかる

  動きのずれや設定変更が反映されるまでの時間を最小限に抑えるには、本体の「再生
  バッファサイズ」と「先読みバッファのサイズ」を極限まで小さくします。

  ・「ツール」->「デバイス設定」->「再生バッファサイズ」を正常に再生出来る範囲
    で可能な限り小さくする。(ASIO か WASAPI なら 25ms まで小さくしても再生出来
    る可能性があります)
  ・「ツール」->「環境設定」->「優先度」->「先読みバッファのサイズ(ms)」を 25ms
    にする。

  これである程度改善します。200ms 程度でも設定変更の反映は十分早くなりますが、
  表示のずれは極限まで追い込まないと気になるかもしれません。

  「再生バッファサイズ」が 25ms で正常に再生出来るのであれば、表示のずれもほぼ
  問題ないレベルまで改善出来る筈です。

  なお、「先読みバッファのサイズ」を小さくし過ぎるとギャップレス再生が出来なく
  なったり、ループ曲の無音検出時に、無音が再生される時間が長くなりますのでご注
  意下さい。通常は初期値(5000ms)にしておき、画面の連動をさせたいときだけ一時的
  に値を小さくするようにして下さい。

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

【更新履歴】

Version 0.12(2022/11/08)

・AEffect::numInputs の値が 0 でないプラグイン(MAmiVSTi.dll)を使用すると落ちる
　のを修正
・プラグイン DLL のファイル名が "MAmiVSTi.dll" のときだけ effSetBlockSize に渡
　すサイズを再生周波数の 30分の1 の値(44100Hz なら 1470)にするようにした
　・音がぶつぶつ途切れる現象への対策
　・正常に再生出来ないことに変わりはない
　　(演奏開始直後の数秒間音が途切れる、音途切れが安定後もテンポがよれよれ)
　・設定出来るようにした方が良いのかもしれないがプラグインによっては対応しない
　　値を渡すと本体を巻き込んで落ちてしまう
・演奏開始時の初期化を強化(リセット系 SysEx を受信しないプラグインへの対策)
　・CC/RPN を出来る限り初期値に設定、リセットオールコントローラー送信等
　・リセットを受信しないプラグインを使用時に「キャッシュ」を true にして演奏を
　　繰り返しても不自然になりにくくなった(VSTSynthFont で確認)
　・プラグインによっては却って演奏が不自然になるかも(リセットオールコントローラ
　　ーを送信するだけにしておいた方が良いかも)
・「再生周波数」「音量」「音源リセット」「キャッシュ」の設定を x86/x64 版 で
　区別して保存するようにした

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

Version 0.11(2022/10/23)

・音量が実際には整数値でしか指定出来ていなかったのを修正

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

Version 0.10(2022/10/22)

・内部的に大幅な修正
・設定項目に「キャッシュ」を追加
　・曲切り替え時に前回使用していた Vsti プラグイン(以後単にプラグイン)のインス
　　タンスを使い回すかの設定
・登録可能なプラグインの最大数を 8 個から 10 個に増やした
　・もっと増やしても良いけど単体で MIDI 音源として使えるプラグインはそんなにな
　　いような…。
・プラグインごとに「再生周波数」「音源リセット」「キャッシュ」を設定出来るよう
　にした
・複数ポート使用時にプラグインを複数回 LoadLibrary していたのを修正
・プラグインのメソッドを全て同じスレッド（プラグインをロードしたのと同じスレッ
　ド）から呼ぶようにした（↓の２点の不具合等が修正）
・VSTi の設定ウィンドウを表示時の曲の切り替え、プラグインの再ロード、プラグイン
　の切り替え等が不安定だった(本体が落ちたり、大量のダイアログボックスを発生する
　ことがある)のを修正
・VSTSynthFont v3.431(公開日時点で最新の有料版) でサウンドフォントを開こうとす
　るとダイアログが表示されずにフリーズするのを修正
・audioMasterCallback の audioMasterGetTime に応じるようにした
　・本体を巻き込んで強制終了・フリーズしていたプラグインのいくつかが動作するよ
　　うになった
・Port-A 以外の設定画面を移動時にも他の画面と連動するようにした

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

Version 0.09(2021/06/25)


・VSTi_x64_01(パス)の既定値を
　Program Files\Roland\Sound Canvas VA\SOUND Canvas VA.dll
　(Roland Content Store 版のインストール先)
　が存在すればそのパス、なければ
　Program Files\Vstplugins\Roland\Sound Canvas VA\SOUND Canvas VA.dll
　(Roland Cloud 版のインストール先)
　に設定するようにした

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

Version 0.08(2021/05/21)

・演奏終了出来ない曲があったのを修正
　・曲長まで再生してからの無音検出を最大5秒で打ち切る処理の計算ミス

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

Version 0.07(2017/05/22)

・複数ポート対応データの SysEx を全て Port-A に送信していたのを修正
・複数ポート対応の場合、以下の SysEx は全てのポートに送信するようにした
　・リセット系(GM SYSTEM ON/GS RESET etc...)
　・マスターボリューム(GM/GS/XG)
　・他にも全てのポートに送信すべきものがあるかもしれないが不明
　・全ての SysEx を全てのポートに送信すると明らかに演奏がおかしくなるデータが
　　存在する
・タスクバーが下側以外のときに設定ダイアログの位置がおかしくなるのを修正
・複数ポート再生時のダイアログが重なっているのを修正

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

Version 0.06(2017/05/18)

・「VSTi 設定」が有効時で複数ポートを使用する曲を再生時、2 番目以降のポート
　のダイアログも表示するようにした(最大4ポート)
・設定画面の表示更新頻度を毎秒10回から毎秒100回に変更
　(SCVA や S-YXG50 Portable VSTi 等で)レベルメータの動きが滑らかになった)

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

Version 0.05(2017/05/15)

・演奏開始時に送信する音源リセットを設定出来るようにした
　・データにリセットを含まないが中身が GS の場合等への対応
　・「GM SYSTEM ON」は常に最初に送信する
　・データに「XG SYSTEM ON」を含む場合は「GS RESET」や「GM2 SYSTEM ON」を指定
　　しても送信しない(「XG SYSTEM ON」を受信するが GS RESET を受信する場合に
　　演奏がおかしくなるため)
・VSTi プラグインのロードに失敗した場合はダイアログを表示するようにした
・VstEvent::deltaFrames を考慮していなかったのを修正
　・演奏の精度(テンポの安定性)が向上
・128バイト以上のシステムエクスクルーシブを正しく処理出来ないのを修正

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

Version 0.04(2017/05/05)

・設定画面に関する以下の修正
　・v0.03 以前とは異なり、設定画面は再生中にのみ表示するように仕様変更
　　(再生中のインスタンスに対して画面を出す)
　・設定画面を出すには「VSTi 設定」を 「true」にする
　・設定画面上での変更が再生に反映されるようになった
　　・本体の仕様上、変更が反映されるまで数秒間かかる
　・レベルメータ等が動くようになった
　　・本体の仕様上、動きが再生と同期せずに数秒間先行する
　・設定画面の一部が表示仕切れていなかったのを修正
　　・(Sound Canvas VA.dll の場合)下部の「SOUND Canvas」のロゴ
　・タイトルバーに vendor 名と product 名を表示するようにした
・VSTi の情報(vendor, product 等)を表示出来るようにした

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

Version 0.03(2017/05/01)

・ファイル名を 32bit 版(kbvsti_x86.kpi)と 64bit 版(kbvsti_x64.kpi)とで区別する
　ようにした
　・本体の「同名の x86(x64)プラグイン」のチェックの有無によらず両方表示される
　　ようにするため
・AEffect::numOutputs が 2 でない VSTi プラグイン(VS Upright 1等)を使用すると
　落ちるのを修正
・設定に関する以下の修正
　・一覧表示用設定のキー名を変更(VstiPath_x86/64_xx=>VSTi_x86/64_xx)
　　・v0.02a 以前と互換性がないため、設定し直す必要がある
　・VSTi ごとに音量を設定出来るようにした
・シークに関する以下の修正
　・現在位置より先へのシークが高速化(↓により相殺される場合もある)
　・演奏がおかしくなることがあるのを修正=>シークが低速になった
　・5秒以内にシーク出来ない場合は諦めることにした(本体が空読み)
・終端付近で無音検出するようにした
　・v0.02/v0.02a で曲の長さより常に 2 秒間余分に再生されていたのが改善
　・検出出来ない場合は最大5秒再生
・可能なら 64bit の精度でレンダリング(processDoubleReplacing)するようにし、
　出力ビット深度を VSTi プラグインの演算精度に合わせるようにした
　・対応する VSTi プラグインが手元にないため、64bit 出力の動作は未確認
　・v0.02a 以前は常に 64bit float 出力だったが、精度は 32bit float

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

Version 0.02a(2017/04/24)

・VSTi のパスの一覧表示で MidRadio Player と Sound Canvas VA の表示名と値の
　対応関係が逆になっていたのを修正(32bit版のみ)

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

Version 0.02(2017/04/24)

・システムエクスクルーシブを送信出来ていなかったのを修正
　・再生を繰り返すと演奏がおかしくなるのを修正
　・演奏精度が大幅に向上
・バンクセレクトを無視していたのをしないように修正
　・無視したい場合は本体側で「MIDI」->「MapMode」->「Ingnore Bank Select」を
　　選択すればバンクセレクトが無視された SMF が渡される
・マルチプルインスタンスに対応(クロスフェード時等に別プロセス経由にしない)
・マルチポートに対応(最大8ポートまで)
・ループ MIDI(CC111)に対応
・終端付近が再生されない(1〜2秒程度途切れて終了する)のを修正
・Vsti のパスと表示名を 8 個まで登録できるようにした
　・登録したパス名が「VSTi(*.dll)のパス」に一覧表示される

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

Version 0.01alpha(2017/04/10)

・初版
・yoshi さん制作の kpi_vsti.kpi(v1.01) を元に作成

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