AmigaにおけるCPU使用率ゼロのAtari音楽エミュレーション:ハードウェアハッキングの傑作

AmigaにおけるCPU使用率ゼロのAtari音楽エミュレーション:ハードウェアハッキングの傑作

デモシーンの記録更新競争とハードウェアの制約が交差する場所では、しばしば最も独創的なエンジニアリングが生まれます。最近、Amiga 500で'sin-dots'のレンダリング記録を更新するという挑戦において、開発者のLeonard (z303) は独自の制約に直面しました。彼は、デモ中にAtari STの音楽を流して「Atariプログラマー」という冗談めいた揶揄に答えたいと考えていましたが、AtariのYM2149サウンドチップをエミュレートするためのCPU負荷が高すぎて、グラフィカルな記録更新を妨げてしまうという問題がありました。

これを実現するために、LeonardはAmigaのカスタムハードウェアを使用してYM2149をエミュレートする方法を開発し、CPU負荷を実質的にゼロに抑えることに成功しました。このプロセスには、YM2149とAmigaのPAULAチップ間のアーキテクチャの違いに関する深い洞察と、ボリューム・モジュレーションをどのように操作するかに関する「エウレカ(発見)」の瞬間が含まれていました。

アーキテクチャの隔たり:YM2149 vs. PAULA

この挑戦を理解するには、まずハードウェアを見る必要があります。YM2149(AY-3-8910のバリアント)はシンセシス・チップです。3つの矩形波ボイスと、擬似乱数ノイズジェネレーター、および基本的なハードウェア・ボリューム・エンベロープを備えています。

対照的に、AmigaのPAULAチップはPCMサンプル再生エンジンです。従来の意味での波形を「生成」するのではなく、メモリから8ビットの符号付きサンプルを再生します。PAULAはより高度ですが、YM2149のようなネイティブな矩形波やノイズ生成機能は備えていません。

「MadMax Buzzer」とエンベロープの課題

単純な矩形波は味気ない音になります。Atariのハイエンドな音楽、特にJochen Hippel (MadMax) のようなミュージシャンが切り拓いた、あのうねるような攻撃的な音色を捉えるには、「MadMax Buzzer」をエミュレートしなければなりません。

YM2149では、このエフェクトはハードウェア・エンベロープ・ジェネレーターをボリューム制御としてではなく、音源そのものとして使用することで実現されます。可聴周波数で三角形のエンベロープを有効にし、それをわずかにデチューンされた矩形波と組み合わせることで、チップは複雑で動きのある波形を生成します。

「Attached Voice」ハックの実装

Leonardの最初の試みは、PAULAの「attached voice」モードを使用することでした。このめったに使われないモードでは、1つのPAULAボイスが別のボイスの周期やボリュームをモジュレート(変調)できます。計画では、3つのボイスを矩形波に使用し、4つ目のボイスをYM2149のエンベロープを模倣するためのボリューム・モジュレーターとして使用する予定でした。

しかし、この最初の試みは失敗しました。attached voiceによるモジュレーション・データはオーディオ・サンプル再生の半分の速度で動作するため、結果として得られた三角形のエンベロープは「カクカク」として粗く、オリジナルのAtariサウンドのような滑らかなうねりを欠いていました。

エウレカの瞬間:役割の逆転

突破口は、ある気づきから生まれました。三角形の波形は滑らかに聞こえるために高い解像度が必要ですが、矩形波はそうではありません。サンプルとモジュレーターの役割を逆転させることで、Leonardは望み通りの結果を得ました。

  1. サンプル: 三角形のエンベロープ形状は、高解像度の8ビットPCMサンプルとして保存されました。
  2. モジュレーター: 矩形波は、16ビットのモジュレーター・フォーマットで保存されました。

矩形波を使用して三角形サンプルのボリュームをモジュレートすることで、モジュレーターの低解像度という性質が、オーディオの音質を低下させることがなくなりました。その結果、MadMax buzzerエフェクトの忠実な再現が可能になりました。

COPPERによるCPU使用率ゼロの実現

最適化されたオーディオであっても、毎フレームPAULAレジスタを更新することは依然としてCPUサイクルを消費します。真の「0% CPU負荷」に到達するため、LeonardはAmigaの専用コプロセッサであるCOPPERを活用しました。

COPPERは、カスタムチップ・レジスタに即時値を書き込み、特定の画面位置を待機することができます。これらはすべて、Motorola 68000 CPUと並行して動作します。各音楽フレームごとに自己結合型のCOPPERリストを事前に生成しておくことで、オーディオの更新は完全にCPUからオフロード(切り離し)されました。

結論:結果と考察

オーディオ・エミュレーションを完全にCOPPERとPAULAにオフロードすることで、Leonardは68000 CPUの全サイクルをグラフィカルな計算に充てることができました。これにより、彼はsin-dotsの記録を6,682から7,210 dotsへと押し上げることができました。しかも、複雑なAtari音楽を流しながらです。

このプロジェクトは、カスタムハードウェアの力を示し、デモシーンの創造性を思い出させてくれます。コミュニティのメンバーが指摘するように、Amigaのコプロセッサがタスクを並行処理できる能力は、単純なクロック速度に依存する現代のPCアーキテクチャには欠けている機能であり、それは低レベル・デベロッパーにとって根本的に異なる感覚を与えます。

"We lived in the future and then it was taken from us for a while."

技術的な実装に興味がある方は、完成したデモはPouetで見つけることができます。COPPERとPAULAの相ジーティ(相乗効果)を使い、ソフトウェア・エミュレーションだけでは不可能だった偉業を成し遂げたことを示しています。

Sources