View on GitHub

cat-plugin-player

cat-plugin-player

ADR 0006: sforzandoの保存カウンターと演奏値をFavorite重複判定から除外する

原因と測定

同じ音色を繰り返しfavorite保存すると増殖するというユーザー報告を、独立hostで再現した。 製品のconfig・favorite・stateは読み取りのみとし、同じTableWarp2 stateをメモリ復元した。 何も操作しない連続保存でも、CEGPラッパー内のzlib圧縮XMLにあるSettings・Slot・EffectSlotのscが18→19→20と増えた。 再読込後の保存も21となった。ノート60/velocity100だけでSlot直下にParam id="131"が入り、その値は100/127だった。 CC1=100を送るとParam id="1"にも100/127が入り、CC120では両値が残った。 このためバイト完全一致では、保存・演奏だけで別favoriteを作ってしまう。

決定

既存の固有処理の入口からsforzando.rsを呼ぶ。 標準state APIが返す不透明な保存state自体は変更しない。CLAP全体への推測による比較は導入しない。 確認済みのCEGP、展開サイズ、zlibストリーム、AriaSave version="1982" productID="1014"が成立する場合だけXML設定を比較する。

手動・自動favoriteとも既存snapshotのIDと名前を再利用し、snapshotのバイトは保持する。 同じpluginでも演奏パターンが違えば、既存仕様どおり別favoriteとして保存する。 既存の重複favoriteを自動削除・統合する移行は含めない。

検証と限界

単体試験でカウンター・演奏値の差だけを同一と判定し、音色・音量・チューニング・他Param・未知版・破損の差を残す。 実機試験では同一stateの6回の手動/自動保存・再読込・ノート/CC1を通して1件を維持し、改名と元snapshotを保持した。 チューニングを変更してhostへ読込み、再保存した場合は2件になった。

CC1の違い自体を別favoriteとして残す用途と、最後のノートvelocityの違いは区別しない。 保存される元snapshotにはそれらの値も残るため、既存snapshotの内容を正規化して書き換える処理ではない。 VST3版や別ARIA schemaには適用しない。未知の音色・版で再発した場合は実際のstate差を確認してから更新する。 標準APIで安定した音色stateが得られるようになれば、本例外の撤去を検討する。