LilyPondのデフォルトフォント

>   これは「[LilyPond Advent Calendar 2017](https://qiita.com/advent-calendar/2017/lilypond)」の12日目の記事です。

[LilyPond](http://lilypond.org)は高品位の楽譜を作成することができます。楽譜には様々なフォントが使われますが、特に何もしなくてもデフォルトフォントが使われます。

## デフォルトフォントを試す

まずは、どんなフォントがデフォルトで使われるのか試してみましょう。

### サンプルソース

以下のLilyPondソースファイルは一切フォントの指定をしていません。

```snowman.ly
% snowman.ly -*- coding: utf-8; -*-

\version "2.19.65"
\pointAndClickOff

\header
{
  title = "☃雪達磨☃"
  composer = "「新訂尋常小学唱歌」第一学年用（昭和7年/ 1932年）より"
}

melody = \relative
{
  \clef treble
  \key f \major
  \time 2/4
  \tempo 4 = 100

  a'8. bes16 c8 r | a8. bes16 c8 r |
  a8. bes16 d8 c | c4 r |

  bes8. bes16 a8 a | g4 f8 f |
  g8. g16 a8 f | g4 r |

  d'8. d16 c8 c | a8. bes16 c8 c |
  a16 a a g f8 g | a4 r |

  d8. d16 c4 | a8. bes16 c8 c |
  a8. a16 g8 g | f r r4 \bar "|."
}

textone = \lyricmode
{
  ダ ル マ | ダ ル マ |
  ユ キ ダ ル | マ☃ |

  ゴ モ ン ノ | マ ヘ ノ |
  ユ キ ダ ル | マ☃ |

  オ ホ キ ナ | タ ド ン ノ |
  メ ダ マ ヲ ム イ | テ |

  コ ハ イ | カ ホ シ テ |
  タ ツ テ ル | ネ \bar "|."
}

texttwo = \lyricmode
{
  だ る ま | だ る ま |
  ゆ き だ る | ま☃ |

  と ほ り の | か ど の |
  ゆ き だ る | ま☃ |

  な が い ー | ま つ ば の |
  お ひ げ を は や | し |

  ゐ ばつ て | あ た り を |
  み て ゐ る | ね \bar "|."
}

upper = \relative
{
  \clef treble
  \key f \major
  \time 2/4

  <<
    {
      \voiceOne
      a'8.( bes16 c8)
    }
    \new Voice
    {
      \voiceTwo
      f,4 f8
    }
  >>
  \oneVoice
  r8 |
  <<
    {
      \voiceOne
      a8.( bes16 c8)
    }
    \new Voice
    {
      \voiceTwo
      f,4 f8
    }
  >>
  \oneVoice
  r8 |

  <<
    {
      \voiceOne
      a8.( bes16 d8 c8 | c4)
    }
    \new Voice
    {
      \voiceTwo
      f,4( e | f)
    }
  >>
  \oneVoice
  r4 |

  r8 <bes g c,>-. r <a f c>-. | r <g e bes>-. r <f c>-. |
  r g[( a f] | <g e>4) r |

  <d' g, f>4( <c g e>8 <c g> | <a f>8. <bes f>16 <c e,>8 <c f,>) |
  r8 <f, d>-. r <g d>( | <a cis,>4) r |

  <<
    {
      \voiceOne
      d4( c8)
    }
    \new Voice
    {
      \voiceTwo
      d,8( fis g)
    }
  >>
  \oneVoice
  r8 |
  <<
    {
      \voiceOne
      a8.( bes16 c8)
    }
    \new Voice
    {
      \voiceTwo
      f,4 f8
    }
  >>
  \oneVoice
  r8 |

  <a f>8-. r <g e bes>-. r | <f c a>-. r <f' c a f>-. r \bar "|."
}

dynamics =
{
  s4\mf s | s2 |
  s4\f s | s2 |
  \break

  s4\mf s | s2 |
  s2 | s2 |
  \break

  s4\f s | s2 |
  s4\mf s | s2 |
  \break

  s4\f s | s8. s16\> s4 |
  s4 s8 s8\! | s4 s8\p s8 \bar "|."
}

lower = \relative c {
  \clef bass
  \key f \major
  \time 2/4

  f8.( g16 a8) r8 | f8.( g16 a8) r8 |
  c4( <bes c,> | <a f>8-.) c( a f |

  e4 f | g a |
  bes a8 f | c'4) c8-.( c-.) |

  bes8( b c e, | f d c a' |
  bes4 bes, | a) a'8-.( a-.) |

  bes4.( e,8 | f g a bes |
  c-.) r c,-. r | <f f,>-. r <c f>-. r \bar "|."
}

\score
{
  <<
    \new Voice = "mel" { \melody }
    \new Lyrics \lyricsto mel \textone
    \new Lyrics \lyricsto mel \texttwo
    \new PianoStaff
    <<
      \new Staff = "upper" \upper
      \new Dynamics = "dynamics" \dynamics
      \new Staff = "lower" \lower
    >>
  >>
  \layout {}
  \midi {}
}
```

### コンパイル

このソースファイルを以下のようにしてコンパイル[^compile]します。

```
$ lilypond snowman.ly
```

すると、楽譜のPDFファイル `snowman.pdf` と MIDI ファイル `snowman.midi` （または `snowman.mid` ）が生成されます。PDFを開くと以下のような楽譜ができあがっています[^png-output]。

|![snowman.png](https://qiita-image-store.s3.amazonaws.com/0/212298/5fa000b6-e09b-6fdc-7fb1-7aeeef55a5b1.png)|
|:-:|

[^compile]: 筆者はいまのところ本稿執筆時点での最新版LilyPond 2.19.80へ移行せず2.19.65をつかっています。これは[先日の記事](https://qiita.com/trueroad/items/781a40f7a8e741d9168b)の通り、筆者はCygwinのディストリビューション配布版を使用していて、その最新版が2.19.65だからです。3番目の数字が15も違うのでだいぶ古いのではないかと思われるかもしれませんが、2.19.80は次期安定板2.20へ向けたプレリリーステスト版ということで80番台になっただけで、実際には2.19.65の次のバージョンです。もちろんこの間にもいくつかの変更が入ってはいるのですが、筆者個人として「どうしても必要な機能」「非常に重要な変更」がなかったのでそのままにしています。本稿の解説もどちらであっても同じです。ただし、機能はともかくドキュメントには重要な変更がいくつか入っていると思っていますので、ドキュメントは新しいものご覧になっていただいた方がよいと思います。

[^png-output]: ここに貼った楽譜はPDFではなくPNGです。このPNGは `lilypond --png -danti-alias-factor=8 -dpixmap-format=pnggray -dresolution=75 snowman.ly` というコマンドで出力したもので、解像度は落としてありますが見た目はPDFと同じです。これを実行するとアンチエイリアスをかけるためにLilyPondからnetpbmのコマンドが呼び出されますので、別途インストールしておく必要があります（lilypond.org公式の一般パッケージでもnetpbmは同梱されていません）。コマンドラインオプションの意味は[LilyPondマニュアル](http://lilypond.org/doc/v2.19/Documentation/usage/command_002dline-usage.ja.html)をご覧ください。


### 使用フォント

このPDFに使われているフォントを調べてみましょう。例えばAcrobat Readerだったら、文書のプロパティを開きフォントのタブを見ると「この文書で使用しているフォント」を見ることができます。筆者の環境でコンパイルしたPDFでは以下の7種類のフォントが使われました。

* Emmentaler-18
* Emmentaler-20
* Emmentaler-Brace
* SourceHanSerif-Bold
* SourceHanSerif-Regular
* TeXGyreSchola-Regular

最初の3つが「Emmentaler」と呼ばれるLilyPondの音符フォント、次の2つは和文フォント「源ノ明朝」[^sourcehanserif]のレギュラーとボールド、最後は欧文フォント「TeX Gyre Schola」のレギュラーです。

[^sourcehanserif]: 正確には和文（日本語）だけでなく中国語と韓国語も含んだフォントですね。CJKすべて含んでいてマルチウェイトなフリーフォントなので、大変便利に利用させていただいております。

#### 音符フォント

特に何も指定してなければデフォルトでLilyPond付属のEmmentalerが使われます。Emmentalerは「オプティカルサイズ」と呼ばれるものになっていて、譜のサイズが20ポイントの場合に使う音符フォントはEmmentaler-20、18ポイントの場合はEmmentaler-18、というように使用するサイズ毎にデザインが微妙に違う別々のフォントが用意されています[^opticalsize]。LilyPondの譜サイズはデフォルトで20ポイントなので、この楽譜の音符はほとんどEmmentaler-20が使われています。速度記号「♩=100」のところの4分音符は他の音符より一回り小さくなっており、ここには18ポイント用のEmmentaler-18が使われています。もう一つのEmmentaler-Braceは名前の通り様々なブレース、つまり大譜表などで使う中括弧「｛」が収められているフォントです。

[^opticalsize]: 普通のフォントはどんなサイズでも同じフォント、同じ形を使ってスケールさせる「オプティカルサイズではない」ものがほとんどです。オプティカルサイズのフォントにはTeXで古くから使われてきたComputer Modernフォントなどの例はありますが、いまどきはかなり珍しいのではないかと思います。楽譜は用途に応じて様々なサイズのものが必要になり、どのサイズであっても演奏者が瞬時に読み取れるようにしなければなりません。大きな楽譜でも小さな楽譜でも同じ形をスケールして使うと非常に読み取りにくいものになってしまうため、サイズ毎に読み取りに適したデザインのものを用意するのが必須であるということです。

#### テキストフォント

文字のフォントですね。和文に「源ノ明朝」、欧文に「TeX Gyre Schola」が使われていました。この楽譜では漢字ひらがなカタカナ☃が「源ノ明朝」で、そのうちタイトルの「☃雪達磨☃」がボールド、その他はレギュラーです。速度記号「♩=100」の音符以外の部分や出展の「昭和7年/ 1937年」の数字とスラッシュの部分、一番下の「Music engraving by LilyPond 2.19.65 — www.lilypond.org 」が「TeX Gyre Schola」です。

筆者の環境では和文フォントに「源ノ明朝」が使われましたが、皆さんの環境では違うフォントが使われるかもしれません[^fontconfig-sourcehanserif]。注目してほしいのは「昭和7年/ 1937年」など、和文（漢字）と欧文（数字）を混ぜて書いていますが、特に何も指定しなくてもそれぞれ別々のフォントが使われているところです。

[^fontconfig-sourcehanserif]: 筆者の環境は後述のようにわざと「源ノ明朝」が出てくるようにFontconfigを設定してあります。

## テキストフォントのデフォルト

音符フォントはEmmentalerがデフォルトフォントで間違いありません。ですが、テキストフォントは和文と欧文で異なるフォントが使われるなど少々複雑なようです。どうなっているのか見てみましょう。

### フォントファミリ

LilyPondにはテキストフォントについてフォント個別の名前を指定せずに使える3種類のフォントファミリがあります。

* roman
    + セリフ体、明朝体など
    + 本当に何も指定しなかった場合や `\roman` を指定した場合に使われる
* sans
    + サンセリフ体、ゴシック体など
    + `\sans` を指定した場合に使われる
* typewriter
    + タイプライター体、等幅フォント
    + `\typewriter` を指定した場合に使われる

サンプルの楽譜は本当に何も指定しなかったので、romanが使われました。「源ノ明朝」は名前の通り明朝体ですし「TeX Gyre Schola」は見ればわかるようにセリフ体ですので、あってますね。ではromanからどうやって具体的な「源ノ明朝」や「TeX Gyre Schola」が選ばれたのか見たいと思います。LilyPondのデフォルトフォントは、この3種類のフォントファミリ毎に決まっていて[マニュアルに書いてあります](http://lilypond.org/doc/v2.19/Documentation/notation/fonts.html#fonts-explained) [^font-manual]ので抜粋・補足します。

[^font-manual]: デフォルトフォントは本稿執筆時点での最新安定版2.18.2とは変更されていて異なります。英語版マニュアルの記述がLilyPondの仕様変更に追従できていない状態のものを[日本語へ翻訳していただいた](http://git.savannah.gnu.org/gitweb/?p=lilypond.git;a=commit;h=5e071167e5ac48d3d9849fd6455197fdca1f7342)ため、後から[英語マニュアルを仕様に追従させた](http://git.savannah.gnu.org/gitweb/?p=lilypond.git;a=commit;h=f40aa7dc7410285fc904612941b1909144c01c2f)のが反映されていません。といいますか、この仕様変更を提案・実装したのは筆者自身でして長いこと英語マニュアルの更新をサボっていたのですが、いよいよ次期安定板2.20の準備が始まり慌てて英語版マニュアルを更新したため、日本語版が遅れてしまっています。。。まぁ、おかげ？で本稿が今のところ日本語で書かれた唯一の解説、ということになりますかね。。。

svgバックエンドの場合（SVGを出力する場合）

|ファミリ  |デフォルトフォント|
|----------|------------------|
|roman     |serif             |
|sans      |sans-serif        |
|typewriter|monospace         |

その他のバックエンドの場合（PDFやPS、PNGなどを出力する場合）

|ファミリ|デフォルトフォント（エイリアス）|エイリアス定義リスト|
|--------|--------------------------------|--------------------|
|roman|LilyPond Serif|TeX Gyre Schola, C059, Century SchoolBook URW, Century Schoolbook L, DejaVu Serif, ..., serif|
|sans|LilyPond Sans Serif|TeX Gyre Heros, Nimbus Sans, Nimbus Sans L, DejaVu Sans, ..., sans-serif|
|typewriter|LilyPond Monospace|TeX Gyre Cursor, Nimbus Mono PS, Nimbus Mono, Nimbus Mono L, DejaVu Sans Mono, ..., monospace|

SVGの場合はともかく、PDFなどの場合がヤヤコシイことになっていますね。これはLilyPondでromanを指定した場合のデフォルトフォントはLilyPond Serifだけど、それはエイリアス（別名）にすぎなくて、エイリアスの定義はリストになっていてTeX Gyre Schola, C059, Century SchoolBook URW, Century Schoolbook L, DejaVu Serif, ..., serifというフォントが並んでいる、と読んでください。

### エイリアス

エイリアスの定義は複数のフォントが並んだリストなのですが、これはどういう意味かというと、もちろん優先順位です。リストの一番最初に載っているフォントに存在する文字はすべてその最初のフォントが使われます。存在しなかった文字はリストの次のフォント、そこにも無ければさらに次のフォント、といように1文字ごとにフォールバックしていきます。

よくみるとPDFなどの場合、それぞれのファミリのリストの最後がSVGと同じ serif, sans-serif, monospace になっています。この3種類はSVGやCSS仕様の「総称フォントファミリ」や「一般フォントファミリ」などと言わているもので、その類のフォントならなんでもよいというような意味です。これが指定された場合、SVGではSVGのビュアーが具体的なフォントを決めます。PDFなどではFontconfigが決めることになります。つまり、romanが指定された場合、TeX Gyre Scholaに存在する文字はTeX Gyre Scholaが使われ、存在しなければC059が使われ、そこにも無ければCentury SchoolBook URWが使われ、というようにどんどんフォールバックしていって、最後には総称フォントファミリのserif、つまりセリフ体のフォントならなんでもよいからFontconfigで決めてくれ、という意味になります。

### サンプルの楽譜の場合

サンプルの楽譜ではどうだったのでしょうか。ソースでは特に何も指定しませんでしたので、romanフォントファミリが選択されています。romanフォントファミリはPDF出力の場合LilyPond Serifというデフォルトフォントが割り当たっています。このLilyPond Serifはエイリアス（別名）になっていて、エイリアスの定義リストの最初のフォントはTeX Gyre Scholaです。「昭和7年/ 1937年」のように和文と欧文を混ぜてある場合、普通の数字やスラッシュはTeX Gyre Scholaに存在する文字なので、TeX Gyre Scholaが使われます。しかし、「昭」「和」「年」は存在しませんのでリストの次のフォントへフォールバックします。次のフォントはC059ですが、このフォントにもありません。次のCentury SchoolBook URWにも、さらに次のCentury Schoolbook Lにもありません。その次のDejaVu Serifにもありません。というわけでどんどんフォールバックしていって、最後のserifにたどり着いてしまいます。そうするとFontconfigがserifに紐づけられているフォントの中から順番に「昭」「和」「年」があるフォントを当たります。筆者の環境ではFontconfigの設定でserifに紐づけるフォントのトップに「源ノ明朝」を設定しており、このフォントには「昭」「和」「年」もあるので「源ノ明朝」が使われた、というわけです。

## デフォルトフォントの詳細

なぜデフォルトフォントはこのようなリストになっているのか詳細を解説します。LilyPondを普通に使うにはあまり関係ない話かもしれませんので、よくわからなければ読み飛ばしていただければと思います。ここで説明しているのは本稿執筆時点での最新版であるVer. 2.19.80についてです。

### roman

LilyPondでセリフ体や明朝体のフォントを意味します。セリフ体のフォントはいろいろありますが、楽譜で使う文字としてはNew Century Schoolbookのようなフォントが広く使われます[^ncsb]。

[^ncsb]: New Century SchoolbookはAdobe基本35書体に含まれるフォントですが、商用フォントですのでLilyPondに同梱して配布するわけにはいきません。URW++がこのAdobe35書体によく似たフォント35種類を作っていてフリー版がGhostscriptの配布物にも含まれています。このURW++のフリーフォントに有志がキリル文字を追加したものがあり、一時期はGhostscriptの配布物に含まれたこともあるようです。AdobeのNew Century Schoolbookに対応するURW++フリーフォントはCentury Schoolbook Lでしたので、LilyPond 2.18.2ではこれの有志キリル文字追加版に少々手を入れたものを同梱してデフォルトフォントとしていました。ですが、有志キリル文字追加版はいろいろと問題があったようで、Ghostscriptは元のURW++オリジナルに戻しています。そして、URW++のフリーフォントをベースに改良したフォントとしてTeX Gyreフォントが登場します。URW++のフリーフォントはAdobe基本35書体とメトリックの互換性を重視したものでしたが、TeX Gyreフォントは完全なメトリック互換を維持せずに改良したものです。当初TeX Gyreフォントは有志キリル文字追加版をベースとしたキリル文字を含んでいましたが、ライセンスの問題からキリル文字は削除されています。その後、本家URW++がギリシャ文字とキリル文字を追加したものをフリーフォント化しGhostscriptから配布されるようになって今に至ります。

#### TeX Gyre Schola

LilyPondでは、New Century Schoolbook系統のフォントとしてTeX Gyre Scholaを採用・同梱しています。必ず同梱しておりLilyPondが使えるどんな環境でもTeX Gyre Scholaを使うことができるので、リストの最上位に配置しています。

#### C059, Century SchoolBook URW, Century Schoolbook L

TeX Gyreフォントは普通の英数字とギリシャ文字の一部は入っていますが、キリル文字などは入っていません。New Century Schoolbook系統のフォントでギリシャ文字やキリル文字を含んでいるフォントにURW++のC059があり、リストの2番目に配置しています。パッケージによってはLilyPondにC059も同梱しているものがあり、lilypond.org公式の一般パッケージには含まれています[^non-c059]。そしてリストはCentury SchoolBook URW, Century Schoolbook Lと続きます。これらはC059と同じURW++の古い版のフォント名でC059があれば指定しておく必要はないのですが、必ずC059が同梱されているわけではなく環境によっては古い版が存在することもあるのでリストに含めています。

[^non-c059]: 残念ながら大抵のディストリビューション配布版にはC059や後述のNimbus Sans, Nimbus Mono PSが同梱されていないようです。ただし、ディストリビューション配布版は[先日の記事](https://qiita.com/trueroad/items/781a40f7a8e741d9168b)の通りFontconfigの設定がアプリ間で共通なので、最近のGhostscriptフォントをインストールしてやればFontconfigから見つけられるようになると思います。実際Cygwinではそうなりました。

#### DejaVu Serif

その次のDejaVu Serifは、セリフ体のフォントですがNew Century Schoolbook系統ではありません。普通の英数字（ラテン文字）、ギリシャ文字、キリル文字以外に、発音記号であるとかCJK以外の様々な言語の文字が含まれています。LilyPondには同梱されませんが、大抵のLinuxディストリビューションに同梱されているため、これを指定しておくことでCJK以外の大抵の文字が使えるようになることを期待しています。

#### serif

CJKの文字はどうなるのかというと、最後のserifまでフォールバックします。つまり、Fontconfigの設定次第、というわけです。筆者はserifが指定された時には「源ノ明朝」が最優先で出てくるようにFontconfigを設定していましたが、特にFontconfigの設定をしなかった場合にはFontconfigのデフォルト設定に従うことになります。lilypond.org公式の一般パッケージではWindows版ならMS明朝が、その他はIPA明朝があれば使われる可能性が高いと思います。IPAex明朝や源ノ明朝などはFontconfigのデフォルト設定には含まれていないので特に設定しない限りは使われない可能性が高いです。

### sans

LilyPondでサンセリフ体、ゴシック体のフォントを意味します。楽譜での使い道としてはコードネームなどがあります。Helvetica系統のフォントをデフォルトにしています[^sans]。

[^sans]: LilyPond 2.18.2 ではHelvetica系統をデフォルトとして設定しておらず、いきなり総称フォントファミリのsans-serifが使われるようになっていたため、環境によってフォントがコロコロと変わってしまいました。例えばWindowsならArial、LinuxならDejaVu Sans、という感じです。ある程度は固定した方がよかろうということでHelvetica系統をデフォルトとしました。

#### TeX Gyre Heros

Helvetica系統のTeX GyreフォントであるTeX Gyre Herosです。LilyPondではこれを採用・同梱しており、必ず使えるためリストの最上位に配置しています。ギリシャ文字の一部やキリル文字は含んでいません。

#### Nimbus Sans, Nimbus Sans L

Helvetica系統のフォントでギリシャ文字やキリル文字を含んでいるURW++のNimbus Sansをリストの2番目に配置しています。LilyPondに同梱されることもあります。その次のNimbus Sans LはURW++の古い版のフォントです。事情はromanと全く同じです。

#### DejaVu Sans

これもromanの時と同じです。Helvetica系統ではないものの、サンセリフ体でCJK以外の大抵の文字を含み、大抵のLinuxディストリビューションに同梱されています。

#### sans-serif

CJK文字はここまでフォールバックします。サンセリフ体を示す総称フォントファミリです。Fontconfigの設定次第で適当に決められます。特にFontconfigの設定をしなかった場合、lilypond.org公式の一般パッケージではWindows版ならMSゴシックが、その他はIPAゴシックがあれば使われる可能性が高くなります。IPAexゴシックや源ノ角ゴシックなどはFontconfigのデフォルト設定には含まれていないため、特に設定しない限り使われる可能性は低くなります。

### typewriter

LilyPondでタイプライター体、等幅フォントを意味します。楽譜ではあまり使わないように思います。Courier系統のフォントをデフォルトにしています[^typewriter]。

[^typewriter]: こちらもsansと同様、LilyPond 2.18.2 ではCourier系統をデフォルトとして設定しておらず、いきなり総称フォントファミリのmonospaceが使われるようになっていました。楽譜で等幅フォントというのはあまり利用例を聞きませんが、やはりデフォルトは固定しておいた方がよいだろうということでCourier系統をデフォルトとしました。

#### TeX Gyre Cursor

Courier系統のTeX GyreフォントであるTeX Gyre Cursorです。LilyPondではこれを採用・同梱しており、必ず使えるためリストの最上位に配置しています。ギリシャ文字の一部やキリル文字は含んでいません。

#### Nimbus Mono PS, Nimbus Mono, Nimbus Mono L

Courier系統のフォントでギリシャ文字やキリル文字を含んでいるURW++のNimbus Mono PSをリストの2番目に配置しています。LilyPondに同梱されることもあります。その次のNimbus Mono, Nimbus Mono LはURW++の古い版のフォントです。事情はromanと全く同じです。

#### DejaVu Sans Mono

これもromanの時と同じです。Courier系統ではないものの、等幅フォントでCJK以外の大抵の文字を含み、大抵のLinuxディストリビューションに同梱されています。

#### monospace

CJK文字はここまでフォールバックします。等幅フォントを示す総称フォントファミリです。Fontconfigの設定次第で適当に決められます。

## おわりに

LilyPondのデフォルトフォントはどうなっているのか、実際にどんなフォントが使われるのか試すとともに、その仕組みを解説しました。デフォルトの場合、普通の英数字は必ずTeX Gyreフォントが使われますが、和文に関しては環境によって使われるフォントが違ってきます。複数の環境で同じ出力を得たいのであれば、フォントをデフォルトのまま使うのではなく、個別のフォント名をきちんと指定した方がよいと思います。