Vol. 03 · MMXXVI Akira Machimura · 町村 彰 machworks.dev
Works ·MVP ·PDF → MusicXML 変換ツール
<works · pdf-to-musicxml />

PDF → MusicXML 変換ツール

for choral rehearsal rooms

OCR と楽譜記号認識を組み合わせた、合唱練習のための変換パイプライン。oemer + music21 で構築中。

Spec
STATUS MVP PERIOD2025-11 → 2026-05 VERSIONv0.4.1 LICENSEMIT (planned) AI USE ✍︎ + ✱ Co-written
Python 3.12oemerMusic21TyperFastAPIOpenCVMusicXMLDockerGitHub ActionsClaude Code

ここでは、PDF → MusicXML 変換ツール v0.4 の設計と実装判断を残します。 合唱の練習現場で「紙の楽譜を、そのまま道具として扱えない」という課題に対する、自前パイプラインの記録です。

A なぜ作ったか

合唱の練習現場では、紙の楽譜のスキャン PDF が日常的に共有されます。 ところが、個別パートの抽出、伴奏を抜いた練習音源の生成、移調による声の負荷調整 —— これらを「PDF のまま」やるのは現実的ではありません。

既存の楽譜認識ツールは精度が出ない箇所、特に 歌詞テキストと音符の対応付け、繰り返し記号、フェルマータの認識で詰まります。 合唱の現場が必要としている粒度に届かない、というのが出発点でした。

B 何ができるか

C アーキテクチャ

入力 PDF は、まず <pre-process /> 段で傾き補正・五線抽出を行い、 <oemer /> へ渡します。OMR の出力は粗いので、 歌詞アライナと反復記号ソルバを通して、 最終的に <music21 /> の内部表現へ正規化します。

ここから先は、MusicXML と MIDI の二系統に分岐するだけです。 「正規化された中間表現を作る」ことが、合唱の現場が必要とする操作(移調、抽出、繰り返し展開)を後付け可能にしました。

1def convert(pdf_path: Path) -> Score:
2    page = preprocess(pdf_path)
3    raw  = oemer.recognize(page)
4    aligned = lyric.align(raw)
5    score   = music21.from_omr(aligned)
6    return score.resolve_repeats()

D AI の使いどころ

E 得たもの・失ったもの

F 次にやること

  1. 多声・分割部の認識精度を上げる(特にバッハのモテット規模)
  2. 歌詞のドイツ語・ラテン語の発音辞書を統合し、IPA 出力に対応
  3. Web UI を Astro Island として /works/pdf-to-musicxml に埋め込み試用版を公開