LilyPond 記譜法リファレンス: 3.3.2 1 つのソースから異なる版を生成する

### 3.3.2 1 つのソースから異なる版を生成する

同じ音楽ソースから異なるバージョンの楽譜を容易に生成できるようにするために、いくつかの方法が用意されています。長い音楽や注記のセクションをさまざまなやり方で組み合わせる場合には、おそらく変数が最も役に立つでしょう。差し替え用の短い音楽セクションの中から 1 つを選択する場合にはタグが役に立ち、楽曲の一部をいろいろな箇所で組み合わせることもできます。

どのような方法をとるにしても、楽譜構造から音楽表記を分離しておくと、音楽表記に手を触れずに楽譜構造を変更することが簡単に行えます。

#### 変数を使用する

音楽のセクションが変数の中で定義されている場合、そのセクションを楽譜の異なる部分で再利用することができます – Organizing pieces with variables を参照してください。例えば、アカペラ のボーカル譜はリハーサル目的ですべてのパートをまとめたピアノ譜を持つことがよくあります。これは声楽全般で言えることです。その場合、音楽を入力する必要があるのは 1 回だけです。2 つの変数からの音楽を 1 つの譜に組み込むことができます – 自動パート結合 を参照してください。ここに例を挙げます:

>     sopranoMusic = \relative { a'4 b c b8( a) }
>     altoMusic = \relative { e'4 e e f }
>     tenorMusic = \relative { c'4 b e d8( c) }
>     bassMusic = \relative { a4 gis a d, }
>     allLyrics = \lyricmode { King of glo -- ry }
>     <<
>       \new Staff = "Soprano" \sopranoMusic
>       \new Lyrics \allLyrics
>       \new Staff = "Alto" \altoMusic
>       \new Lyrics \allLyrics
>       \new Staff = "Tenor" {
>         \clef "treble_8"
>         \tenorMusic
>       }
>       \new Lyrics \allLyrics
>       \new Staff = "Bass" {
>         \clef "bass"
>         \bassMusic
>       }
>       \new Lyrics \allLyrics
>       \new PianoStaff <<
>         \new Staff = "RH" {
>           \partCombine \sopranoMusic \altoMusic
>         }
>         \new Staff = "LH" {
>           \clef "bass"
>           \partCombine \tenorMusic \bassMusic
>         }
>       >>
>     >>

音楽表記には変更を加えずに、楽譜構造の文を変えるだけで、ボーカル パートだけあるいはピアノ パートだけの楽譜を作り出すことができます。

長い楽譜では、変数定義をそれぞれ別々のファイルの中に置いて、それらのファイルをインクルードすることになるかもしれません – LilyPond ファイルをインクルードする を参照してください。

#### タグを使用する

`\tag #'partA` コマンドは音楽表記に partA という名前を付けます。この方法でタグを付けられた表記は、後で `\keepWithTag #'name` と `\removeWithTag #'name` のどちらかを用いて、名前によって選択あるいは排除することができます。タグの付いた音楽にそのようなフィルタを適用した結果は以下のようになります:

フィルタ | 結果
--- | ---
`\keepWithTag #'name` あるいは `\keepWithTag #'(name1 name2…)` が前に付くタグ付きの音楽 | タグの付いていない音楽と、与えられたタグ名のいずれかに当てはまる音楽がインクルードされます。他のタグ名を持つタグ付き音楽は排除されます。
`\removeWithTag #'name` あるいは `\removeWithTag #'(name1 name2…)` が前に付くタグ付きの音楽 | タグの付いていない音楽と、与えられたタグ名のどれにも当てはまらない音楽がインクルードされます。与えられたタグ名のいずれかに当てはまる音楽は排除されます。
`\keepWithTag` と `\removeWithTag` のどちらも前に付かないタグ付きの音楽 | タグの付いた音楽とタグの付いていない音楽すべてがインクルードされます。

`\tag`、`\keepWithTag` それに `\removeWithTag` コマンドの引数はシンボルやシンボルのリスト (例えば `#'score` or `#'(violinI violinII`) と、音楽表記の順であるべきです。シンボルが LilyPond において正しい識別子 (アルファベットのみから成り、数字、アンダースコア、ダッシュは含まない) であり、音符名と混同しない場合である限り、`#'` を省略することができ、シンボルのリストはドットで区切る記法を用いることができます。例えば、`\tag #'(violinI violinII)` は `\tag violinI.violinII` と書くことができます。`\keepWithTag` や `\removeWithTag` でも同様です。タグコマンドは音楽関数なので、`\book` または `\score` ブロックのような、音楽表記ではないオブジェクトをフィルターするのに使うことはできません。

以下の例では、楽曲を 2 つのバージョンで示しています。1 つはトリルを通常の記譜法で示していて、もう 1 つはトリルを明示的に展開しています:

>     music = \relative {
>       g'8. c32 d
>       \tag #'trills { d8.\trill }
>       \tag #'expand {\repeat unfold 3 { e32 d } }
>       c32 d
>      }

>     \score {
>       \keepWithTag #'trills \music
>     }
>     \score {
>       \keepWithTag #'expand \music
>     }

`\keepWithTag` を使う代わりに、音楽セクションを排除する方が楽な場合もあります:

>     music = \relative {
>       g'8. c32 d
>       \tag #'trills {d8.\trill }
>       \tag #'expand {\repeat unfold 3 {e32 d} }
>       c32 d
>      }

>     \score {
>       \removeWithTag #'expand
>       \music
>     }
>     \score {
>       \removeWithTag #'trills
>       \music
>     }

タグ フィルタリングはアーティキュレーション、テキストなどにも適用することができます。フィルタリングを行うにはアーティキュレーションの前に

>     -\tag #'your-tag

を置きます。例えば、以下は条件付の運指指示を持つ音符と条件付注記を持つ音符を定義しています:

>     c1-\tag #'finger ^4
>     c1-\tag #'warn ^"Watch!"

複数の `\tag` エントリで、または複数のタグを一つのシンボルのリストにすることで、表記に複数のタグを付けることもできます:

>     music = \relative c'' {
>       \tag #'a \tag #'both { a4 a a a }
>       \tag #'(b both) { b4 b b b }
>     }
>     <<
>     \keepWithTag #'a \music
>     \keepWithTag #'b \music
>     \keepWithTag #'both \music
>     >>

単一の音楽表記に複数の `\removeWithTag` フィルタを適用することによって、いくつかの異なる名前のタグが付いたセクションを排除することができます。または、`\removeWitTag` にタグのリストを与える表記を用いることもできます:

>     music = \relative c'' {
>       \tag #'A { a4 a a a }
>       \tag #'B { b4 b b b }
>       \tag #'C { c4 c c c }
>       \tag #'D { d4 d d d }
>     }
>     \new Voice {
>       \removeWithTag #'B
>       \removeWithTag #'C
>       \music
>       \removeWithTag #'(B C)
>       \music
>     }

単一の音楽表記に 2 つ以上の `\keepWithTag` フィルタを適用すると、タグ付きセクションが すべて 排除されてしまいます。なぜなら、最初のフィルタがそのタグ以外を持つセクションを排除し、2 番目のフィルタが更にそのセクションを排除するからです。`\keepWithTag` コマンドを、複数のタグのリストを引数に与えて使うことで、そのリストに無いタグを持つセクションのみを削除することができます。

>     music = \relative c'' {
>       \tag #'violinI { a4 a a a }
>       \tag #'violinII { b4 b b b }
>       \tag #'viola { c4 c c c }
>       \tag #'cello { d4 d d d }
>     }

>     \new Staff {
>       \keepWithTag #'(violinI violinII)
>       \music
>     }

上の例では、violinI と violinII の `\tag` を表示しますが、viola や cello は表示しません。

While `\keepWithTag` is convenient when dealing with one set of alternatives, the removal of music tagged with unrelated tags is problematic when using them for more than one purpose. `\keepWithTag` は、1 つだけの入れ替えのセットを扱う場合には便利ですが、関係のないタグが付けられた音楽を削除してしまうことは、タグを複数の目的で使用したい場合に問題となります。そのような場合では、タグの‘グループ’を宣言することができます。

>     \tagGroup #'(violinI violinII viola cello)

こうすることで、4 つの異なるタグが一つの‘タグ グループ’になります。それぞれのタグは、複数の‘タグ グループ’のメンバとなることはできません。

>     \keepWithTag #'violinI …

これで、`violinI` のタグ グループに含まれるタグから、該当するタグのみが表示され、その他のタグは削除されます。(訳注: 指定されたタグ グループに含まれないタグは表示されたままになります。)

>     music = \relative {
>       \tagGroup #'(violinI violinII viola cello)
>       \tag #'violinI { c''4^"violinI" c c c }
>       \tag #'violinII { a2 a }
>       \tag #'viola { e8 e e2. }
>       \tag #'cello { d'2 d4 d }
>       R1^"untagged"
>     }

>     \new Voice {
>       \keepWithTag #'violinI
>       \music
>     }

既存の音楽表記のある特定の場所にいくつか音を組み込みたいことがあります。`\pushToTag` と `\appendToTag` を使って、既存の音楽構造の `elements` の前または後に素材を追加することができます。すべての音楽構造が `elements` を持つわけではありませんが、連続するか同時進行する音楽構造はまず間違いなく `elements` を持ちます:

>     music = { \tag #'here { \tag #'here <<c''>> } }

>     {
>       \pushToTag #'here c'
>       \pushToTag #'here e'
>       \pushToTag #'here g' \music
>       \appendToTag #'here c'
>       \appendToTag #'here e'
>       \appendToTag #'here g' \music
>     }

どちらのコマンドもタグ、組み込む素材、それにタグ付けされた音楽表記を 取り、タグが出現するたびに素材を組み込みます。

#### 参照

学習マニュアル: Organizing pieces with variables

記譜法リファレンス: 自動パート結合, LilyPond ファイルをインクルードする

#### 既知の問題と警告

`\keepWithTag` や `\removeWithTag` でフィルタリングされた音楽表記に `\relative` を用いると、オクターブ関係が変化してしまいます。これは、フィルタリングされた音符のみが `\relative` で解釈されるためです。`\keepWithTag` や `\removeWithTag` よりも先にまず `\relative` を適用することで、全ての音符が解釈されるようになるため、危険を回避することができます。

#### グローバル設定を使用する

別のファイルからグローバル設定をインクルードすることができます:

>     lilypond -dinclude-settings=MY_SETTINGS.ly MY_SCORE.ly

ページ サイズ、フォント、書体などのような設定のグループを別々のファイルに保存することができます。こうすることにより、適当な設定ファイルを指定するだけで、同じ楽譜から異なる版を作り出すことができます。

このテクニックはスタイル シートでも使えます。 Style sheets を参照してください。

#### 参照

学習マニュアル: Organizing pieces with variables, Style sheets

記譜法リファレンス: LilyPond ファイルをインクルードする

#### LilyPond — 記譜法リファレンス v2.22.2 (安定版).

- 2. 専門的な記譜法
- 3. 入出力全般
- 4. スペースの問題
- 5. デフォルトを変更する
- A. 付表
- B. カンニング ペーパー
- C. GNU Free Documentation License
- D. LilyPond コマンド インデックス
- E. LilyPond インデックス