いくつかプログラムを作ってみましたが、音がならないのは少し味気ないものですね。
SMILE BASICには効果音が登録されていて、命令ひとつで鳴らすことができます。
その命令はBEEPです。
BEEP [効果音番号][,周波数][,音量][,パンポット]
効果音番号は0~133で
どんな音があるかは
この画面の真ん中下にあるSMILEという部分をタッチしてみましょう。
すると
下画面に
表示されました。
十字キーで動かして、Aボタンを押してみましょう。
いろいろな音が鳴りますね。
このとき、左に書いてある数字が効果音番号です。
周波数は、-32768~32767まで
100で半音ということなので、0が通常の高さ
ここから-100すると、半音下の効果音がなります。
+100で半音上の効果音が鳴ります。
音量は0~127
0だと無音になる感じです。
パンポットは0~127で
0だと左側、127で右側からしか聞こえなくなります。
中央が64になります。
では、サンプルを作ってみましょう。
使っている命令は、いままで学習した内容です。
数値の頭に0をつけるには? FORMAT$
プログラムの好きなところを実行させる GOTO
プログラムの好きなところを実行するその2 GOSUB RETURN
実行を終わらせるには END
ボタンの入力を受け付けるには? BUTTON VSYNC
繰り返し処理をしたいその2 WHILE~WEND
文字の表示位置を指定するには? LOCATE
' ラベル 10文字ごとに表示するように間隔をあけている
LBL$=" こうかおんNo しゅうはすう おんりょう ぱん "
' 値
VAL$=""
' 効果音番号を保持する変数
BENO=0
' 周波数を保持する変数
BEHz=0
' 音量を保持する変数
BEVOL=64
' パンポットを保持する変数
BEPAN=64
' 変更位置変数 0:効果音番号 1:周波数 2:音量 3:パンポット
HENPOS=0
' 終了フラグ
ENDFLG=0
' ボタン変数
BTN=0
' カウント変数
CNT=0
' 値表示用変数
VIEW$=""
' 画面のクリア
ACLS
' 6行目に位置を変更する
LOCATE 0, 5
' LBL$の中身を表示
PRINT LBL$
WHILE ENDFLG == 0
' Bボタンが押されたら終わるようにする
GOSUB @GETBTN
' 表示位置の設定
LOCATE 0, 6
' 一旦前の表示を消す
PRINT " "
' 表示位置の設定
LOCATE 0, 7
' 一旦前の表示を消す
PRINT " "
' 表示内容のフォーマット
VIEW$=FORMAT$("%8D%8D%8D%8D", BENO, BEHZ, BEVOL, BEPAN)
' 表示位置の設定
LOCATE 0, 6
' 現在の値の表示
PRINT VIEW$
' 表示位置の設定
LOCATE HENPOS * 8 + 7, 7
' 現在動かせる内容の位置を表示
PRINT "↑"
' カウンタを1UP
CNT = CNT + 1
' 60カウントしたら
IF CNT == 60 THEN
' 効果音を鳴らす
BEEP BENO, BEHz, BEVOL, BEPAN
' カウンタを0に戻す
CNT = 0
' 判定終わり
ENDIF
' 繰り返し終わり
WEND
' 終了処理へ
GOTO @END
' ボタン押下判定処理
@GETBTN
BTN = BUTTON()
' 上が押された場合
IF (BTN AND 1) == 1 THEN
' 値増加用処理へ
GOSUB @VALUP
' 判定終わり
ENDIF
' 下が押された場合
IF (BTN AND 2) == 2 THEN
' 値下降用処理へ
GOSUB @VALDOWN
' 判定終わり
ENDIF
' 左が押された場合
IF (BTN AND 4) == 4 THEN
' 値の変更できる項目の変更 ↑が左に1つ移動
HENPOS = HENPOS - 1
' ↑が一番左にいるなら
IF HENPOS < 0 THEN
' 動かさない
HENPOS = 0
' 判定終わり
ENDIF
' 判定終わり
ENDIF
' 右が押された場合
IF (BTN AND 8) == 8 THEN
' 値の変更できる項目の変更 ↑が右に1つ移動
HENPOS = HENPOS + 1
' ↑が一番左にいるなら
IF HENPOS > 3 THEN
' 動かさない
HENPOS = 3
' 判定終わり
ENDIF
' 判定終わり
ENDIF
' Bボタンが押された場合
IF (BTN AND 32) == 32 THEN
' 終了フラグに1を設定
ENDFLG=1
END IF
' 垂直同期
VSYNC
' 元の位置に戻る
RETURN
' 値増加用処理
@VALUP
' 位置が効果音番号の場合
IF HENPOS == 0 THEN
' 効果音番号を1UP
BENO = BENO + 1
' 効果音番号が133を超えていた場合
IF BENO > 133 THEN
' 効果音番号を133に設定
BENO = 133
' 判定終わり
ENDIF
' 判定終わり
ENDIF
' 位置が周波数の場合
IF HENPOS == 1 THEN
' 周波数を100UP
BEHz = BEHz + 100
' 周波数が32767を超えていた場合
IF BEHz > 32767 THEN
' 周波数を32767に設定
BEHz = 32767
' 判定終わり
ENDIF
' 判定終わり
ENDIF
' 位置が音量の場合
IF HENPOS == 2 THEN
' 音量を1UP
BEVOL = BEVOL + 1
' 音量が127を超えていた場合
IF BEVOL > 127 THEN
' 音量を127に設定
BEVOL = 127
' 判定終わり
ENDIF
' 判定終わり
ENDIF
' 位置がパンの場合
IF HENPOS == 3 THEN
' パンを1UP
BEPAN = BEPAN + 1
' パンが127を超えていた場合
IF BEPAN > 127 THEN
' パンを127に設定
BEPAN = 127
' 判定終わり
ENDIF
' 判定終わり
ENDIF
' 元の位置に戻る
RETURN
' 値下降処理
@VALDOWN
' 位置が効果音番号の場合
IF HENPOS == 0 THEN
' 効果音番号を1UP
BENO = BENO - 1
' 効果音番号が0より小さい場合
IF BENO < 0 THEN
' 効果音番号を0に設定
BENO = 0
' 判定終わり
ENDIF
' 判定終わり
ENDIF
' 位置が周波数の場合
IF HENPOS == 1 THEN
' 周波数を100DOWN
BEHz = BEHz - 100
' 周波数が-32768より小さい場合
IF BEHz < -32768 THEN
' 周波数に-32768を設定
BEHz = -32768
' 判定終わり
ENDIF
' 判定終わり
ENDIF
' 位置が音量の場合
IF HENPOS == 2 THEN
' 音量を1DOWN
BEVOL = BEVOL - 1
' 音量が0より小さい場合
IF BEVOL < 0 THEN
' 音量を0に設定
BEVOL = 0
' 判定終わり
ENDIF
' 判定終わり
ENDIF
' 位置がパンの場合
IF HENPOS == 3 THEN
' パンを1DOWN
BEPAN = BEPAN - 1
IF BEPAN < 0 THEN
BEPAN = 0
' 判定終わり
ENDIF
' 判定終わり
ENDIF
' GOSUBに戻る
RETURN
' 終了処理用ラベル
@END
' 表示位置を初期化
LOCATE 0,0
' 終了
END
かなり長くなってしまいました。
それぞれの判定部を配列にするとかなり短くなりますので、挑戦してみてはいかがですか?
配列については
配列って何?
では、実行すると
こんな画面が表示され、音がなります。
矢印の位置がこうかおんNOなので、ここで、上下すると音の種類が変わります。
右ボタンを押すと、矢印の位置がしゅうはすうにかわります。
さらに右をおすと、音量、パン、と変わっていきます。
左を押すと左に矢印が動きます。
その位置で、上下すると、その値が変わっていきます。
Bボタンを押すと終了です。
SMILE BASICには効果音が登録されていて、命令ひとつで鳴らすことができます。
その命令はBEEPです。
BEEP [効果音番号][,周波数][,音量][,パンポット]
効果音番号は0~133で
どんな音があるかは
この画面の真ん中下にあるSMILEという部分をタッチしてみましょう。
すると
下画面に
表示されました。
十字キーで動かして、Aボタンを押してみましょう。
いろいろな音が鳴りますね。
このとき、左に書いてある数字が効果音番号です。
周波数は、-32768~32767まで
100で半音ということなので、0が通常の高さ
ここから-100すると、半音下の効果音がなります。
+100で半音上の効果音が鳴ります。
音量は0~127
0だと無音になる感じです。
パンポットは0~127で
0だと左側、127で右側からしか聞こえなくなります。
中央が64になります。
では、サンプルを作ってみましょう。
使っている命令は、いままで学習した内容です。
数値の頭に0をつけるには? FORMAT$
プログラムの好きなところを実行させる GOTO
プログラムの好きなところを実行するその2 GOSUB RETURN
実行を終わらせるには END
ボタンの入力を受け付けるには? BUTTON VSYNC
繰り返し処理をしたいその2 WHILE~WEND
文字の表示位置を指定するには? LOCATE
' ラベル 10文字ごとに表示するように間隔をあけている
LBL$=" こうかおんNo しゅうはすう おんりょう ぱん "
' 値
VAL$=""
' 効果音番号を保持する変数
BENO=0
' 周波数を保持する変数
BEHz=0
' 音量を保持する変数
BEVOL=64
' パンポットを保持する変数
BEPAN=64
' 変更位置変数 0:効果音番号 1:周波数 2:音量 3:パンポット
HENPOS=0
' 終了フラグ
ENDFLG=0
' ボタン変数
BTN=0
' カウント変数
CNT=0
' 値表示用変数
VIEW$=""
' 画面のクリア
ACLS
' 6行目に位置を変更する
LOCATE 0, 5
' LBL$の中身を表示
PRINT LBL$
WHILE ENDFLG == 0
' Bボタンが押されたら終わるようにする
GOSUB @GETBTN
' 表示位置の設定
LOCATE 0, 6
' 一旦前の表示を消す
PRINT " "
' 表示位置の設定
LOCATE 0, 7
' 一旦前の表示を消す
PRINT " "
' 表示内容のフォーマット
VIEW$=FORMAT$("%8D%8D%8D%8D", BENO, BEHZ, BEVOL, BEPAN)
' 表示位置の設定
LOCATE 0, 6
' 現在の値の表示
PRINT VIEW$
' 表示位置の設定
LOCATE HENPOS * 8 + 7, 7
' 現在動かせる内容の位置を表示
PRINT "↑"
' カウンタを1UP
CNT = CNT + 1
' 60カウントしたら
IF CNT == 60 THEN
' 効果音を鳴らす
BEEP BENO, BEHz, BEVOL, BEPAN
' カウンタを0に戻す
CNT = 0
' 判定終わり
ENDIF
' 繰り返し終わり
WEND
' 終了処理へ
GOTO @END
' ボタン押下判定処理
@GETBTN
BTN = BUTTON()
' 上が押された場合
IF (BTN AND 1) == 1 THEN
' 値増加用処理へ
GOSUB @VALUP
' 判定終わり
ENDIF
' 下が押された場合
IF (BTN AND 2) == 2 THEN
' 値下降用処理へ
GOSUB @VALDOWN
' 判定終わり
ENDIF
' 左が押された場合
IF (BTN AND 4) == 4 THEN
' 値の変更できる項目の変更 ↑が左に1つ移動
HENPOS = HENPOS - 1
' ↑が一番左にいるなら
IF HENPOS < 0 THEN
' 動かさない
HENPOS = 0
' 判定終わり
ENDIF
' 判定終わり
ENDIF
' 右が押された場合
IF (BTN AND 8) == 8 THEN
' 値の変更できる項目の変更 ↑が右に1つ移動
HENPOS = HENPOS + 1
' ↑が一番左にいるなら
IF HENPOS > 3 THEN
' 動かさない
HENPOS = 3
' 判定終わり
ENDIF
' 判定終わり
ENDIF
' Bボタンが押された場合
IF (BTN AND 32) == 32 THEN
' 終了フラグに1を設定
ENDFLG=1
END IF
' 垂直同期
VSYNC
' 元の位置に戻る
RETURN
' 値増加用処理
@VALUP
' 位置が効果音番号の場合
IF HENPOS == 0 THEN
' 効果音番号を1UP
BENO = BENO + 1
' 効果音番号が133を超えていた場合
IF BENO > 133 THEN
' 効果音番号を133に設定
BENO = 133
' 判定終わり
ENDIF
' 判定終わり
ENDIF
' 位置が周波数の場合
IF HENPOS == 1 THEN
' 周波数を100UP
BEHz = BEHz + 100
' 周波数が32767を超えていた場合
IF BEHz > 32767 THEN
' 周波数を32767に設定
BEHz = 32767
' 判定終わり
ENDIF
' 判定終わり
ENDIF
' 位置が音量の場合
IF HENPOS == 2 THEN
' 音量を1UP
BEVOL = BEVOL + 1
' 音量が127を超えていた場合
IF BEVOL > 127 THEN
' 音量を127に設定
BEVOL = 127
' 判定終わり
ENDIF
' 判定終わり
ENDIF
' 位置がパンの場合
IF HENPOS == 3 THEN
' パンを1UP
BEPAN = BEPAN + 1
' パンが127を超えていた場合
IF BEPAN > 127 THEN
' パンを127に設定
BEPAN = 127
' 判定終わり
ENDIF
' 判定終わり
ENDIF
' 元の位置に戻る
RETURN
' 値下降処理
@VALDOWN
' 位置が効果音番号の場合
IF HENPOS == 0 THEN
' 効果音番号を1UP
BENO = BENO - 1
' 効果音番号が0より小さい場合
IF BENO < 0 THEN
' 効果音番号を0に設定
BENO = 0
' 判定終わり
ENDIF
' 判定終わり
ENDIF
' 位置が周波数の場合
IF HENPOS == 1 THEN
' 周波数を100DOWN
BEHz = BEHz - 100
' 周波数が-32768より小さい場合
IF BEHz < -32768 THEN
' 周波数に-32768を設定
BEHz = -32768
' 判定終わり
ENDIF
' 判定終わり
ENDIF
' 位置が音量の場合
IF HENPOS == 2 THEN
' 音量を1DOWN
BEVOL = BEVOL - 1
' 音量が0より小さい場合
IF BEVOL < 0 THEN
' 音量を0に設定
BEVOL = 0
' 判定終わり
ENDIF
' 判定終わり
ENDIF
' 位置がパンの場合
IF HENPOS == 3 THEN
' パンを1DOWN
BEPAN = BEPAN - 1
IF BEPAN < 0 THEN
BEPAN = 0
' 判定終わり
ENDIF
' 判定終わり
ENDIF
' GOSUBに戻る
RETURN
' 終了処理用ラベル
@END
' 表示位置を初期化
LOCATE 0,0
' 終了
END
かなり長くなってしまいました。
それぞれの判定部を配列にするとかなり短くなりますので、挑戦してみてはいかがですか?
配列については
配列って何?
では、実行すると
こんな画面が表示され、音がなります。
矢印の位置がこうかおんNOなので、ここで、上下すると音の種類が変わります。
右ボタンを押すと、矢印の位置がしゅうはすうにかわります。
さらに右をおすと、音量、パン、と変わっていきます。
左を押すと左に矢印が動きます。
その位置で、上下すると、その値が変わっていきます。
Bボタンを押すと終了です。