LilyPondとGhostscriptとTeXで作る楽譜と文章を組み合わせたドキュメント

これは「LilyPond Advent Calendar 2017」の4日目の記事です。
TeX & LaTeX Advent Calendar 2017」の4日目の記事でもあります。

LilyPondは高品位の楽譜を作成することができ、楽器屋さんで「楽譜」として売られているような本の中の楽譜だけのページが続いているような部分を単独で作ることができます。一方、楽譜と文章を組み合わせたようなページが必要になることもありますが、LilyPondは文章の組版が得意ではありません。そういうときは文章の組版が得意なTeXと組み合わせて使おう、ということになります。本稿ではそういった方法をご紹介します。

はじめに

筆者は先日のTeXConf2017で「Extract PDFmark による PDF ファイルサイズ削減」という題名でお話しをさせていただきました。そこではTeXの文書中にLilyPondで作成した楽譜断片を貼り付けるサンプルを示し、GhostscriptExtract PDFmarkを使ってファイルサイズを削減する方法をご紹介しました。詳しくはリンク先にアブストラクトや発表資料がありますのでご覧ください。

TeXConf2017での発表の主題は「PDF ファイルサイズ削減」であって1、楽譜と文章を組み合わせることではありませんでしたので、サンプルとしては既にできあがっていて独立した楽譜断片を使いました。ですが、実際に楽譜と文章を組み合わせたドキュメントを作成する場合は、先に個々の楽譜断片をそれぞれ個々の小さなPDFファイルに出力し、それらをLaTeX文章へ間違えないように \includegraphics を使って貼り付けていく、といったやり方になり少々手間がかかります。

LilyPondには、こういった流れを自動化する lilypond-book というツールがあります。TeXConf2017のサンプルでは使いませんでしたので、本稿では lilypond-book を使いつつTeXConf2017でご紹介したGhostscriptとExtract PDFmarkを駆使する方法で、楽譜と文章を組み合わせたPDFを作成してみたいと思います。

楽譜と文章を組み合わせたドキュメント

楽譜と文章を組み合わせたドキュメントには、どんなものがあるでしょうか。LilyPondのマニュアルには

テキストのなかには楽譜の例を保持しているものがあります。そのようなテキストには、音楽学の専門書、歌集、このドキュメントのようなマニュアルがあります。

という例が挙げられています。

音楽学の専門書

たとえば筆者がLilyPondで楽譜作成する際にいつも手元に置いて参照している「エッセンシャル・ディクショナリー 楽典・楽譜の書き方」あたりが該当するでしょうか。この本は記譜の様々なルールが記載されているもので、リンク先で中身を少しご覧いただけるのではないかと思いますが「こういうときにはこういう楽譜にする」といったような内容がたくさん並べてあります2。この本がLilyPondやTeXで作られたか否かはわかりません3が、間違いなく楽譜と文章を組み合わせたドキュメントでしょう。

歌集

歌詞は文章(詩)なので、これも楽譜と文章を組み合わせたドキュメントになります。楽譜の音符に付随するような歌詞であったり、発想記号のように楽譜に付随して書かれるような文であればLilyPond単独でも組版できます。といいますか、こういうものは小節や音符の位置に応じて位置を決めたりしなければなりませんから、LilyPondで組版せざるを得ないと思います。一方で、楽譜とは独立して歌詞を掲載するような場合、例えば音符に付随する歌詞をひらがなやカタカナで表記する部分と、漢字かなまじり表記で詩を掲載する部分とがそれぞれある場合には、前者はLilyPond、後者はTeXで組版するなどの分担をすることになると思います。

マニュアル

LilyPondのマニュアルは「こういうソースファイルはこういう楽譜になる」といった内容が並んでいますので、楽譜と文章を組み合わせたドキュメントですね。筆者はこのマニュアルの執筆にも参加していますので、本稿ではこれをベースにしたいと思います。

LilyPondのマニュアル

LilyPondのマニュアルやWebページはTexinfoというもので書かれています。TexinfoはGNU公式文書フォーマットで、LilyPondを含めGNU関連プロジェクトのドキュメント形式として広く使われています。Texinfo形式で書かれたファイルを1つ用意すればHTMLやPDFをはじめとする様々な形式のドキュメントを出力することができます。TexinfoからPDFを出力する際にTeXが使われている、というわけです4

やってみよう

それでは、実際にLilyPondのマニュアルと同様のTexinfo文書に楽譜を埋め込んだものを作ってみましょう。

ソースファイル

まずはTexinfoのソースファイルです。

sample.tely
\input texinfo-ja.tex @c -*- coding: utf-8 -*-

@documentencoding UTF-8
@documentlanguage ja

@settitle 雪に関する音楽
@afourpaper

@titlepage

@title 雪に関する音楽
@author 細田真道

このドキュメントは @code{lilypond-book} を使った
Texinfo サンプルとして作られました。

@end titlepage

@contents

@ifnottex
@node Top
@top 雪に関する音楽

このドキュメントは @code{lilypond-book} を使った
Texinfo サンプルとして作られました。

@end ifnottex

@node 童謡
@chapter 童謡

雪や☃に関する童謡を探してみました。

@node 雪
@section 雪

雪に関する童謡としては非常に有名ですね。
おそらくほとんどの方がご存じなのではないでしょうか。
題名はそのままストレートに「雪」、
「尋常小学校唱歌」第二学年用(明治44年/ 1911年)が初出だそうです。
冒頭部分を以下に示します。

@lilypond[fragment]
<<
  \relative
  {
    \clef treble
    \key f \major
    \time 2/4

    c''8. d16 c8. d16 | c4 a8 r |
    a8. bes16 a8. bes16 | a4 f8 r |
  }
  \addlyrics
  {
    ゆ "" き や こん こ
    あ ら れ や こん こ
  }
>>
@end lilypond

@node ☃雪達磨
@section ☃雪達磨

☃に関する童謡を探してみたところ、こんなものを見つけました。
題名は「雪達磨」、
「新訂尋常小学唱歌」第一学年用(昭和7年/ 1932年)に掲載されているそうです。
冒頭部分を以下に示します。

@lilypond[fragment]
<<
  \relative
  {
    \clef treble
    \key f \major
    \time 2/4

    a'8. bes16 c8 r | a8. bes16 c8 r |
    a8. bes16 d8 c | c4 r |
  }
  \addlyrics
  {
    だ る ま だ る ま
    ☃ゆ き だ る ま
  }
>>
@end lilypond

@bye

通常、Texinfoのソースファイルは拡張子 .texi ですが、 lilypond-book で処理するものについては .tely にします。ソースファイル中の @lilypond@end lilypond で挟まれた部分がLilyPondによる楽譜の記述です。

楽譜の処理(中間ファイルの生成)

LilyPond がインストールされていれば以下のコマンドを実行します。

$ lilypond-book --pdf sample.tely

これでいくつかの中間ファイルが生成されます。2桁16進数のディレクトリが2つ掘られて、その中にそれぞれ楽譜断片のPDFやPNGなどが生成されます。また、 sample.tely から作られた sample.texi も生成されます。これは .tely にあった @lilypond ブロックが楽譜断片のPDFやPNGを張り付けるコマンドに置き換わったものです。

PDF生成

中間ファイルが生成できたら、いよいよPDFの生成です。XeTeXを使う方法とLuaTeXを使う方法があります5

XeTeX

XeTeXを使ってPDFを生成します。

$ PDFTEX=xetex texi2pdf sample.texi

もしかしたらエラーが出るかもしれません。このコマンドを実行するには、

  • Texinfo 6.3 以降
  • XeTeX 0.9998 以降(TeX Live 2012 以降)
  • zhspacing (TeX Live の中国語パッケージに付属)
  • IPAex フォント

が必要です。また、困ったことに環境によってはTexinfoパッケージに日本語用ファイルの一部が同梱されていないことがあるようなので、もしtexinfo-ja.texが見つからないというエラーが出た場合にはダウンロードしてカレントディレクトリに入れてみてください。もしかしたらtxi-ja.texも必要になるかもしれません。それでもまだ問題が起きるようであれば、最新のtexinfo.texもカレントディレクトリに置いてみてください。これでPDFが生成できるようになると思います。生成したPDFは、筆者の環境では2,193 KBになりました。結構サイズが大きいですね。

XeTeX出力

sample_3.png

LuaTeX

もし、XeTeXではなくLuaTeXを使いたいという場合には以下のコマンドに変更します。

$ PDFTEX=luatex texi2pdf sample.texi

LuaTeXの場合には、

  • Texinfo 6.3 以降
  • LuaTeX 0.95 以降(TeX Live 2016 以降)
  • LuaTeX-ja (TeX Live の日本語パッケージに付属)
  • IPAex フォント

が必要になります。 texinfo-ja.tex などもXeTeXのときと同様、別途用意していただくことになるかもしれません。これでPDFを生成したところ、筆者の環境では2,332 KBになりました。XeTeXは中国語用パッケージを半ばムリヤリ使っているのに対して、LuaTeXは日本語用ですから日本語の組版品質はこちらの方が良いと思います。ですが残念なことにLilyPondのマニュアルは公式ビルド環境のLuaTeXが古くてTexinfoが使えず、仕方なくXeTeXを使っています6 7

LuaTeX出力

sample_3.png

HTML生成

TexinfoはWebページも生成できます。

$ makeinfo --html -o . sample.texi

これで index.html ができたと思います。ブラウザで開いてみると楽譜断片がPNGで張り付けられているのがわかると思います。

ファイルサイズ削減

筆者の環境で生成したPDFはXeTeX、LuaTeXともに2 MBを超えるファイルサイズになりました。これをTeXConf2017でご紹介したGhostscriptとExtract PDFmarkを使った方法で小さくしてみましょう。中間ファイルも更新する必要がありますので、以下のようにして一旦削除してください。

$ rm -r ??/

楽譜の処理(中間ファイルの生成)

ファイルサイズ削減用の新しい中間ファイルを作ります。

$ lilypond-book --pdf --process='lilypond -dbackend=eps --pdf -dfont-export-dir=fonts -dgs-never-embed-fonts --bigpdfs' sample.tely

本稿執筆時点で最新のVer. 2.19.80では上記の通りですが、TeXConf2017でもお話しした理由により将来変更予定です。より新しいバージョンをお使いであれば、以下のようにしてみてください。

$ lilypond-book --pdf --process='lilypond -dbackend=eps --pdf -dfont-export-dir=fonts --pspdfopt=TeX-GS' sample.tely

楽譜断片のPDFにはフォントが埋め込まれなくなりました8。そして新しく fonts ディレクトリ以下に楽譜断片で使っていたフォントがPostScript形式で置かれます。

PDF生成

最初のPDF生成は今までと同じです。つまり、

$ PDFTEX=xetex texi2pdf sample.texi

もしくは

$ PDFTEX=luatex texi2pdf sample.texi

です。これで生成された sample.pdf には楽譜断片のフォントが埋め込まれていませんのでファイルサイズは小さいですが正常に表示できません。筆者の環境ではXeTeXで47 KB、LuaTeXで186 KBです。

次にExtract PDFmarkで宛先名などを抽出します。

$ extractpdfmark sample.pdf > sample.pdfmark.ps

そして最後にGhostscriptでPDFを処理し、最終PDFを生成します。

$ gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=sample-embeded.pdf fonts/*.font.ps sample.pdf sample.pdfmark.ps

これで正常に表示できて、ファイルサイズが小さいPDFが得られました。筆者の環境ではXeTeX、LuaTeXともに1,139 KBとなりました。サイズが半分ぐらいになりましたので、かなり小さくなりましたね9

おわりに

LilyPondとGhostscriptとTeXを使って楽譜と文章を組み合わせたドキュメントを作る方法をご紹介しました10。本稿ではTexinfoを使いましたが、もちろん普通のLaTeXでも同様のことができますので試してみていただけると幸いです。LaTeXの場合は拡張子を .lytex にして、\begin{lilypond}\end{lilypond} で挟めばよいです。詳しくは使用方法をご覧いただければと思います。


  1. もちろんExtract PDFmarkのご紹介も目的の一つでした。 

  2. (余談)筆者は日本語版が出るよりも前に英語版を買っていました。日本語版が出るという話を耳にして、素晴らしいすぐに買わねばと思いつつも、英語版は買わなくてもよかったかな、とか複雑な心境でした。ですが、両方並べてみると日本語と英語の音楽用語の違いがよくわかって面白いです。「楽譜の読み方」の本はたくさん見つかりますが、書くときにはどういうルールがあるのかちゃんと説明している本はほとんどないので貴重だと思います。なお、記譜法を本当にキッチリカッキリ勉強するのであれば、もっと専門的な本が必要になると思います。筆者は音楽の専門家ではないのでよくわかりませんがこの辺の本がそういうものなんだろうと思っています。 

  3. 見る人が見ればわかるのでしょうけど、筆者には雰囲気的に違ってそうな気がするな、ぐらいしかわかりません。。。 

  4. このときplainTeXが使われます。LaTeXではありません。 

  5. 本家Texinfoで日本語PDF生成できるのはXeTeXもしくはLuaTeXだけで、pTeXは使えません。本家Texinfo以外に、pTeXでTexinfoを使うことのできる実装がいくつかあるようですので、そういうものを使えばpTeXでもできるかもしれません。 

  6. LilyPondのPDFドキュメント生成にはXeTeXが採用されていますが、これは別に日本語PDFを生成したかったからではありません。もともとpdfTeXが採用されていたのですが、英語版などでフォントの問題が発生したためXeTeXに乗り換えたという経緯があります。この時はまだ日本語PDFが生成できるようになっていませんでしたが、将来的にそうしたかったので日本語対応がしっかりしているLuaTeXへの乗り換えを進めようとしました。ですが、当時のLuaTeXでは英語ドキュメントであってもTexinfoがうまく動いてくれずXeTeXしか選択肢が無かったのです。その後、Texinfo本家がVer. 6.3で日本語PDF生成をサポートしたのを機にLilyPondにも英語版と同じXeTeXを使って日本語PDFを生成できる機構を入れました。いまどきのLuaTeXは英語も日本語も問題なく動作しますが、LilyPondの公式ビルド環境はまだ古いままですのでXeTeXしか使えません。もし新しくなったところで、一度苦労してXeTeXへ乗り換えているので、いまさら再度LuaTeXに乗り換えるというのは無いだろうなぁと思っています。 

  7. それ以前に日本語版のPDFドキュメントは公式サイトにありません。公式ビルド環境はもちろん、ほとんどの開発者の環境には日本語用のファイルがなくて日本語PDF生成ができないため、デフォルトで日本語版ドキュメントはHTMLのみ生成されるようにしてあります。ソースファイル中のDocumentation/ja/GNUmakefileのコメントに記載のように、必要な環境を用意してPDF生成を抑止している部分をコメントアウトすれば日本語PDFドキュメントが生成できます。英語版などのPDFドキュメントはデフォルトで生成されるようになっています。 

  8. TrueTypeフォントは埋め込まれます。これはTeXConf2017でもご説明しましたが、埋め込まないと文字化けを起こすからです。 

  9. 筆者の環境では日本語フォントに源ノ明朝が選択されるようにしたので、ここまで差が出たものと思います。TrueTypeフォントであるIPA明朝などが選択される環境では、ここまでの差にはならないと思います。とはいえ文章中の楽譜断片の数が増えれば増えるほど差は開いていきますので、TeXConf2017や本稿でご紹介した方法はどんなフォントでも有用だと思っています。 

  10. ご紹介した方法は、楽譜断片をPDFで用意してTeXへ貼り付けています。TeXConf2017では、楽譜断片もTeXの出力もPDFではなくPostscriptにしておいて、最後の最後にPostscriptからPDFへ変換する方法もあるのではないか、というご指摘もいただきました。確かにそういう方法でPDFを小さくすることもできると思いますが、LilyPondのマニュアルPDFを生成するための要件としてはXeTeX(もしくはLuaTeX)を使用せざるを得ず、すると楽譜断片もTeX出力もPDFにせざるを得ず、残念ながらPostscriptで処理することができません。。。普通にpLaTeXでやる分には十分できると思います。 

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.