楽譜からライブコードへ:MusicXMLパイプライン
2026年4月5日Camel Tech チームmusicxmlstrudeltutorial

楽譜からライブコードへ:MusicXMLパイプライン

なぜMusicXMLなのか

ミュージシャンはデジタル形式の楽譜を何十年分も持っている。MusicXMLは、Finale、Sibelius、MuseScoreなど数十のアプリケーション間で楽譜データを交換するためのオープンスタンダードだ。私たちは従来の記譜法とライブコーディングの橋渡しをしたかった — ミュージシャンが既存のスコアをStrudelHubに持ち込み、Strudelパターンとして再生できるようにする。

自分たちに課した制約:すべてブラウザ内で実行する。 サーバーサイド処理なし、バックエンドへのファイルアップロードなし、外部変換サービスなし。楽譜データがユーザーのマシンから出ることはない。

5段階パイプライン

コンバーターは5つの純粋な変換ステージで構成されるパイプラインだ。各ステージは型付きの入力を受け取り、型付きの出力を生成し、独立してテストできる。

ステージ1:パース

最初のステージはファイルの読み込みを処理する。MusicXMLには2つの形式がある:

  • 非圧縮 (.xml または .musicxml) — プレーンなXMLテキスト
  • 圧縮 (.mxl) — XMLファイルとオプションのメタデータを含むZIPアーカイブ

XMLパースにはブラウザネイティブの DOMParser を、.mxl の展開にはJSZipを使用している。出力はパート、小節、音符、属性の構造化表現 — XML DOMから型付きTypeScriptオブジェクトに抽出されたものだ。

ステージ2:正規化

楽譜にはStrudelのパターンモデルに直接マッピングできない構造的な複雑さが多い。正規化ステージはこれをフラット化する:

  • リピート — 小節線リピートを実際の小節順序に展開する
  • ヴォルタ(1番括弧/2番括弧)— 各括弧を展開された順序の正しい位置に配置する
  • D.C./D.S./Coda ナビゲーション — これらのジャンプ指示を線形の小節順序に解決する
  • 声部分割 — 複数の声部を持つ小節を別々のトラックに分割する

正規化後のデータは、声部ごとのシンプルな小節の線形シーケンス — ジャンプなし、リピートなし、構造的な曖昧さなし。

ステージ3:量子化

Strudelはパターンスロットで動作し、従来の音符の長さではない。4/4拍子での4分音符は4つのスロットのうち1つを占める。8分音符はスロットの半分。量子化ステージは従来の長さをStrudelのスロットベースシステムに変換する。

ここで計算が面白くなる。MusicXMLは、小節の総分割数に対する分数として長さを表現する。4分音符あたり24分割の4/4拍子の小節は合計96分割になる。72分割の付点2分音符は4スロット中3つになる。量子化器はこれらの分数を最も近いStrudel表現にマッピングし、連符や変拍子も処理する。

ステージ4:タイ

タイで結ばれた音符 — 2つの音符が接続されてより長い持続時間を作る — には特別な処理が必要だ。小節をまたぐ2分音符+4分音符のタイは、2つの別々のアタックではなく、1つの持続音にならなければならない。

タイ解決ステージは小節内と小節間の両方でタイ音符を結合する。量子化された出力を走査し、タイの開始/終了マーカーを検出し、持続時間を結合する。リピート境界をまたぐタイや複数声部内のタイなどのエッジケースも処理する。

ステージ5:出力

最終ステージはStrudelのJavaScriptコードを生成する。量子化・タイ解決されたデータを受け取り、arrange() タイムライン関数を使用する有効なStrudelプログラムを出力する。

コード生成における主要な決定事項:

  • General MIDIマッピング — MusicXMLの楽器名をStrudelのGMサウンドバンクにマッピングする。「Violin」パートは s("gm_violin") に、「Piano」パートは s("gm_acoustic_grand_piano") になる。
  • マルチパートアレンジメント — 各声部はトップレベルの arrange() 呼び出し内の stack() エントリとなり、すべてのパートが同時に再生される。
  • 可読性の高い出力 — 生成コードは意味のある変数名、1行1パターン、小節番号を示すコメントを使用する。実行されるだけでなく、読んで編集されることを意図している。

使い方

StrudelHubでMusicXMLコンバーターを使うのは簡単だ:

  1. エディタで任意のセッションを開く
  2. ツールバーの三点メニューをクリック
  3. MusicXMLをアップロード を選択
  4. .xml.musicxml、または .mxl ファイルを選択

変換されたStrudelコードが現在のエディタ内容を置き換える。再生を押せば、楽譜がStrudelパターンとして鳴り始める。そこからコードを編集できる — 楽器の変更、エフェクトの追加、リズムの修正 — そしてスコアがライブコーディングの世界でどう聴こえるかを探求しよう。

制限事項とトレードオフ

完璧な変換は存在しない。既知の制限事項は以下の通り:

  • ダイナミクスとエクスプレッション — MusicXMLはダイナミクス(pp、ff、クレッシェンド)、アーティキュレーション(スタッカート、レガート)、エクスプレッションマークをキャプチャする。現在のコンバーターは音高と長さをマッピングするが、ダイナミクスマーキングをStrudelのゲインやベロシティコントロールに変換する機能は未実装。ロードマップに載っている。
  • 複雑な連符 — ネストされた連符(3連符の中の3連符)は最も近いスロット境界に量子化され、わずかなリズムの近似が生じる場合がある。
  • パーカッション記譜 — MusicXMLの無音程パーカッションは異なる記譜モデルを使用する。標準的なドラムキット楽器はマッピングされるが、カスタムパーカッションセットアップは正しく変換されない場合がある。
  • 装飾音 — 現在は省略されている。Strudelにはオーナメントのメカニズムがあるが、MusicXMLの装飾音タイプからStrudelパターンへのマッピングは自明ではない。

今後の展望

コンバーターの改善をいくつかの分野で進めている:

  • ダイナミクスサポート — MusicXMLのダイナミクスをStrudelの .gain().velocity() モディファイアにマッピング
  • 歌詞 — ボーカルパートから歌詞を抽出し、Strudelのコメントまたはメタデータとして含める
  • ラウンドトリップエクスポート — Strudelパターンを逆にMusicXMLに変換し、従来の記譜ソフトウェアと共有する

うまく変換できないMusicXMLファイルがあれば、ぜひ教えてほしい。コンバーターはオープンなクライアントサイドコードベースの一部であり、エッジケースはパイプラインの改善に役立つ。

詳細はMusicXMLインポートのドキュメントを、変換先の言語についてはStrudelの基本をご覧ください。