🎼

LilyPondで調号・練習番号・テンポ・拍子などを音楽表記と分離して書く

2018/05/30に公開

20180609 追記
この記事は「休符を入力して\omitで消す」という手段をとっていましたが、
空白休符sを使用すればその必要がありません。
取り急ぎ、記事の一番下にサンプルを掲載しております。

概要

曲を通して共通のものを各パートの音楽表記に混ぜて書くと、編成が大きくなるにつれて管理がつらくなってきます。
調号、練習番号、テンポ記号、拍子記号、発想記号……
これらを音楽表記と分離することで、使い回せる状態、つまり1回だけ書けばよい状態にします。

理解するにあたり、公式の学習マニュアルを読み通し、記譜法リファレンスの使い方がわかるようにしておくと良いと思います。

なお、QiitaにはLilyPondのシンタックスハイライトがないようです。。。
GitHubにはあるので、そちらに上げたものもよろしければご覧ください。

LilyPond is 何

コードを書くと楽譜が書ける素敵なソフトです。
分かる人には「TeXの楽譜版」と言えばよいでしょうか。
FinaleやSibeliusにも引けを取らない表現力を持っています。にもかかわらず、なんと無料です!
やるっきゃないですね。
LilyPond... みんなの楽譜作成

環境

LilyPond v2.18.2

結論(方針)

※サンプルソースは記事の最後とGitHubにあります。

Voice

記号用のものを1つ、パート用はそれぞれ作る

  • 記号用は長休符Rで埋める。
  • 音符の位置に依存する記号(ritとか)は、通常の休符rを配置して、それにつける
  • 休符は\omitで消す。
    • 対象は Rest, MultiMeasureRest, MultiMeasureRestNumber
  • パート用には音符・パート固有の記号のみ書く
    • 音部記号、強弱記号……

Staff

<<>>で記号用のVoiceとパート用のVoiceを囲む

Score

パート譜なら対象のStaffをひとつ書く。
総譜なら作ったStaffをすべて<<>>で囲む。

実践

ファイル構成

今回は記述内容が少ないので、階層は作らず全部同じディレクトリに放り込みます。
2パート作って、総譜とそれぞれのパート譜も作ります。

./voice.ly
./staff.ly
./score.ly % 総譜
./part1.ly % パート譜1
./part2.ly % パート譜2

ざっくり作る

パートのVoiceを作る

適当に6小節くらい作ります。パート固有の記号や長休符も入れました。

voice.ly
\version "2.18.2"

one = \new Voice \relative c' {
  \clef "treble"
  c2\ff d |
  e f |
  g a |
  R1*2 |
  b2 c |
}

two = \new Voice \relative c {
  \clef "bass"
  c2\mf\< d |
  e f |
  g\f a |
  b c |
  R1*2 |
}

記号用Voiceを作る

追記していきます。とりあえず曲の最初に表示するものを書きます。
ついでに終止線も書きます。

voice.ly
\version "2.18.2"

% 記号用Voice
mk = \new Voice {
  \compressFullBarRests % 連続する全休符を長休符にまとめる

  \key bes \major % 調号
  \tempo 4 = 120 % テンポ記号

  R1*6 | % 長休符*6
  \bar "|." % 終止線
}

one = \new Voice \relative c' {
% ~~~

StaffとScoreを作る

Staffです。これはちょろいですね。

staff.ly
\version "2.18.2"
\include "voice.ly"

stfOne = \new Staff <<
  \mk % 記号
  \one % パート1
>>

stfTwo = \new Staff<<
  \mk % 記号
  \two % パート2
>>

Scoreです。まず総譜。ちょろいですね。
#(ly:set-option 'relative-includes #t)\includeを各ファイルからの相対パスで書けるようになるマジックワードです。

score.ly
#(ly:set-option 'relative-includes #t)
\version "2.18.2"
\include "staff.ly"

\new Score {
  <<
    \stfOne
    \stfTwo
  >>
}

パート譜もさらっと書きます。

part1.ly
#(ly:set-option 'relative-includes #t)
\version "2.18.2"
\include "staff.ly"

\new Score {
  \stfOne
}
part2.ly
#(ly:set-option 'relative-includes #t)
\version "2.18.2"
\include "staff.ly"

\new Score {
  \stfTwo
}

コンパイル①

Score
1-score.png

part1
1-part1.png

part2
1-part2.png

調号・テンポ記号・終止線がそれぞれ正しく入っているのがわかります。
しかし、余計な全休符が表示されています。こんどはこれを消しましょう。

余計な全休符を消す

\omitを追加

記号用Voiceの上の方に追記します。

voice.ly
% ~~~
mk = \new Voice {
  \compressFullBarRests

  \omit MultiMeasureRest % ★追記 長休符を消す

  \key bes \major
  \tempo 4 = 120

  R1*6 |
  \bar "|."
}
% ~~~

\omit は、端的に言うと指定したオブジェクトの描画を行わなくするコマンドです。
厳密に言うと、オブジェクトのstencilプロパティを#fにする短縮記法です。

% この2つは同義
\override MultiMeasureRest.stencil = ##f
\omit MultiMeasureRest

詳細は公式ドキュメントをお読みください。

そして、MultiMeasureRestは長休符オブジェクトです。

コンパイル②

Score
2-score.png

part1
2-part1.png

part2
2-part2.png

余計な全休符が消えました!
次は、曲の途中に置く記号を追加しましょう。

曲の途中に置く記号を追加する

リハーサルマーク・転調・rit

以下の作戦でいきます。

  • 3小節目で転調(複縦線も) & リハーサルマーク
  • 4小節目3拍目でrit.
voice.ly
% ~~~
mk = \new Voice {
  \compressFullBarRests

  \omit MultiMeasureRest

  \key bes \major
  \tempo 4 = 120

  R1*2 | 
  \bar "||"  % ★追記 転調のための複縦線
  \key d \major % ★追記 調号
  \mark \default % ★追記 リハーサルマーク
  R1 |
  r2 r^"rit." | % ★追記 rit. 音符に付随するテキストは長休符NG。普通の休符を使う
  R1*2 |
  \bar "|." 
}
% ~~~

rit.のある行に注目です。
長休符にテキストをつけると意図した位置に表示できません。
通常の休符で2分休符を2つ入力し、2つ目の休符に^"rit."で付与します。

コンパイル③

Score
3-score.png

part1
3-part1.png

part2
3-part2.png

ritは意図したとおりに表示できましたが、余計な2分休符が出てしまいました。

さらに、part2の5-6小節目間の小節線上に「2」と表示されてしまっています。
これの正体は長休符の長さを表す数字です。
記号用の長休符を\omitしたため、適切な位置に表示されません。

以上の2オブジェクトも消してしまいましょう。

通常の休符と長休符の数字を消す

\omitを追加

方法は同じです。
対象のオブジェクトを記号用のVoiceから\omitしていきます。

voice.ly
% ~~~
mk = \new Voice {
  \compressFullBarRests

  \omit MultiMeasureRest
  \omit Rest % ★追記 通常の休符
  \omit MultiMeasureRestNumber % ★追記 長休符の長さを示す数字

  \key bes \major
% ~~~

コンパイル④

Score
score.png

part1
4-part1.png

part2
4-part2.png

キレイに出ましたね!

最終形

Voice

voice.ly
\version "2.18.2"

% 記号用Voice
mk = \new Voice
  \compressFullBarRests % 長休符をまとめる

  \omit Rest % 通常の休符を消す
  \omit MultiMeasureRest % 長休符の記号を消す
  \omit MultiMeasureRestNumber % 長休符の長さを表す数字を消す

  \key bes \major
  \tempo 4 = 120

  R1*2 \bar "||" |

  \key d \major
  \mark \default

  R1 |
  r2 r^"rit." |
  R1*2 |
  \bar "|." |
}

% パート1
one = \new Voice \relative c' {
  \clef "treble"

  c2\ff d |
  e f |
  g a |
  R1*2 |
  b2 c |
}

% パート2
two = \new Voice \relative c {
  \clef "bass"

  c2\mf\< d |
  e f |
  g\f a |
  b c |
  R1*2 |
}

Staff

staff.ly
\version "2.18.2"
\include "voice.ly"  % voice.lyをinclud

stfOne = \new Staff <<
  \mk % 記号用Voice
  \one % パート1のVoice
>>

stfTwo = \new Staff <<
  \mk % 記号用Voice
  \two % パート2のVoice 
>>

Score

score.ly
#(ly:set-option 'relative-includes #t) % includeを各ファイルからの相対パスで書ける
\version "2.18.2"
\include "staff.ly"

\new Score <<
  \stfOne
  \stfTwo
>>

part1.ly
#(ly:set-option 'relative-includes #t)
\version "2.18.2"
\include "staff.ly"

\new Score {
  \stfTwo
}
part2.ly
#(ly:set-option 'relative-includes #t)
\version "2.18.2"
\include "staff.ly"

\new Score {
  \stfTwo
}

空白休符は使えないのか (20180609追記、訂正)

LilyPondには「空白休符」というものが存在します。
これは、デフォルトで記号を表示しない休符です。rの代わりに小文字のsを使います。

コメントでご指摘いただいたとおり、空白休符(s)には*n記法が使用できます。
これを用いれば、\omitを使用する必要なく、上記「コンパイル④」。と同様の出力結果が得られます。
今回の記号用Voiceの用途にうってつけに見えますが、残念ながら今回は採用できません。
空白休符には長休符(R)にあたるものがなく、パート譜で2小節以上の長休符を表示できなくなってしまうためです。

voice.ly
\version "2.18.2"

% 記号用Voice
mk = \new Voice {
  \compressFullBarRests % 長休符をまとめる

  \key bes \major
  \tempo 4 = 120

  s1*2 | \bar "||" |

  \key d \major
  \mark \default

  s1 |
  s2 s^"rit." |
  s1*2 | \bar "|."
}

% パート1
one = \new Voice \relative c' {
  \clef "treble"

  c2\ff d |
  e f |
  g a |
  R1*2 |
  b2 c |
}

% パート2
two = \new Voice \relative c {
  \clef "bass"

  c2\mf\< d |
  e f |
  g2\f a |
  b c |
  R1*2 |
}

ちなみにリファレンスの同じところに書いてある\skipを使用しても同様の結果となります。
空白長休符Sが出てほしい。。。

参考

GitHubで編集を提案

Discussion