SCC音源をBASICから使ってみよう

SNATCHER付属のサウンドカートリッジ、クラウドファンディングによって製品化された「MSX0」、公式エミュレーター「MSXPLAYer」の最新版には、『SCC音源』が内蔵されていますが、BASICから制御できるようにはなっていません。

もちろん、SCC音源に対応したサウンドドライバーなどを使えばしっかりと鳴ってくれるのですが、BASICから気軽に鳴らしてみたい、という方のためのページです。

Download

このページの全てのプログラム、およびディスクイメージはこちら

NandemoSCCforBASIC.zip

PLAY文でSCCを鳴らしてみよう(NandemoSCC for BASIC)

「NandemoSCC for BASIC」は、以前作成した NandemoSCC というツールをBASICで使えるようにしたものです。

PSGのレジスタデータを監視してリアルタイムでSCCにコピーするという単純な仕組みですが、BASICのPLAY文で演奏したものがそのままSCCで鳴るので、とても簡単にSCCサウンドを楽しむことができます。

実行環境

インストール方法

ダウンロードしたディスクイメージを使用する場合(オートスタート)

  1. ディスクイメージファイル NandemoSCCforBASIC.dsk をセットした状態で MSXを起動すると、以下のようなメニューが表示されます。

  2. 「NandemoSCC for BASIC」は、メニューで[A] を押すとインストールされます。
  3. 本体をリセットするまで「NandemoSCC for BASIC」は動作し続けます。

手動でインストールする場合

  1. SCCのスロットを検索するプログラムファイルが SRCHSCC.BIN、「NandemoSCC for BASIC」のプログラムファイルが NDMSCC.BIN で、通常はセットで使用します。
  2. 2つのファイルをロードできる状態にして、BASIC から以下のように入力すると、「NandemoSCC for BASIC」がメモリ上に常駐するようになります。

    BLOAD"SRCHSCC.BIN",R:BLOAD"NDMSCC.BIN",R

  3. 本体をリセットするまで「NandemoSCC for BASIC」は動作し続けます。

使用方法

「NandemoSCC for BASIC」をインストールした状態で、BASICのPLAY文で何か演奏させてみましょう。

PLAY "v15c","v15e","v15g"

SCCの音が鳴ったと思います。感動しますよね。

このツールでできることは、これが全てです。

あとは、自分で演奏プログラムを書いたり、昔作った演奏プログラムを SCCで聴いてみたり、皆さんそれぞれの楽しみ方を見つけてみてください。

ちなみに、市販のゲームで「NandemoSCC for BASIC」を使用した場合の動作は保証できません。「オールBASIC」かつ「割り込みを使用せず、メモリに余裕があるタイトル」なら動くかもしれませんが、基本的にはノーサポートになります。

サンプルプログラム

MSX-BASIC の PLAY文のみで演奏したサンプルプログラムの動画になります。


応用編

SCCだけで聴いたり PSGとSCCを重ねて聴いたり

「NandemoSCC for BASIC」はPSGのレジスタの内容(音程と音量)をSCCにコピーする仕組みですが、PSGのサウンドイネーブルフラグ(レジスタ7:チャンネルごとの発音ON/OFFフラグ)についてはあえてコピーしていないため、 PSGとSCCそれぞれに「チャンネルごとの発音ON/OFF」を設定することができます。

PSGの場合、レジスタ7の下位3ビットが chC|chB|chA の発音フラグとなっており、ONになっているビットのチャンネルが「無効」 となるため、SOUND文を使用して以下のように設定します。

SCCについては、「NandemoSCC for BASIC」では DAC5H を各チャンネル別の発音フラグとしています。

こちらも下位3ビットが chC|chB|chA の発音フラグとなっていますが、SCCの場合は ONになっているビットのチャンネルが「有効」 となります。

ちなみに、SCCは5音同時発音が可能ですが、「NandemoSCC for BASIC」では3チャンネルしか使用していません

SCCの波形を変更する

「NandemoSCC for BASIC」では、以下のアドレスにSCCの波形データを保存しています。

MuSICAなどのSCC波形エディタを使ってデータを作成し、自由に変更してみてください。

書き換えた後に DERUSR=&HDA22:A=USR(0) を実行すると、SCCに波形データを転送します。

1000 'WAVE FORM SET 1010 FOR I=&HDA50 TO &HDAAF:READ A$:POKE I,VAL("&H"+A$):NEXT 1020 DEFUSR=&HDA22:A=USR(0):'WAVE RESET 1030 'chA WAVE FORM 1040 DATA 00,20,40,50,60,50,40,20,00,30,50,60,50,30,00,B0  1050 DATA 00,C0,A0,90,80,90,A0,C0,90,80,90,B0,00,60,00,80 1060 'chB WAVE FORM 1070 DATA 00,F8,F0,E8,E0,D8,D0,C8,80,78,70,68,60,58,50,48 1080 DATA C0,B8,B0,A8,A0,98,90,88,40,38,30,28,20,18,10,08 1090 'chC WAVE FORM 1100 DATA 00,F0,E0,D0,C0,B0,A0,90,80,70,60,50,40,30,20,10 1110 DATA 00,F0,E0,D0,C0,B0,A0,90,80,70,60,50,40,30,20,10

PSGとSCCの音量バランスを調整する

SCCの音量レジスタは 0(無音) から 15(最大) までの16段階なのですが、この変化量がPSGとは全く異なっています。

そのため、以下の図のように、PSG の音量レジスタの値をそのまま SCC に渡すと、ソフトエンベロープがキレイに聴こえなかったり、全体的に音が大きくなってしまうことがあります。

これを解決するために、「NandemoSCC for BASIC」では、SCCで鳴らしたときのボリュームがPSGのボリュームに近くなるように、内部で値を変換しています。

DA40H以降が変換テーブルとなっているので、このデータを変更することでPSGとSCCとのバランスを変えることができます。

2000 'PSG->SCC VOLUME TABLE(v1-v15, Envelope) 2010 FOR I=&HDA40 TO &HDA4F:READ A$:POKE I,VAL("&H"+A$):NEXT 2020 DATA 01,01,01,01,01,01,01,02,03,04,06,08,0A,0C,0F,0F

2020行の最初の 01 が PLAY文で"v1"を指定したときに SCCに送られるデータとなり、以降 "v2"用、"v3"用、... と並び、"v14" のときが 0C、"v15"のときが 0F、ハードウェアエンベロープ使用時が 0F となります。

プチプチ音対策

PSGの発音フラグをOFFにしてSCCのみを鳴らすと、プチプチ音がなります。

これはPSGの仕様なので避けられないのですが、音量変換テーブルを使うことで軽減することができます。

2000 'PSG->SCC VOLUME TABLE(プチプチ タイサク) 2010 FOR I=&HDA40 TO &HDA4F:READ A$:POKE I,VAL("&H"+A$):NEXT 2020 DATA 05,07,09,0C,0F,01,01,02,03,04,06,08,0A,0C,0F,0F

この音量変換テーブルによって、PLAY文でPSGに"v1"を指定したときにSCCのボリュームは"v5"に変換されます。同様に、"v2"のときには"v7"、"v3"のときには"v9"、"v4"のときには"v12"、"v5"のときには"v15"となります。

プチプチ音の大きさはPSGに送られるボリュームによって決まるため、この状態で "v1"~"v5" までしか使用しないMMLを書くことで、プチプチ音はかなり気にならなくなります。

ハードエンベロープを使うには

PSG のハードエンベロープ( "s0m10000c4" など)は SCCでは再現されません。音量変換テーブルの最後の値(デフォルトでは "v15")で発音します。

FM音源と同時に使う

FM-PAC使用中あるいはMSX-MUSIC内蔵機種では、「NandemoSCC for BASIC」をインストールすることで、FM音源と同時に、PSGで演奏されるパートをSCCで鳴らすことができます。

ただし、メモリ領域が変更されるため、「NandemoSCC for BASIC」をインストールする前(CLEAR文を実行する前)に、必ず一度は _MUSIC を実行しておいてください。

最後に

「SCC対応の優秀なサウンドドライバは色々あるにも関わらず、なぜBASICのPLAY文で?」と思われるかもしれませんが、 「昔BASICで作成したミュージックプログラムがそのままSCCで鳴る」というのは結構楽しいもので、 私も過去のディスクに入っていたミュージックプログラムを片っ端から鳴らしてみたりしました。

SNATCHERのサウンドカートリッジはなかなか手に入りづらいですが、「MSX0」や「MSXPLAYer」には最初から内蔵されていますし、このツールを使って「気軽に」SCCサウンドを楽しんでもらえればと思います。

大したプログラムではないので、皆さんのプログラムに組み込んだり、再配布したり、ご自由にどうぞ。

何かあれば X(twitter)で @tiny_yarou までお願いします。


DEEPなページ

SCCをレジスタレベルでいじってみたい、という方のためのページです。


DEEP! P6!/MSX! に戻る