前回の続きです。
C言語でスーファミ用のソフト開発(4)スプライトの表示 - takuya matsubara blog
今回はスーパーファミコンで効果音を鳴らします。
効果音を鳴らすには音源のファイルが必要です。PVSnesLibが対応しているファイルの形式は「it」または「brr」です。ここではitファイルにします。
まずは、音源を用意します。オリジナル音源にしたいので、スマホで動画を撮影します。
爆発時の「ドカーン」という音が欲しかったので、ビニール袋を膨らませてから割ってみました。結果、「バン」と鳴るだけの短い音になってしまいました。
コインを取った時の「チャリーン」という音も欲しくて、実物のお金を鳴らしたら「ジャリッ」というだけの音になりました。
難しいです。

スプレー缶を叩いたり、ホッチキスを鳴らしてみたり。いろいろ試行錯誤しながら5種類の音を撮ってみました。

撮影した動画(MOVファイル)を動画編集ソフトの「AVIUTL」で開きます。そして、使いたい部分だけを切り取って、「WAV出力」をメニュー選択して、WAVファイルで保存します。
設定は「32kHz」「16ビット」「モノラル」にしました。容量の都合により、あまり長い音は扱うことができません。場合によっては、音質を犠牲にして周波数を落とした方が良いです。周波数は4kHz、8kHz、16kHzにも対応していると思います。

「OpenMPT」という音楽ソフトを使って、itファイルを作成します。こういうソフトを「トラッカー」と呼ぶみたいです。サンプルの「effect」にある「effectssfx.it」というファイルをダウンロードして、音だけ入れ替えることにします。
https://github.com/alekmaul/pvsneslib/tree/master/snes-examples/audio/effects

「OpenMPT」を起動して、ツリーから「Samples」を選択します。サンプル番号を選択したら、インポートのボタンをクリックして、先ほど作ったwavファイルを読み込みます。ノーマライズのボタンをクリックすると、波形の振幅が最適化されます。

5種類の音を読み込みました。全部で88KBくらいあります。

自作ゲーム「SUPER JUMP GAME」の「makefile」です。書式は「effect」をコピペしました。
「effectssfx.it」は返還前のファイル名です。
「soundbank」は変換後のファイル名です(拡張子は不要)。
「-b 5」という設定は、バンク5という意味らしいです。

ビルドすると、「Compression」がどうのというエラーが出てしまいました。ググったら、FAQに対策方法が書いてありました。OpenMPT側の設定を変更する必要があります。
Community FAQ · alekmaul/pvsneslib Wiki · GitHub

itファイルを変換中の様子です。「32204 bytes free」と書いてあります。たぶん、SPC700のRAMの空き容量だと思います。

itファイルを変換すると、「soundbank.h」「soundbank.asm」「soundbank.bnk」という3つのファイルが生成されます。これが音のデータです。88KBくらいあったデータが26KBくらいに圧縮されました。
鳴らすために必要な処理は次の通りです。
・spcBoot関数でサウンド機能の初期化する。
・spcSetBank関数で効果音のデータを設定する。
・spcLoadEffect関数で効果音のデータをSPC700に読み込む。(楽曲の場合はspcLoad関数)
・ spcEffect関数で音を鳴らす。(楽曲の場合はspcPlay関数)
・メインループで spcProcess関数を毎回呼び出す。
あとは公式のWikiを参照してください。
https://github.com/alekmaul/pvsneslib/wiki/Sounds-and-Musics
ゲームの実行中の様子です。
効果音を鳴らすことに成功しました。

ROMイメージの中身はこんな感じです。まだ容量に余裕があります。
音のデータ(soundbank)が離れた場所に存在します。makefileで設定したバンク5ってこの場所なのでしょうか。
複数のsoundbankを置くこともできるようです。