このブログの内容が難しい方へ

もし、内容が難しくて理解出来ない場合には、Cプログラミング入門以前などのプログラミングを始める前に知っておくと良い事が書いてある本を読んでから、その後にやさしいC 第3版 [やさしいシリーズ]などのC言語というプログラミング言語の入門書を読むことをお勧めします。また、MIDIの知識がない人は、コンプリートMIDIブックなどがお勧めです。そこまで理解できれば、KSP特有の作法は、このブログを参考にすれば大丈夫だと思います。

2011年9月2日金曜日

while文

では、最後のコントロールステートメント、while文の説明です。while文は、ある条件が満たされる間、ずっと指定されたプログラムを実行し続けます。実は、while文はけっこう危険です(笑)。何が危険かというと、条件が満たされる間、ずっと実行し続けるわけです。もし、プログラムのバグで、永久に条件が満たされ続けることになってしまうと……暴走します。というわけで、while文は気をつけて使ってください。while文は、以下のように記述します。
while(条件)
    {プログラム}
end while
もう、見慣れましたよね。では、早速、例を見ていきましょう。(あ、ちなみに、このプログラムを実行してはいけません。あとで説明します)

on init
	declare $Flag := 1
end on

on note
	while($Flag = 1)
		play_note($EVENT_NOTE,$EVENT_VELOCITY,0,$DURATION_QUARTER/2)
		wait($DURATION_QUARTER)
	end while
end on

play_noteというのは、()内で指定した条件を元に、ノートオンを生成します。余談ですが、この()内のそれぞれの値を引数(ひきすう)と言ったりします。play_noteを関数とか言ったりもします。まぁ、関数は、命令の事だと思ってもらっていいです。「ここで、この命令を実行してくれ」とKontaktに伝えるわけです。で、その命令に細かく指示を出すために、引数が必要になったりするわけですね。この関数と引数のセットは、予め使い方が決まっています(関数は他にもたくさんあるので、後日、少しずつ説明します)。

ちなみに、$EVENT_NOTEは、callbackを起動したイベントのノートナンバーです。$EVENT_VELOCITYは、callbackを起動したイベントのベロシティです。その次の0とは、再生するサンプルのオフセットのマイクロ秒単位の値です(オフセットを知らない人には、いつか説明しますので、理解できなくても読み飛ばしてください)。そして、$DURATION_QUARTERとは、現在のテンポの4分音符の長さです。それを2で割っているので、8分音符の長さを指定しています。

つまり、このプログラムは、ノートオンを実行すると、そのノートの再生を4分音符のタイミングで、8分音符のノートを再生し続けます。そう、永遠に……、永遠に……。あれ?そうです。おかしいですよね。while文はこういう危険性があるんです。一度ノートオンでトリガーしたら最後、このプログラムは止まりません。しかも、KSPで、こういうバグを自動的に検知することは出来ないんです。では、少しこのプログラムを修正しましょう。

on note
	while($NOTE_HELD = 1)
		play_note($EVENT_NOTE,$EVENT_VELOCITY,0,$DURATION_QUARTER/2)
		wait($DURATION_QUARTER)
	end while
end on

$NOTE_HELDというのは、要は鍵盤を押しっぱなしかどうか?という状態を保持している変数です。押しっぱなしであれば値が1で、そうでなければ0になります。これで、プログラムは暴走しなくなったわけです。

KSPでは、このwhile文と、if文、select文の3つがコントロールステートメント(俗に言う制御文というものです)として用意されています。ちょっと大変だったかもしれませんが、慣れるとすぐに体に染み込みますので、ご安心を:-)

0 件のコメント:

コメントを投稿