あーさん日記

https://akkera102.sakura.ne.jp/gbadev/ の中の人

GB互換のサウンド(大雑把な説明)

wikiチュートリアルを一通り理解できた方限定です。ご注意ください。
GBAのGB互換サウンドがわからーんというプログラマーな方は、
以下のサイトにある「Sound Channel Demo」の
サンプルROMを起動してみてください。
英語は読まなくても大丈夫です。

The Audio Advance - Gameboy Advance Sound Resources

チャンネル1を例にすると、
REG_SOUND1CNT_L、REG_SOUND1CNT_H、REG_SOUND1CNT_Xに
それぞれ値を入れることができるようになっています。

f:id:akkera102:20151006201858p:plain

各メモリをビット単位で分解したのが下記の一覧です。
順番は大雑把に
・スイープ
・音の長さ
・dutyサイクル
エンベロープ
・周波数(音色)
・ループ有無

となっています。
なんのこっちゃ、と思うかもしれませんが(^^;
機能順で並べ替えると
・周波数(音色)
・音の長さ

・スイープ
・dutyサイクル
エンベロープ
・ループ有無

となり、下の4項目は周波数(音色)に味付けをする機能となっています。
詳しいことはGBATEKか、
GB音源仕様・レジスタマニュアルを参照してください。
注意点として、どうも音の長さよりエンベロープのInit volに値が入っていないと
鳴らないようです。

チャンネル2は1の機能劣化だったと思います。3,4は詳しくないので
解説できません。すみません。

さて、この機能を有機的に組み合わせて演奏させるのが
MMLとそのドライバーです。具体的には以下のようになります。

NO.88 mml_test

// main.c 120行目
EWRAM_CODE void StateReset()
{
    MmlSetStr(1, "T120O4L4 RRRRRRRR CDEFEDCR EFGAGFER CRCRCRCR L8CCDDEEFF L4EDCR");
    MmlSetStr(2, "T120O5L4 CDEFEDCR EFGAGFER CRCRCRCR L8CCDDEEFF L4EDCR RRRRRRRR");
    MmlSetStr(4, "T120L4 RBRBRBRB RBRBRBRB8B8 RBRBRBRB RBRBRBRB8B8 RB8B8RBRBBC"  );
    MmlPlay();

    State = STATE_PLAY;
}

サンプルでは「かえるの歌」を演奏しています。
さらにソースコードにテキスト保存するのではなく、windowsDOSプロンプト内で
バイナリデータを作り、演奏させたのがNO.96 adrvです。

この辺りは面倒かもしれませんが、ドキュメントを読むより
ソースコードを読んでしまった方が有益じゃないかと思っています。
音は聞いて覚える部分もありますし。

オリジナルで演奏したい場合はwindowsMMLアプリを使って作曲して、
それをGBAに移植するのがいいと思います。