はじめに
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つにあげられる。
機能
- 3つのプログラム可能なオシレータ(8オクターブ 約16 - 4000Hz )
- オシレータ毎にノコギリ波形・矩形波・パルス波・ノイズから1つを選択することができる
- 3つの独立した音量制御
- 3つのプログラム可能なエンベロープ・ジェネレータ
- 1つの複数モードを持つフィルタを持つ(ローパス・ハイパス・バンドパス・ノッチパス)
- オシレータ・シンク
- リング・モジューレーション
- 音量制御
- 2 A/D POT インターフェース(ジョイスティック・インターフェース)
- 乱数・変調ジェネレータ?
- 外部オーディオ・インプット
上記のとおりアナログ・シンセの特徴を持つ音源チップとなっている。
技術的な詳細
SIDはアナログとデジタルを統合した回路構成を持つ。制御ポートはすべてデジタルであり、出力はすべてアナログである。SIDは3音の音声合成を特徴とし、それぞれの音声は次の5つの波形の内1つを使用しなければならない: 矩形波(デューティー比可変)・三角波・ノコギリ波・擬似乱数によるノイズ・複数の混合波形(複数の波形を指定すると波形はミックスされるのではなく論理ANDされて出力されるので、元波形とは異なる波形が出力される)。
リング変調ビットをオンにすると他のボイスのリングモジュレータとして使用される。三角波出力はリング変調の結果に置き換わる。オシレータ・シンクビットをオンにすると強力に同期される。
それぞれの音はチップ内で外部コンデンサ(6581のCAP1A,1B,2A,2Bに接続)の支援により構築されたデジタル制御された12dbアナログ・マルチステート・フィルタに共通に通される。フィルタはローパス・バンドパス・ハイパス出力をもち、マスターボリュームレジスタを通して個々に最終出力を選択することができる。ローパスとハイパスの状態を組み合わせることによって、ノッチ出力(もしくはバンドパスの反転)出力を得ることができる。プログラマがフィルタカットオフ周波数およびレゾナンスを選ぶことができる。
3番目のオシレータ/エンベロープ・ジェネレータの出力はCPUより読み取りが可能となっている。この出力はビブラート・周波数/フィルタの整形・その他類似の効果のための変更情報ソースとして使用することが可能である。3番目のオシレータはゲームにおける乱数生成器としても利用できる。
SIDは外部オーディオ入力を処理することができる。外部オーディオ入力は内部出力とミックスして出力されるようになっている。
6581 SID Block Diagram
リンク元:http://www.waitingforfriday.com/wp-content/uploads/2017/01/SID_Block_Diagram.png
SID 制御レジスタ
SIDには制御のための29個の8ビットレジスタがある。レジスタは書き込みのみか読み取りのいずれかである。
RegNo (Hex) | データ | 名前 | タイプ | |||||||
---|---|---|---|---|---|---|---|---|---|---|
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | |||
ボイス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音を高速で繰り返す)などのプログラミングテクニック”を組み合わせることによって特徴的なサウンドを生み出している。しかしながらそのプログラミング・テクニックにより音質的に荒い感じのするものとなる。
SIDをゲーム音響用でなく『3音ポリ・シンセ』として使用すると、アナログ・シンセっぽい高品質な音を奏でることができるようである。
http://www.hypersynth.com/SIDizer/audio/MOS6581_Melody.mp3 (エフェクトがかかっているけど)
http://sid.kubarth.com/files/8580FLT.mp3 (これは8580だが)