v2.0.1 · 修复设置不保存、F5/F7 快进后退、卷帘显示
v2.0.1
修两个问题。第二个影响更大。
修复:设置从来没保存过,「快速上手」每次都弹
现象:速度、移调、热键、输入兼容全都不记忆。每次启动都弹「快速上手」。
原因:发布开了裁剪(PublishTrimmed)。反射式 JSON 序列化依赖的元数据被裁掉,
运行时抛异常。而 Save 与 Load 原先都静默吞掉异常,所以一点提示都没有。
发布日志里早就有警告,只是我没当回事:
Persist/AppConfig.cs(52,41): warning IL2026: Using member
'System.Text.Json.JsonSerializer.Serialize<TValue>(TValue, JsonSerializerOptions)'
which has 'RequiresUnreferencedCodeAttribute' can break functionality when trimming.
改动:设置读写改用源生成的 JSON 上下文(JsonSerializerContext)。
编译期产出读写代码,不依赖反射,裁剪下也正常。
另外把两处静默 catch 改为写日志,以后再出问题能查到。
验证:用与发布完全一致的裁剪构建连跑两次。
| 浮层可见 | FirstRunDone | settings.json | |
|---|---|---|---|
| 第 1 次,点「知道了」 | 是 | 否 → 保存后 是 | 已写入 |
| 第 2 次 | 否 | 是 | 已存在 |
发布时的 AppConfig 相关裁剪警告:2 条 → 0 条。
「快速上手」的文字同时精简。三段各一句话,注意事项压成一行。
原来占满一屏,现在是一张小卡。
修复:F5 与 F7 不是相对移动
按 F7 总是跳到 5 秒。按 F5 总是回到开头。
原因:取当前位置时只在「正在演奏」的分支里读引擎时钟。
double cur = playing ? eng!.ElapsedSeconds : _previewSeconds;其余情况读 _previewSeconds。刚打开歌曲时它是 0。
所以 0+5 得 5 秒,0−5 被夹到 0。
改动:播放位置改为只有一个来源。试听中读试听时钟。演奏中读引擎时钟。
空闲时读起始位置,并且每次定位都同步更新它。
实测(未播放,歌曲长 21 秒):
前进 5 秒:10.0 → 15.0 s
后退 5 秒:15.0 → 10.0 s
后退 5 秒:10.0 → 5.0 s
前进 5 秒:5.0 → 10.0 s
后退 999 秒:10.0 → 0.0 s 正确夹在开头
日志现在写明前后位置,方便你自己核对。
请在 Windows 上确认
- 首次启动应弹「快速上手」。点「知道了」。再启动一次,不应再弹。
- 改速度、移调、热键,关掉程序,再打开。设置应保持。
- 空闲时按 F7 几次。位置每次加 5 秒。按 F5 每次减 5 秒,到 0 停住。
- 播放中、试听中也按 F5 / F7。应从当前位置加减 5 秒。
修复:卷帘左键栏只剩 C4-C5,正在响的音符不显示
现象:声音正常,但卷帘看不到音符,左键栏只有一个八度(正好 C4 到 C5)。
原因:一个声部都没勾选时,刷新流程会清空卷帘。而演奏引擎在开始播放时
已经把音符复制走了,所以声音继续,画面却空了。
左键栏的 C4-C5 是「音符列表为空」时的兜底区间,正好一个八度,所以看起来像音域变了。
改动:
- 已载入文件但没勾选声部时,不再清空卷帘,保留上一次的内容,并在日志写明。
只有「根本没载入文件」才清空。 - 音符为空时,左键栏沿用上一次的音域,不再退回固定的 C4-C5。
如果又出现这个现象,请在 %LOCALAPPDATA%\HarpAutoPlayer\play.log 里
找「没有任何声部被勾选」这一行,并把当时的操作顺序告诉我。
修复:可见音域只有一个八度
现象:左键栏只显示一个八度(例如 C4 到 C5),超出范围的音符看不到。
原因:可见音域只保证「比谱面实际音高宽一个八度」。窄音域的曲子因此只显示一个八度。
而口琴能吹三个八度,于是可吹范围内的其它音高全在画面外,没法选中、没法拖过去改。
改动:可见音域的最小跨度改为 4 个八度(47 个半音),按谱面实际音高居中展开。
超出可吹范围的音符照旧用浅灰色画出来。现在它们一定在画面内,可以选中、拖动、删除。
实测:
| 文件 | 可见音域 | 跨度 |
|---|---|---|
| 示例3-铃儿响叮当 | A#2–A6 | 4 个八度 |
| 【车万】寄世界于偶像 | F1–E5 | 4 个八度 |
| 河北墨麒麟 | D#0–D#3 | 4 个八度 |