概要
以前、I2Cで制御できる80円のPSG互換チップで遊ぼうという内容で投稿したわけですが、その続編です。予告通りPSG以外の音源にも対応。KonamiのSCC+音源互換です。というか、前回の段階でほとんどできてたんですが、一箇所バグがあって音が腐ってたんでOFFにしてありました。
SoundCortex
特徴
詳細は前回の投稿を見ていただくとして、LPC810を使って色々な音源チップをエミュレートしていこう、というモノです。パソコン上でエミュレートするのと比べると以下の様なメリットがあります。
- チップから音が出るのでカッコいい
- 自分の電子工作に組み込んで使える
- I2Cで制御できる(マイコンに優しい)
- 0.1ms以下の超低レイテンシ
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に上げたバイナリをアップしてあります)