C言語でスーファミ用のソフト開発(5)効果音を鳴らす

前回の続きです。

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

 

www.youtube.com

ゲームの実行中の様子です。

効果音を鳴らすことに成功しました。

 

ROMイメージの中身はこんな感じです。まだ容量に余裕があります。

音のデータ(soundbank)が離れた場所に存在します。makefileで設定したバンク5ってこの場所なのでしょうか。

複数のsoundbankを置くこともできるようです。