
楽譜からライブコードへ: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コンバーターを使うのは簡単だ:
- エディタで任意のセッションを開く
- ツールバーの三点メニューをクリック
- MusicXMLをアップロード を選択
.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の基本をご覧ください。