TAB Score Viewer 更新日志(v2.7.5)
这次更新跨度超大,从 a61afce 到 17d4679 共 89 个提交,版本号来到 2.7.5。简单说就是:重构了代码、加了超多新功能、提升了无障碍体验、修复了一堆 bug,现在需要 Python 3.11+ 才能跑。
🎉 重点速览
- 许可证变更:从 MPL 2.0 换成了 AGPL v3,LICENSE 文件已更新,所有语言包里的版权声明同步。
- 代码大重构:原来的“巨无霸”
TAB Score Viewer.py被拆成了core/、service/、ui/、workers/分层结构,维护起来更轻松,测试也更好写了。 - 类型注解全覆盖:核心模块都加了类型标注,引入
PyQt5-stubs,mypy 检查已开启(CI 只警告不阻塞)。 - 测试覆盖率:从约 85% 提升到 91%,1654+ 个测试全部通过,还加入了无障碍和截图回归测试。
- Python 版本要求:必须 3.11 及以上。
✨ 新功能(挑几个好玩的)
🎼 文件格式 & 播放
- 支持 GP7/GP8(.gp)文件:能解析 ZIP 包里的 GPIF XML 和二进制配置,智能加载,旧格式也兼容。
- GP3~GP5 和弦显示:重构了显示控件里的和弦渲染,去掉旧代码,显示更清爽。
- 节拍器:GTP 模式下自动读 BPM 和拍号,图片/PDF 模式可手动设置;支持全局增益滑块,可配置分母;快捷键
Ctrl+M一键开关。 - GTP 播放前倒计时:3 秒倒计时 + 节拍器同步,中途可取消。
- 速度曲线编辑器:可以自己画播放速度变化曲线,随心调速。
- A-B 循环播放:支持设置起点终点循环播放,练琴神器。
🧭 界面 & 操作体验
- 收藏夹:最近文件列表上方新增可折叠的收藏列表,右键点击文件即可标星/取消,最多存 100 个,空星/实星图标直观。
- 难度评分:GP3~GP8 文件自动评分(基于 SQLite 缓存,文件修改后重新计算),背景线程批量处理,文件列表里显示星标和详情弹窗,非吉他音轨自动过滤。
- 自定义全局快捷键:可视化配置界面,冲突检测,支持中英日三语。
- 命令行启动:新增
cli_launcher.py,支持 macOS 文件打开事件,跨平台启动逻辑统一,窗口里加了“主页”按钮方便切换。 - 自动更新检查:新模块,使用 certifi 增强 SSL 兼容,集成到“关于”和“设置”界面。
- 应用内日志系统:可调级别,高级设置里开关,“打开日志目录”一键直达。
- 关于对话框:显示版本、许可证、作者、联系方式、AI 声明等,三语支持。
- 主题扩展系统:用户把 JSON 或 Python 文件丢进
themes/文件夹就能自动加载新主题,UI 和 GTP 渲染同步应用。 - 缺失音色库提示:启动时检测到
FluidR3_GM.sf2缺失会弹出引导对话框,告诉你各个平台该去哪下载。
♿ 无障碍(a11y)
- 色盲/色弱模式:6 种模拟模式,专属设置页带实时预览,所有界面(滑块、对话框等)都能即时刷新。
- 键盘导航:最近文件和收藏列表支持
↑/←折叠展开。 - 辅助功能标签:所有 UI 组件都添加了
accessibleName和accessibleDescription,读屏更友好。
🎸 实用小工具
- 吉他调音器:基于自相关算法的音高检测,标准 EADGBE 六弦实时调音,带状态指示,快捷键
Ctrl+T,全窗口单例避免麦克风冲突,支持三语。
🔧 重构(开发向,但你也能感受到稳定性提升)
- 原来的单文件被拆分到
core/(常量、字体、国际化、主题、数据模型、快捷键、更新检查、色盲模式、难度评分)和service/(节拍器、播放引擎、控制器、收藏服务等)以及ui/(窗口、控件、对话框、打印等)和workers/(异步任务)。 DisplayWindow被拆成了工具栏、控制面板、底部栏、音频面板等独立组件,代码更清晰。- 设置对话框也拆成通用、GTP渲染、高级、色盲等多个面板,由状态机控制。
- 导出/打印逻辑独立成纯函数模块。
- 大量 lambda 信号槽改为命名函数,避免闭包变量捕获问题。
- 用
logging替代print,日志更规范。
🧪 类型安全 & 测试
- 核心模块全部加类型注解,使用
TYPE_CHECKING避免运行时循环导入。 - mypy 开启
disallow_untyped_defs等检查(仅警告,不影响 CI)。 - 修复了若干真实类型错误(比如
cvd.py里错误使用模块级app)。 - 新增大量单元测试,覆盖新控制器、服务、控件、对话框和调音器,修复了跨平台路径问题。
🚀 CI/CD & 打包
- GitHub Actions 增加 ruff 检查、pytest 测试、mypy 类型检查、i18n 翻译同步。
VERSION文件打进所有平台的 spec 包里。- macOS 支持 Apple Silicon,自动检测 Homebrew 路径,修复 PyInstaller BUNDLE 模式下的 SVG 图标加载。
- PyInstaller 的隐藏导入更新,补全核心模块和服务模块。
- 应用图标添加
.icns格式。
🐛 修复的 Bug(挑几个影响大的)
- 打击乐无声(v1.1.2 遗留):修复了 GP7/GP8 鼓轨 MIDI Bank Select 编码错误,并补全了 GPIF 打击乐音高映射。
- GP7/GP8 弦位错乱:修正了音符到弦的映射,在解析器文档和注释里说明了弦号反转问题,FAQ 里增加了 Q5/Q6。
SpeedCurveConfig崩溃:补上@dataclass装饰器,避免field(default_factory)返回 Field 对象而不是列表,加绘回归测试。- 主题切换失效:修复了文件名带空格时主窗口不刷新的问题;给设置对话框和选择窗口加了
objectName以精确匹配 QSS;DisplayWindow 强制重绘背景色。 - macOS 双击 GTP 启动失败:重构 CLI 启动逻辑,延迟处理 Apple Event,避免内存泄漏。
- macOS 权限问题:添加 TCC 预热钩子,跨语言权限错误提示并重新选文件。
- A-B 标签未初始化:补上缺失的
ab_info_label,移除hasattr回退,改用 logging。 - 色盲模式刷新:修复了 4 个窗口(关于、设置、DisplayWindow、ModernSlider)应用颜色矩阵的问题,统一通过
ThemeManager.get()获取。 - 分轨 GTP 注释路径:在音频引擎初始化后重新加载注释控制器,避免
gtp_player未就绪时丢失路径。 - 吉他技巧评分权重:调整了评分算法,难度更合理。
- 字体模块导入:修正
get_font_family→get_ui_font_family。 - 更新检查 SSL:使用 certifi 优先的上下文,解决 macOS 证书问题,修正 User-Agent 格式。
📚 文档更新
- 添加 LICENSE 文件,所有本地化许可文本同步为 AGPL v3。
- README 更新标题、版本徽章,优化 macOS 安装说明(精简冗余)。
- FAQ 扩展(GP7/GP8 弦映射问题 Q5/Q6)。
- 新增 alphaTab 弯音/颤音/摇杆 MIDI 合成原理分析文档,附带 ApolloTab 移植笔记。
- 添加国际化贡献指南(中英双语),翻译同步脚本移到
tools/。 - 项目记忆文档压缩到 250 行以内,保持简洁。
📦 依赖变化
- 新增:
Pydantic v2(用于 settings.json 校验与序列化)、PyQt5-stubs>=5.15.6.0、pytest-qt。 - 升级:
PyMuPDF到1.24+。 - 注意:ARM Linux 用户如果 pip 安装 PyQt5 失败,建议用系统包。
⚙️ 配置系统
- 基于 Pydantic v2 重构,增加配置校验测试。
- 新增配置项:启动时检查更新、日志开关/级别、色盲模式、自定义快捷键、节拍器增益/拍号分母、收藏列表。
提交范围:a61afce → 17d4679(89 个提交)
最终版本:2.7.5
👏 致谢
感谢新贡献者 @LiJingrong123456 在 PR #3 中大刀阔斧重构并修复诸多 bug!
完整变更记录:
https://github.com/Zhuwenqian/TAB-Score-Viewer/compare/v2.1.0...v2.7.5