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

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

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

MENU

Download

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

以前作成した NandemoSCC というツールを、BASICで使えるようにしてみました。

「NandemoSCC for BASIC」は、PSGに送られたデータを監視して、同じデータをリアルタイムにSCCにコピーするツールです。

BASICのPLAY文で演奏したものがそのままSCCでも鳴るので、とても簡単にSCCサウンドを楽しむことができます。

インストール方法

以下のプログラムを入力し、10070行A=USR( &H01 ) の引数を SCCが存在するスロット に対応した値に書き換えてください。

実行すると、「NandemoSCC for BASIC」がシステムワークのあまり使われなさそうな領域(F750-F79F)にインストールされ、バックグラウンドで動作するようになります。プログラムは NEWしても構いません。

NandemoSCC for BASICNDMSCC.BAS(MSX/2/2+/turboR+SCCカートリッジ、およびMSX0対応)

10000 '---------------------- 10010 'NANDEMO-SCC for BASIC 10020 '---------------------- 10030 CLEAR 300,&HD000 10040 AD=&HD000:DEFUSR=AD:'RELOCATABLE 10050 FOR I=AD TO AD+&H13F:READ A$:IF A$="XX" THEN A$=LEFT$(HEX$(AD),2) 10060 POKEI,VAL("&H"+A$):NEXT 10070 A=USR(&H01):'SCC SLOT (SLOT-A:&H01 SLOT-B:&H02 MSX0:&H8C UNINSTALL:0) 10080 END 11000 'INSTALL PROGRAM 11010 DATA FE,02,C0,F3,23,23,7E,B7,28,4E,21,80,XX,11,50,F7 11020 DATA 01,5F,00,ED,B0,32,61,F7,CD,4F,XX,28,0B,21,9F,FD 11030 DATA 11,AF,F7,01,05,00,ED,B0,CD,60,F7,AF,32,FE,BF,21 11040 DATA 00,90,36,3F,21,E0,XX,11,00,98,01,60,00,ED,B0,CD 11050 DATA 64,F7,3E,C3,32,9F,FD,21,6C,F7,22,A0,FD,FB,C9,2A 11060 DATA A0,FD,01,6C,F7,ED,42,C9,CD,4F,XX,C0,CD,60,F7,AF 11070 DATA 32,8F,98,CD,64,F7,21,AF,F7,11,9F,FD,01,05,00,ED 11080 DATA B0,FB,C9,00,00,00,00,00,00,00,00,00,00,00,00,00 11090 'PSG->SCC VOLUME TABLE(v1-v15, Envelope) 11100 DATA 01,01,01,01,01,01,01,02,03,04,06,08,0A,0C,0F,0F 11110 'NANDEMO-SCC MAIN 11120 DATA 3E,00,18,03,3A,43,F3,26,80,C3,24,00,F5,E5,D5,C5 11130 DATA CD,60,F7,3E,07,18,05,D3,A0,DB,A2,2F,32,8F,98,06 11140 DATA 06,21,85,98,78,3D,D3,A0,DB,A2,77,2B,10,F6,06,03 11150 DATA 21,8C,98,78,C6,07,D3,A0,DB,A2,E6,1F,28,06,11,4F 11160 DATA F7,83,5F,1A,77,2B,10,EB,CD,64,F7,C1,D1,E1,F1,00 11200 'chA WAVE FORM 11210 DATA 00,20,40,50,60,50,40,20,00,C0,A0,90,80,90,A0,C0 11220 DATA 00,30,50,60,50,30,00,B0,90,80,90,B0,00,60,00,80 11230 'chB WAVE FORM 11240 DATA 00,20,40,50,60,50,40,20,00,C0,A0,90,80,90,A0,C0 11250 DATA 00,30,50,60,50,30,00,B0,90,80,90,B0,00,60,00,80 11260 'chC WAVE FORM 11270 DATA 00,20,40,50,60,50,40,20,00,C0,A0,90,80,90,A0,C0 11280 DATA 00,30,50,60,50,30,00,B0,90,80,90,B0,00,60,00,80

使用方法

「NandemoSCC for BASIC」をインストールした状態で、PLAY文で音楽を演奏させてみましょう。PSGに加えて、SCCの音が鳴ると思います。

応用編

PSGをミュートしてSCCの音のみを聴く

「NandemoSCC for BASIC」はPSGのレジスタの内容(音程と音量)をSCCにコピーする仕組みのため、通常は PSGとSCCが重なって演奏されます。

しかし、PSGのサウンドイネーブルフラグ(レジスタ7)についてはあえてコピーしていないため、このレジスタを変更してPSGの全チャンネルの出力をOFFにしても、SCCの音は通常通りに鳴ります。

これを利用すると、「PSGはミュートしてSCCの音のみを聴く」ということが可能になります。

PSGのレジスタ7は、OFFになっているビットのチャンネルが有効 となるので、具体的な設定方法は以下のようになります。

※「サウンドイネーブルスイッチもPSGからSCCにコピーしてほしい(PSGが鳴らないならSCCも鳴らさないでほしい)」というのであれば、 11130行 の7番目のデータを 05 から 00 に変更してください。「PSGとSCCの両方を鳴らしたいが、PSGドラムにはSCCが反応しないでほしい」というような場合に有効です。

※PSGの出力をOFFにした状態でボリュームレジスタが変更されるとプチプチ音が鳴ることがありますが、これはPSGの仕様です。解決方法は、後述の「SCCの音量を調整する」をご覧ください。余談ですが、この仕様を利用してPSGでPCM再生を行うことができます。

SCCの特定のチャンネルを有効または無効にする

「NandemoSCC for BASIC」が起動している状態でF774H に値を書き込むことで、PSGのレジスタ7同様に SCCの特定チャンネルの有効・無効を設定することができます。

こちらも下位3ビットで制御しますが、SCCの場合は ONになっているビットのチャンネルが有効 となります。

SCCの波形を変更する

11200行 以降がチャンネル別の波形データになるので、MuSICAなどのSCC波形エディタを参考に、自由に変更してください。

ただし、インストール時にSCCに転送しているので、演奏中に波形データを変更することはできません。

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

PSG のハードエンベロープ( "s0m10000c4" など)は使えません。すべて v15 として演奏されます。

SCCの音量を調整する

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

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

11100行 が変換テーブルとなっており、PSGのv1からv15とハードエンベロープ使用時、計16個分の「SCCに設定する音量値」が並んでいます。

また、前述したように、PSGの出力をOFFにするとプチプチ音がなりますが、この変換テーブルを使うことで軽減できます。

プチプチ音の大きさはPSGのボリュームに左右されるので、例えば、PSGの v1,v2,v3,v4,v5 用のテーブルを書き換えて SCCでは v5,v7,v9,v12,v15 で鳴るようにして、v5以下でPSGを演奏するようにすれば、プチプチ音はほとんど聴こえなくなります。

「NandemoSCC for BASIC」自体を無効化する

インストールプログラム実行時の引数に 0 を指定することで、「NandemoSCC for BASIC」自体を無効化することができます。

プログラム自体は常駐したままなので、再度スロット番号を指定すれば有効化されます。

FM音源と同時に使う

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

ただし、CLEAR文で文字領域やマシン語領域を確保する際には、必ずそれより前に_MUSICを実行してください。

サンプルプログラム

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

MSX の PLAY文ではおよそ 1/12秒(t180の16分音符)より短い音符が演奏できないという致命的な弱点があるのですが、一生懸命に頑張って演奏していると思います(^_^)

FM音源を使用したサンプルプログラムも載せておきます。こちらも全てPLAY文です。

ただ、元々素晴らしいバランスで作られていることもあり、PSGに加えてSCCが鳴ってもそこまで驚きは感じられないですね…(^_^;)

最後に

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

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

また、「SCCの音が鳴らない」という場合、大抵はスロット設定が間違っている(あるいはデフォルトのままで変更していない)と思われます。SCCカートリッジがどのスロットに差してあるのかを確認し、正しい値を設定してください。

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


BASICからマニアックにSCCをいじってみよう(CMD SCC)

ここからは 「SCCというサウンドチップ自体をいじってみたい」という方のための内容になります。

SCCで音を鳴らすため方法自体はとてもシンプルなのですが、そもそもアクセスするためにはスロットを切り替える必要があり、BASICから気軽にレジスタに値を出力してみる、というようなことができません。

そこで、PSGに対するSOUND文のように、簡単にSCCにアクセスするための拡張コマンドを作成してみました。

CMD SCC のインストール

以下のプログラムを実行すると、BASICに新しいコマンド "CMD SCC" が追加されます。

CMD SCC インストールプログラムCMDSCC.BAS

10 '------------------- 20 'INSTALL "CMD SCC" 30 '------------------- 40 CLEAR300,&HD800 50 FOR I=&HD800 TO &HD841:READ A$:POKE I,VAL("&H"+A$):NEXT 60 DEFUSR=&HD800:A=USR(0) 70 DATA21,C3,0D,22,0D,FE,21,D8,8C,22,0F,FE,C9,7E,FE,53 80 DATAC0,CD,66,46,FE,43,C0,CD,66,46,FE,43,C0,CD,66,46 90 DATAFE,28,C0,23,CD,2F,54,ED,53,35,D8,7E,FE,2C,C0,23 100 DATACD,1C,52,E5,21,00,00,5F,3A,10,FE,CD,14,00,E1,23 110 DATAF1,C9

CMD SCC の使い方

サンプルプログラム

SCCの5チャンネル全てを使って音を出すプログラムです。

SCCのレジスタは、PSGのレジスタに似た構造となっているので、BASICのSOUND文で音を鳴らす方法にかなり近いです。

SOUND文と比較したコメントなども書いておいたので、参考にしてみてください。

CMD SCC サンプルプログラムSMPSCC.BAS(半角カナを使用しているためブラウザで開くと文字化けします)

1000 '------------------------------------ 1010 ' SAMPLE PROGAM FOR CMD SCC 1020 '------------------------------------ 1030 ' 1040 'SCC ノ ソンザイスル スロット 1050 ' キホンスロット1 = &H01 1060 ' キホンスロット2 = &H02 1070 ' MSX0(カクチョウスロット0-3) = &H8C 1080 POKE&HFE10,&H8C 1090 ' 1100 'モード キリカエ(for SNATCHER) 1110 CMD SCC(&HBFFE,0):'メガROM ゴカン モード 1120 ' 1130 'バンク キリカエ 1140 CMD SCC(&H9000,&H3F):'SCC ノ オヤクソク 1150 ' 1200 'ハケイ データ (32byte * 4ch) 1210 ' chA : 9800~981F 1220 ' chB : 9820~983F 1230 ' chC : 9840~985F 1240 ' chD : 9860~987F 1250 ' chE : (chD ト オナジ) 1260 FOR CH=0 TO 3:RESTORE 1290:'chA-chE オナジ ハケイ ニ スル 1270 FOR I=0 TO 31:READ A$:CMD SCC(&H9800+CH*32+I,VAL("&H"+A$)) 1280 NEXT:NEXT 1290 DATA 00,07,0F,17,1F,27,2F,37,3F,47,4F,57,5F,67,6F,77 1300 DATA 80,88,90,98,A0,A8,B0,B8,C0,C8,D0,D8,E0,E8,F0,F8 1310 ' 1400 'チャンネル ON/OFF(1:ON 0:OFF) 1410 ' chE|chD|chC|chB|chA : 988F = SOUND 7,n ノ ビットハンテン 1420 CMD SCC(&H988F,&HB00000):'chA-chE スベテOFF 1430 ' 1500 'シュウハスウ データ (2byte * 5ch) 1510 ' chA : 9880,9881 = SOUND 0,n:SOUND 1,m 1520 ' chB : 9882,9883 = SOUND 2,n:SOUND 3,m 1530 ' chC : 9884,9885 = SOUND 4,n:SOUND 5,m 1540 ' chD : 9886,9887 1550 ' chE : 9888,9889 1560 CMD SCC(&H9880,&HAC):CMD SCC(&H9881,1):'chA : o4c ← 01ACH 1570 CMD SCC(&H9882,&H53):CMD SCC(&H9883,1):'chB : o4e ← 0153H 1580 CMD SCC(&H9884,&H1D):CMD SCC(&H9885,1):'chC : o4g ← 011DH 1590 CMD SCC(&H9886,&HE3):CMD SCC(&H9887,0):'chD : o4b ← 00E3H 1600 CMD SCC(&H9888,&HBE):CMD SCC(&H9889,0):'chE : o5d ← 00BEH 1610 ' 1700 'ボリューム データ (1byte * 5ch) 1710 ' chA : 988A = SOUND 8,n 1720 ' chB : 988B = SOUND 9,n 1730 ' chC : 988C = SOUND 10,n 1740 ' chD : 988D 1750 ' chE : 988E 1760 CMD SCC(&H988A,15):'chA : v15 1770 CMD SCC(&H988B,15):'chB : v15 1780 CMD SCC(&H988C,15):'chC : v15 1790 CMD SCC(&H988D,15):'chD : v15 1800 CMD SCC(&H988E,15):'chE : v15 1810 ' 2000 'エンソウ 2010 ' PLAY"v15o4c","v15o4e","v15o4g","v15o4b","v15o5d" 2020 PRINT"HIT ANY KEY TO PLAY";:A$=INPUT$(1):PRINT 2030 CMD SCC(&H988F,&B11111):'chA-chE スベテON 2040 PRINT"HIT ANY KEY TO STOP";:A$=INPUT$(1):PRINT 2050 CMD SCC(&H988F,&B00000):'chA-chE スベテOFF

最後に

CMD SCC などという名前ですが、実際は特定スロットの特定アドレスにデータを書き込むだけのコマンド だったりするので、FE10Hの値を書き換えれば、裏RAMやFM-PACへのアクセスもできます。 やっていることは「スロット指定のPOKE文」みたいなものですね。

処理も重いので、この命令だけを使って音楽演奏をさせるのはなかなか難しいですが、SCCの仕組みを学んだり、波形をエディットして音色を確認するくらいであれば、十分実用に耐えると思います。

興味を持ったというマニアックな方は、ぜひSCCを色々と触ってみてはいかがでしょうか。


DEEP! P6!/MSX! に戻る