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

  • 37
    いいね
  • 0
    コメント

概要

以前、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に上げたバイナリをアップしてあります)