Lilypondによる楽譜(leadsheet)の作り方

# はじめに
本稿は`lead sheet` を`GNU LilyPond`(以下`Lilypond`)により作成する方法を記す．`lead sheet`はJazzなどのバンドで用いられる楽譜であり，1 頁程度に楽曲のメロディーとコード譜がまとめて記される．バンド演奏を行うには必須な楽譜となる．`LilyPond`は，音符の並びをテキストファイルに書くと，これを入力として楽譜の`pdf` を出力するプログラムである．オープンなソフトであり無料で利用できる．

`LilyPond`の文法書はインターネットで閲覧できる．事例豊富に書かれた大書である．しかし，`lead　sheet` を作成するとなると，散在するコマンド群を文法書から拾い集めることになり，かなりの労力が要る．本稿は著者が体験したそのような労力の結果を備忘録としてまとめている．

## 準備
<!-- コメントアウトしたい内容 -->
まず`GNU LilyPond` のインストールを行う．OS はWindowsでもLinux でもサポートがあるので，自分の環境に合わせてダウンロードインストールする．`LilyPond` の入力ファイルはテキストなので，編集には任意のテキストエディタが使える．ファイル名の拡張子には`.ly`を用いる．例えば，ファイル`sample.ly` に`LilyPond`のスクリプトを記述したとすると，以下のコマンドによりコンパイルされ`sample.pdf` が生成される．

```shell:
lilypond sample.ly
```
Windows上で拡張子がアプリに関連付けされているならば，Explorer上でファイル`sample.ly`をダブルクリックすれば`sample.pdf`が自動生成される．コンパイルの過程は`sample.log`に出力され，エラーがあればここに出力される．エディタのお薦めは`Visual Studio Code`である．これと`LilyPond`拡張機能をインストールすれば，編集後すぐに生成された`pdf`をプレビューできる．また，キーボードなどmidi機器を接続すれば，キーボードから音譜を入力することもできる．

## 参考文献
マニュアルとインストーラがアクセスできる．

https://lilypond.org/doc/v2.21/Documentation/web/manuals.ja.html

`lead sheet`とは？

https://en.wikipedia.org/wiki/Lead_sheet

`Lilypond`による`lead sheet`の例はインターネット上で希少であるが，以下はとても有用な事例が掲載されている．

https://kamebass.hatenablog.com/entry/2019/03/04/224308

# 音符の表示

```lilypond:
{ c' }
```
この小さなテキストは`LilyPond`のスクリプトである．これをコンパイルすると以下を得る．
![middleC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445358/abfd8a98-9ce9-aa1d-378b-a35771c0584c.png)
この後述べるように`Lilypond`ではきめ細かいコマンドが用意されているが，この小さな音譜の例は最大限にデフォルト機能を利用している．`c'`はミドルCと呼ばれ，ピアノの鍵盤上で丁度真中に位置する`ド`の音である．`ドレミファソラシ`の音程(Pitch)はそれぞれ`cdefgab`により指定する．
```lilypond:
{ c' e g }
```
複数の音をスペースで区切って並べれば対応する音譜ができる．`ドミソ`を指定した．
![domiso.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445358/2fbf152b-0793-712b-eee4-75dbc352616b.png)
音譜を見ると期待と異なり，`ミソ`が1オクターブ下の音になっている．これはデフォルトで絶対音記法になっているためである．単に`c`と書くとミドルCの1オクターブ下の音を指す．`c'`の`'`は1オクターブ上げるコマンドである．これに対して相対音記法にするには以下のように書く．
```lilypond:
\relative c' { c e g }
```
![domiso_r.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445358/0eb41e4f-9bd3-b038-8cb0-eaa831c1970d.png)
この相対音指定により，音は直前の音に一番近い側を選択することになる．最初の音は`c'`に近い側の音から選択する．以降では相対音記法を使用する．

次の例では、デフォルト機能を書き下してみる．

# 簡単な曲
```lilypond:
\version "2.22.1"  % comment
\language "english"
\relative c' { 
    \clef treble
    \key f \major
    \time 4/4
    \tempo 4 = 120
    \partial 8
    d8 ~| \bar "||"
    d4 fs a c | bf g f d | e g c bf | a1 \bar "|."
}
```
![4bars.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445358/4363685f-c06e-fe27-ebe0-b59f2e62593d.png)

先頭の`\version "2.22.1"`は`Lilypond`のバージョン指定で，無くても動作する．別のバージョンの`Lilypond`でこのソースをコンパイルすると警告が出て，違いを知らせる．

コメントは`%`から行末まで，複数行に渡る場合には`%{`に始まり`%}`に終わるまでに記す．

`\clef treble`はト音記号の指定．`\clef bass`にすればへ音記号となる．`\key f \major`は調号の指定．マイナーの場合は`\minor`．`\time 4/4`が拍子．3拍子にする場合は`3/4`となる．`\tempo 4 = 120`はテンポの指定．4分音符の速さが120拍/分であることを譜面に記載する．

## 小節
`\time`で指定した拍子が満たされる度に単線で小節区切りが表示される．単線以外に変更するには，`\bar "||"`で二重線を，`\bar "|."`で二重線の右側が太い線を指定することができる．

## シャープ(＃)とフラット(♭)
シャープは`s`，フラットは`f`を音に後置する．例えば，前例で`fs`はfのシャープ，`bf`はbのフラットである．この記法は，2行目の`\language "english"`が効いている．もし，この2行目が無ければ，デフォルトの記法(恐らく`\language "nederlands"`か？)となり，シャープは`is`，フラットは`es`を後置する．

## オクターブ高低
既に紹介したように1オクターブ高い音程の指定には`'`を使う．1オクターブ低い指定は`,`を使う．例えば，`cs''`は2オクターブ高いCシャープ，`gf,`は1オクターブ低いGフラットを指す．

## 音長
音長(duration) は音程に続いて数字で示す．1 は全音符(上例で`a1`)，2は2分音符，4は4分音符(上例で`d4`)，8は8分音符(上例で`d8`)，などである．付点長は数字に続けて`.`を付ける．例えば`a2.`は3拍の長さを指定している．
以上の音長は前の音指定と同じであれば省略できる．例えば，`a8 b c4`において`b`は8分音符となる．
縦棒`|`は小節の区切りチェックで，これが現れる地点で1小節分の音長が積算されていなければ，エラーが出力される．`\partial 8`が最初の方に現れるが，これは次に現れる小節だけ拍数を変更する(弱起小節)．この例では最初の小節を8分音符長に設定する．`~`はタイ(tie) を表す．


## 3連符
```lilypond:
\relative c' { 
    \tuplet 3/2 { a8 bf a }
    r4
    \tuplet 3/2 { a4 bf a }
}
```
![3renpu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445358/a17613a6-eb99-8a1f-a218-9208d815c702.png)
上の例で`\tuplet 3/2 { a8 bf a }`は，3連符の指定になる．8分音符の2つ分(=4分音符)を3つに分け(`3/2`)て音譜指定している．

## 休符
休符は`r`で指定する．前例の`r4`は4分休符を指す．休符に似た指定に`s`がある．これは空白の音譜を生む．音譜の生成をスキップする．

# 最初のLead Sheet
```lilypond:
\version "2.22.1"
\language "english"
\paper {
    top-margin = 2.0\cm
    bottom-margin = 2.0\cm
    line-width = 15\cm
    indent = 0\cm
}
\header {
    title = "Hello, World"
    composer = "Nanashi Gombei"
    tagline = ##f
}
\markup { \vspace #1 }
<<
\new ChordNames {
    \chordmode {
        s8 |
        d1:7 | g2:m7 g2:m7/f | c1:7 | f1 | 
        d1:7 | g2:m7 g2:m7/f | c1:7 | f1 | 
    }    
} 
\new Staff {
    \relative c' { 
        \clef treble
        \key f \major
        \time 4/4
        \tempo 4 = 120
        \partial 8
        d8 ~| \bar "||"
        d4 fs a c | bf g f d | e g c bf | a1 | \break
        d,4 fs a c | bf g f d | e g c bf | a1 |
        \bar "|." \break
    }
}
>>
```
![hello+chord.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445358/c867579a-c4d8-0814-6db0-4a89bc417c1c.png)


音符の構成方法をある程度紹介したので，Lead Sheet楽譜を作ってみる．印刷紙の仕様(`\paper`)と表題印刷(`\header`)を加えている．`top-margin`および`bottom-margin`は読んで字のごとくである．`line-width`の指定で5線譜の長さが決まる．左右のマージンは均等に割り当てられる．`indent`を指定すると，その分最初の5線譜がインデントされる．
`\header`部位の`tagline`を`##f`(false)に指定しているが，これを指定しないと譜面の最下部に決められたメッセージが出力される．`\markup { \vspace #1 }`は表題部と五線譜の間のスペースを指定している．
## 小節改行
`Lilypond`では，改行(小節の折り返し)を明に指定しない場合，自動で改行が行われる．意図しないような改行もあるので，`\break`により改行を明に指定する．演奏者が読みやすい4小節や8小節単位での改行を指定するが，音符が混んでいる小節などがあれば6小節なども必要になる．いずれも手動にて操作する．デフォルトで，小節番号が2行目以降の小節の先頭に刻印される．

## コード譜
コード譜を作るには`<< >>`によってコード部(`\new ChordNames`)と5線譜部(`\new Staff`)を合流させる．コード部の中身は`\chordmode`に続くコード名となる．主な記法を以下の表に示す．

|記法|コード通称|
|---|---|
|c | C Major |
|c:/g | C over G |
|c:maj | C Major 7th |
|c:7 | C Dominant 7th |
|c:sus | C sus 4 |
|c:m7 | C Minor 7th |
|c:m7.5- | C half-diminished 7th |
|c:dim | C diminished 7th |

参考：

https://en.wikipedia.org/wiki/Chord_notation

# 歌詞のあるLead Sheet
```lilypond:
\version "2.22.1"
\language "english"
melody = \relative c' {
    \partial 4 
    e8 ef |
    \repeat volta 2 {
        d4^\markup { \halign #1.5 \rounded-box \bold \huge A }
         fs a c | bf g f d | e g c bf | a1 | \break
        d,4 fs a c | bf g f d | e g c bf |
    }
    \alternative {
        { a1 }
        { a4 c f,2 | \bar "||"}
    } \break 
    d4^\markup { \halign #1.5 \rounded-box \bold \huge B }
     fs a c | bf g f d | e g c bf | a1 | \bar "|." \break
}
chord = \chordmode {
    s4 |
    d1:7 | g2:m7 g2:m7/f | c1:7 | f1 | 
    d1:7 | g2:m7 g2:m7/f | c1:7 | f1 | f1 |
    d1:7 | g2:m7 g2:m7/f | c1:7 | f1 |
}
verse = \lyricmode {
    Oh __ _ 
    The quick bro -- wn fox jumped o -- ver the __ _ la -- zy dogs.
    The quick bro -- wn fox jumped o -- ver the __ _ la -- zy dogs. dogs. __ _ _
    The quick bro -- wn fox jumped o -- ver the __ _ la -- zy dogs.
}
booktitle = "Hello, World"
composer = "A B"

\header {
    title = \booktitle
    composer = \composer
    tagline = ##f
}
\markup  \vspace #2
\score {
    <<
    \new ChordNames \chord
    \new Staff \melody 
    \addlyrics \verse
    >>
    \layout{ 
        \override Score.Clef.break-visibility = #all-invisible
        \override Score.KeySignature.break-visibility = #all-invisible
        \override Score.SystemStartBar.collapse-height = #1
    }
    \midi { }
}
```
![hello+song2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445358/625e5d80-80d4-87e9-d406-d0dd1d6b6ffb.png)

## 繰り返し
繰り返し(2回)の構文は，`\repeat volta 2 { A } \alternative { { B } { C } }`である．Aの部位に繰り返す譜，Bの部位に1回目の譜，Cの部位に2回目の譜が記載される．N回であれば`volta N`とし，`\alternative`にN個の譜を用意する．

## リハーサル記号
演奏練習のときに「Bからもう一度演奏しよう」など指定できると便利である．このBのような記号をリハーサル記号と呼ぶ．曲内の切れ間に付番するリハーサル記号には`Lilypond`で用意されたコマンドもあるが，自由度を求めて`^\markup { \halign #1.5 \rounded-box \bold \huge A }`のように自作している．最初の`^`は`\markup`以降の記号を譜面の上側に記載する指示．ちなみに`_`とすると下側に記載する．`\halign`は水平方向に位置をずらして，音符の左上側に記載されるよう調整している．

## 変数の利用
上の例では，`Lilypond`の変数を利用している．任意の文字列を変数とすることができ，ここでは`melody`，`chord`，`verse`にそれぞれ音符，コード，歌詞を代入している．この変数を参照するときは`\`を前置する．また，`booktitle`，`composer`にはそれぞれ題名，作曲家名を代入して，`\header`で参照している．

## `\score`
前の例で`<< >>`で囲まれた楽譜要素がソースに現れると対応する譜面が生成された．これはデフォルト機能を利用した簡便記法であり，よりフォーマルには`\score`の引数内に楽譜要素を展開する．そして`\layout {}`を指定することで譜面生成が行われる．譜面生成と同時に`midi`を生成する場合には`\midi {}`を指定する．

## 歌詞
前の例で`<< >>`によりコードと音符を合流させた．上の例では`\addlyrics \verse`により更に歌詞を合流させている．verseには`\lyricmode {}`が代入されている．歌詞はこの`\lyricmode`の引数に指定する．歌詞をそのまま記述すると1音符に1単語が対応する．単語が複数音符にまたがる場合には`--`により音節を区切る．これによって，1単語が分離され，譜面にはハイフンで単語が分離されて表示される．1単語あるいは音節を伸ばして歌い複数音符に対応させる場合(Melisma)は、`__`を指定しその後音符の数だけ`_`を指定する．これにより歌詞には、音を伸ばした部分に下線が現れる．

## ト音記号などの省略
`\layout {}`の引数は，譜面の2行目以降ト音記号及び調号を表示させず，5線譜の左を縦線で閉じる指定である．

## midi
`\midi {}`を指定すると，`midi`が生成される．例えば，`a.ly`をコンパイルすると`a.pdf`とともに`a.mid`が生成される．Windowsであれば`a.mid`をダブルクリックすることによりプレイヤーが立ち上がって曲を聴くことができる．この`midi`には，`\tempo`の情報も埋め込まれるため，指定した速度が反映される．`midi`で再生されるのはメロディだけではなく，コードも再生される．通して聴くことで，音間違いに加え，コード間違えもチェックできる．

# パート別のLead Sheet
```lilypond:
\version "2.22.1"
\language "english"
main = \relative c'
{
    \clef treble
    \key f \major
    \time 4/4
    \tempo 4 = 120
    d4 fs a c | bf g f d | e g c bf | a1 | \break
    d,4 fs a c | bf g f d | e g c bf | a1 | \bar "|." \break
}
chord = \chordmode {
    d1:7 | g2:m7 g2:m7/f | c1:7 | f1 | 
    d1:7 | g2:m7 g2:m7/f | c1:7 | f1 | 
}
\paper {
    top-margin = 2.0\cm
    bottom-margin = 2.0\cm
    line-width = 15\cm
    indent = 0\cm
}
booktitle = "Hello, World"
composer = "Someone"
\bookpart {
    \header {
    title = \booktitle
    composer = \composer
    tagline = ##f
    }
    \markup  \vspace #1
    \score {
        <<
        \new ChordNames \chord
        \new Staff \main            
        >>
        \layout{ 
            \override Score.Clef.break-visibility = #all-invisible
            \override Score.KeySignature.break-visibility = #all-invisible
            \override Score.SystemStartBar.collapse-height = #1
        }
        \midi { }
    }
}
\bookpart {
    \header {
    title = \booktitle
    composer = \composer
    subtitle = "Trombone"
    tagline = ##f
    }
    \markup  \vspace #1
    \score {
        \transpose f g
        <<
        \new ChordNames \chord
        \new Staff \main            
        >>
        \layout{ 
            \override Score.Clef.break-visibility = #all-invisible
            \override Score.KeySignature.break-visibility = #all-invisible
            \override Score.SystemStartBar.collapse-height = #1
        }
    }
}
```
![book1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445358/eddfbdd1-bcd9-c4ea-59e8-42d90d5686ba.png)
![book2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2445358/be5c76cd-908f-6164-428e-b039ef3f5ed7.png)
`\bookpart`を使うと複数の楽譜を1つのPDFにまとめることができる．上の例では，同じ楽曲をconcert pitchとトロンボーン用に分けて作譜している．トロンボーンは変ロ(B♭)の楽器なので楽譜は長2度高く記譜する．この例では原曲がFなので，トロンボーンの楽譜はGとなり，移調をしている．
前述の変数を使っているので，メロディやコードや曲名などの定義が一元化されている．

## 移調
移調の指定は`\transpose`を使う．上例では`\transpose f g`としてFをGに移調している．これによりメロディだけでなくコードも移調される．メロディを1オクターブ高く移調するには、`\transpose f g'`のように指定する．

# まとめ
楽譜作成ソフトにはWYSIWYGエディタが広く使われていると思う．筆者もオープンソースのMuseScoreを利用しているが，最近は`Lilypond`も重宝している．テキストベースで作譜したい方には`Lilypond`が一つの選択肢になるだろう．