須通り
Sudo Masaaki official site
For the reinstatement of
population ecology.

ホーム | 雑記トップ | 特集「LilyPondで吹奏楽」 | LilyPondのファイル構造を学んで大規模な音楽を作ろう

はじめに

吹奏楽やオーケストラの総譜・パート譜に代表される、大規模な楽譜をLilyPondで作るには、肥大化しがちなソースコードを適切に構造化し分割せねばならない。このページでは、巨大な楽譜のソースコードを部品(コンテキスト)として管理し、見通しの良いLilyPondプロジェクトを構築する手法について解説する。

単一のソースからスコアとパート譜を出力する

LilyPondにおいてスコアとパート譜を、いかなる手順で作り分けるかは、2014年春現在のネット上の日本語情報で言及に乏しい話題であるので、本稿で解説しておく。なおタイトルの「単一のソース」とは「同じパートの同じ音を(スコア用とパート譜用の)2回書く必要がない」という意味であり、実際には次章に示す通り、ソースファイルを複数に分割してもよい。

まずはコンテキストを理解せよ

コンテキストって何なのさと疑問に思うだろう。正確な理解は難しいが、ひとまず「音楽を構成する部品に名前を付け、LilyPondのプロジェクト内で再利用できるようにしたもの」と覚えておけばよい。なおコンテキストには幾つかの種類があって、LilyPondのソースコード中に出てくる "Staff" とか "Voice" とかいった単語は、これらの種類を表すものである(それぞれ、使用方法が異なる)。

初級者向けのLilyPond解説文では、音楽的内容をコンテキストとして保存し、再利用する手法は滅多に採られない。おそらくは説明や読解が面倒であることに加え、解説者自身が重要性を理解していない所為だろう。だが、巨大な楽譜を譜刻する上でコンテキストの利用は不可欠である。

LilyPond公式サイトのリファレンスマニュアルでは、「5.1 コンテキストを理解する」としてセクションが丸々割かれている。面倒でもサブセクション 5.1.1 と 5.1.2 あたりまでは目を通して欲しい。まあ最低限、以下のソースファイルを読んで何をしているのか理解できる程度の知識があればよい。

Voiceコンテキストを使用して楽譜を記述する、簡単な例を示す。LilyPondソースはこちら

\version "2.16.0"  % LilyPond version は絶対に指定すること
% まずフルートのパートをVoiceに定義しておく
flute = \new Voice {
  \clef treble
  \key c \major
  \relative c' {
      f4 g a f
  }
}
% 次いでファゴットのパートをVoiceに定義しておく
bassoon = \new Voice {
  \clef bass
  \key c \major
  \relative c {
      f2 f2
  }
}
% ここからスコアを記述
\score {
  <<
  \flute  % ここでフルートのVoiceを再利用する
  \bassoon  % ここでファゴットのVoiceを再利用する
  >>
  \layout {}
  \midi {}
}
An example of contexts and a score

Fig. | Voiceコンテキストを使用して、フルートとファゴットの2パートが同時進行する楽譜を記述した例。

楽譜出力を自在に制御するための\bookと\score

コンテキストを扱えるようになったら、いよいよスコアの記述に取り組む。とはいっても、実は直前に示した譜例がすでにスコアになっている。

(先ほどと同じソースの後半だけを抜粋したもの)
...
...
% ここからスコアを記述
\score {
  <<
  \flute  % 同時進行する1番目のパート
  \bassoon  % 同時進行する2番目のパート
  >>
  \layout {}
  \midi {}
}

抜粋部分の冒頭に \score コマンドがあり、これが score ブロックを定義する。実際に楽譜を作り出すのはこの、score ブロック内の記述である。Score ブロックの内部に、<< >>で囲まれた二つのVoiceコンテキストが併記されており、これは各voiceが時間的に同時進行する、すなわち譜表が上下に繋がれることを指示する。ちなみに<< >>を使わずに併記すると、\fluteの後に\bassoonの音符を継ぎ足した、1パート×2小節の音楽になる。

次いで、このソースファイルを改造して、スコアとパート譜を同時に出力させよう。さっそく実例を示す。LilyPondソースはこちら

\version "2.16.0"  % LilyPond version は絶対に指定すること
% まずフルートのパートをVoiceに定義しておく
flute = \new Voice {
  \clef treble
  \key c \major
  \relative c' {
      f4 g a f
  }
}
% 次いでファゴットのパートをVoiceに定義しておく
bassoon = \new Voice {
  \clef bass
  \key c \major
  \relative c {
      f2 f2
  }
}
% ここからスコアを記述
\book {
  \bookOutputName "ConExample_Score"
  \score {
    <<
      \flute  % ここでフルートのVoiceを再利用する
      \bassoon  % ここでファゴットのVoiceを再利用する
    >>
    \layout {}
    \midi {}
  }
}
% ここからフルートのパート譜を記述
\book {
  \bookOutputName "ConExample_Flute"
  \score {
    \flute  % ここでフルートのVoiceを再利用する
    \layout {}
    \midi {}
  }
}
% ここからファゴットのパート譜を記述
\book {
  \bookOutputName "ConExample_Bassoon"
  \score {
    \bassoon  % ここでファゴットのVoiceを再利用する
    \layout {}
    \midi {}
  }
}

上に示したソースには \book というコマンドで定義される、bookブロックが3つ含まれている。それぞれのbookブロックは1つのscoreブロックを持ち、それぞれがスコアないしパート譜を生成する。

このbookブロックの機能は、コンパイル対象のLilyPondドキュメントにおいて、そこに含まれるbookブロックの数だけ、個別の楽譜ファイルを出力することである。結果として、1枚のソースファイルから「スコア」「フルートのパート譜」「ファゴットのパート譜」の3枚の楽譜PDFファイルが得られる。各楽譜ファイルの名称は、book ブロック内に \bookOutputName を記述することで制御される。

また以下のように、1つのbookブロックに複数のscoreブロックを持たせることも可能である。LilyPondソースはこちら

...
...
(中略)
% ここからスコアを記述
\book {
  \bookOutputName "ConExample_All"
  \score {
    <<
      \flute  % ここでフルートのVoiceを再利用する
      \bassoon  % ここでファゴットのVoiceを再利用する
    >>
  }
  \score {
    \flute  % ここでフルートのVoiceを再利用する
  }
  \score {
    \bassoon  % ここでファゴットのVoiceを再利用する
  }
}

これがどのような楽譜を生み出すかというと、1ページ内に「スコア」、「フルートのパート譜」、「ファゴットのパート譜」が上から順に並んだPDFファイルである。詳しく知りたい人は公式リファレンスマニュアルの「3.1.5 ファイル構造」を参照してほしい。

大規模プロジェクト用に分割記述したLilyPondソースファイルをincludeで引用する

単パート、単楽章といった小規模な楽曲であれば、LilyPondソースを一つのファイルにまとめてしまっても、全体を見渡すことは容易であろう。だが吹奏楽やオーケストラのようにパートが数十にも分割されると、各パートのソース冒頭へのアクセスは難しい。この問題に対処するため、パートを別のファイルに記述しておき、includeコマンドを用いてその内容を引用する。

方法は以下。

あらかじめ、各パートの音符を記述するソースファイルと、スコアを作るための
ソースファイルとを分けて作り、これらを同じフォルダに置く。
"score.ly"
"part1.ly"
"part2.ly"
...
...
(必ずしもこの名前でなくてもよい)
"score.ly"の内部に、以下のようにインクルード処理を記述する。

\inlcude "part1.ly"
\include "part2.ly"
(以下同様)

スコアを作成するときは、"score.ly"をLilyPond実行環境から開き、そのままコンパイルすればよい。コンパイル時には"score.ly"内の当該箇所に、インクルードされた内容がそっくりコピペされ、それらの記述が全部繋がった1本のソースファイルとしてlilypondエンジンに送られ解釈される。

作例

一応、インクルードの概念を理解するための簡単な作例を挙げておく。

インクルードを利用したソース分割の単純化された作例(zip圧縮)

移調楽器の入力と記譜

がらりと話は変わるが、吹奏楽の記譜において避けて通れぬ問題が、クラリネットやピッコロなどの移調楽器(移高楽器)の存在である。こんな前々々世紀の遺物、筆者自身は廃止しちまえと主張しているのだが、C管への統一が遅々として進まない現状、対応させざるを得ない。

LilyPondのソースコードを記譜音で記すか、実音で記すかは、入力に用いるソースに揃えれば良い。すなわち、既存の紙楽譜から音高を読み取る場合は記譜音のままノートを置けばよいし、in C で入力されたMIDIデータなどが既にある場合や、頭の中で移調作業が出来ない人が作曲する場合などは、実音で入力するだけである。

もちろんLilyPondは賢いデータ記述言語なので、コマンド一発で移調をやってのける。移調のためのLilyPondコマンドが \transpose である。以下に使用例を示す。

LilyPondにおけるクラリネットの移調譜の例

たとえば実音で { c d ees f } (ただし楽曲の調はEs durと仮定し、先頭のc音は真ん中のド)という音楽的内容を記譜したいする。Bフラット管のクラリネットにおける記譜上の音高は長二度高い { d e f g } だ。
(余談だがクラリネットの楽譜を「しぃ~っ」と書くと実際の音が「べぇ~っ」と鳴るので、「べー」管と呼称するのである)

ここでソースコードの書き方は、少なくとも以下の二通り存在する。

クラリネット (in B) の楽譜を実音で記譜する方法。LilyPondソースはこちら

\version "2.16.0"  % LilyPond version は絶対に指定すること
% 最初に音楽的内容をVoiceに定義しておく
clarinetFirst = \new Voice {
  \clef treble
  \key ees \major  % 調は明示的に指定しておくこと
  \relative c' {
      c4 d ees f  % ノートは実音で打ち込む
  }
}
\score {
  \transpose bes c' { \clarinetFirst }  % 記譜音を長二度上に移調
  \layout {}
  \midi {}
}

クラリネット (in B) の楽譜を記譜音で記譜する方法。LilyPondソースはこちら

\version "2.16.0"  % LilyPond version は絶対に指定すること
% 最初に音楽的内容をVoiceに定義しておく
clarinetFirst = \new Voice {
  \clef treble
  \key f \major  % 調の指定も(Es durではなくF durに)変える必要がある
  \relative c' {
    d4 e f g  % ノートを最初から記譜音で打ち込む
  }
}
\score {
  \clarinetFirst % 移調しない
  \layout {}
  \midi {}
}

いずれの方法でも、描かれる楽譜は以下のようになるはずだ。

clarinet in B flat

Fig. | 変ホ長調で実音C-D-Es-Fの音楽を、クラリネット用に記譜した例

移調譜の譜表をtransposeで処理する場合の注意

  • 上の例にも記しているように、\key による楽曲の調の指定は、可能な限り行うこと。さもないと、同音異名を正しく処理してくれない。
  • 単純な長調や短調に当てはまらない場合も、\key による調の指定は可能。たとえば旋法を使いたければ、"\key = f \major" の代わりに "\key = f \dorian" などとして、モード名称を直接指定することも出来る。

ただし、これらの方法でも1つの問題が残る。同時に生成されるMIDIデータの音高が、実音 { c d ees f } ではなく記譜音 { d e f g } になってしまうのだ。対処は少し面倒だが、以下のinstrumentTranspositionを用いる方法がある。

移調譜において正しい音高のMIDIを得る方法

クラリネット (in B) の楽譜を実音で記譜し、さらに正しい音高のMIDIを出力する方法。LilyPondソースはこちら

\version "2.16.0"  % LilyPond version は絶対に指定すること
% 最初に音楽的内容をVoiceに定義しておく
clarinetFirst = \new Voice {
%  \clef treble
  \key ees \major  % 調は明示的に指定しておくこと
  \relative c' {
    c4 d ees f  % ノートは実音で打ち込む
  }
}
\score {
  \new Staff \with {
    instrumentTransposition = bes  % このプロパティがMIDI音高を変更する
  }
  \transpose bes c' { \clarinetFirst }  % 記譜音を長二度上に移調
  \layout {}
  \midi {}  % 記譜音を長二度上に移調
}

なお、ここまで面倒なことをしなくても、スコア・パート譜を出力するためのソースファイル(Scoreセクション)と、MIDIを出力するためのソースファイル(Scoreセクション)とを別々に用意すれば解決する。すなわちオタマジャクシは実音で記載した上で、スコア・パート譜出力用のScoreセクションにのみ、実→記譜の方向にトランスポーズを掛けるのだ。個人的には(MIDI単独出力時の実行速度の観点からも)こちらをお薦めする。

楽曲メタデータを集中管理する

(執筆中)(要するに曲名・作曲者名・著作権表示・テンポ・練習番号といった全楽器で共有される情報であれば、1つのソースファイルにまとめて書いてしまえば楽だねという話)