概要
以前、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に上げたバイナリをアップしてあります)
Comments
質問させてください。
この方法で和音を出したいのですが、CH_Aは出力されるのですが、B,C,D以降音が出ません。
http://wp.hrmux.com/?p=2595
http://curious4dev.mydns.jp/post-2972/
などを参考に
Mixerの設定を0x00001 -> 0x11111に変更し、それぞれSetVolume、SetWabeTableを設定しているのですが、B以降の音がでません。どのように設定したら良いのでしょうか
アドバイスお願いします
コメントの範囲で気になる点は、ミキサーに入れてる値ですね。記載ミスかもしれませんが、16進数では0x1fになります。C++14以降なら2進数も0b11111で通ると思いますが、Arduinoで通るか試したことないです(今、携帯からなので試せない)
ありがとうございました.
解決しました.
おっしゃる通り,0x111ではなく,0x0fで設定することで解決しました.
0b1111は入れてみたのですが,うまく動きませんでした.
あと,このような波形テーブルのデータってどこかに落ちてないですかね.
http://wp.hrmux.com/?p=2633
ここにあったMAPPYのゲーム音は
https://github.com/keim/SiONMML/blob/master/mmltalks/20110422_LinearDrive_%5BAC%5D_MAPPY_-_MISS_-_(C)namco_1983.sionmml
このあたりから漁ってきたのですが,他がなかなかみつかりません.
どこかにサンプルなど心当たりありませんか?
Wave Shape Editor
http://keim.hatenablog.com/entry/20120806/p1
このツールで自作しようとも画策しましたが,今年の3月にカヤックさんの
wonderfl build flash online
がサービス終了してしまったようで,使えません.
なにかよいアドバイスがあれば教えてください.
TSSCP用のデータとかネットに残ってれば参考になるかもしれません。
あと、僕のデータからでよければ、以下のファイルの#wav文に定義されてるのがSCC用の波形データです。たぶんGRADIUS 2あたりで使われてた音色を拝借してます。
http://yuri.twintail.org/experiments/tss/data/tss.c/data/GRADIUS_GENERATION_STAGE1.tss
他はVSTiのChip32あたりを使って自作するとかでしょうか。あちらの音色データがどうなってるのか知らないので、そこから変換でまた一手間かかるかもしれません。でもまぁ、そうですね。ウェブベースの音色エディタあると便利かもしれませんね。TODOリストに入れときます。
Let's comment your feelings that are more than good