2026年5月18日月曜日

MIDI を音声ファイル (WAV, MP3, AAC, FLAC, Opus) に変換するアプリ midi2audio を作った

MIDI を音声ファイル (WAV, MP3, AAC, FLAC, Opus) に変換するアプリ midi2audio を作りました。 あると嬉しいなあとは思っていたのですが、実装が追いついておらず、なかなか作れていませんでした。 Midy の基本実装がだいぶ完成に近づき、 GM2 の推奨実装は完全対応し、再生クオリティもほぼ完璧になりました。 ようやく色々なものを作れるフェーズに入ってきました。 動作の仕組みは簡単で、Midy で MIDI を AudioBuffer に変換し、 Mediabunny で音声ファイルにエンコードします。

音声ファイルへのエンコードは 2025年前までは ffmpeg.wasm を使うくらいしか方法がありませんでした。 Mediabunny が出てきたことによって、 手軽に WAV, MP3, AAC, FLAC, Opus へ変換できるようになりました。 ffmpeg.wasm はファイルサイズが非常に大きく速度的にも課題がありましたが、 Mediabunny なら非常に軽量かつ高速に動作します。 ちなみに Vorbis への変換はまだ未対応のようなので、Mediabunny のサポートを確認し次第、追加します。



Midy の動作速度は JavaScript の最速実装に限りなく近づいていると思います。 実装の根源は Wasm はネイティブの 1/2 くらいしか出ない現実にあります。 DSP や Ogg デコーダーのベンチマークもしてみましたが、やはりこの数値になります。 つまり JavaScript / Wasm での音声リアルタイム処理はネイティブに勝てないので、 ネイティブ処理を増やすことが MIDI 再生の肝だと思っており、 その構成で可能限りパフォーマンスが出るように設計しました。 またキャッシュできるものは徹底的にキャッシュを利用するようにしています。 典型的なキャッシュはすべて実装したので、 ユーザーが意識してオプション選択をすると、非常に高速な MIDI 再生ができます。 再生クオリティが高まった結果、キャッシュ実装が完璧になってきた結果として、 音声変換にも利用できるようになりました。音声変換はキャッシュの応用です。

Midy は基本的な実装がほぼ完成したので、あとは応用的な実装です。 キャッシュ周りの使い勝手を良くしたり、MIDI 2.0、GS、XG あたりの実装を加えたり、誰も使ってなさそうな高度な機能の対応などなど。 現状の実装で困るケースはほぼないので、今後は応用アプリを重点的に作っていきます。

0 件のコメント: