Skip to content

v2.0.1 · 修复设置不保存、F5/F7 快进后退、卷帘显示

Choose a tag to compare

@ChickenD233 ChickenD233 released this 12 Sep 19:03

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 上确认

  1. 首次启动应弹「快速上手」。点「知道了」。再启动一次,不应再弹。
  2. 改速度、移调、热键,关掉程序,再打开。设置应保持。
  3. 空闲时按 F7 几次。位置每次加 5 秒。按 F5 每次减 5 秒,到 0 停住。
  4. 播放中、试听中也按 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 个八度