跟踪 2.0 重构(数据/SDK 分层、老插件兼容、效果器、属性面板)之后有意推迟 的事项。每项均已确认可安全后补(加性/非破坏);某项排期时可从本 issue 拆出独立 issue。
同步 2026-06-18:插件设置系统、effect 接口规范化(会话化)、manifest 入口统一 classes 数组、插件冲突消解矩阵(所有类型) 均已完成、移入末尾「已完成」。
同步 2026-07-17:颤音影响 effect 自动化参数 、effect 段内子区间增量(脏区间账本+局部重合成) 、PropertyArray 均已完成、移入末尾「已完成」;新增在案项:多声道音频面契约措辞随多声道立项时钉入(当前插件契约纯单声道)。
同步 2026-07-18:effect preset 设计已定稿、实现暂缓 (用户定:待真实 effect 插件生态起来再做,2.0 不强求),设计要点记在下方条目防丢;移 🟢 低优先级。
🔴 高优先级
🟡 中优先级
🟢 低优先级
effect preset(设计已定稿 2026-07-18,实现暂缓待真实 effect 插件生态) :分两种——①实例 preset(单 effect 参数值,.tleffectpreset,engine type 存文件内、列表按当前引擎过滤,不含 bypass/id)②链 preset(挂 part 的整链结构快照,含 type/enabled/参数/automation 默认值,专属后缀待定;应用=整链替换新发 id、颤音外键如实孤儿;bypass 入链)。共同口径承 part preset 判例:物化 dense 快照(默认值也是声音)、不含曲线/分段轨、单文件制平铺同一 Presets\ 文件夹(文件名=名字,同后缀全局命名空间;Save As 撞到其它引擎的同名文件时覆盖弹窗须带归属引擎名)。实现要点:TLP 的 effect 内联读写抽进 DataInfoJsonUtils(ToJson(EffectInfo)/ToEffectInfo)供链 preset 复用;存储管理层泛化 PresetConfigManager;UI=Effects 面板标题栏(链)+每卡片菜单(实例)。已定不做:part preset 不嵌 effect 链(声源域/处理域正交);旧链→新链颤音外键智能匹配(无可靠判据)。加性扩展后补:引擎出厂 preset(GetFactoryPresets DIM 默认空)。
多声道音频面:实现随第一个真实消费者(effect 挂 audio part / 立体声 instrument)立项;立项时把三段契约措辞钉进音频面注释与插件文档——①寻址以帧计②span 按 ChannelCount 交织、整帧原子③恒单声道承诺(未声明能力的 effect 永远只收单声道段,多声道走 CreateAudioSegment 新重载加性选入)。当前插件契约纯单声道
免重启卸载/更新扩展(加载器已 collectible-ready,切换 isCollectible:true 即可;当前走重启式安装器)
原生 dll 子目录(runtimes/<rid>/native 等)探测兜底 —— 当前原生依赖只走 .deps.json,无目录探测兜底(托管 dll 有)
context 统一(并入合成 context)—— 原挂"待 voice API 整体改造";voice SDK 重设计已落地,可重估是否还需要
主程序 .NET 升级(net8→net10,跳 net9 直上 LTS):SDK/Foundation 保持 net8 二进制地板、老插件 roll-forward;需一轮老插件加载回归,独立进行
CI 用 ApiCompat 对比黄金 dll 校验冻结契约(可选护栏)
权威野外插件兼容清单(真机实测持续补全)
release/2.0.0 → master 合并、effect worktree 清理
🔵 未来大版本方向
✅ 已完成(记录)
PropertyArray(有序可重复列表) :值模型 PropertyValue 补数组臂;live-doc IDataPropertyArray/DataPropertyArray+多选 MultipleDataPropertyArray;多选容器三态合并(数组按 index、对象按 key 并集;容器键部分成员缺失按结构合并不塌 Multiple;缺位=默认值、编辑即补齐);SDK ArrayConfig/ListConfig+面板 Array/ListController(独立元素渲染器);AddableObjectConfig 变长键控容器+自动化联动(多说话人混音式);TLP JSON/CBOR 序列化;扩展设置持久化支持 list/array/嵌套 object;单测 PropertyArrayTests/MultiSelectMergeTests+夹具+手测用例 PROPERTY-ARRAY-TEST-CASES.md。提交 74b7c83/a692497/924b7e9/60ff5e1/937f9a7/fde9a0b/341c4ec。typed 叶子包装(Bool/Number/String)维持已划掉(零消费者、具体类型重载替代)。
颤音影响 effect 自动化参数 :Vibrato.AffectedEffectAutomations(键=槽位下标+轨 id,与 voice 影响表平行、命名空间互不相扰);标脏分源(EffectAmplitudesModified 与 RangeModified 二分,改 effect 关联振幅只惊动 effect 链、不把 voice 标脏重合成);取值按 AutomationKey 路由,effect 轨终值=曲线+颤音偏移(与 voice 共享包络语义);拖拽关联/双击解除/叠加层对 voice/effect 统一;快照按槽位切片冻结;TLP JSON/CBOR 补 affectedEffectAutomations 嵌套表;链结构变更经 RemapEffectIndexes 同撤销单元重映射槽位外键(配套 effect 实例稳定 id,8eaaae1)。提交 1ff23db。
effect 段内子区间增量(脏区间账本传导+局部重合成) :IAudioSegment.Resize(内容延续的扩展/裁剪,段身份跨几何变更存活、下游节点与缓存不因 part 增长而全灭);账本改绝对采样坐标 RangeModified(long,int)(内容变更必经 Write 记账、几何变更按对称差记账,重算范围由下游自决);IEffectSynthesisProcessor→IEffectSynthesisSession(持活视图+跨 Process 养缓存);回显独立信号 SynthesizedParametersChanged(长耗时引擎中途渐进发布);参考引擎 Slow Gain=局部重合成范式(账本收窄重算窗、耗时∝窗长、声称只罩窗口)。提交 72756cc;inpainting 形态测试插件 V1.Inpaint+手测用例 94d0b7e。
键值集合的集合表达式支持([CollectionBuilder]) :Map/OrderedMap 及其可变/只读接口挂 [CollectionBuilder],解锁 [] 字面量——含 new() 无法表达的接口目标 = [](不能 new 接口);Map 由继承 Dictionary 改为组合、公有枚举统一产出 IReadOnlyKeyValuePair,使单个 builder 通吃具体类与接口;只读接口空 [] 复用 Empty 单例(零分配);OrderedMap 保留覆盖语义与 RemoveAt/KeyAt/ValueAt 索引 API。连带:DataMap 内部字段由 Map 改原生 Dictionary(对外 IDictionary 契约不变)、TLP/CBOR 读写辅助方法形参 Dictionary→Map/IReadOnlyMap。非空 KV 字面量收益有限(元素是接口、new(...) 与 BCL KeyValuePair 都不隐式汇入、须显式 new ReadOnlyKeyValuePair<,>(...)),主要价值在空 []。独立测试 MapCollectionExpressionTests(7 例)。提交 39e1a9c。
扩展冲突消解矩阵(所有插件类型,非仅 format) :身份 id(format 扩展名 / voice·effect·agent 引擎 id)跨包可重名、非全局唯一键。四个 manager 从 id→单个(先到丢弃) 改为 id→多包并存(同包同 id 去重);ExtensionRouting 三合一——活实现解析(用户选择 / 内建优先 / packageId 序最小)+ 选择存 app Settings.json 的 ExtensionRouting 字典 + 冲突聚合;工程只引身份 id、不存包 id,选中包缺失按默认策略回退(工程跨机可移植);format import/export 各为可路由身份;ExtensionSettingsManager 改按 (packageId,id) 枚举;设置窗口「Extension Routing」页按类型分组(Voice/Effect/Agent Model/Format)、下拉显包名、专属图标;legacy 包 id 改用目录名(区分多包 + 反查包名,退役"legacy=空串");夹具 V1.RouteConflict.A/B(format)+V1.VoiceConflict.A/B(voice) + tests/EXTENSION-ROUTING-TEST-CASES.md。提交 1474ddb。
插件设置系统 (opt-in IExtensionSettings;设置窗口「扩展」页;ExtensionSettingsStore 单文件;设置按包分桶 root[packageId][kind:extensionId] 根治不同包同 id 串味,内建用 (built-in)、legacy 用目录名、V1 包用反向域名 id;密钥 DPAPI/钥匙串;agent 复用存储层)
effect 接口规范化(会话化) :厚 IEffectProcessor(每段一个)+ IEffectContext + IUpstreamAudioSegment;退役 IEffectInput/Output/Change;自订阅自管失效;EffectGraph 反应式 processor 图;回显轨端到端
manifest 入口统一 classes 数组 :退役 class/import/export 具名槽,改 classes 候选类清单、宿主按 type 所需接口扫描认领;assembly 保持单数(一能力的入口类同住一 dll,多 dll 走多 extensions[] 条目共享一 per-package ALC)
条件属性面板(§三.25,config=f(context) 提交时整树重算 + keyed-diff)
PropertyValue.Invalid 垫片清理(Invalid 正式化为长期哨兵)+ 装箱优化(标签+字段联合)
IDataObject.WillModify 改前事件(merge 对偶语义,对齐 C++ aboutToModify)
voice SDK 会话模型重设计(厚插件;插件面全秒轴)+ 合成分段 Segment SDK 形状(SynthesisSegment/IAudioSegment)
voice→effect 音频段化 + 按段增量重渲染(段握柄 / 按段独立过链 cache[segment][stage] / 波形 + 播放逐段;提交①②③,§三.28)
插件多语言(i18n)适配(插件侧自译 + 静态全局 host context + manifest localizations)
扩展侧边栏信息增强(icon / 作者 / 简介 tooltip / 真实类别徽标)
voice 插件实战开发文档(plugin-development.md §5:音素 I/O / 音高双通道采样 / 快照 / note·part 属性约定 / 原生依赖打包 + LLM 版同步)
🗑️ 不再跟踪(已决 / 无跟踪价值)
传给插件的音符是否宿主侧先去重叠 —— 已决 :SDK 直传可重叠序列、去重叠归插件(单声部按需截断 / 和弦原味消费),见 78096bb/caecc3e
assembly 单数 vs assemblies 复数 —— 已决 :保持单数;classes 复数是因一个能力可有多入口类(如 format 导入+导出),但它们同属一身份、同住一 dll;多 dll 包用多 extensions[] 条目(共享一 per-package ALC)表达
文档数据集合接口统一 / IDataObject DIM 重构(effect 那套 IReadOnlyDataCollection 统一)—— §三.20 已定"不纳入";§三.21/22/24 已重做数据/事件/导航模型(IDataObject.WillModify 已实装,见已完成)
跟踪 2.0 重构(数据/SDK 分层、老插件兼容、效果器、属性面板)之后有意推迟的事项。每项均已确认可安全后补(加性/非破坏);某项排期时可从本 issue 拆出独立 issue。
🔴 高优先级
🟡 中优先级
🟢 低优先级
.tleffectpreset,engine type 存文件内、列表按当前引擎过滤,不含 bypass/id)②链 preset(挂 part 的整链结构快照,含 type/enabled/参数/automation 默认值,专属后缀待定;应用=整链替换新发 id、颤音外键如实孤儿;bypass 入链)。共同口径承 part preset 判例:物化 dense 快照(默认值也是声音)、不含曲线/分段轨、单文件制平铺同一Presets\文件夹(文件名=名字,同后缀全局命名空间;Save As 撞到其它引擎的同名文件时覆盖弹窗须带归属引擎名)。实现要点:TLP 的 effect 内联读写抽进DataInfoJsonUtils(ToJson(EffectInfo)/ToEffectInfo)供链 preset 复用;存储管理层泛化PresetConfigManager;UI=Effects 面板标题栏(链)+每卡片菜单(实例)。已定不做:part preset 不嵌 effect 链(声源域/处理域正交);旧链→新链颤音外键智能匹配(无可靠判据)。加性扩展后补:引擎出厂 preset(GetFactoryPresetsDIM 默认空)。CreateAudioSegment新重载加性选入)。当前插件契约纯单声道isCollectible:true即可;当前走重启式安装器)runtimes/<rid>/native等)探测兜底 —— 当前原生依赖只走.deps.json,无目录探测兜底(托管 dll 有)🔵 未来大版本方向
IPlugin.GetExtension(id)字符串能力面)extern alias桥接)✅ 已完成(记录)
PropertyValue补数组臂;live-docIDataPropertyArray/DataPropertyArray+多选MultipleDataPropertyArray;多选容器三态合并(数组按 index、对象按 key 并集;容器键部分成员缺失按结构合并不塌 Multiple;缺位=默认值、编辑即补齐);SDKArrayConfig/ListConfig+面板 Array/ListController(独立元素渲染器);AddableObjectConfig变长键控容器+自动化联动(多说话人混音式);TLP JSON/CBOR 序列化;扩展设置持久化支持 list/array/嵌套 object;单测PropertyArrayTests/MultiSelectMergeTests+夹具+手测用例PROPERTY-ARRAY-TEST-CASES.md。提交74b7c83/a692497/924b7e9/60ff5e1/937f9a7/fde9a0b/341c4ec。typed 叶子包装(Bool/Number/String)维持已划掉(零消费者、具体类型重载替代)。Vibrato.AffectedEffectAutomations(键=槽位下标+轨 id,与 voice 影响表平行、命名空间互不相扰);标脏分源(EffectAmplitudesModified与RangeModified二分,改 effect 关联振幅只惊动 effect 链、不把 voice 标脏重合成);取值按AutomationKey路由,effect 轨终值=曲线+颤音偏移(与 voice 共享包络语义);拖拽关联/双击解除/叠加层对 voice/effect 统一;快照按槽位切片冻结;TLP JSON/CBOR 补affectedEffectAutomations嵌套表;链结构变更经RemapEffectIndexes同撤销单元重映射槽位外键(配套 effect 实例稳定 id,8eaaae1)。提交1ff23db。IAudioSegment.Resize(内容延续的扩展/裁剪,段身份跨几何变更存活、下游节点与缓存不因 part 增长而全灭);账本改绝对采样坐标RangeModified(long,int)(内容变更必经 Write 记账、几何变更按对称差记账,重算范围由下游自决);IEffectSynthesisProcessor→IEffectSynthesisSession(持活视图+跨 Process 养缓存);回显独立信号SynthesizedParametersChanged(长耗时引擎中途渐进发布);参考引擎 Slow Gain=局部重合成范式(账本收窄重算窗、耗时∝窗长、声称只罩窗口)。提交72756cc;inpainting 形态测试插件 V1.Inpaint+手测用例94d0b7e。[CollectionBuilder]):Map/OrderedMap 及其可变/只读接口挂[CollectionBuilder],解锁[]字面量——含new()无法表达的接口目标= [](不能 new 接口);Map 由继承 Dictionary 改为组合、公有枚举统一产出IReadOnlyKeyValuePair,使单个 builder 通吃具体类与接口;只读接口空[]复用 Empty 单例(零分配);OrderedMap 保留覆盖语义与 RemoveAt/KeyAt/ValueAt 索引 API。连带:DataMap 内部字段由 Map 改原生 Dictionary(对外 IDictionary 契约不变)、TLP/CBOR 读写辅助方法形参 Dictionary→Map/IReadOnlyMap。非空 KV 字面量收益有限(元素是接口、new(...)与 BCL KeyValuePair 都不隐式汇入、须显式new ReadOnlyKeyValuePair<,>(...)),主要价值在空[]。独立测试MapCollectionExpressionTests(7 例)。提交39e1a9c。ExtensionRouting三合一——活实现解析(用户选择 / 内建优先 / packageId 序最小)+ 选择存 appSettings.json的ExtensionRouting字典 + 冲突聚合;工程只引身份 id、不存包 id,选中包缺失按默认策略回退(工程跨机可移植);format import/export 各为可路由身份;ExtensionSettingsManager改按 (packageId,id) 枚举;设置窗口「Extension Routing」页按类型分组(Voice/Effect/Agent Model/Format)、下拉显包名、专属图标;legacy 包 id 改用目录名(区分多包 + 反查包名,退役"legacy=空串");夹具V1.RouteConflict.A/B(format)+V1.VoiceConflict.A/B(voice) +tests/EXTENSION-ROUTING-TEST-CASES.md。提交1474ddb。IExtensionSettings;设置窗口「扩展」页;ExtensionSettingsStore单文件;设置按包分桶root[packageId][kind:extensionId]根治不同包同 id 串味,内建用(built-in)、legacy 用目录名、V1 包用反向域名 id;密钥 DPAPI/钥匙串;agent 复用存储层)IEffectProcessor(每段一个)+IEffectContext+IUpstreamAudioSegment;退役IEffectInput/Output/Change;自订阅自管失效;EffectGraph反应式 processor 图;回显轨端到端classes数组:退役class/import/export具名槽,改classes候选类清单、宿主按type所需接口扫描认领;assembly保持单数(一能力的入口类同住一 dll,多 dll 走多extensions[]条目共享一 per-package ALC)Invalid正式化为长期哨兵)+ 装箱优化(标签+字段联合)IDataObject.WillModify改前事件(merge 对偶语义,对齐 C++aboutToModify)SegmentSDK 形状(SynthesisSegment/IAudioSegment)cache[segment][stage]/ 波形 + 播放逐段;提交①②③,§三.28)🗑️ 不再跟踪(已决 / 无跟踪价值)
78096bb/caecc3eassembly单数 vsassemblies复数 —— 已决:保持单数;classes复数是因一个能力可有多入口类(如 format 导入+导出),但它们同属一身份、同住一 dll;多 dll 包用多extensions[]条目(共享一 per-package ALC)表达IDataObjectDIM 重构(effect 那套IReadOnlyDataCollection统一)—— §三.20 已定"不纳入";§三.21/22/24 已重做数据/事件/导航模型(IDataObject.WillModify已实装,见已完成)