第一日¶
コンテキスト¶
LilyPondの更なる利用のために、ここでコンテキストという概念について理解しておく必要がある。
LilyPondの楽譜表現は階層構造になっており、あるコンテキストが別のコンテキストを含むという形をとっている。
代表的なコンテキストは Score
、 Staff
、 Voice
の3つであり、それぞれが出力される楽譜の「楽譜全体」、「譜(1パート分の五線譜)」「声部」に対応している。
Score
は1つまたは複数の Staff
を含むことができ、 Staff
は1つまたは複数の Voice
を含むことができる。
以下の図は、コンテキストの階層構造を図示したものである。
TODO
コンテキストは エングラーバ で扱うエングラーバというものをいくつか持ち、それぞれのエングラーバが実際に音楽記号を配置する。
例えば、 Voice
コンテキストは Note_heads_engraver
と呼ばれるエングラーバを持ち、このエングラーバは符頭を楽譜上に描く。
Score
コンテキストは Metronome_mark_engraver
というエングラーバを持ち、楽譜全体で共有されるテンポ記号を描く。
コンテキストの生成¶
コンテキストは \new
コマンドで生成する。 \new
の後に、生成するコンテキストの種類を与え、必要であればコンテキストの固有名を =
と文字列で指定する。
最後に音楽表記を与える。
ただし、 Score
コンテキストは \new Score
によってではなく、 \score
によって生成する。
\score
は {
}
で囲まれた音楽表記やいくつかの特殊なコマンドを取り、TODO
\score
は \book
以外のいかなる子要素になってはならない。TODO
\score {
<<
\new Staff {
\new Voice {
g'4
}
}
\new Staff = "staff2" {
\new Voice {
c'4
}
}
>>
}
上の例では、 \score
によって Score
コンテキストを生成し、 <<
>>
で囲まれた2つの \new Staff
により同時に2つの譜を作り出している。
後者の Staff
には staff2
という名前が付いており、ソースファイルの別の場所から参照することができる。
コンテキストの暗黙的作成¶
第一週の種々の例で見てきたように、単純に音楽表記を {
}
で囲むことで楽譜を生成することができた。
これはLilyPondが内部的にコンテキストを自動生成しているためであり、TODO
{
c'4 d' e' f'
}
これは以下のように解釈される。
\book {
\score {
\new Staff {
\new Voice {
c'4 d' e' f'
}
}
\layout { }
}
\paper { }
\header { }
}
音楽が \new Voice
を省略して表記されるとき、暗黙的に Voice
コンテキストが作成される。
この表記を囲んでいる Staff
が存在しない時、暗黙的に Staff
が作成される。
同様に、 \score
、 \layout
、 \book
、 \paper
、 \header
が作成されている。
\score {
\new Staff {
\new Voice {
\new Staff {
c'4
}
}
}
}
上のコードのように、 Voice
コンテキスト内で \new Staff
を呼び出す時、 Voice
は Staff
を含むことができないから、
その外部にある Score
コンテキストを探し、 Score
の子コンテキストとして Staff
が作成される。
(もちろん、 \score
が存在していない時には暗黙的に作成される。)
結果的に、 Score
内には、 Score
の直下にある Staff
と、 Voice
内で宣言された Staff
の二つが作成されるため、出力は以下のようになる。
下段に新しく作成された Staff
内に暗黙的に Voice
が作成され、そちらに音符が置かれていることに注意せよ。
多声表記 (2)¶
多声表記 (1) で、以下のような表記について学習した。
<< { g'4 a' b' c'' } \\ { e'4 f' g' a' } >>
これは \new Voice
を用いた以下の表記と同等である。
<<
\new Voice = "1" { \voiceOne g'4 a' b' c'' }
\new Voice = "2" { \voiceTwo e'4 f' g' a' }
>>
1つの譜の中で複数の声部を保持するために、 Staff
コンテキスト内に複数の Voice
コンテキストを持たせているというわけである。
TODO: voices
TODO: スパナを繋げる