ひろじいべーしっくch 第26回の動画の解説・補足。(0-026)
ここでは、サンプルプログラム「あかしろあお」の説明のほか、「公文出版チャレンジ!プチコン4SmileBASIC Nintendo Switchで学ぶ! プログラミングワーク」でも解説されたPUSH命令についての解説を紹介しています。
プログラム
今回のプログラムはこちら。(公開キー443E4X1、LOAD“N26_AKASIROAO”)
今回紹介するのは画面に設定された音色や鍵盤で楽器のように演奏を楽しむプログラムです。左スティックで音程を変更できます。右スティックやXボタンでエコーの効果を加えられます。Rボタンでエフェクトの効果をオフにし、画面を消去し、終了します。

このブログにおいてはなるべく専門用語を使用せずに非常に短く簡潔に説明しています。
一部の内容を省略している箇所があります。
詳細を知りたい方は公式リファレンス等も参照してください。
[]については省略可能ですが、一部の命令(例えばDIM命令等)については最低一つの[]は必要です。
EFCEN
EFCEN 状態
エフェクタ(効果音)の状態を設定します。
(EFCEN OUT 変数 → エフェクタの状態を取得する)
引数
状態
0 | #EFCOFF | OFF |
1 | #EFCON | ON |
返値(EFCEN OUTでの返値)
0: OFF |
1: ON |
例
EFCEN 0
S=EFCEN()
EFCSET
EFCSET プリセット番号
エフェクタを設定する(プリセット番号で指定する場合です。)
引数
プリセット番号 | ||
0 | #EFCOFF | OFF |
1 | #EFCBATH | 風呂 |
2 | #EFCCAVE | 洞窟 |
3 | #EFCSPACE | 宇宙 |
例
EFCSET #EFCSPACE
BGMSET
BGMSET ユーザー定義曲番号,MML文字列
ユーザー定義音楽を定義します。
・定義した音楽はBGMPLAYで再生可能です。
引数
ユーザー定義曲番号
ユーザ定義曲番号:128~255
MML文字列
コマンドの文字列
例
BGMSET 128,”CDEFG”
BGMPITCH
BGMPITCH [トラック番号,]ピッチ
再生している音楽の基準音程を変化させます。
引数
トラック番号
対象のトラック番号: 0~15
・省略時は全トラックが対象。
ピッチ
変化させる音程の値:-32768~32767
・100で半音。
例
BGMPITCH 0,100
BGMWET
BGMWET [トラック番号,]ウェット
指定トラックのエフェクタ効果量を設定します。
・エフェクタがOFFの時は音量が変化する。エフェクタをONにして使用のこと。
引数
トラック番号
設定するトラック番号:0~15
・省略時は0。
ウェット
設定するエフェクタ効果量:0(ドライ)~127(ウェット)
例
BGMWET 0,64
動作の説明

※ACLS命令の位置が5行目にあり、3行目の画面設定がリセットされています。ゲーム上では特に影響がありませんが、プログラムとしては無駄な記述となっています。詳細は動画内の8分50秒あたりをご覧ください。
動画の8分50秒

以下は、おおまかな動作の説明です。概略図は以下の通りです。

実行画面

動画の2分58秒

改造版
今回の改造版は、ドレミの3鍵から黒鍵盤を含めた22鍵に増やし、また細かい訂正を含めたものとなっています。

実行画面

※単音のみです。和音はできません。
補足(動画内での袋とじコーナー)
今回は「公文出版チャレンジ!プチコン4SmileBASIC Nintendo Switchで学ぶ! プログラミングワーク」の92頁でも解説されたPUSH命令についての補足の解説を紹介しています。
袋とじ1(PUSH命令)
以下、PUSH命令を補足。(プログラミングワーク92頁の補足の解説です)
PUSH
PUSH 配列,式
配列の末尾に要素を追加する
・要素数が1つ増える。
(注)1次元配列のみ
引数
配列
要素を追加される配列
式
追加する要素の値
例
DIM WORK[10] PUSH WORK,123 |
(注)PUSHを使用する前は、DIMで宣言した通り、WORK[0]~WORK[9]の計10個の配列が配列の構成であり、WORK[10]をPRINT文で使用するとSubscript out of range(配列サイズを超えたアクセスです)のエラーが生じます。ここで上記の例の様にPUSH命令を使用すると、上記の例ではDIM WORK[11]という宣言のやりなおしと同様の効果が行われ、まさに「要素数が1つ増える」、「要素数の最大値を1つ増やす」ということが行われます。また、このことにより、WORK[10]が要素に加えられ、その値もWORK[10]=123と同様の効果が行われます。
下記⓵と②は同じ内容で、実行結果は両方とも画面に123が表示されます。
⓵ DIM WORK[10] PUSH WORK,123 PRINT WORK[10] |
② DIM WORK[11] WORK[10]=123 PRINT WORK[10] |
PUSH命令のメリットは、VARやDIMでの配列の最大要素数の宣言を宣言し直すこともなく最大要素数を1つ増やすことができるということです。まさに最大要素数をプッシュ「押す」というイメージですね。なお、宣言し直すと表現しましたが、2回宣言すると「すでに定義されています」とエラーがでるため、プログラムを直接書き換えることになります。
PUSH命令のデメリットは、1次元の配列限定ということです。技術的にはむずかしいこともないでしょうけど、2次元以上ではどの方向にプッシュするのかがわからないからでしょうか?
メリット | デメリット | |
PUSH | 配列の最大値を気にせずに配列の最大値を増やすともに、値の代入も兼ねて行うことができる。プログラムの動作中に新たな情報を追加する場合に便利(?) | ⓵一次元限定であること。②DIMで配列の最大値の宣言をしているのにそれを、ある意味無意味にしてしまう。 |
ちなみに余談ですが、POP命令というのがあります。(下記の“?”はPRINTの省略形です。)
DIM WORK[11] WORK[10]=123 ? WORK[10] A=POP(WORK) ?A ? WORK[10] |
これを実行すると
123 123 Subscript out of range in 0:7 配列サイズを超えたアクセスです |
となります。最大要素数が1減ってしまうというPUSHと逆の作用を行う命令です。返り値は削除の対象となる配列の末尾の内容です。よって上記の例では3行目の結果として123が表示され、その改行後、6行目の変数Aの内容が123であることから、それが表示され、最後7行目で削除したことによって存在しないはずのWORK[10]を表示しようとしたことによりSubscript out of rangeのエラーが生じた、ということです。
POP
POP(配列)
配列の末尾から要素を取り出す
・要素数が1つ減る。
引数
配列
要素を取り出される配列
戻り値
取り出した要素の値
例
DIM WORK[10] PUSH WORK,123 A=POP(WORK) |
PUSH命令とPOP命令は、より難しいC言語では、命令の内容が多少異なりますが、採用されています。
袋とじ2(さくいん)
ジャンルを気にせずにアルファベット順で頁を探せるさくいんを作りました。
非公式さくいん(プログラミングワーク)
非公式さくいん(公式リファレンスブック)
動画では、サイト内検索の方法も紹介しています。
Microsoft Edge:右上の「・・・」を押す→ページ内の検索
グーグルクローム:右上のタテに三つの点である「・・・」を押す→検索と編集→検索
袋とじ3(前回の補足、MAX命令)
前回「数字ルーレット」の24行目から25行目

この24行目から25行目は、次の様に省略できます。

MAX
MAX(数値,数値[,数値…])
指定された複数の数値から一番大きい値を得る
引数
数値
最大値を調べたい数値を引数として並べる
返値
渡された引数の中で一番大きい数
例
A=MAX(1,2,3,4)
袋とじ4(前回の補足、RETURN without GOSUB エラーについて)
「RETURNがあってGOSUBがない」というエラーが考えられます。プチコン3まではありましたが、なぜかプチコン4ではStack underflow(スタックアンダーフロー)となります。
アンダーフローとは、浮動小数点の指数部の桁の下限を超えた場合に発生するエラーで、それがスタック(割り込み要求が発生した場合、値を一時的に退避する場所)での下限の値を超えた時のエラーということです。
さっそく、リファレンス内の検索でRETURNを見てみましょう。
動画内では、今回はMicrosoft Edgeで検索しています。
どうやら、プチコン4ではGOSUB以外でも、DEF命令でRETURNを使用する場合もあるということで、このエラーメッセージが消えてしまったか、スタックアンダーフローが先生じるのでそちらを優先しているのか、定かではありませんが、「実際にRETURNがあってGOSUBがない状況で、スタックアンダーフローのエラーメッセージが出るらしい」ので、メインルーチンとサブルーチンが区別できているか検証することも考えておきましょう。
まとめ
1.二種類の時間の管理がありました。
⓵TOUCH命令の引数であるタッチ時間の変数TT
②画面にタッチしてからカウントがはじまり、次の鍵盤が押されるまでリセットされない変数T
②の変数Tについては、BGMPLAYが連続的に音が流されることについての防止とエコーの効果発生時間の管理に利用していました。
このように、各変数の役割を考えていきましょう。
今回の様に、変数を増やしてもかまいません。
2.できるだけ楽をする工夫をしよう!
初心者にとっては、ジャンルの理解に苦しくなることもあるでしょう。索引やページ内検索を利用して、命令を理解してからジャンルを理解していくことも間違いではないと思います。
「できるだけ楽をする工夫」というのは、プログラミングでの検索においても、また同様な効果を示すプログラムの記述を用いてプログラムを短くすることも工夫の一つです。
プログラミングを学習として捉えると心苦しい方も多いと思います。マイペースで少しずつ理解を増やしていきましょう。
コメント