# サウンド ゲームボーイはPSG(Progrmmable Sound Generator)と呼ばれる音源を持っており、PSGは4つのチャンネルで構成されています。(PCMチャンネルはありません) - スイープ機能とエンベロープ機能を備えた矩形波チャンネル (CH1) - エンベロープ機能を備えた矩形波チャンネル (CH2) - 波形メモリをそなえたウェーブチャンネル (CH3) - エンベロープ機能を備えたノイズチャンネル (CH4) チャンネルは、それぞれ、まず `0..15` の音量を出力し、それがチャンネルの持つDACによって `-1..1` の範囲に変換されます。最後に、これら4つの値がミキシングされ、左右のスピーカーに出力されます。(つまり、最終出力は `-4..4` の範囲になります) サウンドのIOレジスタは、音を出している間は常に書き込みをすることができます。 SGBでは周波数が2.4%高くなります。 ## コンポーネント ### エンベロープ CH1, CH2, CH4では、エンベロープを使用して音量を変化させることができます。 エンベロープは 64Hz で動作し、`N tick` ごとに音量を変化させます。(`N = 0..7`, `NRx2.0-2` で指定) ### 長さカウンタ (Length Timer) 長さカウンタは、全てのチャンネルに搭載されており、音の鳴る時間を決めたいときに使用します。 長さカウンタは、256Hzでインクリメントされ、長さカウンタの値が 64 (CH1,CH2,CH4) または 256 (CH3) になると、音が止まります。 プログラム側は、長さカウンタの初期値を指定することで、音の長さを決定します。例えば、CH1 を `1/256`秒だけ鳴らしたい場合、長さカウンタの初期値を 63 に設定します。 ### タイマ (Period Counter) タイマは全てのチャンネルで周波数を決定するために使用します。 詳細については、各`NRx3`レジスタの説明を参照してください。 ## 🟥 CH1 - 矩形波チャンネル(Tone & Sweep) ### FF10 - NR10 - CH1制御レジスタ(スイープ) (R/W) > スイープ(sweep): 一定の速度で周波数を変化させる事 ``` Bit 0-2 スイープ時のシフト量 (n: 0-7) 3 スイープの増減 0: + (周波数は大きくなる) 1: - (周波数は小さくなる) 4-6 スイープ時間(スイープの起こる間隔) 0b000: スイープしない 0b001: 7.8 ms (1/128Hz) 0b010: 15.6 ms (2/128Hz) 0b011: 23.4 ms (3/128Hz) 0b100: 31.3 ms (4/128Hz) 0b101: 39.1 ms (5/128Hz) 0b110: 46.9 ms (6/128Hz) 0b111: 54.7 ms (7/128Hz) ``` 各シフトによる周波数(NR13,NR14)の変化について、変化前の周波数を`X(t-1)`, 変化後の周波数を`X(t)`とすると`X(t)`は ``` X(t) = X(t-1) ± X(t-1)/2^n ``` と求められます。 ### FF11 - NR11 - CH1制御レジスタ(音色・長さ) (R/W) > デューティ比(duty): 周期的な現象において、特定期間のうち現象が継続される期間の割合のこと ``` Bit Expl. 0-5 W 長さカウンタ初期値 (t1: 0..63) 6-7 R/W デューティ比 0b00: 12.5% (`_-------_-------_-------`) 0b01: 25% (`__------__------__------`) 0b10: 50% (`____----____----____----`) (normal) 0b11: 75% (`______--______--______--`) ``` 長さカウンタの値は、`NR14.6`がセットされている場合にのみ使用されます。 ### FF12 - NR12 - CH1制御レジスタ(音量) (R/W) > エンベロープ(envelope): 音が発音されてから聞こえなくなるまでの音量の時間的変化 ``` Bit 0-2 エンベロープ速度 (n: 0-7) 値が小さいほど変化が速くなる 0だとエンベロープオフ 3 音量変更方向 (0=小さくなっていく, 1=大きくなっていく) 4-7 エンベロープ初期音量 (0..15) チャンネルの初期音量 0だと無音 ``` 音量の変化(エンベロープ)のインターバルは `n*(1/64)`秒 です。そのため、n(bit0-2)が小さいほど音量の変化は早くなります。 `NR12.3-7`(音量変更方向とエンベロープ初期音量) をすべて0にすると、DACがオフになり(したがってCH1もオフになり)、ポップノイズが発生する可能性があります。 ### FF13 - NR13 - CH1制御レジスタ(周波数下位) (W) FF14と合わせて11bitで周波数を指定します。FF13ではbit0-7が入っています。 ### FF14 - NR14 - CH1制御レジスタ(周波数上位) (R/W) ``` Bit 0-2 W 周波数(bit8-10) 3-5 R 不使用 6 R/W 長さカウンタ有効フラグ(1=有効) 7 W リスタート ``` 長さカウンタ有効フラグ(bit6)がセットされている場合、NR11の音声の長さが0になったとき音声が止まります。 周波数の値はNR13とNR14の11bitの値を`x`(0..2047)とすると`1048576/(2048-x) Hz`になります。 リスタート(`NR14.7`)に`1`を書き込むと、音声がリスタートします。 ## 🟦 CH2 - 矩形波チャンネル(Tone) CH2は、スイープの制御レジスタ(CH1ではNR10)がないことを除けば、CH1と同じように動作します。そのため書いてある内容もCH1とほとんど同じです。 ### FF16 - NR21 - CH2制御レジスタ(音色・長さ) (R/W) NR11と同じです。 ### FF17 - NR22 - CH2制御レジスタ(音量) (R/W) NR12と同じです。 ### FF18 - NR23 - CH2制御レジスタ(周波数下位) (R/W) NR13と同じです。 ### FF19 - NR24 - CH2制御レジスタ(周波数上位) (R/W) NR14と同じです。 ## 🌊 CH3 - 波形メモリチャンネル このチャンネルは、デジタルサウンドを出力することができ、サンプルバッファ(Wave RAM)の長さは32桁に制限されています。 このサウンドチャンネルは、Wave RAMを矩形波で初期化すると、通常の音を出力することもできます。 このチャンネルには、エンベロープレジスタはなく、音量はNR32で設定します。 ### FF1A - NR30 - CH3制御レジスタ(マスター) (R/W) ``` Bit 0-6 不使用 7 DAC有効フラグ (0=無効, 1=有効) ``` 他のチャンネルと同様に、DACをオフにすると即座にチャンネルもオフになります。 ### FF1B - NR31 - CH3制御レジスタ(長さ) (W) ``` Bit 0-7 長さカウンタ初期値 (t1: 0-255) ``` 長さカウンタは、`NR34.6`がセットされている場合にのみ使用されます。 ### FF1C - NR32 - CH3制御レジスタ(音量) (R/W) ``` Bit 0-4 不使用 5-6 音量 0b00: 0%(ミュート) 0b01: 100% 0b10: 50% (つまり、1だけ右シフト) 0b11: 25% (つまり、2だけ右シフト) 7 不使用 ``` ### FF1D - NR33 - CH3制御レジスタ(周波数下位) (R/W) `NR34.0-2`と合わせて11bitで周波数を指定します。`NR33`では周波数のbit0-7を指定します。 ### FF1E - NR34 - CH3制御レジスタ(周波数上位) (R/W) ``` Bit 0-2 W 周波数(bit8-10) 3-5 R 不使用 6 R/W 長さカウンタ有効フラグ(1=有効) 7 W Initial (1=Restart Sound) ``` 長さカウンタ有効フラグ(bit6)がセットされている場合、NR31の音声の長さが0になったとき音声が止まります。 bit7がセットされている場合は、NR31の音声の長さが0になった時に、サウンドがリスタートします。 周波数の値は**CH1,CH2とは計算式が異なり**、NR33とNR34の11bitの値を`x`(0..2047)とすると`2097152/(2048-x) Hz`になります。 ### FF30-FF3F - CH3波形メモリデータ (R/W) この16バイトのメモリ領域には、32個の4bitのサンプルが格納され、上位4bitから順に再生されます。 波形メモリデータへのアクセスは、CH3が無効(`NR52.2=0`)の時のみ行うようにしてください。(DACがオンであっても、チャンネルがアクティブでない限り、波形メモリには正常にアクセスできます。) そうしないと、アクセスしたときの挙動がおかしくなります。(ほとんどの機種では、CH3が現在読み込んでいるオフセットにバイトが書き込まれます。GBAでは、この書き込みは単に無視されます。) > [!NOTE] > CH3スタート後、最初に読み出されるサンプルはインデックス1のもの、つまり最初のバイトの下位ニブルであり、上位ニブルではありません。 ## 🎺 CH4 - ノイズチャンネル ホワイトノイズを出力するためのためのチャンネルです。ホワイトノイズは、一定の周波数において、振幅を高低の間でランダムに切り替えることで行われます。 周波数に応じて、ホワイトノイズは硬くなったり柔らかくなったりします。 また、ランダムジェネレーターの機能に影響を与えて、出力がより規則的になるようにすることも可能で、その結果、ノイズの代わりにトーンを出力することが制限されます。 ### FF20 - NR41 - CH4制御レジスタ(長さ) (W) ``` Bit 0-5 長さカウンタ初期値 (t1: 0-63) ``` 長さカウンタは、`NR44.6`がセットされている場合にのみ使用されます。 ### FF21 - NR42 - CH4制御レジスタ(音量) (R/W) ``` Bit 0-2 エンベロープ速度 (n: 0-7) 値が小さいほど変化が速くなる 0だと変化なし 3 音量変更方向 (0=小さくなっていく, 1=大きくなっていく) 4-7 エンベロープ初期音量 (0-0Fh) (0=音無し) ``` 音量の変化(エンベロープ)のインターバルは `n*(1/64)`秒 です。そのため、n(bit0-2)が小さいほど音量の変化は早くなります。 ### FF22 - NR43 - CH4制御レジスタ(周波数) (R/W) 振幅は与えられた周波数で高低をランダムに切り替えることで発生させます。 周波数が高くなると、ノイズはよりやわらかくなります。bit3をセットすると、出力がより規則的になり、一部の周波数はノイズよりもトーンに近い音になります。 ``` Bit 0-2 ノイズ周波数1(カウント指定) (r) - 値が小さいほど周波数が高くなる - 周波数は1/nされる。nに入る値は、周波数テーブルから引き出される。(値0から順に、1,2,4,6,8,10,12,14) 3 長周期/短周期 (0=15bits(長周期), 1=7bits(短周期)) 4-7 ノイズ周波数2(オクターブ指定) (s) - 値が小さいほど周波数が高くなる - 値が1増えるごとに、周波数は1/2,1/4,1/8…していく ``` 周波数fは次の式で表されます。(`r=0`のときは`r=0.5`とします) ``` f = 524288 / r / 2^(s+1) Hz ``` ### FF22 - NR44 - CH4制御レジスタ(リスタート) (R/W) ``` Bit 0-5 R/W 不使用 6 R 長さカウンタ有効フラグ(1=有効) 7 W Initial (1=サウンドをリスタート) ``` 長さカウンタ有効フラグ(bit6)がセットされている場合、NR41の音声の長さが0になったとき音声が止まります。 bit7がセットされている場合は、NR41の音声の長さが0になった時に、サウンドがリスタートします。 ## 🔊 サウンド制御レジスタ ### FF24 - NR50 - 全体音量制御レジスタ (R/W) ボリュームビットは、左右のサウンド出力のマスターボリュームを指定します。 SO2は左のヘッドフォンに、SO1は右のヘッドフォンに出力されます。 ``` Bit 0-2 右音量 (0-7, 値が大きいほど音量が大きい) 3 右出力有効フラグ (1=有効) 4-6 左音量 (0-7, 値が大きいほど音量が大きい) 7 左出力有効フラグ (1=有効) ``` 余談ですが、ゲームボーイに内蔵されている4つのサウンドチャンネルに加えて、5つ目のサウンドチャンネルをカートリッジ内の外部ハードウェアから供給することができます。この機能を使用した商用ゲームはなく、ゲームボーイアドバンスではこの機能は廃止されました。 ### FF25 - NR51 - 各チャンネル出力制御レジスタ (R/W) ``` Bit 0-3 CHn右出力有効フラグ (1=有効) (bit0=CH1, bit1=CH2, bit2=CH3, bit3=CH4) 4-7 CHn左出力有効フラグ (1=有効) (bit4=CH1, bit5=CH2, bit6=CH3, bit7=CH4) ``` ### FF26 - NR52 - サウンドON/OFFレジスタ (R/W) GBのプログラムでサウンドを使用しない場合は、このレジスタに`0x0`を書き込むことで、GBの消費電力を16%以上削減することができます。 bit7をクリアしてAPUを無効にすると、すべてのサウンドレジスタの内容が破壊されます。 また、APUが無効にされている間は、(`0xFF26`を除いて)どのサウンドレジスタにもアクセスできません。 ``` Bit 0-3 R サウンドn ON/OFF (bit0=CH1, bit1=CH2, bit2=CH3, bit3=CH4) 4-6 R 不使用 7 R/W 全サウンド ON/OFF (0: 全サウンド回路をOFF) (R/W) ``` このレジスタのbit0-3は、**読み取り専用**のステータスビットで、これらのビットに書き込んでも、**サウンドの有効化/無効化は行われません**。 このフラグは、初期フラグ(NR14,NR24,NR34,NR44のbit7)をセットしてサウンド出力が再開されたときにセットされ、フラグはサウンドの長さが終了するまで(有効な場合)セットされたままになります。 ボリュームエンベロープの音量がゼロになっても、サウンドフラグはオフになりません。 > [!WARNING] > bit0-3では、チャンネルの生成回路の状態だけが報告され、DACの状態は報告されません。 (ただしチャンネルがONになるのは、対応するDACがONになっている場合のみです。) > チャンネルのDACがオフの場合、NRx4への書き込みは無効になりチャンネルをオンにしません。