[Lilypond] 総譜とパート譜を同時に生成するテクニック
総譜 (スコア) とパート譜をともに Lilypond で作成することを考えます. ベースとなる音楽情報は総譜とパート譜で (ほぼ) 同じものですから, 総譜とパート譜はソースコードの大部分を共有するべきです. 基本的なことは公式ドキュメントにまとまっています.
ただし, パート譜には以下の考慮事項があります.
- 奇数ページの改ページ位置をできるだけ長い休符に合わせたい.
そのために手動で
\pageBreak
を挿入したいが, これは総譜には反映されるべきではない. - 必要に応じて, 休符部分に他のパートの音符を示しておきたい (影譜,
CueVoice
).
このあたりをいい感じに行うワークアラウンドを考えたので, まとめておきます. もっと良い方法があるかもしれませんが...
なお, 以下では弦楽四重奏を想定して説明します.
プロジェクト構造
以下のファイルを作成します.
String Quartet.ly
: メインとなる Lilypond ファイル.score.ily
: 総譜部分を担当する.part.ily
: パート譜部分を担当する.violin1.ily
,violin2.ily
,viola.ily
,cello.ily
: 各パートの音楽データを入力する.- (任意)
common.ily
: 共通のソースコードをまとめておくファイル (調や拍子, 発想標語, その他共通で使用する Lilypond コードなど).
各パート
まず各パート violin1.ily
, violin2.ily
, viola.ily
, cello.ily
ですが,
これらのファイルには, Staff
を含めず, 音楽データ (Voice
) だけをまとめておきます.
さらに, 各パートの CueVoice
もここに入力しておくと良いでしょう.
要点は, CueVoice
は総譜には読み込まずパート譜だけで使用されるため,
CueVoice
内に改ページなどのパート譜のためのレイアウト設定を持たせておくことができる, という点です.
例えば violin1.ily
は次のような内容になるでしょう.
violinFirst = \new Voice \relative c' {
%{ 音楽データを入力 %}
}
violinFirstCue = \new CueVoice {
%{ 全小節を `s` で埋める (影譜が必要な部分のみ入力). \pageBreak 等はここに入力 %}
}
score.ily
次に score.ily
ですが, 総譜で単独の PDF ファイルを作成したいため, この中でひとつの book
を作成します.
\book {
\score {
\new StaffGroup <<
\new Staff \with { instrumentName = #"Violin I" } { \violinFirst }
\new Staff \with { instrumentName = #"Violin II" } { \violinSecond }
\new Staff \with { instrumentName = #"Viola" } { \viola }
\new Staff \with { instrumentName = #"Cello" } { \cello }
>>
\layout {}
}
\paper {
#(layout-set-staff-size 17)
systems-per-page = #4
}
}
複数の楽章からなる楽曲の場合は, \score
ブロックを増やしてください.
part.ily
パート譜ですが, ほぼ同じものをパートの数だけ作成するのは面倒です. そこで以下の方法で手間やソースコードの無駄を省くことができます.
part.ily
には, 以下のように, 各パートによって異なる部分を変数とした Lilypond コードを入力します.
この場合には \INSTRUMENT
, \PART
, \CUE
が各パートによって異なる変数です.
\book {
\bookOutputSuffix \INSTRUMENT
\score {
<<
\new Staff << \PART \CUE >>
>>
\layout {}
}
\paper {
#(layout-set-staff-size 20)
bookTitleMarkup = \markup \center-column {
\fill-line {
\fontsize #4 \bold \fromproperty #'header:title
}
\fill-line {
\rounded-box { \fontsize #2 \INSTRUMENT }
\fromproperty #'header:composer
}
}
}
}
\bookOutputSuffix
を指定することで各パートの出力ファイル名を制御することができます.
今回の場合では, String Quartet-Violin I.pdf
といった感じで出力されます.
また, どのパートの楽譜か明示するために bookTitleMarkup
を設定しておきました.
このあたりは好みで自由に調整できます.
複数の楽章からなる楽曲の場合は, 楽章の数だけ \score
を増やすと同時に,
\PART
, \CUE
といった変数も楽章の数だけ用意します.
メインファイル
それではメインファイル String Quartet.ly
ですが, ここで今まで作成してきたファイルを \include
していきます.
\version "2.24.0"
\language "deutsch"
\pointAndClickOff
\header {
title = "String Quartet"
%composer = ""
tagline = ##f
}
%\include "./common.ily"
\include "./violin1.ily"
\include "./violin2.ily"
\include "./viola.ily"
\include "./cello.ily"
%%% 総譜を作成 %%%
\include "./score.ily"
%%% パート譜を作成 %%%
INSTRUMENT = "Violin I"
PART = \violinFirst
CUE = \violinFirstCue
\include "./part.ily"
INSTRUMENT = "Violin II"
PART = \violinSecond
CUE = \violinSecondCue
\include "./part.ily"
INSTRUMENT = "Viola"
PART = \viola
CUE = \violaCue
\include "./part.ily"
INSTRUMENT = "Cello"
PART = \cello
CUE = \celloCue
\include "./part.ily"
総譜は単に別ファイルで作ったものを \include
するだけです.
問題はパート譜ですが, 見ての通り, \include "./part.ily"
する直前でパートによって異なる変数に各パートの音楽データ等を代入することで,
ソースコードの重複を最小限にしてパート譜を作成することができます.
以上で, 音楽データそのものは一か所に入力されており, それが総譜とパート譜の双方に反映されていますが,
パート譜ではさらに追加の \pageBreak
や影譜を自由に入力できる, という目標が達成できました.