番茄简谱的开源渲染核心和兼容应用。部署于 https://fanqie.linho.cc/。
简谱,也称数字谱,是中国大陆地区通行的记谱方式。用数字表记音高,表示时值的符杠以数字下划线形式表记。市面上制作简谱的免费软件较少。
番茄简谱是一款用户数量不少的免费简谱软件,它定义了一套称为「番茄简谱脚本」的 DSL,将其编译成 SVG 形式的谱面。并提供了一套 说明文档(镜像)。
原版以 在线服务 的形式提供,实际上谱面渲染由 PHP 后端完成(每次编辑内容都会产生请求,后端返回 SVG)。维护状态比较糟糕,证书过期且偶发服务中断。由于难以联系到原作者,因此有了该项目。
本项目的目标是从头实现一遍番茄简谱脚本的解析与渲染逻辑,使用 TypeScript 以便在前端直接执行,无需发送回后端渲染,不依赖网络。并以此为基础重写前端与客户端。
当前计划:
- 语法解析器核心
- SVG 渲染器核心
- 实现全流程谱面渲染
- 在浏览器中导出 SVG、JPG 和 PDF
- 拼回原版前端
- 基于原版前端上线网站
- 基于原版前端打包客户端
- 重写新前端
- 基于新前端上线网站
- 基于新前端打包客户端
解析和渲染器的细节冗杂、逻辑量大,且需要与原接口对齐,因此本项目大量使用了 LLM。不过 AI 生成代码均经人类复核与测试。
原版番茄简谱有不少 bug。项目初期阶段打算复现大部分语义以保持兼容性并方便与原 API 对比测试,仅对一些过于离谱的 bug 做修复。
破坏语义的 bug 修复,我计划在整体逻辑稳定后发布与番茄简谱对齐的 v1 版本,此后再在新版本迭代修复。目前已经发现的 bug 包括:
- 声部之间的节拍对齐仅止步四分音符级别,更细的节拍不再对齐(例如 1//1//1//1// 与 2/2/ 会直接左对齐)
- 减时线分组一律按四分音符时值,未考虑 6/8 拍
- 临时声部包裹三连音时,在三连音后的第一个小节线前闭合,不按 tuplet 缩放推迟
- 同一行连续两段
{dsb ...}时,只有一个左括号、没有右括号,后续上下声部恢复混乱
如果有更多问题,欢迎提 issue 反馈。
使用 pnpm workspace 管理,各包位于 packages 目录:
@openfanqie/core:解析 DSL 并输出 SVG。@openfanqie/export-jpg:在浏览器中将 SVG 谱面转换为 JPG,支持 96/300 DPI。@openfanqie/export-pdf:在浏览器中将多页 SVG 谱面导出为 PDF。@openfanqie/legacy-app:直接 vendor 的原版前端,略作修改以接入重写版渲染核心。
脚本解析器与渲染器为从零实现,以 MIT 协议开源。
原版前端为原网站直接爬取,复制入仓库。尽管原网站上明文提供,但严格来说仅为 source available,并非开源。若有侵权请通过 issue 联系我删除。