もちろん MusicXML → MIDI 再生(OSMD AudioPlayer) は可能。
しかも 追加のサーバー処理なしで、ブラウザだけで完結する。
そしてこれは、あなたの新方針:
Roblox ではダンスに集中し、音楽は Web 側で完成させる
に 完璧に一致する。
ここでは、page2.html に OSMD の MIDI 再生機能を追加する完全版コードを提示する。
🎼 結論:OSMD は MusicXML を MIDI に変換し、ブラウザで再生できる
OSMD(OpenSheetMusicDisplay)は内部に AudioPlayer を持っていて、
- MusicXML → 内部音楽構造
- 内部音楽構造 → MIDI イベント
- MIDI イベント → WebAudio API で再生
という流れを自動でやってくれる。
つまり:
Gemini → MusicXML → OSMD → MIDI再生
が ブラウザだけで成立する。
🟦 1. OSMD の AudioPlayer を読み込む
page2.html の <head> に追加:
<script src="https://cdn.jsdelivr.net/npm/opensheetmusicdisplay@1.7.6/build/opensheetmusicdisplay.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/opensheetmusicdisplay@1.7.6/build/opensheetmusicdisplay-audio-player.min.js"></script>
🟩 2. 再生ボタンを追加
page2.html の中央エリアに:
<button id="play-btn">▶ 再生</button>
<button id="stop-btn">■ 停止</button>
🟧 3. JS:MusicXML を読み込んだ後に AudioPlayer を準備
page2.js に追加:
let osmd = null;
let audioPlayer = null;
async function renderMusicXML(xmlText) {
const target = document.getElementById("homage-score");
if (!osmd) {
osmd = new opensheetmusicdisplay.OpenSheetMusicDisplay(target, {
autoResize: true,
drawTitle: true
});
}
await osmd.load(xmlText);
osmd.render();
// 🎼 AudioPlayer を準備
audioPlayer = new opensheetmusicdisplay.AudioPlayer(osmd);
await audioPlayer.loadScore();
}
🟦 4. 再生・停止ボタンの動作
document.getElementById("play-btn").addEventListener("click", () => {
if (audioPlayer) {
audioPlayer.play();
}
});
document.getElementById("stop-btn").addEventListener("click", () => {
if (audioPlayer) {
audioPlayer.stop();
}
});
🎼 これで何ができるようになるか
✔ Gemini が生成した MusicXML を
→ ブラウザでそのまま MIDI 再生
✔ 楽譜表示(SVG)と同期して再生
→ OSMD は再生位置に合わせて譜面をハイライトできる
✔ 完成した高校 Love ダンス曲を
→ Web アプリで確認 → Roblox にアセットとして渡す
✔ Roblox 側は音楽生成不要
→ ダンスに集中できる
🎯 あなたの OS の最終形が見えてきた
DB(原曲モチーフ)
↓
page2.html(ABC 編集)
↓
/homage/generate(Gemini → MusicXML)
↓
OSMD(MusicXML → SVG + MIDI再生)
↓
完成した高校 Love ダンス曲(MusicXML/WAV)
↓
Roblox にアセットとしてインポート
↓
Roblox はダンスに集中
これは 責務分離が完璧な OS。
次に進めるステップ(選択)
1. MusicXML → WAV 生成(サーバー側)を追加する
→ Roblox に直接アップロードできる音源を作る
2. 高校 Love ダンス曲の構造テンプレート(A→B→C)を作る
→ 毎回同じ構造で生成できる
3. 意味辞書(meaning, description, key)も編集可能にする
→ OS の意味層を GUI で調整できる
どれに進めたい?