
2026/09/28 3:30
ZX スペクトラムの 1 ビットピッパによるデジタルオーディオ
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
このテキストは、システム単一の簡素なビーパーを最適化されたソフトウェアタイミングで精密に操作し、高品質なデジタルオーディオを実現する ZX スペクトラムプロジェクトを記録しています。シャドウレジスターを利用した
EXX 指示および厳格なメモリ制限内でのポインタ管理により、著者は 16kHz の再生レートを達成し、もともとの低忠実度の 8kHz 出力を大幅に向上させました。これは、スピーカーの慣性による初期の制限を克服し、97 マイクロ秒から 170 マイクロ秒間のパルス幅を最適化することで、きついトーンではなく滑らかな遷移を実現したためです。開発には、C コンパイラーの有効的な使用を妨げる激しいレジスター圧力のためにアセンブリ言語で 2 回の完全な書き換えが必要とされ、また PC と異なり専用のハードウェアタイマーを使用せず(NOP 指示によって微調整された遅延を実現)、音量は波データを事前に処理する代わりにジャンプテーブルの値を変更して「内蔵増幅」を提供する独自ロジックテーブルで実装されました。検証により、デモが本物の 48K マシン(gmc および Omni 128 ビルドによって確認)、Spectaculator などの現代ハードウェア、Fuse、EightyOne、Zesarux、Clock Signal、Zesarux を含むエミュレーター上で動作することが確認されました。この手法では全使用可能な RAM をサンプルデータに割り当てる必要があり、システムクラッシュを防ぐためにシャドウレジスターからの退出時に慎重な処理が必要とされますが、これは新規かつ効率的なオーディオ合成法を確立します。Dmitry Milk の「CORE5」や Michael J. Mahon の Apple IIe 用の RTSynth(および Class Apples アルバム)などのプロジェクトに触発されたこのアプローチは、スペクトラムという「黄金期」のシステムにおける直接ハードウェア能力を活用しており、他の 8 ビットアーキテクチャでしばしば必要な重い回避策を避けます。本文
ZX スペクトラムの 1 ビットビープ音を高品質なデジタルオーディオへ:究極のリビルドプロジェクト
ZX スペクトラムシリーズを締めくくる最終章として、あらゆる種類の ZX スペクトラムで搭載されている単純な 1 ビットのビープ音を、高品質なデジタルオーディオへと変換する技術の開発を行いました。その結果は非常に良好でした。
成果と検証環境
- 画期的な音質向上
- 先週公開したデモリールの再生音がこれであり、以前の単純な PCM 再生システムとの差は**「天上地下」**と言えるほどです。
- ハードウェア・ソフトウェアの双方での動作確認
- オリジナルハードウェア: デモプログラムの正常動作を確認済み。
- 現代のリビルト機(クラオン): 「gmc」氏(マストドンアカウントを通じて 48K スペクトラムで動作確認)と、トム・ハート氏(オミニ 128 システムで結果を得た)により検証済み。
- エミュレーターでの互換性
- 上記のデモは
を用いてキャプチャしていますが、以下のプラットフォームでも正常に動作します。Fuse- EightyOne
- Zesarux
- Spectaculator
- Clock Signal
- 上記のデモは
技術的な課題と制約
この技術の実用性にはいくつかの限界が存在します。
- 音量の問題: 外部アンプを接続していないハードウェア上で再生すると、出力音量が非常に小さくなります。
- メモリ容量: サンプルの長さや品質を維持するには、必要な RAM が**「ほぼ全て」**を占めてしまいます。
- 開発の難易度:
- 動作するものを手に入れるまでに2 回の完全な書き換えが必要でした。
- 設定したタイミング制約にギリギリの状態で収める必要があり、従来使用したことないテクニックを駆使しました。
- アセンブリ言語での作業が必須であり、C 言語でのコンパイルサポートでは対応不可能でした(厳密なタイミング指令列とレジスタ圧力の両立のため)。
開発の歩み:誤った試みから突破へ
先行の研究と基本原理
- DOS 時代の Eric the Unready や Star Control II における PC スピーカーの活用経験から学んだ技術背景です。
- 物理的な基本原理: 回路の電容とスピーカーの質量により、信号の遷移とコーンの振動には時間がかかります。これを巧みに利用することで、より細かく変動する音波を得ます。
- PC の容易な I/O と独立したハードウェアタイマーとは異なり、スペクトラムではソフトウェア上でサンプリングレートとパルス幅を制御する必要があります。
誤った試み 1:実際の遅延ループ
- 計算結果: スペクトラム CPU(約 3.5MHz)で 125 マイクロ秒は 438 サイクルに相当します。
- アプローチ: 4 ビット PCM データを読み込み、スピーカー ON/OFF を行い、その間に NOP ループで遅延させる方式。
- 結果: 耳にすることは鋭い高音の笛声のみ。単に 8kHz のトーンを発生しただけであり、音源としての機能不全でした。
誤った試み 2:動的遅延
- 改善策: 固定された長い NOP ストリームではなく、計算されたジャンプによる微調整可能なプログラム遅延を採用。6502 アーキテクチャのトリックも検討しましたが、4 サイクル精度で十分でした。
- 発見: 結果は主に 8kHz トーンですが、その裏に音声クリップのささやきがうっすらと聞こえるようになりました。技術の有効性が示唆されました。
- 要因: スペクトラムのスピーカーが PC よりも軽量であること、および 4 ビット信号内の値が約 20 マイクロ秒のダイナミックレンジに対応できることが判明しました。
道を見つけること(Blip Buffer の発見)
エミュレーターのソースコード調査により、オーディオ信号の滑らかにする**「Blip Buffer システム」**が存在することが分かりました。Fuse- 重要な洞察: システムの物理的な慣性(スピーカーが動き始め減速するまでの時間)を無視して 8kHz よりも長い遷移時間を必要としており、これは 4〜7 サンプル(97〜170 マイクロ秒)に相当します。
Sawtooth から Sample へ
- 自己改変コードの最適化:
- 各パルスを 2 回送信するマクロ方式を採用し、ジャンプテーブルで切替を行うことで、ロジックを厳格かつ効率的にしました。
マクロを用いて、スピーカー ON → NOP 遅延 → スピーカー OFF のサイクルを実現。pcmstep
- レジスタ管理の革新:
- 16 ビットカウンターとポインタとの競合問題を解決するため、**シャドウレジスタ(EXX)**を活用して通常レジスタを解放しました。
- これにより16kHz のサンプリングレートに合わせることが可能になりました。
- メモリ容量の対策:
- 16kHz で約 40KB に及ぶクリップが 32KB メモリに収まらない問題に対し、
を各パルスで 2 回送信することで回避しました。pcmstep
- 16kHz で約 40KB に及ぶクリップが 32KB メモリに収まらない問題に対し、
- 振幅補正とシステム安定化:
- ジャンプテーブル内で増幅とクリッピング(値から 5 を引いて 3 倍など)を事前に行い、エミュレーターでの出力を確認しました。
- 終了時のシステムクラッシュを防ぐため、シャドウレジスタ内の値を保護するコードを追加しました。
ファイナルな再生コード
- 構成:
ルーチンが割り込み制御とシャドウレジスタの保存/復元を行い、メインループを呼び出します。playwav - タイミング制御: 全体のループを 438 サイクルとし、スピーカー ON/OFF のタイミングを厳密に制御(サイクル 219 と 438 で OFF)。
- ジャンプテーブル: 32 バイト境界に整列させ、キャリーオーバーを防ぎながら内蔵増幅機能を持たせています。
関連する研究と比較
Dmitry Milk の Beeperdrive や Michael J. Mahon の RTSynth システムなどの成果と比較検討しました。
- SoftSoniq と CORE5 エンジン:
- Dmitry Milk は GitHub で「CORE5」エンジンのコードを公開しており、より高度なシンセサイザー機能(256 個のブランチ、8 ビットオーディオ)を実現しています。
- 高速化テクニック: HL レジスタを再利用してスタックポインターを間接的に呼び出しターゲットとする手法など、Dmitry のコードには驚くほど効率的な Z80 テクニックが含まれていました。
- Mahon の RTSynth:
- Apple IIe 向けのシステムであり、異なる CPU(6502)ですが類似したアプローチを取っています。
- PC スピーカーと同様の原理ですが、Apple の制御ロジックは単純化されています。
今後の可能性と評価
技術的拡張性
- C64との連携: C64 ではランレングス符号化された 4 ビット PCM を 1MHz の 6502 で 16kHz に変換するスキームも可能です(ただし 14 サイクルの制約が残ります)。
- マルチトラック: 逆方向に進み、信号をさらに細かく分割することで 5 ビットまたは 6 ビットのサウンドへ拡張可能ですが、4 ビットで十分であることを考慮して今回は見送りました。
- フルミュージックエンジン: Softsoniq エンジンのような音楽再生への拡張も検討されましたが、既に同様のプロジェクトが存在するため、今回の範囲に留めました。
ZX スペクトラムの評価
- バランスの良さ: システムが強力になるにつれて一般的になった複雑な処理(C64/Amiga 型)とは異なり、スペクトラムは**「あなたが望むものを直接求めて得られる」**シンプルさが特徴です。
- スイートスポット: 生パワーと控えめ仕様の間で極めて快適なバランスを備えており、ユーザーに親しみやすく能力を利用できる点で優れています。
このプロジェクトにより、1 ビットのビープ音が高品質な音楽体験へと生まれ変わることを証明しました。