注意:この記事の内容を鵜呑みにし、事故や損失を招いた場合でも当方は一切の責任は負いかねます。自己責任でお願いします。
秋月電子のお楽しみ袋に入っていた謎のIC 「TAXAN KY-3201P SGC」を0から解析してみました。
その結果、4音+ノイズ1音のSSG音源ICであることがわかりました。
この記事では、解析から演奏までを説明します。「1.解析」は飛ばしても構いません。
現在も解析中であるため、内容はちょくちょく修正されます。ご了承ください。また、間違いや新しい情報などコメント欄にコメントして頂くととても助かります。
構成:
1.解析
2.仕様
3.使い方
4.テスト
5.プログラム
6.まとめ
1.解析
ネット上にはデータシートはおろか、採用例なども見つからず使用を諦めていました。ですが、このICがPSG音源ICという情報を見つけ解析を始めました。
まず、データーシートが手に入らない以上ICのピンがどのようになっているかが不明です。なので手掛かりを見つけるためにICを燃やしてダイの構造を観察することにしました。
ダイの構造を見ると左下らへんにレジスタ領域があります。(Twitter上ではまだこのICが何者かわからなかったためにROM書いてありますが間違いです。)
拡大してみると8bit×16が2つあり、アドレスが0x00から0x1Fをもつ8bitレジスタ群ということが予想出来ます。制御する上で重要な情報が入りました。
次にICのピンとダイを繋ぐボンディングパッドの形状を見てみます。
上下4か所、左右6か所あり、下の2か所が特徴的な形状をしています。
他の箇所と比べ大きくなっているので電源ピンと仮定することが出来ます。
また、その間にあるボンディングパッドは他の箇所と比べ小さいく、1か所しかないため特別な入出力ピンと予想できます。
このICのピンで言うと電源ピンは4番と6番に当たることがわかります。ここでピンと来る方もいるでしょう。
そう、このICの電源ピンの位置とYAMAHAのPSG音源IC「YMZ294」の電源ピンの位置が似ています。つまりこのIC自体「YMZ294」に近い性能を有している可能性があります。
以上がICのダイからわかる情報です。
ここからはこの予想をもとに各ピンの役割を解明していきます。
「YMZ294」に近いICということがわかったので、「YMZ294」のピンアサインと近いことが予想できます。そこで「YMZ294」のデータシートをもとに解析していきます。
まずは電源ピンの確定です。ダイの画像からは電源ピンの位置はわかりますが、VddかGNDかがどちらかわかりません「YMZ294」のデータシートを参考にすると4番ピンがVdd、6番ピンがGNDとなっています。なのでとりあえず、この通りに接続してみたところICに過大な電流が流れてしまいました。そこで今度は4番ピンがGND、6番ピンVddとして接続したところ過大な電流は流れず、電源ピンの位置が確定しました。
次に音の出力ピンの位置を予想します。「YMZ294」のデータシートを参考にすると電源ピンの間の5番ピンが音の出力であることがわかります。ダイの画像を見ると他の箇所のボンディングパッドと大きさが違うことから、このICの音の出力ピンは5番ピンであることが暫定できます。
これで3/20ピンの役割がわかりました。次に「YMZ294」のデータシートをもとに、システムクロック(ICの音生成用クロック)、データーバス、CS(チップセレクト)、WE(ライトイネーブル)、A0(データ・アドレス選択)、IC(リセット入力)ピンの位置を探ります。ダイ画像ではこの項目の判別が完全につかないため「YMZ294」のデータシートを参考にマイコンから演奏データを送りながら音の鳴る条件を探ります。
始めに「YMZ294」の電源ピン以外の対応するピンをこのICのピンとマイコンを接続してみました。ですが音が出ませんでした。よくよく考えてみると「YMZ294」とこのICの電源ピンの位置も若干違うため、これらの入力ピンも違う可能性があることに気付きました。
そこで根気強くこれらのピンを総当たり戦法でマイコンと接続しました。そこで作業開始から数時間後のこと、特定の入力パターンでデジタル出力になることがわかりました。
デジタル出力となるピンは7~11番ピンの5個と13~20番ピンの8個です。また、7~11番ピンは不明な条件によって出力パターンが変わることも判りました。
ここで13~20番ピンが8個ということでデーターバスであることが予想できます。
また、7~11番ピンは5個、つまり5bitのデータの送受信と考えるとダイ画像から予想した
アドレス0x1fをbitに直すと5bitであるため、7~11番ピンはアドレスバスであると暫定できます。
この結果は「YMZ294」のデータシートからの予想よりだいぶかけ離れていました。
これで残りは1、2、3、12ピンの4つです。
A0(データ・アドレス選択)ピンは不要なので除外し、残るはシステムクロック(ICの音生成用クロック)、CS(チップセレクト)、WE(ライトイネーブル)、IC(リセット入力)です。
「YMZ294」のデータシートは参考にならないと判り、総当たり戦法で見つけていきます。その結果、1番ピンはシステムクロック(ICの音生成用クロック)、2番ピンがIC(リセット入力)の可能性、3番がOE/WE(アウトイネーブル/ライトイネーブル選択)またはTEST入力端子の可能性、12番ピンがWEまたはCSの可能性が判りました。ただし、2、3、12番ピンの正確な役割はわかりません。
以上でこのICのピンの役割の解析が終わりました。
この通りにマイコン接続し、アドレス0x00~0x1Fにデータ0x00~0xFFを順番に書き込んだところランダムな音が出力されました。
ここからはレジスタマップの解析をしてきます。とはいうものの、アドレス0x00~0x1Fにデータ0x00~0xFFに書き込んでどのような音が出るか調べるので難易度は低いです。
不明な部分も多いですがとりあえず音を出すことは出来ました。
2の使い方にICのピンとアドレスマップをまとめます。
あと、「KY-3201P SGC」のSGCはサウンドジェネレーターコントローラーの略ではないかと思います。
2.仕様
解析した「KY-3201P SGC」仕様です。もちろんオリジナルのデータシートはありません。
現在も解析中であるため、内容はちょくちょく修正されます。2019年6月日現在の情報です。
現在も解析中であるため、内容はちょくちょく修正されます。2019年6月日現在の情報です。
秋月電子で手に入るPSG音源IC「YMZ294」のデータシートを模倣して作成しました。
■特徴
・独立した4チャンネルの矩形波+ノイズ1音の音源
・各チャンネルは設定した音程の1倍、2倍、4倍、8倍の矩形波を合成した波形を出力可能
・CS制御信号と8ビットデータバスと5ビットアドレスバスによるCPUインターフェース
・2ビット分周レジスタにより幅広い周波数のマスタークロックを利用可能
■YMZ294との比較
・VDD端子とGND端子の位置が逆(重要)
・VDD端子とGND端子の位置が逆(重要)
・矩形波生成ユニットがYMZ294より1つ多い
・データバスとアドレスバスが独立している
・YMZ294では単純な矩形波のみに対し、KY-3201P SGCでは、設定した音程の1倍、2倍、4倍、8倍の矩形波を合成した波形を出力可能
■端子配線図
「?」が付いている端子はまだ仕様がはっきりと判っていません。
■予想端子機能
W/Rが'H'、/CSがLの時データを書き込みます。
※とりあえずW/Rを'H'に固定して制御します。
5./IC
'L'の時システムリセットになります。
※リセット時レジスタアレーの内容が全ての'0'になるのか未検証です。
6.SO
音声信号のアナログ出力です。
7.VDD
+5Vの電源端子です。
8.GND
接地端子です。
■タイミング図
■レジスタマップ
注) レジスタマップの内容はまだはっきりと判っていないため頻繁に変わります。
※ここで緑色は「ほぼ仕様が確定している」
黄色は「そうではないか?」
赤色は「完全に不明だけど変更すると音の変化がみられる」
白色に(X)は「現時点では変更しても変化がみられない」
状態を表しています。
■レジスタ機能説明
※仕様がほぼ確定しているレジスタのみ説明します。
1.楽音周波数の設定
4チャンネル(A、B、C、D)の楽音発生器で作られる周波数ftは次のように決められます。
ft=fΦM /(2^DI)×32×TP
TP=(TP11×2^11)+(TP10×2^10)+(TP9×2^9)+(TP8×2^8)+
(TP7×2^7)+(TP6×2^6)+(TP5×2^5)+(TP4×2^4)+
(TP3×2^3+(TP2×2^2)+(TP1×2^1)+(TP0)
DI=(DI1×2^1)+(DI0)
[ft:楽音周波数]
[fΦM:「ΦM」の入力周波数]
[TP0~TP11:楽音周波数設定レジスタ($00,01、$05,06、$0A,0B、$0F,10)]
[DI0、DI1:システムクロック分周レジスタ($1F)]
また、各チャンネルはftをもとに1倍、2倍、4倍、8倍の周波数を合成して出力できます。(波形は論理ANDで出力されます。)
fso=(H3×2^3×ft)&(H2×2^2×ft)&(H1×2^1×ft)&(H0×ft)
[fso:各チャンネル合成出力周波数]
[H3~H0:オクターブ合成レジスタ($03、$08、$0D、$12)]
例:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
クリスタルオシレーター8MHz
分周レジスタDI=1
楽音周波数設定レジスタTP=000100011100=284
オクターブ合成レジスタH0=1、H1=1、H2=0、H3=0の時
ft=8×10^6 /(2^1)×32×284=440.14Hz
fso=(0×2^3×ft)&(0×2^2×ft)&(1×2^1×ft)&(1×ft)=880.28Hz & 440.14Hz
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
音を止めるには、「?」が付いている端子はまだ仕様がはっきりと判っていません。
■予想端子機能
■端子機能説明
1.ΦM
マスタークロック入力です。入力周波数は4MHzから32MHzです。
※クリスタルオシレーターを変更して確かめたところ、60MHzのものでも一応動作しました。(音程が高すぎるため実用不可)
2.A0~A4
5ビットのアドレスバスです。
3.D0~D7
8ビットのデータバスです。
4./CS,W/R
5ビットのアドレスバスのアドレスに8ビットのデータバスのデータを書き込みをコントロールします。W/Rが'H'、/CSがLの時データを書き込みます。
※とりあえずW/Rを'H'に固定して制御します。
5./IC
'L'の時システムリセットになります。
※リセット時レジスタアレーの内容が全ての'0'になるのか未検証です。
6.SO
音声信号のアナログ出力です。
7.VDD
+5Vの電源端子です。
8.GND
接地端子です。
■タイミング図
■レジスタマップ
注) レジスタマップの内容はまだはっきりと判っていないため頻繁に変わります。
※ここで緑色は「ほぼ仕様が確定している」
黄色は「そうではないか?」
赤色は「完全に不明だけど変更すると音の変化がみられる」
白色に(X)は「現時点では変更しても変化がみられない」
状態を表しています。
■レジスタ機能説明
※仕様がほぼ確定しているレジスタのみ説明します。
1.楽音周波数の設定
4チャンネル(A、B、C、D)の楽音発生器で作られる周波数ftは次のように決められます。
ft=fΦM /(2^DI)×32×TP
TP=(TP11×2^11)+(TP10×2^10)+(TP9×2^9)+(TP8×2^8)+
(TP7×2^7)+(TP6×2^6)+(TP5×2^5)+(TP4×2^4)+
(TP3×2^3+(TP2×2^2)+(TP1×2^1)+(TP0)
DI=(DI1×2^1)+(DI0)
[ft:楽音周波数]
[fΦM:「ΦM」の入力周波数]
[TP0~TP11:楽音周波数設定レジスタ($00,01、$05,06、$0A,0B、$0F,10)]
[DI0、DI1:システムクロック分周レジスタ($1F)]
また、各チャンネルはftをもとに1倍、2倍、4倍、8倍の周波数を合成して出力できます。(波形は論理ANDで出力されます。)
fso=(H3×2^3×ft)&(H2×2^2×ft)&(H1×2^1×ft)&(H0×ft)
[fso:各チャンネル合成出力周波数]
[H3~H0:オクターブ合成レジスタ($03、$08、$0D、$12)]
例:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
クリスタルオシレーター8MHz
分周レジスタDI=1
楽音周波数設定レジスタTP=000100011100=284
オクターブ合成レジスタH0=1、H1=1、H2=0、H3=0の時
ft=8×10^6 /(2^1)×32×284=440.14Hz
fso=(0×2^3×ft)&(0×2^2×ft)&(1×2^1×ft)&(1×ft)=880.28Hz & 440.14Hz
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3.使い方
ここでは簡単に音を鳴らす方法を紹介します。
音を出力するには、
・音量レジスタを1以上にする($02、$07、$0C、$11)
※($02、$07、$0C、$11)のD0とD1が'0'の場合
・オクターブ合成レジスタのビットを4つあるうち1つ以上選択する($03、$08、$0D、$12)
・サウンド出力レジスタを'0'にする($1FのD4)
※特定条件下でサウンド出力レジスタを'1'の場合でも出力されます。
の3つの条件が全ての揃った時に音が出力されます。(例外も多くあります)
音を出力するには、
・音量レジスタを1以上にする($02、$07、$0C、$11)
※($02、$07、$0C、$11)のD0とD1が'0'の場合
・オクターブ合成レジスタのビットを4つあるうち1つ以上選択する($03、$08、$0D、$12)
・サウンド出力レジスタを'0'にする($1FのD4)
※特定条件下でサウンド出力レジスタを'1'の場合でも出力されます。
の3つの条件が全ての揃った時に音が出力されます。(例外も多くあります)
・音量レジスタを0にする($02、$07、$0C、$11)
※($02、$07、$0C、$11)のD0とD1が'0'の場合
・オクターブ合成レジスタのビットを4つとも'0'にする($03、$08、$0D、$12)
・サウンド出力レジスタを'1'にする($1FのD4)
※特定条件下でサウンド出力レジスタを'0'の場合でも出力されます。
のどれか1つの条件が合致した時、音が止まります。(例外も多くあります)
例:~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
「2.仕様」の楽音周波数の設定の(例)の音を出力したい場合
[クリスタルオシレーター8MHz
[分周レジスタDI=1
[楽音周波数設定レジスタTP=000100011100=284
[オクターブ合成レジスタH0=1、H1=1、H2=0、H3=0の時
[
[ft=8×10^6 /(2^1)×32×284=440.14Hz
[
[fso=(0×2^3×ft)&(0×2^2×ft)&(1×2^1×ft)&(1×ft)=880.28Hz & 440.14Hz
これに加えて
音量レジスタL0~L5を全て'1'(最大)にする。($02、$07、$0C、$11)
ここではL0の右隣2つのビット(D1、D0)を'0'にする。($02、$07、$0C、$11)
サウンド出力レジスタを'0'にします。($1FのD4)
こうして初めて880.28Hz と 440.14Hzの合成波(論理AND)が出力されます。
音を止めるには、音量レジスタL0~L5を全て'0'にします。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
レジスタ設定例:~~~~~~~~~~~~~~~~~~~~~~~~~~~~
クリスタルオシレーター8MHz
チャンネルAで880.28Hz と 440.14Hz合成波(論理AND)を出力する。
$00に00011100
$01に00000001
$02に11111100
$03に00000011
$1Fに01000000
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
※音量レジスタはL0がMSB、L5がLSBとほかのレジスタとは逆になっています。
エンベロープについて
このKY-3201P SGCにはエンベロープ機能が付いていると思われます。
ですが仕様は今現在判明していません。情報を提供していただけるととても助かります。
ノイズ音について
ノイズ音はドラムセットとして利用できるのですが、エンベロープに依存しているためエンベロープの仕様が判明した後説明します。
4.テスト
Arduinoで「ぼくのフレンド」を演奏してみました。
構成はオクターブ合成なし1矩形波×4チャンネル+ノイズなしです。
構成はオクターブ合成なし1矩形波×4チャンネル+ノイズなしです。
まだまだ判明していない仕様も多いですが、とりあえず音は出ました。
プログラムは後日ある程度まとまったら公開します。
4.5制作例(2019/10/30追加)
Bサイズのユニバーサル基板の上にこの音源ICを8個のせて、
右4個:矩形波16和音+ノイズ4音、左4個:矩形波16和音+ノイズ4音のステレオにして演奏してみました。
音量が大きめなので下げてから再生することをおすすめします。
音量が大きめなので下げてから再生することをおすすめします。
5.プログラム(2019/8/5追加)
エンベロープの仕様が未だに分かりませんが、とりあえずMIDIで演奏できるようにしました。
UARTなので直接MIDI入力はできませんがフォトカプラと抵抗を用意するとMIDI信号を受信できます。各自調べてください。
ドラムのエンベロープはソフトウェアで制御しているので処理落ちで発音が安定しません。各自プログラムを書き直して使用してください。
このプログラムではKY3201P-SGCを4つ使用していますが、1つからでも使用可能です。
構成は、
ドラム:ノイズ4音+タム矩形波1音(同時発音)
矩形波:15チャンネル(同時発音)
です。
回路図
EMIフィルはノイズが気になる方は付けて下さい。
arduinoで使用されているマイコンATmega328pを単体で使用していますが、プログラムはarduinoのスケッチとなっています。
プログラム&回路図(29kb)
6.まとめ
このPSG音源IC「KY-3201P」は長らく仕様不明でしたが、「YMZ294」同様に制御しやすい音源ICということがわかりました。
正直、自分でもICのダイを見ただけでここまで解析できるとは思いませんでした。
まだまだ未知のレジスタがあるので楽しめそうです。
この記事を見てくれている皆さんの部品箱の中にたぶんこのICが眠っていると思います。興味のある方はぜひ遊んでみてください。
最後にもう一度、
この記事の内容を鵜呑みにし、事故や損失を招いた場合でも当方は一切の責任は負いかねます。自己責任でお願いします。
wwwwwwwwwww
返信削除