5.1.3 コンテキストを残しておく

通常、コンテキストは何もすることが無くなった最初の音楽的タイミングで消滅させられます。そのため、Voice コンテキストはすべてのイベントを終えるとすぐに消滅し、Staff コンテキストは保持しているすべての Voice コンテキストのイベントが終了するとすぐに消滅する、などとなっています。このことは、早い段階にすでに消滅したコンテキストを参照する必要がある場合に、障害となります。例えば、\change コマンドで譜を変更する場合、\lyricsto コマンドで歌詞をボイスに結び付ける場合、あるいは、早い段階で登場したコンテキストに音楽イベントを追加する場合に障害となります。

この一般的な規則には 1 つ例外があります: {…} 構文 (シーケンシャルな音楽) の中で、構文が対象にする「現在のコンテキスト」は、その中の要素が更に下位のコンテキストを扱う場合、要素が終了した後もその下位のコンテキストを指し続けます。これはいくつかの場合において、暗黙的なコンテキストが誤って作成されることを防ぎますが、最初の下位コンテキストは、表記が終わるまで残り続けるということを意味しています。

一方、<<…>> 構造 (同時に起こる音楽) の表記は持続しません。そのため、コンテキストを作成するコマンドを、余分な <<…>> で囲むことによって、新たなコンテキストが、囲まれた {…} 表記全体にわたって残り続けることを阻止することができます。

いかなる音楽タイミングでも何かすることがあるようにすることで、任意のコンテキストを残しておくことができます。Staff コンテキストを残しておくには、それに含まれるボイスの 1 つが維持されることを保証する必要があります。ボイスを残しておく方法の 1 つに、ボイスに含まれる実際の音楽と並列に、空白休符をそのボイスに付け加えるという方法があります。残しておく必要があるすべての Voice コンテキストに対して、空白休符を付け加える必要があります。ところどころで使用されるボイスがある場合、前述の例外によって必要なボイスを残そうとするよりは、それらのボイスすべてを残しておく方が安全です。

以下の例では、空白休符の追加を用いる方法で、ボイス A とボイス B の両方が楽曲全体を通して維持されます:

musicA = \relative { d''4 d d d }
musicB = \relative { g'4 g g g }
keepVoicesAlive = {
  <<
    \new Voice = "A" { s1*5 }  % Voice "A" を 5 小節の間、維持する
    \new Voice = "B" { s1*5 }  % Voice "B" を 5 小節の間、維持する
  >>
}

music = {
  \context Voice = "A" {
    \voiceOneStyle
    \musicA
  }
  \context Voice = "B" {
    \voiceTwoStyle
    \musicB
  }
  \context Voice = "A" { \musicA }
  \context Voice = "B" { \musicB }
  \context Voice = "A" { \musicA }
}

\score {
  \new Staff <<
    \keepVoicesAlive
    \music
  >>
}

[image of music]

以下の例は、空白休符を用いる方法で、途切れ途切れのメロディに歌詞を持たせる方法を示しています。もちろん、実際に楽譜を書く場合は、メロディや伴奏は複数のセクションによって構成されることになります。

melody = \relative { a'4 a a a }
accompaniment = \relative { d'4 d d d }
words = \lyricmode { These words fol -- low the mel -- o -- dy }
\score {
  <<
    \new Staff = "music" {
      <<
        \new Voice = "melody" {
          \voiceOne
          s1*4  % Voice "melody" を 4 小節の間、残します
        }
        {
          \new Voice = "accompaniment" {
            \voiceTwo
            \accompaniment
          }
          <<
            \context Voice = "melody" { \melody }
            \context Voice = "accompaniment" { \accompaniment }
          >>
          \context Voice = "accompaniment" { \accompaniment }
          <<
            \context Voice = "melody" { \melody }
            \context Voice = "accompaniment" { \accompaniment }
          >>
        }
      >>
    }
    \new Lyrics \with { alignAboveContext = "music" }
    \lyricsto "melody" { \words }
  >>
}

[image of music]

これに代わる方法として、メロディに直接空白休符を付け加えて、メロディが伴奏と揃うようにする方法があります – 多くの場合、こちらの方法の方が良いかもしれません:

melody = \relative {
  s1  % 1 小節スキップします
  a'4 a a a
  s1  % 1 小節スキップします
  a4 a a a
}
accompaniment = \relative {
  d'4 d d d
  d4 d d d
  d4 d d d
  d4 d d d
}
words = \lyricmode { These words fol -- low the mel -- o -- dy }

\score {
  <<
    \new Staff = "music" {
      <<
        \new Voice = "melody" {
          \voiceOne
          \melody
        }
        \new Voice = "accompaniment" {
          \voiceTwo
          \accompaniment
        }
      >>
    }
    \new Lyrics \with { alignAboveContext = "music" }
    \lyricsto "melody" { \words }
  >>
}

[image of music]


LilyPond — 記譜法リファレンス v2.23.82 (開発版).