GAME BOY / 03
32点の波形を、描いて鳴らす
Waveチャンネルは32点の小さな波形を繰り返し読みます。形を変える操作と、その波形を読む速さを変える操作を、別々に試しましょう。
値を変えて、聴き比べる
三角波とノコギリ波を、同じA3で聴き比べます。下の32点はそれぞれ0〜15。スライダーを動かすと、自作の波形とコードへ反映されます。
32点の配列をコピー・貼り付けする
JSON配列を貼り付けて「配列を読み込む」を押します。32点、各0〜15の整数のみを受け付けます。JavaScriptは実行しません。自作波形の受け渡しやAnalyzerから取り出した配列の試聴に使えます。
再生ボタンを押すまで音は鳴りません。
DMGのデジタル音源を既存WASMコアで生成します。実機のアンプ・スピーカー・アナログフィルターは再現しません。試聴だけに固定ゲインと両端10 msのフェードを加えます。図は加工前のPCMです。設定を変えると試聴が止まるので、もう一度再生してください。
同じ設定を、コードで持ち帰る
値を変えるとコードとリンクが更新されます。PlaygroundでRunして試し、Stopで停止できます。
チップでは、何が起きる?
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()とは異なります。図に一定値が残る場合でも、交流成分のない出力は音程のある音にはなりません。
貼り付けた波形だけで元のゲームの音が完全に再現されるとは限りません。元データの音程・レベル・発音タイミングや、発音後のレジスター変更も音を作っています。本ページにゲーム由来の波形は同梱していません。