本项目致力于提供一个简单、高效的工具链,用于将基于传统乐谱记谱法(如琵琶谱、工尺谱、减字谱等)的文本输入,转换为统一的乐谱语法树结构存储,可以实时渲染为现代的、可发布的乐谱图像。以后将支持一键转换为简谱、五线谱、音频、midi文件等
- 实时预览: 在 PySide6 界面中实时输入乐谱语法文本,即时查看渲染结果。
- 语义化输入: 采用简洁的 Markdown 启发式语法,专注于乐谱的结构和符号,而非复杂的图形绘制。
- 核心服务分离: 渲染和处理逻辑封装在
scorelang服务层,易于扩展到不同的乐谱类型和输出格式。 - 可移植性强: 最终应用通过 PyInstaller 打包,可在 Windows 等系统上独立运行。
- 灵活的文件管理: 用户生成的数据(图片、保存的文本)保存在应用程序运行目录,易于管理和备份。
本项目基于 Python 3.x 和 PySide6 构建。建议使用虚拟环境(venv)运行。
- 下载最新版本的打包文件(
稍后会放入网盘)。 - 双击运行文件夹中的
MusicScoreHub.exe文件,应用程序启动后,在右侧文本输入框中输入乐谱文本。 - 点击“生成乐谱”按钮,即可在左侧看到渲染结果,图片文件将保存在运行目录下的
data/scores_image文件夹中。 - 也可以保存自己输入的语法文件,乐谱文件将保存在运行目录下的
data/scores_saved文件夹中。
本平台采用一套简洁的 Markdown 启发式语法 来输入乐谱,请严格遵循以下规则。 本指南详细说明了用于乐谱数字化和渲染的文本输入语法。请严格按照以下规则输入乐谱文本。
整个乐谱的信息
| 结构 | 示例 | 说明 |
|---|---|---|
| 乐谱标题 | # 迦陵频 |
必须 乐谱的名称。 |
| 调式 | @ 沙陀调 |
必须 乐曲使用的调式。如果不输入默认黄钟调 |
下面的是可以附加的元信息,用于归档和管理,不会被渲染到最终的乐谱图片中。
| 结构 | 示例 | 说明 |
|---|---|---|
| 来源 | % 来源:三五要录 |
可选 注明乐谱的出处。 |
| 录入者 | % 录入:冯氏羊肉馆 |
可选 注明乐谱的录入者。 |
| 审校者 | % 审校:冯氏羊肉馆 |
可选 注明乐谱的审校者。 |
| 日期 | % 日期:2025.10.12 |
可选 注明录入或审校日期。 |
可以在整个乐谱的任意地方插入介绍性文本
| 结构 | 示例 | 说明 |
|---|---|---|
| 插入文本 | = 这是一段乐曲介绍。 |
插入的文本将作为注释渲染。系统会自动换行。 |
| 手动换行 | = 第一行文本 = 第二行文本 |
通过换行然后重新开始一个新的 = 行来实现手动换行。 |
使用 ## 来新建乐段。
| 结构 | 示例 | 说明 |
|---|---|---|
| 乐段标题 | ## 入破第一 |
用于划分乐段,支持在下一行添加 @ 临时转调 信息。 |
| 临时转调 | @ 临时变宫 |
乐段标题后跟随 @ 可以进行临时的调式变化,作用于本乐段即以后所有乐段。 |
主谱字及其修饰符都必须包含在一对 花括号 {} 中。
下面是按散声到第四柱的主谱字:
下面是可以使用主谱字表示的时值符号:
(引符号可以用/y的修饰符表示,也可以直接用主谱字)
示例: {一}、{引}、{丁}
在主谱字后使用 小括号 () 插入小字(装饰音、副字)。
| 语法 | 示例 | 渲染效果 |
|---|---|---|
| 单个小字 | {一(二)} |
主字为“一”,小字为“二”。 |
| 多个小字 | {一(二三)} |
主字为“一”,小字为“二”和“三”。 |
时值减半符号和其他演奏技巧通过在主谱字后添加 斜杠 / 及其代号来实现。
| 代号 | 名称 | 语法 | 说明 |
|---|---|---|---|
| /h | 火 | {三/h} | 表示当前谱字的时值减半,并在渲染时标记“火”符号。 |
| /hh | 时值减半 | {一/hh} | 表示当前谱字的时值减半,但不渲染“火”符号。 |
| /y | 引 | {二/y} | 表示该谱字时值加一个单位。 |
| /f | 反拨(指法) | {七/f} | 表示该谱字附带“反拨”指法标记。 |
| /r | 断句 | {三/r} | 渲染为一个横杠,用于乐句之间的断开。 |
| /py | 乐拍子 | {一/py} | 右侧实心圆点。 |
| /pz | 只拍子 | {二/pz} | 底部空心圆。 |
| /b | 百 | {三/b} | 右侧的百标记。 |
| /ls | 连弹开始 | {二/ls} | 表示连弹开始。 |
| /le | 连弹结束 | {二/le} | 表示连弹结束。 |
-
连续“火”字: 当前一个字使用
/h(渲染火)后,紧跟的下一个字也必须加上/hh:{三/h}{四/hh}
-
时值减半但无火: 如果两个字都需要时值减半,但都不标记“火”,则都使用
/hh:{一/hh}{二/hh}
使用 /ls 和 /le 标记连弹的开始和结束。
| 语法 | 说明 |
|---|---|
{一/ls} |
连弹开始 |
{二/le} |
连弹停止 |
乐拍子和乐百符号(/py, /pz, /b, /r)在乐谱中主要用于标记乐句中的节拍重音或节奏点。
只拍子只会在时值累计到两字时才会被应用。
- 当拍子符号出现在引,丁上时,可以把“引”和“丁”变成主谱字输入:
{引/b}{丁/pz}
# 乐谱数字化小测试
@这里写调式
% 来源:三五要录
% 录入:冯氏羊肉馆
% 审校:冯氏羊肉馆
% 日期:2025.10.12
=这里写插入文本
## 在这里写乐段
@支持临时转调,不写则默认继承当前调式
=这里也可以插入文本
=也可以不写乐段,系统会自动帮你生成一个不渲染的空乐段节点
{一/py}
{二/py/pz}
{三/py}
{四/py/pz}
{五/b}
{六/py/pz}
{七/py}
{八/py/pz}
{九/py}
{十/py/pz}
{匕/py}
{卜/py/pz}
{敷/b}
{乙/py/pz}
{言/py}
{合/py/pz}
{斗/py}
{乞/py/pz}
{之/py}
{也/py/pz}
{也/b}
{丁/py/r}
{引/b}
#引符号可以用/y的修饰符表示,也可以直接用主谱字
## 修饰符号展示,可以叠加
{一/py/h}
{二/hh}
{乙/ls/py}
{三/le/pz}
{四/f/py}
{五/pz/py}
{六/y/b/pz}
{七(三七)/py}
{卜(八)/h/py}
{八/hh/pz}
{九/f/py}
{十/r}