LilyPondで調号・練習番号・テンポ・拍子などを音楽表記と分離して書く
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小節くらい作ります。パート固有の記号や長休符も入れました。
\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を作る
追記していきます。とりあえず曲の最初に表示するものを書きます。
ついでに終止線も書きます。
\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です。これはちょろいですね。
\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
を各ファイルからの相対パスで書けるようになるマジックワードです。
\version "2.18.2"
\include "staff.ly"
\new Score {
<<
\stfOne
\stfTwo
>>
}
パート譜もさらっと書きます。
\version "2.18.2"
\include "staff.ly"
\new Score {
\stfOne
}
\version "2.18.2"
\include "staff.ly"
\new Score {
\stfTwo
}
コンパイル①
Score
part1
part2
調号・テンポ記号・終止線がそれぞれ正しく入っているのがわかります。
しかし、余計な全休符が表示されています。こんどはこれを消しましょう。
余計な全休符を消す
\omit
を追加
記号用Voiceの上の方に追記します。
% ~~~
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
part1
part2
余計な全休符が消えました!
次は、曲の途中に置く記号を追加しましょう。
曲の途中に置く記号を追加する
リハーサルマーク・転調・rit
以下の作戦でいきます。
- 3小節目で転調(複縦線も) & リハーサルマーク
- 4小節目3拍目でrit.
% ~~~
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
part1
part2
ritは意図したとおりに表示できましたが、余計な2分休符が出てしまいました。
さらに、part2の5-6小節目間の小節線上に「2」と表示されてしまっています。
これの正体は長休符の長さを表す数字です。
記号用の長休符を\omit
したため、適切な位置に表示されません。
以上の2オブジェクトも消してしまいましょう。
通常の休符と長休符の数字を消す
\omit
を追加
方法は同じです。
対象のオブジェクトを記号用のVoiceから\omit
していきます。
% ~~~
mk = \new Voice {
\compressFullBarRests
\omit MultiMeasureRest
\omit Rest % ★追記 通常の休符
\omit MultiMeasureRestNumber % ★追記 長休符の長さを示す数字
\key bes \major
% ~~~
コンパイル④
Score
part1
part2
キレイに出ましたね!
最終形
Voice
\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
\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
% includeを各ファイルからの相対パスで書ける
\version "2.18.2"
\include "staff.ly"
\new Score <<
\stfOne
\stfTwo
>>
\version "2.18.2"
\include "staff.ly"
\new Score {
\stfTwo
}
\version "2.18.2"
\include "staff.ly"
\new Score {
\stfTwo
}
空白休符は使えないのか (20180609追記、訂正)
LilyPondには「空白休符」というものが存在します。
これは、デフォルトで記号を表示しない休符です。r
の代わりに小文字のs
を使います。
コメントでご指摘いただいたとおり、空白休符(s
)には*n
記法が使用できます。
これを用いれば、\omit
を使用する必要なく、上記「コンパイル④」。と同様の出力結果が得られます。
今回の記号用Voiceの用途にうってつけに見えますが、残念ながら今回は採用できません。
空白休符には長休符(R
)にあたるものがなく、パート譜で2小節以上の長休符を表示できなくなってしまうためです。
\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
が出てほしい。。。
参考
- LilyPond — 学習マニュアル v2.18.2 (安定版).
Discussion