趣味でやっているハードウェア関連(主にFPGA/レトロアーケード基板互換SoC開発)について書いていきます。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
前回まであんまり派手さのないROM周りの話をしてきましたが、今回は音源周りです。
「ゼビウス」の実機には、3チャンネルのWSGと爆発音専用音源が搭載されています。
WSGは、波形メモリ音源と呼ばれる種類のもので、小さな波形データ(16~32サンプル程度)を用いて音声を発生させます。
なんてシンプル!
ステレオリバーブは音がリッチな感じになるので入れてみました。
「ゼビウス」の実機には、3チャンネルのWSGと爆発音専用音源が搭載されています。
このWSGという音源は、当時の「ナムコらしさ」を音の面から支えていた立役者でもあります。
当時、主流で他社の基盤でよく採用されていたテキサス・インスツルメンツ社のPSGとは、明らかに一線を画した音を出していました。
店舗でナムコの新作が稼働を始めると、入り口の前を通っただけですぐに気が付いたものです。
音を聞いただけで「ナムコだ!」とわかるのです。
(もちろんこれはハードウェアだけではなくて、音楽制作者のセンスの賜だと思いますが)
(もちろんこれはハードウェアだけではなくて、音楽制作者のセンスの賜だと思いますが)
WSGは、波形メモリ音源と呼ばれる種類のもので、小さな波形データ(16~32サンプル程度)を用いて音声を発生させます。
波形データを工夫することで「マッピー」で鳴っている特徴的なバンジョーの音など、単純な矩形波や正弦波にとどまらない音色を出すことができます。
(余談ですが、家庭用機のPCエンジンにも同様の方式の音源が載っています。)
いろんな音を出せるわりには原理が簡単で、初めて知った時には「こんな簡単な方法でこれだけの音が出せるなんて!」と感動したものです。
この音源を実現するのに、1チャンネルあたりに必要なものは、4つのレジスタと加算器だけです。
(あとは時分割で使う波形ROMと乗算器とミキシング用の加算器)
文章で説明するより前に、まずはソースをどうぞ。
"Sound Generator(s)"というコメントがある所を読んでもらえると分かると思うのですが、このモジュールは4クロックで1サンプルを出力するような実装になっています。
(1クロックで1チャンネル分の処理を行うためです。)
(1クロックで1チャンネル分の処理を行うためです。)
そのため出力するサンプリングレートの4倍のクロックを入れる必要があります。
今回は実機と同じ96KHzで動作させています。出力のサンプリングレートは24KHzです。
波形は1種類あたり32サンプルで8種類載せられます。
(波形メモリ全体の容量は256サンプル)
チャンネル毎に、以下の4つのレジスタを持っています。
・カウンタ (20/16bits)
・周波数設定レジスタ (20/16bits)
・波形指定レジスタ (3bits)
・音量設定レジスタ (4bits)
("20/16"と書いてあるのは、第1チャンネルのみ20bitsの精度を持っていて、残りは16bitsだからです。)
そしてチャンネル毎に、以下のような処理をしてサンプル値を求めます。
・周波数設定レジスタの値をカウンタに加算する。
・カウンタの値の上位5ビットと波形指定レジスタの値を使って波形メモリの参照アドレスを得る。
・波形メモリから値(4bits)を読み出して、音量設定レジスタの値を乗算する。
その結果がそのチャンネルの出力値です。
同様に残りのチャンネルも処理して、全てのチャンネルの出力値を加算して平均を取れば、それが音源のデジタル出力になります。
あとはそのデジタル出力を適当なDAC(実機では抵抗DAC)に入れてあげれば、音声として聞こえるわけです。
なんてシンプル!
この原理と回路を最初に考えた人は天才だと思います。
( 「マッピー」や「ドルアーガの塔」では8チャンネルに拡張されていますが、原理は同様です。)
今回のソースは、さらにマスターボリューム設定/外部PCM入力/ステレオリバーブとΔΣDACを内蔵した豪華版(?)です。
ステレオリバーブは音がリッチな感じになるので入れてみました。
「オリジナルはモノラルなのに邪道!」と思う方は OUT_L の出力だけを聞いてください。
外部PCM入力は、「爆発音専用音源」の出力をミックスするために付けてあります。
「爆発音専用音源」については、いろいろ事情があるので次回以降に。
ではまた。
PR