| やりたいこと | 通常のAudioタグなど | @onjmin/dtm (playMML) |
|---|---|---|
| ズレないループ | 曲の終わりと始まりの間にプチッと遅延や隙間ができがち… | Web Audio APIのスケジューリングにより、ミリ秒単位で完全にシームレスなループを実現! |
| イントロ付きループ | ファイルを分割して、再生完了を監視してつなぐ複雑な処理が必要… | MML文字列を1本渡して、ループ開始位置(小節など)を指定するだけで自動ループ! |
| 音・ビート同期演出 | 毎フレーム再生時間をチェックする(ズレるし、重い)… | 「この小節/ステップを通ったらイベントを呼ぶ」と設定するだけで正確に発火! |
| 音量の共通管理 | ゲーム全体の音量コントロールに組み込みにくい… | ゲーム側の AudioContext や MasterGain を渡せるので、SEとBGMの音量バランスもバッチリ! |
ピアノロール画面(DAW)では音色データ(SoundFont)をロードしますが、playMML()
はデフォルトで**ロード不要の超軽量シンセ(矩形波など)**で発音します。これにより、「BGMのロード待ちでゲームの起動が遅れる」「通信量がかさむ」といった問題をクリアできます。
「もっと豪華な音で鳴らしたい!」という時は、以下のように onPlayNote や onPlayDrum フックを使って、自作のシンセやゲーム側のロード済みサウンドエンジンに簡単に差し替えられます。
playMML(mmlString, {
audioContext: myGameCtx,
loop: { start: { bar: 2 } }, // 2小節目からループ
onPlayNote: (e) => {
// 鳴らしたい音色エンジンをここに繋ぐだけ!
mySynth.trigger(e.pitch, e.volume, e.when, e.duration);
}
});