本記事は生成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 に寄せる意味が出てきます。
つまり「記譜ソフトで作った譜面(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…" と、単語がハイフンで音節分割されている)。

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

変換で「保たれるもの」と「変わるもの」
同じ「野ばら」の MusicXML(展開後)と MEI を比べた実測です。
| 項目 | MusicXML(score.xml) | MEI(heidenroslein.mei) |
|---|---|---|
| ファイルサイズ | 111,496 bytes | 97,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 で機械的に変換できる(
loadData→getMEI、CLI/Python/Node 共通) - 音符・小節・歌詞・書誌メタデータはよく保たれる。歌曲なら楽譜とテキストが結びついたまま MEI に移せる
- ただし
xml:idの振り直し・レイアウトの再解釈・スキーマ版差があり、可逆変換ではない。目的(印刷再現か、研究記述か)でフォーマットを使い分ける - 変換してもライセンスは消えない。再配布まで考えるなら CC0/CC BY の素材を選ぶ
参考
- Verovio — MEI 描画・変換ライブラリ(RISM Digital Center)
- Reference book for Verovio — 入力フォーマット・API リファレンス
- Music Encoding Initiative — MEI 本体
- OpenScore Lieder Corpus(CC0) — 本記事の題材



コメント
…