Commodore 64 の音源チップMOS SID 6581を調べた

公開:2011-02-27 19:38
更新:2020-02-15 04:36
カテゴリ:音楽・動画,mos sid,ハードウェア,audio

はじめに


MOSのSIDチップは性能で他のPSGとは一線を画していた。当時の私のあこがれの的だった。今回チップの詳細について調べてみた。 内容は『Commodore SID 6581 Datasheet - http://www.waitingforfriday.com/?p=661』・『MOS Technology SID - http://en.wikipedia.org/wiki/6581を適当に端折って翻訳したものにコメントを加えている。

MOS Technology SIDとは

MOSテクノロジー 6581/8580 SID(サウンド・インターフェース・デバイス)はコモドールCBM-II・64・128・マックスマシーン内蔵のプログラム可能なサウンド・ジェネレータであり、PSGのカテゴリの1つにあげられる。

機能

上記のとおりアナログ・シンセの特徴を持つ音源チップとなっている。

技術的な詳細

SIDはアナログとデジタルを統合した回路構成を持つ。制御ポートはすべてデジタルであり、出力はすべてアナログである。SIDは3音の音声合成を特徴とし、それぞれの音声は次の5つの波形の内1つを使用しなければならない: 矩形波(デューティー比可変)・三角波・ノコギリ波・擬似乱数によるノイズ・複数の混合波形(複数の波形を指定すると波形はミックスされるのではなく論理ANDされて出力されるので、元波形とは異なる波形が出力される)。
リング変調ビットをオンにすると他のボイスのリングモジュレータとして使用される。三角波出力はリング変調の結果に置き換わる。オシレータ・シンクビットをオンにすると強力に同期される。

それぞれの音はチップ内で外部コンデンサ(6581のCAP1A,1B,2A,2Bに接続)の支援により構築されたデジタル制御された12dbアナログ・マルチステート・フィルタに共通に通される。フィルタはローパス・バンドパス・ハイパス出力をもち、マスターボリュームレジスタを通して個々に最終出力を選択することができる。ローパスとハイパスの状態を組み合わせることによって、ノッチ出力(もしくはバンドパスの反転)出力を得ることができる。プログラマがフィルタカットオフ周波数およびレゾナンスを選ぶことができる。

3番目のオシレータ/エンベロープ・ジェネレータの出力はCPUより読み取りが可能となっている。この出力はビブラート・周波数/フィルタの整形・その他類似の効果のための変更情報ソースとして使用することが可能である。3番目のオシレータはゲームにおける乱数生成器としても利用できる。

SIDは外部オーディオ入力を処理することができる。外部オーディオ入力は内部出力とミックスして出力されるようになっている。

ということで、SIDはエンベロープジェネレータ による振幅変調(AM)までがデジタル処理で、その後のフィルタ・全体音量制御はアナログで行われていると推測する。

6581 SID Block Diagram
リンク元:http://www.waitingforfriday.com/wp-content/uploads/2017/01/SID_Block_Diagram.png

SID 制御レジスタ

SIDには制御のための29個の8ビットレジスタがある。レジスタは書き込みのみか読み取りのいずれかである。

表1:SIDレジスタ一覧
RegNo
(Hex)
データ名前タイプ
D7D6D5D4D3D2D1D0
ボイス1
00 F7 F6 F5 F4 F3 F2 F1 F0 周波数
下位8bit
書き込み
01 F15 F14 F13 F12 F11 F10 F09 F08 周波数
上位8bit
書き込み
02 PW7 PW6 PW5 PW4 PW3 PW2 PW1 PW0 パルス幅
下位8bit
書き込み
03 - - - - PW11 PW10 PW9 PW8 パルス幅
下位4bit
書き込み
04 NOISE 矩形波 鋸波 三角波 TEST RING
MOD
SYNC GATE 波形・制御 書き込み
05 ATK3 ATK2 ATK1 ATK0 DCY3 DCY2 DCY1 DCY0 アタック
ディケイ
書き込み
06 STN3 STN2 STN1 STN0 RLS3 RLS2 RLS1 RLS0 サスティン
リリース
書き込み
ボイス 2
07 F7 F6 F5 F4 F3 F2 F1 F0 周波数
下位8bit
書き込み
08 F15 F14 F13 F12 F11 F10 F09 F08 周波数
上位8bit
書き込み
09 PW7 PW6 PW5 PW4 PW3 PW2 PW1 PW0 パルス幅
下位8bit
書き込み
0A - - - - PW11 PW10 PW9 PW8 パルス幅
下位4bit
書き込み
0B NOISE 矩形波 鋸波 三角波 TEST RING
MOD
SYNC GATE 波形・制御 書き込み
0C ATK3 ATK2 ATK1 ATK0 DCY3 DCY2 DCY1 DCY0 アタック
ディケイ
書き込み
0D STN3 STN2 STN1 STN0 RLS3 RLS2 RLS1 RLS0 サスティン
リリース
書き込み
ボイス 3
0E F7 F6 F5 F4 F3 F2 F1 F0 周波数
下位8bit
書き込み
0F F15 F14 F13 F12 F11 F10 F09 F08 周波数
上位8bit
書き込み
10 PW7 PW6 PW5 PW4 PW3 PW2 PW1 PW0 パルス幅
下位8bit
書き込み
11 - - - - PW11 PW10 PW9 PW8 パルス幅
下位4bit
書き込み
12 NOISE 矩形波 鋸波 三角波 TEST RING
MOD
SYNC GATE 波形・制御 書き込み
13 ATK3 ATK2 ATK1 ATK0 DCY3 DCY2 DCY1 DCY0 アタック
ディケイ
書き込み
14 STN3 STN2 STN1 STN0 RLS3 RLS2 RLS1 RLS0 サスティン
リリース
書き込み
Filter
15 - - - - - FC2 FC1 FC0 フィルタカットオフ
下位3Bit
書き込み
16 F15 F14 F13 F12 F10 F09 F08 F07 フィルタカットオフ
上位8Bit
書き込み
17 RES3 RES2 RES1 RES0 Filter EX Filter 3 Filter 2 Filter 1 レゾナンス/フィルタ 書き込み
18 3 OFF HP BP LP VOL3 VOL2 VOL1 VOL0 モード/ボリューム 書き込み
Misc
19 PX7 PX6 PX5 PX4 PX3 PX2 PX1 PX0 POTX 読み込み
1A PY7 PY6 PY5 PY4 PY3 PY2 PY1 PY0 POTY 読み込み
1B 07 06 05 04 03 02 01 00 OSC3/Random 読み込み
1C E7 E6 E5 E4 E3 E2 E1 E0 ENV3 読み込み

SID 制御レジスタの詳細

音声 1-3共通

周波数(レジスタ00-01(ボイス1),07-08(ボイス2),\u00240E-\u00240F(ボイス3))
オシレータの周波数をレジスタを2つ使用し、16ビット値で線形に制御する。周波数値は線形に変化する。レジスタ値から周波数を求める式は下記の通りである。
(出力周波数)= (レジスタ16ビット値) (Φ02ピンに入力されたクロック周波数 / 16777216) (Hz)
標準では1MHzのクロックがΦ02ピンに入力されるため、結果周波数は下記の式で求めることができる。
(出力周波数)= (レジスタ16ビット値 0.0596)(Hz)
音階に対応した周波数を上記公式でリアルタイムに求めることは処理速度的に困難であったので、事前に上記公式で算出したテーブルを持っていた。さまざまな調律音階を実現するための十分な分解能をSIDは有している。また周波数の増分を意識することなく音階から音階へのなめらかな変更(ポルタメント)を可能にしている。
パルス幅(レジスタ02-03(ボイス1),09-$0A(ボイス2),$10-$11(ボイス3))
オシレータが矩形波(パルス波)である場合にレジスタを2つ使用し、12ビット値でパルス幅(デューティーサイクル)を線形で制御する。パルス幅は下記の式で求められる。
(パルス幅) = (レジスタ12ビット値 / 40.95)(%)
パルス幅は増分を意識せずなめらかに変更することが可能である。 レジスタの値が0か4095($FFF)の場合は常にDC出力される。レジスタ値が2048(0x800)の場合方形波を出力する。
制御レジスタ(レジスタ04(ボイス1),$0B(ボイス2),$12(ボイス3))
このレジスタは8つのビットでオシレータの様々な制御を行う
ゲート(Bit0)
このビットを1にセットすると発音が開始され、エンベロープ・ジェネレータが初期化され、アタック・ディケイ・サスティーンサイクルが開始される。このビットを0にリセットするとリリースサイクルに遷移する。
オシレータ・シンク(Bit1)
1にすると、オシレータ・シンクする(ボイス1→ボイス3・ボイス2→ボイス1・ボイス3→ボイス1)。
オシレータ・シンクに関しての解説:http://www.g200kg.com/jp/docs/dic/oscillatorsync.html
リング・モジュレータ(Bit2)

このビットをセットするとリング・モジュレータが有効となる。リング・モジュレータを使用するためには、ビットをセットするボイス波形が三角波にセットされていなければならない。SIDはリング変調した出力を三角波の出力に置き換える。 オシレータ(発振器)1にセットした場合、オシレータ(発振器)1とオシレータ(発振器)3がリング変調されオシレータ1に出力される。オシレータ2の場合オシレータ1とオシレータ2のリング変調した値がオシレータ2に出力される。オシレータ3の場合オシレータ1とオシレータ3のリング変調した値がオシレータ3に出力される。

リング・モジュレータは非整数次倍音を含む音(鐘など)を作るために使われる
リング・モジュレータについての解説:http://www.denhaku.com/course/23.htm
Test(Bit3)
このビットをセットすると、ビットがクリアされるまでオシレータ(発振器)の出力が固定される。通常はこのビットはテスト目的で使用されるが、外部イベントとオシレータ(発振器)を同期させたり、ソフトウェアでコントロールすることでかなり複雑な波形を生成する目的で使用することもできる。
三角波(Bit4)
このビットをセットするとオシレータ(発振器)の波形は三角波となる。
ノコギリ波(Bit5)
このビットをセットするとオシレータ(発振器)の波形はノコギリ波となる。
矩形波(Bit6)
このビットをセットするとオシレータ(発振器)の波形は矩形波となる。この波形に限りパルス幅をコントロールできる。
ノイズ(Bit7)
このビットをセットするとオシレータ(発振器)の波形はノイズとなる。ノイズはオシレータ(発振器)の周波数レジスタによってその質が変化する。
オシレータの出力波形は加算されない。もし1つ以上の波形が選択された場合その結果は論理ANDとなる。この仕様は指定できる4つの波形に新たな波形を生成する手段として利用できるけれども、ノイズ波形を選択している場合にさらに他の波形を指定するとノイズ固定となってしまうので注意すること。もしこうなってしまった場合にはテストビットかもしくはリセットするまで出力され続ける。
アタック・ディケイ(レジスタ05(ボイス1),$0C(ボイス2),$13(ボイス3))

ビット4-7はアタック・レートを1~16の値で選択する。ビット0-3はディケイ・レートを1~16の値で選択する。各値がどの程度の時間となるかは表2の通りである。

表2
10進16進アタック・レート
(Time/Cycle)
ディケイ/リリース・レート
(Time/Cycle)
0 (0) 2 mS 6 mS
1 (1) 8 mS 24 mS
2 (2) 16 mS 48 mS
3 (3) 24 mS 72 mS
4 (4) 38 mS 114 mS
5 (5) 56 mS 168 mS
6 (6) 68 mS 204 mS
7 (7) 80 mS 240 mS
8 (8) 100 mS 300 mS
9 (9) 250 mS 750 mS
10 (A) 500 mS 1.5 S
11 (B) 800 mS 2.4 S
12 (C) 1 S 3 S
13 (D) 3 S 9 S
14 (E) 5 S 15 S
15 (F) 8 S 24 S

表2のレート(時間/サイクル)は、入力クロックが1MHzの倍である。他のクロックの場合、(1MHz)/(入力クロック)をかけた時間となる。

サスティーン・リリース(レジスタ06(ボイス1),$0D(ボイス2),$14(ボイス3))

ビット4-7(STN0-STN3)は1から16までのサスティーン レベルを指定する。0が振幅(音量)0で15が最大である。8は元波形の1/2の振幅となる。

ビット0-3(RLS0-RLS3)はリリース・レートを1~16の値で選択する。各値がどの程度の時間となるかは表2の通りである。

注意:エンベロープ・ジェネレータの周期は特に制限無くゲート・ビットでコントロールできる。もしアタック・サイクルが終了する前にゲート・ビットをリセットしてもすぐさまリリースサイクルが、その時の振幅レベルで開始される。もしリリースサイクルが終了する前にゲート・ビットをセットた場合、その時の振幅レベルでアタック・サイクルが開始される。この仕様はリアルタイム・ソフトウェアコントロールによる複雑なエンベロープ・コントロールに使用することができる。

フィルタ

フィルタ・カットオフ周波数($15H,$16H)
11ビット精度でフィルタのカットオフ周波数を設定する。カットオフ周波数は線形に遷移する。$15レジスタのビット3-7は使用されていない。カットオフ周波数の範囲は約30Hz - 10KHzである(CAP1・CAP2に付けるコンデンサが2200pFの場合)。
レゾナンスおよびフィルタ出力($17)
Bit4-7

0-15の値でフィルタ・レゾナンスを設定する。

フィルタ出力(ボイス1(Bit 0),ボイス2(Bit 1),ボイス(Bit 2),外部入力(Bit 3))
各ボイスおよび外部入力をフィルタへ出力するかどうかを指定する。ビットをセットするとフィルタへ出力され、リセットするとフィルタを介さず直接出力される。
フィルタモード/音量($18)
Bit 4-7はフィルタモードおよび出力設定を行う。
ローパス(Bit 4)

このビットをセットするとローパスフィルタとなる。カットオフ周波数以上の出力は減衰する。減衰率は12dB/オクターブである。


本当は指数的に減衰するけど、曲線を書くのが面倒くさいので直線にしている。
バンドパス(Bit 5)

このビットをセットするとバンドパスフィルタとなる。カットオフ周波数付近以外の出力は減衰する。減衰率は6dB/オクターブである

ハイパス(Bit 6)

このビットをセットするとハイパスフィルタとなる。カットオフ周波数以下の出力は減衰する。減衰率は12dB/オクターブである。

ボイス3の出力Off(bit 7)

このビットがセットされると、ボイス3は出力されなくなる。他のボイスの変調目的などでボイス3を使用し、音声として出力したくない場合にセットする。

フィルターモードは複数設定できる。例えばローパスとハイパスを同時にセットするとノッチフィルタの効果を得られる。

SIDの場合フィルタ・カットオフ周波数を変化される機能は無いので、ソフトウェアでコントロールする必要がある。またフィルタは1個なので各ボイス毎に異なるフィルタをかけることはできない。

音量(Bit 0-3)
0-15の値で出力音量を設定する。音量は線形に変化する。ソフトウェアでコントロールすることによりトレモロなどの音量変化エフェクトをかけることができる。

その他

POTX,POTY($19,$1A)
ジョイスティックなどの位置デバイスの値を取得する。この値は512入力クロック毎に更新される。
オシレータ3及び乱数値の読み取り($1B)
このオシレータ3出力の上位8ビットの値を読み出す。
この記述でSIDのは波形メモリは8ビット以上の量子化ビット数を持つということになる。
この値を読み取ることで変調用波形(LFOなど)に利用出来る。ノイズ波形を選んでおくとゲーム用の乱数値にも利用できる。
エンベロープジェネレータ3の値の読み取り($1C)
ボイス3のエンベロープジェネレータの値を読み取ることができる。この値も変調用波形として使用できる。

SIDサウンド

”リングモジュレーション”・”フィルタ”・”アルペジオ(コード音をつくるために2音または3音を高速で繰り返す)などのプログラミングテクニック”を組み合わせることによって特徴的なサウンドを生み出している。しかしながらそのプログラミング・テクニックにより音質的に荒い感じのするものとなる。

この荒い音質は高速アルペジオのせいだけではなく、6580のD/Aコンバータによる要素のほうが大きい。D/A時にかなりディストーションがかかるようである。後継版の8580では改善されているらしい。

SIDをゲーム音響用でなく『3音ポリ・シンセ』として使用すると、アナログ・シンセっぽい高品質な音を奏でることができるようである。
http://www.hypersynth.com/SIDizer/audio/MOS6581_Melody.mp3 (エフェクトがかかっているけど)
http://sid.kubarth.com/files/8580FLT.mp3 (これは8580だが)