View on GitHub

cat-plugin-player

cat-plugin-player

ADR 0010: Vaporizer2 の MSEG 再計算差の許容幅を修正する

原因と決定

保存済み3件を読み取りで比較した。Vaporizer2 1 と auto Vaporizer2 2 はCLAP、同じfmaj7_g6_arpeggioで、XML要素・属性配置と他の設定が一致する。差はsweepのMacro 1と、MSEGの時間・座標15属性だけだった。auto Vaporizer2 1 は音色と演奏パターンstepsが異なるため別Favoriteである。

旧判定の絶対差1e-9は、今回のMSEG差を扱えなかった。時間の最大差は0.000105000030000135 ms(Decay 0との比較)、座標の最大差は約9.61795e-7。Attackでは約1.03812e-6 ms、別MSEGのAttack/Decayでは約7.65090e-7 msの差もある。

既存の対象属性だけ、時間の有限値の絶対差を0.00011 ms以下、正規化座標xValを0.000001以下へ変更する。相対誤差やMSEG全体の除外は導入しない。PARAM、yVal、カーブ、ループ、対象外の点・属性は比較に残す。Macro 1の差はADR 0009のsweep由来が確認できる場合だけ除外する。保存・復元する元stateは加工しない。

対象は引き続きCLAP ID com.vastdynamics.VAST2、VC2!ラッパー、VASTVaporizerParamsV2.20000、chunkData/msegData0〜msegData4のAttack/Decay/Release時間と直下のmsegPoint1・msegPoint2のxValに限定する。未知形式・対象位置・不正データはバイト完全一致へ戻す。

根拠と限界

上流VASTMSEGData.cppのcalcADSR()は座標から時間を再計算し、doADSR()はfloatへの座標変換、安全用の下限、座標の再正規化を行う。保存に使われる時間・座標は再計算されるため、独立した安定値ではない。

今回の保存済み差はその再計算に整合する。ただし単純なload/save、editor表示、ノート・CC1処理では今回の大きな差そのものは再現せず、従来の約1e-10の差だけを再現した。差が発生した具体的操作は未特定であり、上流ソースの参照リビジョンをインストール済みバイナリのビルドリビジョンと同一とは扱わない。

許容幅以内の意図的なMSEG時間・座標編集は区別できない。時間の幅は0.11マイクロ秒、座標は正規化範囲の100万分の1である。他のPARAMの編集は別Favoriteとして残る。さらに大きな差が発生した場合は再調査し、根拠なく許容幅を拡大しない。安定した音色用stateを標準APIで取得できる場合は本例外を撤去する。

既存Favoriteの一括削除は行わない。同一と判定した保存では既存ID・名前・元snapshotを再利用するため、既存の2件は一覧に残る。

検証