GBA音源とは、任天堂のゲームボーイアドバンスに内蔵されている音源のことである。
GBA音源を意識した(あるいは実機の)音源を使って作成した音楽はチップチューン(chiptune)のジャンルに入る。
→Chiptune
実機で演奏する場合は市販のフラッシュカートリッジなどを使用し自作系のソフトウェアを利用するか、市販ゲームの音楽を改造して利用することになると思われる(未詳)。
音色・チャンネル数は以下のとおり。
音色 | チャンネル数 | ピコカキコでの表記 |
矩形波 (duty比:12.5% 25% 50% 75%) |
2 | @5@w1 /* 12.5% */ @5@w2 /* 25% */ @5@w4 /* 50% */ @5@w6 /* 75% */ |
波形メモリ | 1 | @10-x #WAV10 x,xxx… @13-x #WAV13 x,xxxxxx… |
ノイズ (長周期・短周期) |
1 | @11 /* 長周期 */ @12 /* 短周期 */ |
PCM | 2 | @13-x #WAV13 x,xxxxxx… @9-x #WAV9 x,xx,xxx… など |
また、GBA音源はステレオ出力になっており、これらのチャンネルは、音を3段階(左・中・右)に振ることができる。
FlMMLの仕様上、ピコカキコでのGBA音源完全再現はほぼ可能…だと思われる。
ゲームボーイアドバンスに内蔵されている音源は、従来のゲームボーイ互換の矩形波(2ch)・波形メモリ(1ch)・ノイズ(1ch)とGBAで追加されたPCM(2ch)である。FC音源とは似てるし、似てない。どちらかと言うとSFC音源に近いかも知れないし、そうでもないかも知れない。
以下、GB音源の記事などを参考に詳細を記述。
R:読み込み W:書き込み oは可能で、xは不可能、「ビット」は上段が上位(MSB)で下段が下位(LSB)バイトです。
アドレス | 読書き | ビット | 説明 |
$4000060 SG10_L |
R:xxxxxxxx_xooooooo W:xxxxxxxx_xooooooo |
XXXXXXXX _XSSSHRRR |
矩形波1 制御レジスタ(スイープ)
R:周波数変更量 ・カウント満了時に、どのくらい周波数を変更するか ・値が小さいほど変化が大きい ・0だと変化無し H:周波数変更方向 ・0:上がっていく 1:下がっていく S:周波数変更タイマカウント数 ・値が小さいほど周波数変更頻度が高い X:未使用 |
$4000062 SG10_H |
R:oooooooo_ooxxxxxx W:oooooooo_oooooooo |
VVVVDCCC _DDLLLLLL |
矩形波1 制御レジスタ(音量・音色・長さ)
L:長さカウント値 ・値が大きいほど長さが短い D:Duty比 ・00:12.5% 01:25% 10:50% 11:75% C:エンベロープ速度 ・値が小さいほど変化が速くなる ・0だと変化無し D:音量変更方向 ・0:小さくなっていく 1:大きくなっていく V:エンベロープ初期音量 ・エンベロープ開始時の音量の指定 ・キーオン中にここだけ変えても、設定通りの音量にならない |
$4000064 SG11 |
R:xoxxxxxx_xxxxxxxx W:ooxxxooo_oooooooo |
OCXXXFFF _FFFFFFFF |
矩形波1 制御レジスタ(周波数・長さ・キーオン)
F:周波数 ・値が大きいほど高音になる X:未使用 C:長さカウンタ有効フラグ(1:有効 0:無効) O:キーオンフラグ ・このビットを立たせることで、キーオン(音を鳴らす)できる。 |
$4000068 SG20 |
R:oooooooo_ooxxxxxx W:oooooooo_oooooooo |
VVVVDCCC _DDLLLLLL |
矩形波2 制御レジスタ(音量・音色・長さ)
L:長さカウント値 ・値が大きいほど長さが短い D:Duty比 ・00:12.5% 01:25% 10:50% 11:75% C:エンベロープ速度 ・値が小さいほど変化が速くなる ・0だと変化無し D:音量変更方向 ・0:小さくなっていく 1:大きくなっていく V:エンベロープ初期音量 ・エンベロープ開始時の音量の指定 ・キーオン中にここだけ変えても、設定通りの音量にならない |
$400006C SG21 |
R:xoxxxxxx_xxxxxxxx W:ooxxxooo_oooooooo |
OCXXXFFF _FFFFFFFF |
矩形波2 制御レジスタ(周波数・長さ・キーオン)
F:周波数 ・値が大きいほど高音になる X:未使用 C:長さカウンタ有効フラグ(1:有効 0:無効) O:キーオンフラグ ・このビットを立たせることで、キーオン(音を鳴らす)できる。 |
$4000070 SG30_L |
R:xxxxxxxx_oooxxxxx W:xxxxxxxx_oooxxxxx |
XXXXXXXX _OBSXXXXX |
波形メモリ 制御レジスタ(波形再生)
X:未使用 S:波形メモリチャンネルサンプル数 ・0:32サンプル 1:64サンプル B:波形メモリ再生バンク選択 ・波形メモリの読み書きは選択していないバンクが対象となる ・64サンプルを選択中にキーオンまたはキーオン中に バンク切り替えを行うと、ここで指定したバンクが先に鳴る。 O:波形メモリチャンネル有効フラグ(0:無効 1:有効) ・0だと、音が鳴らない。 |
$4000072 SG30_H |
R:oooxxxxx_xxxxxxxx W:oooxxxxx_oooooooo |
VVVXXXXX _LLLLLLLL |
波形メモリ 制御レジスタ(音量・長さ)
L:長さカウント値 ・値が大きいほど長さが短い X:未使用 V:音量 ・000:ミュート 001:100% 010:50% 011:25% ・100-111:75% |
$4000074 SG31 |
R:xoxxxxxx_xxxxxxxx W:ooxxxooo_oooooooo |
OCXXXFFF _FFFFFFFF |
波形メモリ 制御レジスタ(周波数・長さ・キーオン)
F:周波数 ・値が大きいほど高音になる X:未使用 C:長さカウンタ有効フラグ(1:有効 0:無効) O:キーオンフラグ ・このビットを立たせることで、キーオン(音を鳴らす)できる。 |
$4000078 SG40 |
R:oooooooo_xxxxxxxx W:oooooooo_xxoooooo |
VVVVDCCC _XXLLLLLL |
ノイズ 制御レジスタ(音量・長さ)
L:長さカウント値 ・値が大きいほど長さが短い X:未使用 C:エンベロープ速度 ・値が小さいほど変化が速くなる ・0だと変化無し D:音量変更方向 ・0:小さくなっていく 1:大きくなっていく V:エンベロープ初期音量 ・エンベロープ開始時の音量の指定 ・キーオン中にここだけ変えても、設定通りの音量にならない |
$400007C SG41 |
R:xoxxxxxx_oooooooo W:ooxxxxxx_oooooooo |
OCXXXXXX _OOOORFFF |
ノイズ 制御レジスタ(周波数・長さ・キーオン)
F:ノイズ周波数1(カウント指定) ・値が小さいほど周波数が高くなる ・実際に出力される周波数(Hz)は、 524288÷O÷2^(F+1) で計算することができる。 (オクターブ指定が 0 の場合 O=0.5 に置き換える) R:長周期/短周期 ・0で長周期 O:ノイズ周波数2(オクターブ指定) ・値が小さいほど周波数が高くなる ・値が1増えるごとに、周波数は1/2,1/4,1/8…していく X:未使用 C:長さカウンタ有効フラグ(1:有効 0:無効) O:キーオンフラグ ・このビットを立たせることで、キーオン(音を鳴らす)できる。 |
$4000080 SGCNT0_L |
R:oooooooo_xoooxooo W:oooooooo_xoooxooo |
NW21NW21 _XLLLXRRR |
ゲームボーイ互換チャンネル制御レジスタ
R:右音量 L:左音量 ・値が大きいほど音量が大きい ・実機ではこの値を0にしても無音にはならない。 X:未使用 1:矩形波1-右出力 有効フラグ (1:ON 0:OFF) 2:矩形波2-右出力 有効フラグ (1:ON 0:OFF) W:波形メモリ-右出力 有効フラグ (1:ON 0:OFF) N:ノイズ-右出力 有効フラグ (1:ON 0:OFF) 1:矩形波1-左出力 有効フラグ (1:ON 0:OFF) 2:矩形波2-左出力 有効フラグ (1:ON 0:OFF) W:波形メモリ-左出力 有効フラグ (1:ON 0:OFF) N:ノイズ-左出力 有効フラグ (1:ON 0:OFF) |
$4000082 SGCNT0_H |
R:oooooooo_xxxxoooo W:oooooooo_xxxxoooo |
FTLRFTLR _XXXXBAVV |
サウンド制御レジスタ
V:ゲームボーイ互換チャンネル音量 ・00:25% 01:50% 10:100% 11:使用禁止 A:PCM A 音量 ・0:50% 1:100% B:PCM B 音量 ・0:50% 1:100% X:未使用 R:PCM A 右出力 有効フラグ (1:ON 0:OFF) L:PCM A 左出力 有効フラグ (1:ON 0:OFF) T:PCM A タイマー選択 (1:タイマー1 0:タイマー0) F:PCM A FIFO リセット (1:リセット) R:PCM B 右出力 有効フラグ (1:ON 0:OFF) L:PCM B 左出力 有効フラグ (1:ON 0:OFF) T:PCM B タイマー選択 (1:タイマー1 0:タイマー0) F:PCM B FIFO リセット (1:リセット) |
$4000084 SGCNT1 |
R:xxxxxxxx_oxxxoooo W:xxxxxxxx_oxxxxxxx |
XXXXXXXX _SXXXNW21 |
各チャンネルステータス/サウンド有効フラグレジスタ
1:矩形波1 ステータスフラグ (1:ON 0:OFF) 2:矩形波2 ステータスフラグ (1:ON 0:OFF) W:波形メモリ ステータスフラグ (1:ON 0:OFF) N:ノイズ ステータスフラグ (1:ON 0:OFF) S:全サウンド有効フラグ (1:ON 0:OFF) |
$4000088 SGBIAS |
R:ooxxxxoo_oooooooo W:ooxxxxoo_oooooooo |
RRXXXXBB _BBBBBBBB |
サウンドPWMコントロール
B:バイアスレベル ・通常は変更する必要なし (初期値:200h) X:未使用 R:サンプリングレート ・00: 9bit/ 32768Hz (デフォルト、PCMに最適) 01: 8bit/ 65536Hz 10: 7bit/131072Hz 11: 6bit/262144Hz (GB互換チャンネルに最適) |
$4000090 -$400009F |
R:oooooooo_oooooooo W:oooooooo_oooooooo |
WWWWWWWW _WWWWWWWW |
波形メモリデータ
W:波形データ (符号無し4bit) ・1バイト目のMSB→LSB→ 2バイト目のMSB→LSB→・・・と続く ・読み書きは再生が行われてない方のバンクへ行われる |
$40000A0 SIGFIFOA_L |
R:xxxxxxxx_xxxxxxxx W:oooooooo_oooooooo |
11111111 _00000000 |
PCM A FIFO レジスタ(下位)
0:データ0 (符号付き8bit) 1:データ1 (符号付き8bit) ・通常はタイマー0または1とDMA1を利用して転送を行う。 |
$40000A2 SIGFIFOA_H |
R:xxxxxxxx_xxxxxxxx W:oooooooo_oooooooo |
33333333 _22222222 |
PCM A FIFO レジスタ(上位)
2:データ2 (符号付き8bit) 3:データ3 (符号付き8bit) ・通常はタイマー0または1とDMA1を利用し転送を行う。 |
$40000A4 SIGFIFOB_L |
R:xxxxxxxx_xxxxxxxx W:oooooooo_oooooooo |
11111111 _00000000 |
PCM B FIFO レジスタ(下位)
0:データ0 (符号付き8bit) 1:データ1 (符号付き8bit) ・通常はタイマー1または0とDMA2を利用して転送を行う。 |
$40000A6 SIGFIFOB_H |
R:xxxxxxxx_xxxxxxxx W:oooooooo_oooooooo |
33333333 _22222222 |
PCM B FIFO レジスタ(上位)
2:データ2 (符号付き8bit) 3:データ3 (符号付き8bit) ・通常はタイマー1または0とDMA2を利用し転送を行う。 |
アドレス | 読書き | ビット | 説明 |
$40000BC DM1SAD_L $40000C8 DM2SAD_L |
R:xxxxxxxx_xxxxxxxx W:oooooooo_oooooooo |
SSSSSSSS _SSSSSSSS |
転送元アドレス指定レジスタ
S:転送元アドレス (28bit) ・再生するPCMバッファを設定。ROM内の指定も可 ・DMA転送を開始してもこの値は変化しない。 X:未使用 |
$40000BE DM1SAD_H $40000CA DM2SAD_H |
R:xxxxxxxx_xxxxxxxx W:xxxxoooo_oooooooo |
XXXXSSSS _SSSSSSSS |
|
$40000C0 DM1DAD_L $40000CC DM2DAD_L |
R:xxxxxxxx_xxxxxxxx W:oooooooo_oooooooo |
DDDDDDDD _DDDDDDDD |
転送先アドレス指定レジスタ
D:転送先アドレス (27bit) ・PCM用途でDMAを使う場合は、 $40000A0 または $40000A4 に設定 X:未使用 |
$40000C2 DM1DAD_H $40000CE DM2DAD_H |
R:xxxxxxxx_xxxxxxxx W:xxxxxooo_oooooooo |
XXXXXDDD _DDDDDDDD |
|
$40000C4 DM1CNT_L $40000D0 DM2CNT_L |
R:xxxxxxxx_xxxxxxxx W:xxoooooo_oooooooo |
XXCCCCCC _CCCCCCCC |
転送カウントレジスタ
C:転送回数 (14bit) ・転送回数を指定する。1回の転送は16bitまたは32bit。 ・PCM用途では、この値は利用されない。 X:未使用 |
$40000C6 DM1CNT_H $40000D2 DM2CNT_H |
R:ooooxooo_oooxxxxx W:ooooxooo_oooxxxxx |
EITTXWRs _sddXXXXX |
転送コントロールレジスタ
X:未使用 d:転送先アドレス制御 ・0:増加、1:減少、2:固定、3:増加/リロード ・PCM用途の場合は固定に設定しておく。 s:転送元アドレス制御 ・0:増加、1:減少、2:固定、3:未使用 R:DMAリピート ・PCM用途では有効に設定 (1:ON 0:OFF) W:転送単位 ・PCM用途では常に32bitになる。(1:32bit 0:16bit) X:未使用 T:転送開始タイミング ・0:すぐに、1:VBlank、2:HBlank、3:特殊 ・PCM用途では「3:特殊」に設定しておく。 I:割り込み制御 ・転送完了時に割り込み制御 (1:ON 0:OFF) ・PCM用途ではDMAリピートが有効な為利用不可(未詳)。 E:DMAイネーブル ・指定したタイミングで転送を開始する。 ・リピートOFFの場合は転送終了でフラグが下がる |
TIMER0 から順に $4000100 $4000104 $4000108 $400010C |
R:oooooooo_oooooooo W:oooooooo_oooooooo |
CCCCCCCC _CCCCCCCC |
タイマーカウントレジスタ
C:タイマー初期値(W)、現在値(R) ・オーバーフローすると初期値から再スタートする ・読み込みで現在のカウント値を取得できる ・PCM再生周波数の設定値は通常、下記で求める。 16,780,000 ÷ 周波数(Hz) × -1 = C |
TIMER0 から順に $4000102 $4000106 $400010A $400010E |
R:xxxxxxxx_ooxxxooo W:xxxxxxxx_ooxxxooo |
XXXXXXXX _EIXXXUSS |
タイマーコントロールレジスタ
S:プリスケーラ選択 ・0:F/1、1:F/64、2:F/256、3:F/1024 ( F = 16,780,000 Hz ) U:オーバーフローカウントアップ ・有効にするとプリスケーラの設定を無視し、 1つ前のタイマーのオーバーフローでカウント X:未使用 I:割り込み許可 ・有効にするとオーバーフローで割り込み (1:ON 0:OFF) E:タイマースイッチ ・0:停止 1:作動 |
このチャンネルで出せる矩形波のDuty比は、12.5% 25% 50% 75%の4種類。波形は以下の表を参照。
Duty比 | 波形 |
12.5% | _| ̄|_______| ̄|_______ |
25% | _| ̄ ̄|______| ̄ ̄|______ |
50% | _| ̄ ̄ ̄ ̄|____| ̄ ̄ ̄ ̄|____ |
75% | _| ̄ ̄ ̄ ̄ ̄ ̄|__| ̄ ̄ ̄ ̄ ̄ ̄|__ |
CH1の矩形波チャンネルにはスイープ機能があり、周波数を変化させることが出来る。
スイープレジスタ($4000060)での指定することにより、周波数を上昇させたり下降させたりする事が出来る。
周波数更新時、以下の計算方法で周波数の上昇・下降を行う。
FC音源の仕様と同じように見えるが、比べると実は全然違う。 GBA音源の場合、周波数レジスタ値はFC音源のときとは逆で、値が多いほど周波数が高くなるため、レジスタ値が大きいほど周波数の変化が大きくなり、レジスタ値が小さいほど周波数の変化が小さくなる。
FC音源では、キーオンの仕様上、周波数レジスタ9bit目以降の書き換えでプチノイズが出るが、GBA音源ではキーオンの仕様が違うため、周波数レジスタ9bit目以降を変更してもプチノイズは乗らない。GB音源はFC音源と比べて、ソフトウェアによる周波数変更に強いといえる。
矩形波は、キーオン時に波形位置がリセットされないが、波形は若干乱れる。
ゲームボーイの特徴とも言える波形メモリ。アドバンスでは1バンクあたり32サンプルのバンクを2つ利用出来る。
波形メモリの周波数は、矩形波と比べて1オクターブ低い。
64サンプルを選択している場合はさらに1オクターブ低くなると思われる。
波形データは読み書きしたいバンクとは別のバンクを$4000070で指定し、$4000090-$400009Fへ書き込む。 バンクあたりのサンプル数は32、量子化ビット数は4、上位4bit→下位4bit→次の上位4bit…の順で出力される。
音量は、5段階で変更できる。(100%, 75%, 50%, 25%, OFF) ただし、波形データをビットシフトする形で音量を下げているため、サウンドPWMコントロールレジスタで設定されている有効なビット数を超える場合は下位ビットが失われる分波形が変わる。
ノイズ音の周波数は、線形帰還シフトレジスタによる擬似乱数で出ている。
//レジスタの初期値
reg = 0xffff;
output = 1;
//以下の2行を回す。
// shortFreqは、短周期フラグ。1にすると有効になる。
// これで得られるoutputの値が、ノイズチャンネルの波形。
if(reg == 0)reg = 1; //一応
reg += reg + (((reg >> (shortFreq ? 6 : 14)) ^ (reg >> (shortFreq ? 5 : 13))) & 1);
output ^= reg & 1;
「ザー」という音の長周期と、「ギー」という音の低周期が出せる。
ノイズのパターンは、長周期ノイズが32767bit。低周期ノイズは127bit。
ゲームボーイのノイズ音はFC音源とは違って、キーオン毎にレジスタがリセットされるため、長周期・短周期ともに常に同じ音が出る。 これによって、FC音源と比べて、短周期ノイズをドラム音として使いやすくなっている。
ゲームボーイアドバンスで追加されたチャンネル。このチャンネルは他のチャンネルと違い、サンプリングされた波形などを直接再生することができる。これにより、ソフトウェアで最大同時発音数をある程度増やすことが出来るようになった。
市販のGBA用ゲームソフトのほとんどがソフトウェアPCM合成も行っていると思われるが、ゲームによっても音質は異なる場合があるようだ。これは、波形で使用するメモリーやPCM合成にかかる時間に余裕がないためなのだろう。
発音動作は再生周波数(周期)設定用タイマーとPCM転送用のDMAを介して行われ、その間CPUはサウンドの合成や別の処理をすることができる。
仕組みとしては、DMAを有効にすると即座にFIFOへ転送され、タイマーのオーバーフローで1サンプルがFIFOから再生される。
再生位置を知りたい場合は後続のタイマーをカスケード接続し、オーバーフローによるカウントを有効にすることで再生されたサンプル数を知ることができる。
GBA音源の矩形波・ノイズチャンネルでは、音量をハードウェアで変化させることが出来る。
GBA音源のハードウェアエンベロープは、FC音源と比べると強化されている。 初期ボリュームが指定でき、その音量から増幅・減衰させることができる。
(FC音源では、初期ボリュームは最大固定で、変化は減衰のみ)
矩形波・ノイズチャンネルでは、音量レジスタ($4000062 $4000068 $4000078)を変更した後、反映のためにキーオンしなければならない。
しかし、キーオンすると、矩形波チャンネルでは波形が若干乱れ、ノイズチャンネルではレジスタがリセットされてしまうため、GBA音源はFC音源と比べて、ソフトウェアエンベロープに弱い。そのため、矩形波・ノイズチャンネルでソフトウェアエンベロープを使用するソフトは、ファミコンと比べると少ない。
ソフトウェアエンベロープを使用するソフトの多くは、音量を変化する頻度を少なくしたり、一部のエンベロープをハードウェアに任せるなど、ノイズを目立たせないように工夫されていた。
キーオンせずに音量レジスタだけ変更すると、訳の分からない変な挙動(GBSOUND.TXTではこれを"ZOMBIE MODE"と呼んでいる)によって、期待通りの音量にならない(GBA音源ではGB音源のそれとも挙動がちょっと違うらしい)。
波形メモリチャンネルは、音量レジスタの変更のみでも大丈夫なのでノイズは発生しない。
つまり、ファミコンの音源と比べるとどこが違うのか。大きな違いは以下の通り。
細かい違いは以下の通り。
それ以外は、大体FC音源と同じになっている。
実際のゲームでは、発売初期は矩形波・波形メモリをメインとしたGB時代と変わらない音作りのものが多かった(グラディウスジェネレーションなどはよくネタにされる)が、後期になるに従いPCM音源部分の活用幅が広がり、SFC顔負けの重厚なサウンドを出すゲームが増えた。前述の通りPCM音源部分はソフトウェアで波形を合成することで発音数を増やすことができ、ハード中後期にプログラミング技術がこなれてきたことにより音質・発音数向上を実現できたということだろう。
特に好事家の間では「デ・ジ・キャラット でじこミュニケーション」の楽曲がPCM音源を使い倒したものとしてしばしば評価される。
仕様レベルではFCと似通っていたが、PCM音源の存在がきわめて大きかったといえるだろう。
掲示板
71 ななしのよっしん
2022/02/04(金) 17:11:14 ID: bg4U/zOmti
Youtubeとかで、ここ最近の高性能ハードで出たゲームの曲を、この音源でいい感じにアレンジされてると最高に燃える
72 ななしのよっしん
2023/12/02(土) 22:50:30 ID: HzxD6Ul153
これはGBA音源と言えますか?
GBAサウンドエンジンのシミュレーションによる高音質化
>>sm43087203
73 ななしのよっしん
2024/08/17(土) 11:49:15 ID: 26JMB+mIWH
そろそろサウンドドライバの事を記事に追加して欲しいなぁなんて
GBA 標準サウンドドライバ(MusicPlayer2000)の概要
https://
急上昇ワード改
最終更新:2024/12/26(木) 11:00
最終更新:2024/12/26(木) 10:00
ウォッチリストに追加しました!
すでにウォッチリストに
入っています。
追加に失敗しました。
ほめた!
ほめるを取消しました。
ほめるに失敗しました。
ほめるの取消しに失敗しました。