Edited at

I2Cで制御できるSCC+互換チップ

More than 1 year has passed since last update.


概要

以前、I2Cで制御できる80円のPSG互換チップで遊ぼうという内容で投稿したわけですが、その続編です。予告通りPSG以外の音源にも対応。KonamiのSCC+音源互換です。というか、前回の段階でほとんどできてたんですが、一箇所バグがあって音が腐ってたんでOFFにしてありました。


SoundCortex


特徴

詳細は前回の投稿を見ていただくとして、LPC810を使って色々な音源チップをエミュレートしていこう、というモノです。パソコン上でエミュレートするのと比べると以下の様なメリットがあります。


  • チップから音が出るのでカッコいい

  • 自分の電子工作に組み込んで使える

  • I2Cで制御できる(マイコンに優しい)

  • 0.1ms以下の超低レイテンシ

IMG_20160413_015559.jpg


SCC+互換モード

I2C slave address 0x51でアクセスできます。書き込みはPSG互換モード同様に2 bytes単位で行って下さい。最初の1 byteがSCC+のレジスタアドレス(MSXのメモリにマップされている時の下位8bit)、続く1 byteが書き込む値です。

拡張機能としてレジスタ0xFFに0を書き込むと3.579545MHz(デフォルト)、0以外を書き込むと4MHzのオシレータを繋げたSCCとして動作します。実機はMSXで動くものしか存在しないので4MHzは意味がないのですが、PSGの4MHzモードとセットで使えるように4MHzモードも用意しました。

また0xFFを読みだすとメジャーバージョン1、0xFEを読みだすとマイナーバージョン0が読み出されるはずです。

念のためにSCC+のレジスタマップを載せておきます。ちなみにSCC+はいわゆる(SD)スナッチャーROMに載ってる5音全部の音色が設定できる、GRADIUS 2とかよりちょっとだけ豪華なやつです。波形モーフィングとか?(実装してないです)

レジスタ
内容

0x00-0x1F
Ch.A 波形テーブル

0x20-0x3F
Ch.B 波形テーブル

0x40-0x5F
Ch.C 波形テーブル

0x60-0x7F
Ch.D 波形テーブル

0x80-0x9F
Ch.E 波形テーブル

0xA0
Ch.A TP[7:0]

0xA1
Ch.A TP[11:8]

0xA2
Ch.B TP[7:0]

0xA3
Ch.B TP[11:8]

0xA4
Ch.C TP[7:0]

0xA5
Ch.C TP[11:8]

0xA6
Ch.D TP[7:0]

0xA7
Ch.D TP[11:8]

0xA8
Ch.E TP[7:0]

0xA9
Ch.E TP[11:8]

0xAA
Ch.A 音量[3:0]

0xAB
Ch.B 音量[3:0]

0xAC
Ch.C 音量[3:0]

0xAD
Ch.D 音量[3:0]

0xAE
Ch.E 音量[3:0]

0xAF
ミキサー

0xE0-0xFFあたりにあるモード設定レジスタは詳しく知らないので未対応。波形テーブルはint8_t[32]です。TPはPSGと同じ。音量はPSGとは違って線形になってます。ミキサーはbit 0側がCh.Aに対応。PSGが不論理なのに対してSCCは正論理。


デモ

YouTubeにGRADIUS 2のオープニングを鳴らしてみた的な動画をあげてあります。冒頭のぶ〜〜〜〜〜〜〜ん……とかめちゃくちゃいい感じに鳴ってます。


最後に


使ってみてね

ファームウェアは全てGitHubにて公開しています。PSGとSCC+の両方を有効にしたprebuiltバイナリも置いてありますので、そのまま焼けば美味しく頂けます。一応prebuilt版は24MHz動作にしてみました。9-bit/46.875kHzでの再生です。オーバークロックの48MHzでも安定して動作してるので、最新のソースでは48MHz動作の10-bit/46.875kHz再生にしてあります。まぁ、OPLLを追加するための準備でもあります。


今後の予定

MIDIメッセージを受けてADSR付きPSG/SCC+音源として制御するミドルとか作りたいなー、とは思ってます。あと、今の手応えだとPSG/SCC+/OPLL全部が1 chipで回せそうな予感がしてます。OPNやOPMも個別のチップで作れそうですね。あとは気力だけ。


いいわけ

モード設定レジスタが未実装って以外に、なんか少しバグってる気がします。音が消えて欲しいところで残ることがあるので……SCCも何度か作ってるけど、モードレジスタ実装しなくてもこういう問題は出なかったはず。

あんまり時間かけられてないので、つまらないバグかも。何か気づいたらGitHubでpull requestして頂けるとハッピーです。

(2016/8/14追記:0xAFのミキサーがバグってるようだ、という報告を頂き修正しました。minor versionを1に上げたバイナリをアップしてあります)