MusicXML 再び
かなり前に譜面を作成するソフトを作ろうと思いたち,そのソフトで使うファイルフォーマットとして MusicXML (by Recordare) を使おうと決めていました.思い立ってから少し時間もすぎたので,MusicXML 関連の日本語の文書も増えているかと思ったのですが,意外にもあまり増えていないようです.Finale のユーザは増えているようではありますが,MusicXML 自体への関心はあまりないのでしょうか.一部,音楽を研究されている学生さんや研究者の方々ががんばっておられるというのが現状のようです
MusicXML について詳細を知りたければ,MusicXML DTD Index と MusicXML 1.0 Tutorial をがんばって読めばよいのですが,なにぶんあまりにも量が多くて全部読む気になりません.そこで,ここでは例題をいくつか眺めながら適当に理解していこうと思います.なお,MusicXML に特有ではない部分(つまり XML の仕様)については言及しないことにします.
なお,以下に書いてあることには間違いが含まれている可能性が多々あります.本当かどうかは以下のドキュメント群などを参照してください.
チュートリアルの中に,最も簡単な譜面の例として挙げられているものを以下に引用します.どんな譜面かは,以下のテキストをファイルに書き出して Finale の MusicXML Import の機能で読み込ませるか,MusicXML 1.0 Tutorial の P11 を見ると確認できます.
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE score-partwise PUBLIC "-//Recordare//DTD MusicXML 1.0 Partwize//EN" "http://www.musicxml.org/dtds/partwise.dtd">Music 1 0 G 2 C 4 4 whole
チュートリアルにしたがって,各要素ごとに見ていくことにします.
ファイルの構造
このファイルの全体構造は,サンプルとドキュメントの内容から推測すると以下のようになっているようです.
< XML ファイルであることの宣言 > < MusicXML であることの宣言 / Partwise 形式であることの宣言 >以下,楽譜のデータが入る. スコアの終わり各パートの宣言 パート XX のデータが以下に入る. 最初の小節のデータが入る. 属性データリスト 音符のデータリスト 2番目の小節のデータが入る. ... 以下小節の数だけ繰り返す.... 以下パートの数だけ繰り返す.
ファイルの形式として,score-partwise と score-timewise という2つの形式があるようで,上は score-partwise の場合の例です.score-partwise 形式では,楽譜>パート>小節>音符,というようにパートを基準に階層化されるのに対し,score-timewise では時間の流れを基準に,楽譜>小節>パート>音符,というように階層化されるようです.ここでは partwise の例を追うことにします.
Score の構造
ひとつの楽譜 (score) は
- work: 作品に関するデータ
- movement-number: 楽章の番号
- movement-title: 楽章のタイトル
- identification: Identity の項目を参照.作曲者,作曲年などのデータを入れる.
- part-list: パートに関するデータ
この中で,part-list ブロックだけは必ず書かなければならないことになっているようです.part-list ブロック内にもいくつかの種類のデータを書き込めますが,最低限 score-part ブロック1つ,さらに score-part ブロックの中には part-name ブロックを1つだけ書かなければなりません.と,言葉で書くとややこしいのですが,つまり下記のような表記が最低限必要ということです.
ピアノ右手
score-part は必ず id という属性値を伴い,ここにパートを識別するための名前を入れます.パートが2つの場合は,以下のようになります.
ピアノ右手 ピアノ左手
work そのほかのブロックは,書かなくてもエラーにはなりません.データの作成者が必要と思えば入れる,という感じになっています.例えば悲愴ソナタ第1楽章のデータを入れるとすれば,次のようになります.
作品13 ソナタ「悲愴」 1 第一楽章 Ludwig van Beethoven 2004-10-20 Hypersigma Text Editor MusicXML 1.0 example
identification ブロックについては,データの入力者のメモやデータを作成したソフトウェアが使うメモ書きのようなもののようです.