MSX0のプログラミングメモ

MSX0 Stackに関して、私がつくった簡単なBASICプログラムや、プログラミングのメモなどを載せていきます

MSX0の鍵盤プログラム

MSX0 Stackにはタッチパネルが付いているので、それを使った鍵盤プログラムを作成しました。

タッチパネルを使ったBASICプログラムを作る際の参考になったらうれしいです。
使えそうなところがあったら、自由に使っていただいて結構です。(プログラム全体の転載は、このブログのURLも紹介していただければOKです(出典が明らかになれば)。)

スクリーンショット

タイトル画面(シンプルすぎるw)

鍵盤プログラムのタイトル画面

演奏中の画面

演奏中画面

上の段:左から「ド」「レ」「ミ」「ファ」
下の段:左から「ソ」「ラ」「シ」「ド」
です。
ボタンを押している間は、ボタンが赤くなって、音が鳴り続けます。
押したタイミングと、離したタイミングでそのあたりの処理を行っています。

プログラム

ファイル名:PADMUSIC.BAS

1 ' Copyright 2023 hellotocky
10 SCREEN 5:COLOR15,2,15
20 LINE(0,0)-(255,211),15,BF
30 LINE(10,120)-(245,160),2,BF:open "GRP:" FOR OUTPUT AS #1:PRESET(30,136):PRINT #1,"HIT this button to START"
100 ' INIT
110 _TURBO ON
120 DEFINT A-Z
129 ' BD(): 0=current pad(4), 1=before pad(4), 2=before tapped
130 DIM R(2),G(2),B(2), X1(9),X2(9),Y1(9),Y2(9),BE(2,9), BD(3), HZ(9):BM=9:BS=2
140 RESTORE 9000:FOR I=0 TO BM-1:READ X1(I), Y1(I), X2(I), Y2(I), HZ(I):NEXT I
150 RESTORE 9200:FOR I=0 TO BS-1:FOR J=0 TO BM:READ BE(I,J):NEXT J,I
160 RESTORE 9400:FOR I=0 TO 1: READ R(I),G(I),B(I): NEXT I
190 BD(0)=0:BD(1)=0:BD(2)=-1:BT=-1
200 ' TITLE loop
210 BP=0:GOSUB 8000
220 IF BT<>0 GOTO 210
300 ' MAIN loop
310 LINE(0,0)-(255,211),15,BF:FOR I=2 TO 2+8:COLOR=(I,R(0),G(0),B(0)):NEXT I
320 FOR I=1 TO 8:LINE(X1(I),Y1(I))-(X2(I),Y2(I)),I+2,BF:NEXT I
330 BP=1
340 GOSUB 8000:GOTO 340
8000 ' touch pad loop
8010 BD(1)=BD(0):BD(0)=PAD(4)
8020 IN$=INKEY$:IF IN$="Q" THEN END
8030 IF BD(1)=-1 AND BD(0)=0 THEN GOSUB 8400:BT=-1:RETURN
8040 IF BD(0)=0 THEN RETURN
8050 X=PAD(1):Y=PAD(2):I=0
8060 IF BE(BP,I)<>0 AND X1(I)<=X AND X<=X2(I) AND Y1(I)<=Y AND Y<=Y2(I) THEN BT=I:GOTO8080
8070 IF I<BM THEN I=I+1:GOTO 8060 ELSE RETURN
8080 IF BD(2)<>BT THEN GOSUB 8400
8090 BD(2)=BT:GOSUB 8200:RETURN
8200 ' key down
8205 IF BP=0 THEN COLOR=(2,R(1),G(1),B(1)):RETURN
8210 COLOR=(BT+2,R(1),G(1),B(1))
8220 SN=111860!/HZ(BT):SOUND 8,10:SOUND 0,SN AND 255:SOUND 1,SN\256
8230 RETURN
8400 ' key up
8405 IF BP=0 THEN COLOR=(2,R(0),G(0),B(0)):RETURN
8410 SOUND 8,0
8420 COLOR=(BD(2)+2,R(0),G(0),B(0))
8430 RETURN
9000 REM button position, sound Hz
9010 DATA  10,120,245,160,   0
9020 DATA  10, 10, 60,100, 261
9030 DATA  70, 10,120,100, 294
9040 DATA 130, 10,180,100, 330
9050 DATA 190, 10,240,100, 349
9060 DATA  15,115, 65,205, 392
9070 DATA  75,115,125,205, 440
9080 DATA 135,115,185,205, 494
9090 DATA 195,115,245,205, 523
9200 REM button status pattern
9210 DATA 1,0,0,0,0,0,0,0,0
9220 DATA 0,1,1,1,1,1,1,1,1
9400 DATA 1,6,1,  7,1,1   :'color

メモ

ちょっと無駄なループが多いですが、8000行からの処理は使いまわせるように意識したつもりです。

9010行目~9090行目:ボタンの座標データの定義。9010行目は0番、9020行目は1番、9030行目は3番…となる。
9210行目~9220行目:タイトル画面で押せるボタンと、演奏画面で押せるボタンのパターンを定義。
 ※9210行目は、0番のボタンのみ押せる、という意味。(パターン0番)
  9220行目は、1番~8番のボタンのみ押せる、という意味。(パターン1番)

変数のBPに何番のパターンを使用するかを代入してから、8000行目をコールします。結果が変数BTに入って帰ってきます。
 BT=-1なら、何も押されなかった
 BT=0なら、ボタン0番が押された
 BT=1なら、ボタン1番が押された
というような意味になります。

タイトル画面では以下の処理を行っています。

210 BP=0:GOSUB 8000
220 IF BT<>0 GOTO 210

ここでは何も処理してないですが、この中で音を鳴らすとかスプライトを動かすとかの処理を入れてもいいですね。
BP=0を代入しているので、9210行目で定義したパターン1番を使う=ボタン0番のみ有効となります。
BP=1を代入すると、9220行目で定義したパターン2番を使うことになり、ボタンの1番~8番が有効になります。

ボタンが押された、離れた、と言う処理を9200行目~と9400行目~に書きましたが、ちょっとイマイチかな…。お好みで変更どうぞ。