GAME BOY / 03

32点の波形を、描いて鳴らす

Waveチャンネルは32点の小さな波形を繰り返し読みます。形を変える操作と、その波形を読む速さを変える操作を、別々に試しましょう。

値を変えて、聴き比べる

三角波とノコギリ波を、同じA3で聴き比べます。下の32点はそれぞれ0〜15。スライダーを動かすと、自作の波形とコードへ反映されます。

波形RAMに書く32点の値。横軸:点0〜31、縦軸:0〜15。音源の出力PCMではありません。
生成した左出力PCM。発音開始100 ms後から12 ms。縦軸−0.25〜0.25の固定スケール。波形RAMの値をそのまま描いた図とは、振幅・時間の単位が違います。
32点の配列をコピー・貼り付けする

JSON配列を貼り付けて「配列を読み込む」を押します。32点、各0〜15の整数のみを受け付けます。JavaScriptは実行しません。自作波形の受け渡しやAnalyzerから取り出した配列の試聴に使えます。

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

DMGのデジタル音源を既存WASMコアで生成します。実機のアンプ・スピーカー・アナログフィルターは再現しません。試聴だけに固定ゲインと両端10 msのフェードを加えます。図は加工前のPCMです。設定を変えると試聴が止まるので、もう一度再生してください。

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

値を変えるとコードとリンクが更新されます。PlaygroundでRunして試し、Stopで停止できます。

Playgroundで編集 ↗

チップでは、何が起きる?

32個の4 bit値を2点ずつ詰め、16 byteの波形RAM(FF30〜FF3F)へ転送します。stopAndSetWaveform()は転送前にWaveのDACを停止します。setNote()はNR33 / NR34、setLevel()はNR32、keyOn()はDAC有効化とtriggerに対応します。

音程をA3からA4へ変えると、同じ32点を読む速さが約2倍になります。録音PCMの「元の音程」を指定する操作ではありません。ここには長い録音サンプルもありません。

「32点に2周期」をA3で鳴らすと、32点全体を読む速さは同じでも、波の山が2回現れるため、1周期の波形より約1オクターブ高く聞こえます。配列の中の周期構造も音高に影響します。

出力レベルは4段階です。1/2と1/4は4 bit値のビットシフトなので、精密な連続ゲインとは異なり小さい値の段差も変わります。0はNR32のミュートで、DAC停止のkeyOff()とは異なります。図に一定値が残る場合でも、交流成分のない出力は音程のある音にはなりません。

貼り付けた波形だけで元のゲームの音が完全に再現されるとは限りません。元データの音程・レベル・発音タイミングや、発音後のレジスター変更も音を作っています。本ページにゲーム由来の波形は同梱していません。

Waveのレジスター仕様