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

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

2011年9月8日木曜日

listener callbackとset_listener()とchange_listener_par()

listener callbackは、一見難しいようで、実はものすごく簡単です。(listener callbackがなかった頃は、同じ事をやろうとすると結構面倒だったんですよ……。いい時代になったものです。)で、ちょっと復習になりますが、listener callbackは、ホストのスタートとストップ、もしくは一定間隔置きに実行したいプログラムを簡単に書くことが出来ます。はっきし言ってちょーおもしろカッコイイ(←ネタが古い)機能です。listener callbackを使うには、ちょっとした事前準備が必要でして、init callbackにて、どのタイミングでlistener callbackを呼び出すかを予め指定しておきます。そして、listener callbackにて、実際に実行したいプログラムを書いていくわけです。では、以下のコードを見てください。

on init
	set_listener ($NI_SIGNAL_TRANSP_START,1)
	set_listener ($NI_SIGNAL_TRANSP_STOP,1)
	set_listener ($NI_SIGNAL_TIMER_MS,1000)
	set_listener ($NI_SIGNAL_TIMER_BEAT,1)
end on

on listener
	select ($NI_SIGNAL_TYPE)
		case $NI_SIGNAL_TRANSP_STOP
			message ("Stopped")
		case $NI_SIGNAL_TRANSP_START
			message ("Started")
		case $NI_SIGNAL_TIMER_MS
		case $NI_SIGNAL_TIMER_BEAT
	end select
end on

set_listenerは、init callback内でのみ使えます。これで、どのタイミングでlistener callbackを呼び出すかを指定しておきます。第1引数にはシグナルタイプを、第2引数にはパラメータを指定します。シグナルタイプには四種類しかないので、覚えてしまいましょう。$NI_SIGNAL_TRANSP_STARTは、ホストがスタートした時で、$NI_SIGNAL_TRANSP_STOPは、ホストがストップした時にlistener callbackを呼び出すかを指定します。この場合は、第2引数のパラメータが1の時には、呼び出し、0の時には呼び出しません。注目すべきは、listener callbackで、select文で$NI_SIGNAL_TYPEによって、処理を選択出来ることです。これで、アイディア次第で色んな事ができます。$NI_SIGNAL_TIMER_MSは、第2引数に指定したマイクロ秒単位でlistener callbackを呼び出します。

on init
	declare $Count
	set_listener ($NI_SIGNAL_TRANSP_STOP,1)
	set_listener ($NI_SIGNAL_TRANSP_START,1)
	set_listener ($NI_SIGNAL_TIMER_MS,1000000)
	set_listener ($NI_SIGNAL_TIMER_BEAT,1)
end on

on listener
	select ($NI_SIGNAL_TYPE)
		case $NI_SIGNAL_TRANSP_STOP
			message ("Playback was stopped.")
		case $NI_SIGNAL_TRANSP_START
			message ("Playback was started.")
		case $NI_SIGNAL_TIMER_MS
			$Count := $Count + 1
			message($Count)
		case $NI_SIGNAL_TIMER_BEAT
	end select
end on

1秒単位でlistener callbackを呼び出して、変数Countの値をステータスラインに表示しています。

on init
	declare $Count
	set_listener ($NI_SIGNAL_TRANSP_STOP,1)
	set_listener ($NI_SIGNAL_TRANSP_START,1)
	set_listener ($NI_SIGNAL_TIMER_MS,1000000)
	set_listener ($NI_SIGNAL_TIMER_BEAT,1)
end on

on listener
	select ($NI_SIGNAL_TYPE)
		case $NI_SIGNAL_TRANSP_STOP
			message ("Playback was stopped.")
		case $NI_SIGNAL_TRANSP_START
			message ("Playback was started.")
		case $NI_SIGNAL_TIMER_MS
		case $NI_SIGNAL_TIMER_BEAT
			$Count := $Count + 1
			message($Count)
	end select
end on

$NI_SIGNAL_TIMER_BEATは、第2引数に、一拍あたりに何回呼び出すかをを指定します。

on init
	declare $Count
	set_listener ($NI_SIGNAL_TRANSP_STOP,1)
	set_listener ($NI_SIGNAL_TRANSP_START,1)
	set_listener ($NI_SIGNAL_TIMER_MS,1000000)
	set_listener ($NI_SIGNAL_TIMER_BEAT,1)
	change_listener_par($NI_SIGNAL_TIMER_BEAT,2)
end on

on listener
	select ($NI_SIGNAL_TYPE)
		case $NI_SIGNAL_TRANSP_STOP
			message ("Playback was stopped.")
		case $NI_SIGNAL_TRANSP_START
			message ("Playback was started.")
		case $NI_SIGNAL_TIMER_MS
		case $NI_SIGNAL_TIMER_BEAT
			$Count := $Count + 1
			message($Count)
	end select
end on

ちなみに、change_listener_parは、設定を変更するだけです。change_listener_parは、set_listenerと違い、どのコールバックでも使うことが出来ます。

0 件のコメント:

コメントを投稿