Help us understand the problem. What is going on with this article?

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

More than 3 years have 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に上げたバイナリをアップしてあります)

toyoshim
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away