本記事は生成AIと共同で執筆しています。事実関係は可能な範囲で公式ドキュメント等と照合していますが、誤りが含まれている可能性があります。重要な判断を行う前にご自身でも一次情報をご確認ください。

結論(先出し)

MusicXML から MEI への変換は機械的にできます。 もっとも手軽なのは Verovio を使う方法で、loadData() で MusicXML を読み込み getMEI() で MEI を書き出すだけです。CLI・Python・Node のいずれからでも同じ処理を呼べます。

ただし注意点が一つあります。この変換は「バイト単位で等価な変換」ではなく、楽譜の意味内容を MEI として再符号化する処理です。音符・小節・歌詞・書誌メタデータはよく保たれますが、xml:id は振り直され、レイアウト情報は再解釈されます。可逆変換(round-trip で元に戻る)ではない点を理解して使うのが大事です。

この記事では、CC0 で公開されている実データ(シューベルト「野ばら」)を題材に、実際に変換を走らせて何がどう保たれるかを確認します。

そもそも MusicXML と MEI は何が違うのか

どちらも「楽譜を XML で表す」フォーマットですが、出自と狙いが違います。

  • MusicXML — 記譜ソフト間の交換フォーマット。MuseScore / Finale / Sibelius / Dorico などがいずれも入出力に対応し(Sibelius は歴史的に一部バージョンで Dolet プラグイン併用)、事実上の業界標準。「この音符をどう印刷するか」に強い。
  • MEI(Music Encoding Initiative) — 学術的な音楽資料の符号化フォーマット。図書館員・音楽学者・技術者のコミュニティが策定。異版の併記(<app>/<rdg>)、原資料との対応、批判校訂といった 人文学的な記述に強く、TEI(テキスト符号化)と設計思想を共有する。

つまり「記譜ソフトで作った譜面(MusicXML)を、研究データ基盤に載せるために MEI へ移す」という流れが典型的な変換の動機になります。楽譜とテキスト(歌詞・校訂注)を一体で扱いたいとき、MEI に寄せる意味が出てきます。

変換パイプライン。記譜ソフト(MuseScore 等)が MusicXML(.mxl/.xml)を書き出し、それを Verovio が loadData→getMEI で MEI に機械変換する。できた MEI は Verovio での SVG 描画と、異版・校訂・IIIF 連携のような研究データ基盤の双方に使える

つまり「記譜ソフトで作った譜面(MusicXML)を Verovio で MEI に変換し、描画にも研究記述にも使う」という流れです。

一番手軽な方法: Verovio

Verovio は RISM Digital Center が開発する MEI 描画ライブラリですが、各種フォーマットから MEI への変換器としても使えます。入力として MusicXML(圧縮 .mxl を含む)・Humdrum・ABC・PAE・EsAC などを受け付け、内部モデルを経由して MEI を出力できます。

呼び出し口は複数あります。

  • CLI: verovio -t mei input.musicxml -o output.mei
  • Python: pip install verovio(環境によってはビルド済み wheel が要る)
  • Node: npm install verovio(WASM ビルドなのでネイティブコンパイル不要)

今回は環境非依存で入る Node(WASM)版を使いました。

実際に変換してみる

題材は OpenScore Lieder Corpus(CC0)から、シューベルト「野ばら(Heidenröslein)」D.257。歌曲なので 楽譜+歌詞が入っており、変換でテキストがどう保たれるかを見るのに向いています。

1. 素材を取得する

OpenScore の GitHub ミラーには、原本の MuseScore ファイル(.mscz)と、そこから生成された圧縮 MusicXML(.mxl)が併置されています。今回は .mxl を使います。.mxl は中身が ZIP なので、まず本体の XML を取り出します。

curl -sL "https://raw.githubusercontent.com/OpenScore/Lieder/main/scores/Schubert,_Franz/Op.3/3_Heidenr%C3%B6slein,_D.257/lc30321236.mxl" -o heidenroslein.mxl

# .mxl は ZIP。META-INF/container.xml が本体(score.xml)を指す
unzip -o heidenroslein.mxl

.mxl の中身はこうなっています。

META-INF/container.xml   ← 本体ファイルの場所(full-path="score.xml")を記述
score.xml                ← MusicXML 本体(score-partwise)

2. Verovio で MEI に変換する

Node(WASM)で書き出す最小スクリプトです。.mxl を展開せず直接読ませることも可能ですが、ここでは展開済みの score.xml を渡しています。

// convert.mjs
import fs from 'node:fs'
import createVerovioModule from 'verovio/wasm'
import { VerovioToolkit } from 'verovio/esm'

const xml = fs.readFileSync('score.xml', 'utf8')

const mod = await createVerovioModule()
const tk = new VerovioToolkit(mod)
console.log('verovio version:', tk.getVersion())

tk.loadData(xml)            // MusicXML を自動判別して読み込み
const mei = tk.getMEI()     // MEI 文字列を書き出し
fs.writeFileSync('heidenroslein.mei', mei)
node convert.mjs

実行結果(手元での実測):

verovio version: 6.2.0-43f8060
loadData ok: 1
pages: 1
MEI bytes: 97077
meiversion: 6.0-dev
measures: 16 notes: 196 syllables(lyrics): 138

MusicXML(score-partwise)を読み込み、16 小節・196 音符・歌詞 138 音節を含む MEI が出力されました。CLI 派なら 1 行です。

verovio -t mei score.xml -o heidenroslein.mei

3. 出力された MEI を確認する

先頭部分(meiHead)には、MusicXML 側の書誌情報がそのまま引き継がれています。タイトル・作曲者・作詞者(ゲーテ)・CC0 の配布元まで残っているのが分かります。

<mei xmlns="http://www.music-encoding.org/ns/mei" meiversion="6.0-dev">
  <meiHead>
    <fileDesc>
      <titleStmt>
        <title>Heidenröslein, D.257</title>
        <respStmt>
          <persName role="composer">Franz Schubert</persName>
          <persName role="lyricist">Johann Wolfgang von Goethe</persName>
        </respStmt>
      </titleStmt>
      <pubStmt>
        <availability>
          <distributor>OpenScore (CC0)</distributor>
        </availability>
      </pubStmt>
    </fileDesc>
    ...

歌詞は音符に紐づく <syl>(音節)として保持され、単語内の位置(wordpos)や連結(con)まで表現されています。楽譜とテキストが 1 つの文書の中で結びついたまま残るのが、MEI に寄せる利点です。

<syl con="d" wordpos="i">Kna</syl>   <!-- 単語の頭 -->
<syl con="s" wordpos="t">be</syl>    <!-- 単語の末尾 -->

描画するとこの音節が音符の直下に並びます(下は歌声パートと歌詞の部分。"Sah ein Knab' ein Rös-lein…" と、単語がハイフンで音節分割されている)。

楽譜の歌声パートの拡大。各音符の下に3番までのドイツ語歌詞が音節単位(Sah / ein / Knab' / Rös - lein …)で割り付けられている

変換した MEI をそのまま Verovio で描画(renderToSVG())すると、次のように楽譜になります。声楽+ピアノ、3 番までの歌詞が音符に揃って付いており、MusicXML から機械変換した MEI がそのまま楽譜として成立していることが分かります。

Verovio が描画したシューベルト「野ばら」D.257 の楽譜。上段が歌声パート、下段がピアノ。音符の下に3番までのドイツ語歌詞(Sah ein Knab'…)が音節単位で並ぶ

変換で「保たれるもの」と「変わるもの」

変換で保たれるものと変わるものの対比。保たれる(左・緑): 音符と小節、歌詞(syl と単語内位置)、書誌メタデータ。変わる/注意(右・赤): xml:id は振り直される、レイアウトは再解釈される、可逆ではなく元の XML には戻らない

同じ「野ばら」の MusicXML(展開後)と MEI を比べた実測です。

項目MusicXML(score.xml)MEI(heidenroslein.mei)
ファイルサイズ111,496 bytes97,077 bytes
楽譜構造(小節・音符)16 小節16 小節・196 音符
歌詞<lyric> 139<syl> 138
書誌メタデータ保持<meiHead> に引き継ぎ

保たれるもの

  • 音楽の実体: 音高・音価・小節・声部といった楽譜そのもの
  • 歌詞: 音節分割・単語内位置を含めてほぼそのまま(139→138 の差は伸ばし音や休符上の扱いに由来する程度)
  • 書誌メタデータ: タイトル・作曲者・作詞者・ライセンス表記

変わる/注意すべきもの

  • xml:id は振り直される: 変換のたびに新しい ID が生成される。ID をキーに外部注釈(アノテーション)を貼っている場合は再マッピングが必要
  • レイアウトは再解釈される: 改行・改ページ・細かな配置は Verovio の記譜エンジンが解釈し直す。「元の印刷そっくり」を保証するものではない
  • スキーマのバージョン: 上の出力は meiversion="6.0-dev"(開発版スキーマ)だった。安定版(例: MEI 5.x)を前提とする受け手に渡すなら、バージョン指定や検証(jing 等)を挟むと安全
  • 可逆ではない: MusicXML→MEI→MusicXML で元の XML には戻らない。これは「意味の再符号化」であって「無損失の相互変換」ではない

この「変わる」性質は欠点ではなく、フォーマットの目的が違う以上、当然そうなるという理解が大切です。印刷の忠実な再現が欲しいなら MusicXML のまま扱い、研究記述を載せたいなら MEI に移す、と使い分けます。

Verovio 以外の変換手段

  • musicxml2mei(XSLT スタイルシート) — MEI コミュニティ(music-encoding/encoding-tools)が公開してきた古典的な変換器。Verovio 登場以前からある。ただし対象は最新でも MEI 3.0 止まり(現行は MEI 5.x)で、入力に timewise の MusicXML を要求する(一般的な score-partwise は事前変換が要る)。用途が合うか確認する
  • MuseScore — GUI/CLI で MusicXML を扱える。MEI 直接書き出しはバージョン・プラグイン依存
  • Verovio は MusicXML 以外に Humdrum(**kern)・ABC・PAE も MEI に変換できる(EsAC・MuseData は Humdrum 経由)。これらの形式の資料を持っているなら入口として便利

なお Verovio は MusicXML を「入力」専用で、MEI→MusicXML の書き出しには対応していません(出力は SVG・MEI・MIDI・Humdrum・PAE 等)。記譜ソフトへ戻したい場合は別ツール(MuseScore で MEI を読む等)が必要です。

実務上の注意: ライセンスは変換で消えない

技術的に変換できることと、そのデータを再配布してよいことは別問題です。変換しても原データの権利関係は引き継がれます。

  • 今回の OpenScore Lieder は CC0。改変も再配布も自由なので、MEI 化して自分の基盤に載せて公開できる
  • 一方、「オープンアクセス(自由に閲覧・ダウンロードできる)」でも、ライセンスが All Rights Reserved の学術データは少なくありません。この場合、フォーマットを MEI に変換しても再配布はできません(自分の環境で見る・研究に使うのは可、公開再配布は要許諾)

「公開されている=再利用してよい」ではないので、素材を選ぶ段階でライセンス(LICENSE ファイル、データ内の著作権レコード、サイトの利用規程)を必ず確認してください。再配布まで見据えるなら、CC0 / CC BY のようにライセンスが明示された素材を選ぶのが安全です。

まとめ

  • MusicXML → MEI は Verovio で機械的に変換できる(loadDatagetMEI、CLI/Python/Node 共通)
  • 音符・小節・歌詞・書誌メタデータはよく保たれる。歌曲なら楽譜とテキストが結びついたまま MEI に移せる
  • ただし xml:id の振り直し・レイアウトの再解釈・スキーマ版差があり、可逆変換ではない。目的(印刷再現か、研究記述か)でフォーマットを使い分ける
  • 変換してもライセンスは消えない。再配布まで考えるなら CC0/CC BY の素材を選ぶ

参考