MusicXMLのチュートリアル

プログラミング///

XMLは人の理解しやすい文章で書かれたデータ形式なので、効率の良く操作することができます。MusicXMLは、そのような長所と楽譜を結び合わせることができます。MusicXMLは楽譜を管理したり研究したりするのに役立つでしょう。

MusicXMLは楽譜の汎用フォーマットを目指したデータ形式です。有名な楽譜制作ソフトウェアでも採用されており、現在もっとも普及している楽譜データと言えます。しかしMusicXMLのことは知っていても、その内部構造を把握している人はあまりいないかもしれません。その理由の一つに解説書が十分に翻訳されていないことが挙げられるでしょう。

この記事では、MusicXMLのチュートリアルの1つのセクションである「Hello World」の解説します。チュートリアルの日本語訳ではないことに注意してください。それではMusicXMLがどういうものなのか見てみましょう。

MusicXMLでHello World

チュートリアルのはじめに「Hello World」について触れられています。これは主要なプログラミング言語であるC言語の創始者たちが、学習者に教えた最初のステップのことを指しています。その課題が、画面上に「hello,world」と表示するプログラムを作りましょうというものでした。現在もそのステップはプログラミング入門の定番となっています。

ということは、これからMusicXMLで「hello,world」と記譜する方法を学べるのでしょうか。残念ながら、「hello,world」を楽譜に記すのはとても複雑で最初のステップには向きません。そのためチュートリアルではもっと簡単な楽譜を作る方法を紹介しています。

五線譜にト音記号と4分の4拍子のリズム。これから作成するのは、ドの音の全音符が1つ記されただけの簡単な楽譜です。全体で1小節ととても短い曲ですが、このなかにMusicXMLのエッセンスがたくさん詰まっています。

チュートリアルでは次に、全体のXML文を掲載していますが、私はそうしたくはありません。一度にたくさんの記号の羅列を見せて、あなたを不安にさせたくないからです。一行ずつ見ていくことにしましょう。一歩ずつ進んでゆけば、必ずゴールにたどり着くことができます。

XMLとDTDについての説明

1行目:XML文書であることを宣言する行

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

1行目に注目してみましょう。これはXML文書であることを宣言する部分です。もう少し分解してみましょう。

<?xml ... ?>

これが1行目の骨格です。これにより、この文章全体がXMLであることを明示することができます。この中に、3つの属性が入ります。1つずつ見てゆきましょう。

<?xml version="1.0" ... ?>

XMLは現在2つのバージョンがあります。XML1.0とXML1.1です。一般に普及しているのは1.0の方で、MusicXMLでもXML1.0を採用しています。バージョン属性を含めることにより、記述するXMLのバージョンを明確にすることができます。バージョンは必須項目です。

<?xml version="1.0" encoding="UTF-8" ... ?>

2番目の属性には文字コードを指定します。UTF-8の他に使用している文字コードに合わせて"UTF-16"や"Shift_JIS"、"EUC"などを記述することができます。この属性は省略することができます。その場合はUTF-8あるいはUTF-16となります。

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>

3つ目の属性には、外部の文書構造を定義したファイルを使用していないかどうかを指定しています。使用していない場合は"yes"、使用している場合は"no"となります。この属性は省略することが可能です。その場合は"no"とみなされます。

2つ目と3つ目の属性は省略しても差し支えありません。そのためチュートリアルの1行目は簡潔に次のように書くことができるでしょう。

<?xml version="1.0" ?>

3つ目の属性で外部の定義ファイルを使用しているとあったので、次にその定義ファイルを指定します。

2行目:文書構造の定義をする行

<!DOCTYPE score-partwise PUBLIC
    "-//Recordare//DTD MusicXML 3.0 Partwise//EN"
    "http://www.musicxml.org/dtds/partwise.dtd">

※ 見やすさのために途中で改行していますが、上記は1行と数えます。

この文書型定義のことをDTDと呼びます。チュートリアルによれば参照されているURLは単なる目安とされています。ほとんどのアプリケーションでは、MusicXMLを読み込むたびにオンライン上のDTDファイルを取得することはないでしょう。

XMLの定義ファイルとしてDTDを採用するケースは少なくなっています。とはいえ現状は、この行をきちんと明記するのは親切なことです。使用している定義ファイルのありかを明示していることになるからです。

DTDにはDTD独自の構造があるため、少し戸惑うかもしれません。もう少しこの行を詳しく見てみましょう。

<!DOCTYPE ... >

DTDはDOCTYPE宣言によって定義されます。この内部に定義を直接書くことも可能です。また内部に書きつつ、外部のファイルを指定することも可能です。外部ファイルを指定する方法は2つあります。どちらも外部ファイルを参照する点での役割は同じです。

<!DOCTYPE score-partwise ... >

DOCTYPEで最初に記述するのがルート要素です。ルート要素とは最上位の要素のことです。それはHTML文書のhtml要素に当たります。MusicXMLでのルート要素はscore-patrwiseです。ですからMusicXMLの最上位要素がscore-partwiseになることがここから分かります。

<!DOCTYPE score-partwise PUBLIC ... 

DTDの定義に外部ファイルを指定する2つの方法があります。1つがSYSTEMを用いる方法です。もう1つがPUBLICを用いる方法です。PUBLICは、ISOや標準化団体などで利用することを目的として開発されたDTDを特定する場合に用いられます。MusicXMLはまさにそれにあたるので、PUBLICを使用するのはふさわしいことと言えます。

<!DOCTYPE score-partwise PUBLIC
  "-//Recordare//DTD MusicXML 3.0 Partwise//EN" ... >

実は"…"内に書かれる文に定まったルールはありません。使用するユーザ間で合意が取れていれば良しとされます。一般に次のような形式が使用されるようです。

"(+//または-//) 組織名/出版番号 (説明文) // データの種類 (説明文) // 言語コード "

参考:http://www.techscore.com/tech/XML/Basic/Basic3/3_3.html/

+// が正式な機関に登録されていることを表すのに対し、-// は正式に登録せず使用するユーザ間で合意が取れていることを示しています。ここからこのDTDについての基本的な情報が分かります。

  • 正式な機関に未登録、ユーザ間で合意が取れている
  • 組織名:Recordare
  • データの種類:DTD MusicXML 3.0 Partwise
  • 言語コード:EN

それでは、DTDの宣言部に戻って最後の部分を見てみましょう。

<!DOCTYPE score-partwise PUBLIC
    "-//Recordare//DTD MusicXML 3.0 Partwise//EN"
    "http://www.musicxml.org/dtds/partwise.dtd">

最後の"…"内には、定義ファイルのURLを記入します。これで2行目を調べることができました。

MusicXMLの要素

3行目:ルート要素にはMusicXMLのバージョンを記述する

<score-partwise version="3.0">

MusicXMLのルート要素です。これから出てくる要素はすべて、この要素の子要素になります。チュートリアルではオプションにも言及されていますが詳しくは説明されていません。

バージョン属性に注目してください。これはMusicXMLが3.0のバージョンで書かれていることを示しています。もしバージョン1.0で書いている場合はこの属性を記述する必要はありません。

4〜8行目:パートの一覧を記述する

  <part-list>
    <score-part id="P1">
      <part-name>Part 1</part-name>
    </score-part>
  </part-list>

score-partwiseかscore-timewiseに関わらず、MusicXMLのヘッダ部分に、スコアに含まれる楽曲パートの一覧を記述します。上記は最小構成のリストです。パートは1つで、score-partの必須属性ID、および必須の要素part-nameが記述されています。

9行目:パートの始まりを記述する

  <part id="P1">

1つ目のパートの始まりを記述します。そして同時にこの例では唯一のパートです。id属性には先ほどヘッダに記述したid属性と同じものを記述します。

10行目:1小節目の始まりを記述する

    <measure number="1">

パートの1小節目の始まりを記述します。

11行目:ノートなどの情報を含める

      <attributes>

attributes要素は、あとに続くノート(発音)や音楽データを解釈するのために必要な情報を含みます。

12行目:division要素とduration要素

        <divisions>1</divisions>

divisionとは分割のことです。MusicXMLの各ノートは、duration要素を持っています。divisions要素は、duration要素を四分音符につき分割した数です。この楽譜は全音符1つしかないので、四分音符で分割する必要はありません。それでdivisions要素は1となります。音符は普通、分数を使って表現されます。例えば4分、あるいは8分という風に表現します。MusicXMLでも同じです。分母を途中で変更することはほとんどないので、分子のみを個々のノートと関連付けます。これはMIDIで用いられる音符の継続時間を表すための方法と似ています。

13〜15行目:調号を設定する

        <key>
          <fifths>0</fifths>
        </key>

key要素は調号を表すために用いられます。フラットやシャープのないハ長調のキーにするには、fifths要素に0を指定します。Dキーにするにはfifths要素に2を指定できます。ヘ長調の曲を作るにはfifth要素に-1を設定します。この要素は五度圏(Circle of Fifth)という言葉から取られています。五度とは、和音の左端の音から右端までを数えると5つになることに由来しています。この1つの要素でシャープやフラットを持った調号を表現することができます。

参考:http://www.yk.rim.or.jp/~kamide/music/theory/

16〜19行目:拍子を設定する

        <time>
          <beats>4</beats>
          <beat-type>4</beat-type>
        </time>

time要素は拍子を表しています。2つ子要素のbeatとbeat-typeはそれぞれ、拍子の分子と分母です。

20〜23行目:音部記号(ト音記号)を設定する

        <clef>
          <sign>G</sign>
          <line>2</line>
        </clef><

MusicXMLはト音記号などの音部記号をはじめ、様々な音部記号を記述できます。その多くは今日では使われていないものです。一般的なト音記号は、譜表の2行目の高音部記号(G)で表されます。(譜表の下から2本目がGです)

24,25行目:ノートの開始

      </attributes>
      <note>

atributes要素が完了しました。最初のノートを開始する準備が完了しました。

26〜29行目:音の高さを設定する

        <pitch>
          <step>C</step>
          <octave>4</octave>
        </pitch>

pitch要素はstepとoctave要素を含んでいる必要があります。オプションのalter要素で、シャープやフラットを表現できます。これらの要素は音を表します。シャープやフラットは調子記号のものであっても、使用されるならば常にalter要素が含まれる必要があります。この楽譜ではalter要素は含みません。4オクターブのCは、オクターブ中央のドの音で始まることを示しています。

30行目:音の長さを設定する

       <duration>4</duration>

divisionsの値が1、つまり四分音符につき1つの分割であるので、durationは4、つまり四分音符4つの長さになります。

31行目:音符の表記を設定する

        <type>whole</type>

type要素から全音符と表記されていることがわかります。これを見れば音の長さを知ることができます。とはいえ、この表記とは別に数値でのデータがあるなら、アプリケーションは効率的に処理することができるでしょう。いずれにしても、表記と演奏が一致しているとは限りません。例えば同じ8部音符を使うとしても、音の長さ微妙な長さはクラシックとジャズでは違うでしょう。楽譜上の表記と演奏データを上手に内包するために、このような要素が存在しています。

32〜35行目:各要素の完了

      </note>
    </measure>
  </part>
</score-partwise>

各要素が完了しました。それでは、ここまで見てきたサンプルをつなげてみましょう。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE score-partwise PUBLIC
    "-//Recordare//DTD MusicXML 3.0 Partwise//EN"
    "http://www.musicxml.org/dtds/partwise.dtd">
<score-partwise version="3.0">
  <part-list>
    <score-part id="P1">
      <part-name>Music</part-name>
    </score-part>
  </part-list>
  <part id="P1">
    <measure number="1">
      <attributes>
        <divisions>1</divisions>
        <key>
          <fifths>0</fifths>
        </key>
        <time>
          <beats>4</beats>
          <beat-type>4</beat-type>
        </time>
        <clef>
          <sign>G</sign>
          <line>2</line>
        </clef>
      </attributes>
      <note>
        <pitch>
          <step>C</step>
          <octave>4</octave>
        </pitch>
        <duration>4</duration>
        <type>whole</type>
      </note>
    </measure>
  </part>
</score-partwise>

まとめ

MusicXMLのチュートリアルに基づいた解説はいかがでしたか。もしこのまま記譜を続けていきたいと思われるなら、note要素を書き加えることによってそうできます。

XMLは人の理解できる文章で書かれたデータ形式です。また操作するのにも効率の良いデータ形式です。MusicXMLでは、そのような長所と楽譜を結び合わせることができます。多くの楽譜がMusicXMLで書かれるなら、楽譜を効率的に管理したり研究したりするのに役立つことでしょう。