GAME BOY / 01

パルスの幅を変えると、
音はどう変わる?

同じ「ラ」の音でも、波の幅を変えると響きが変わります。まず50%で聴き、12.5%と比べてみましょう。

1. 一つの値を変えて、聴く

デューティ比は、繰り返すパルスの幅の割合です。音程をA4、音量を10に固定して、幅だけを変えてください。25%と75%は波形の向き・位相が違いますが、単独ではほぼ同じ音色になります。

再生ボタンを押すまで音は鳴りません。

実際に生成した左出力のPCM。発音開始100 ms後から12 msを表示。横軸:時間(0〜12 ms)、縦軸:固定の振幅スケール。聴き比べるときも表示倍率は変えません。

この試作はDMGのデジタル音源をエミュレートします。実機のアンプ・スピーカーの音色やアナログの高域通過フィルターは再現していません。試聴時のみ一定の音量調整と始端・終端10 msのフェードを加えています。図は加工前のPCMです。

2. 同じ設定を、コードで持ち帰る

上の値を変えると、このコードも変わります。PlaygroundでRunすると同じ音色設定を再現できます。Stopで停止してください。

Playgroundで編集 ↗

initialize()は4チャンネルを無音で準備します。keyOn()から発音し、keyOff()で停止します。ここではエンベロープの周期を0にして音量を一定にし、CH1のスウィープも初期値で無効にしています。sleep(1.5)はJavaScript側の時間制御です。

APIからハードウェアへの対応
操作対応する設定
pulse.setVoice(ch, {duty})CH1のNR11 / CH2のNR21、上位2 bit
volume, envelopeNR12 / NR22(初期音量・方向・周期)
pulse.setNote(ch, 'A4')NR13・NR14 / NR23・NR24の周波数値。実際の周波数はレジスター精度へ丸められます。
keyOn(ch)NR14 / NR24のtrigger。高レベルAPIでは長さカウンターを無効にします。

仕様:Pan Docsのデューティ比/このプロジェクトのGame Boy API仕様

3. 実機では、どこで音が生まれる?

ここで説明する実機は初代Game Boy(DMG)、基板資料の対象はDMG-CPU-06です。APUはCPUと同じICの中にあります。独立したYM2612を載せるメガドライブとは構成が違います。

CPUから設定
同じIC内のAPUへ
APU:Pulse 1・Pulse 2
Wave・Noise
左右へ混ぜる・出力
アンプ → スピーカー / ヘッドホン
信号の流れを簡略化した機能図。基板の部品位置やシリコンの配置を表す図ではありません。

Pulse 1だけがハードウェアの音程スウィープを持ち、Pulse 2にも同じ4種類のデューティ比があります。Waveは32点の波形メモリー、Noiseは疑似乱数列を使う別の発音回路です。

実際の部品位置は、Gekkio氏のDMG-CPU-06基板トレースと回路図で確認できます。これらの資料はCC BY 4.0です。本ページへの画像転載は行っていません。DMGの別リビジョンやGame Boy Colorへ部品配置を一般化しないでください。