Ohhnews

分类导航

$ cd ..
foojay原文

Sheetmusic4J 0.0.5 发布:新增 LilyPond 导入导出支持

#sheetmusic4j#lilypond#javafx#乐谱渲染#格式转换

Sheetmusic4J 是一个用于渲染乐谱并与之交互的 Java(FX) 库。继 MusicXML、MIDI、ABC 和 Guitar Pro 之后,0.0.5 版本又增加了一种格式:LilyPond。

感谢 Reddit 上的 Dani_E2e 和 Jurgen Lambrecht 建议支持 LilyPond!

LilyPond 是什么?

LilyPond 是一个免费、基于文本的制谱程序,许多音乐家和出版商用它来制作精美的印刷乐谱。你以纯文本形式在 .ly 文件中编写音乐,LilyPond 会将其编译成 PDF。大量古典曲目,从巴赫众赞歌到完整的管弦乐总谱,都有 .ly 源码可用,例如在 Mutopia Project 上。

$ lilypond
\version "2.24.0"
\header {
  title = "C Major Scale"
}

\relative c' {
  \clef treble
  \key c \major
  \time 4/4
  c4 d e f | g a b c | c b a g | f e d c |
}

导入与导出

借助 ScoreFile 门面,可以在 JavaFX 中直接加载并渲染 .ly 文件,而无需运行 LilyPond。任何乐谱,无论其原始格式是什么,也都可以保存为 LilyPond,从而导出高质量的 PDF:

$ java
Score score = ScoreFile.load(Path.of("bach-bwv610.ly"));

// ...and write any score back out as LilyPond
ScoreFile.save(score, Path.of("bach-copy.ly"));

LilyPond 的输入更接近编程语言,而不是数据格式,因此读取器的工作方式与 LilyPond 本身类似:解析器解析音名、默认时值和变量,解释器让音乐沿时间展开为谱表、声部、歌词和和弦名,汇编器则将结果切分成小节,并推导出 LilyPond 留给隐含处理的内容,例如跨小节线的延音线、变音记号和符杠。

支持的功能包括 \relative、\fixed 和 \transpose、和弦、延音线、圆滑线、连音组、装饰音、带替代段落的反复、多谱表与多声部、钢琴谱表、歌词、和弦名、力度记号、速度标记和排练记号等。像 \override 和 Scheme 代码这类排版微调会被跳过,因为 Sheetmusic4J 使用自己的布局。完整列表见 LilyPond 页面。

测试样本包含来自 LilyPond 文档的真实片段(一首巴赫管风琴众赞歌、一份管弦乐谱、指法谱、一首施托克豪森作品……),这是一种发现还有哪些工作要做的好方法。

排版改进

真实的 LilyPond 乐谱以新的方式考验了排版引擎,由此带来了惠及所有格式的改进:

  • 连音组现在像符杠一样位于符干一侧,或按乐谱指定的位置放置(placement 也会从 MusicXML 读取);它们会避开符头和符杠,并支持嵌套连音组。
  • 八度谱号,例如吉他高音谱号下方带 8 的谱号,以及打击乐谱号。
  • 不同 CPU 架构上的布局一致,通过避免音符间距中 Math.pow 的差异实现。

试用

在 Sheetmusic4J 网站上阅读完整状态更新,查看代码示例快速上手,或在 GitHub 上查看差异对比。

如果某个 LilyPond 文件无法正确加载或渲染,请在 GitHub 上告诉我,最好附上该文件。