マイコン工作実験日記

Microcontroller を用いての工作、実験記録

Doom Player -- VS1053b

2022-02-19 12:41:10 | DoomPlayer

Doom Playerでは、ゲーム音楽や効果音は全てVS1053bを経由して出力されています。前記事でも触れたように、効果音はSTM32H7A3のDACによりアナログ信号に変換され、これをVS1053bでゲームBGMとミキシングしています。

ゲーム音楽は、DOOMのWADファイル上では、MUS形式と呼ばれるDOOM独自の形式で保存されていますが、この形式はMIDIのフォーマット0(SMF0)のデータとその並びをちょっと変更した程度のものなので、MIDI SMF0に簡単に逐次的に変換することができます。つまり、MIDIのSMF0データを入力として受け付けてくれる音源チップがあれば、ゲーム音楽を再生できることになります。そのようなアマチュア向けチップとしては、どうやら次の2種類があるようです。

  1. VS1053b
    2000年代終わりにMP3プレーヤ製作用として大ヒット(?)した製品。MP3の特許が切れて激安中華製プレーヤが出現するとともにMP3プレーヤを製作する人も姿を消しましたが、今でもチップやボードは販売されているようです。MIDIシンセとしての音や機能には限りがあるので、MIDI機能を使っている人は多くはないように思われます。わたしも、MIDI機能が備わっていることには、今回の製作を始めるまで全く気づいていませんでした。
  2. SAM2695
    フランスのDream社のチップ。MIDI野郎で使われているチップ。今回、初めて知りました。Aliexpressとかではチップ買えそうですが、ちょっと入手難しそう。おまけに、0.4mmピッチのQFNなのでハンダ付けも苦労しそう。

SAM2695の方がいい音で鳴りそうなのですが、入手/工作も難しそうなので適当なモジュールが無いか探したところ、ようやく見つけたのが、こちらのボード。シールドサイズなのでちょっとデカい。SAM2695はI2Sでの出力もできないので、やはり今回はVS1053b を使うことにしました。レトロゲームにレトロチップの組み合わせも悪く無いだろうと思ったのですが、ちゃんと音が鳴るまで苦労しました。以下、その経過。

VS1053bでMIDIデータの生成をするためには、Real time MIDI機能というものを使います。VS1053bのGPIO0をL, GPIO1をHレベルに固定してブートすれば、何もしなくてもシリアルポートで受信したMIDIデータを再生してくれるという嬉しいバカチョン機能です。早速、SMF0に変換したDOOMの音楽データを流し込んでみたのですが、頻繁に再生が止まってしまい使い物になりません。長くても45秒くらいでおかしくなって、短い場合には、再生を始めて数秒で止まってしまいます。配線ミスかと思って確認したものの、問題はなく、同じような経験をしている人がいないか検索したところ、シンセアンプラグドさんが同じような経験をされており、どうやらチップの問題らしいことが判明。

VS1053bをMIDI音源として使っている人は少ないのか検索しても解決策が見つからないので、 本家のフォーラムを読み漁ったところ次のことがわかりました。

  • 元々のreal time midi機能は、入力のバッファが短く、ノート数が多いとバッファが溢れて音の再生が止まったり、鳴りっぱなしになったりすることがある。使い物にならん。
  • 解決策として、"Real-Time MIDI input" というアプリケーションが提供されているので、これをVS1053bのRAMにダウンロードして、ROMで提供されているオリジナルファームの代わりに走らせる。

と、まぁ、これだけのことだったのですが、データシートだけでなくアプルケーションノートはひと通り読まないといけないということを改めて、認識しました。VS1053bって、何種類もパッチ/アプリ/プラグインが用意されているなんて全く知らなかったので、ちょっとした驚きです。一番、驚いたことは、マイコン無しでVS1053bにSDカードをつなげてMP3プレーヤを作れるというアプリが用意されていること。VS1053bが内蔵するDSPをプログラムすることで、マイコン無しでもプレーヤが作れるようです。

最新のパッチは2020年になっており、長くサポートされているようです。今回使用したFeatherWingのチップのデートコードは2033になっていました。