事件管理
事件与音符编号
每个音符都是事件,外来的(键盘、编曲软件)或是脚本生成的音符都是事件。由于音符释放后,声音会经历衰减(Decay)过程,音符事件会持续存在一段时间,因此可能会有很多事件同时存在。为了方便访问,每个事件都有一个唯一编号。但回调函数和事件是两码事。回调函数是被计算机执行的程序,而事件可以认为是一种虚拟音。
触发回调函数的音符,其编号储存于内建变量$EVENT_ID中。play_note()中生成的音符序号可以手动指定。
on init message ("") declare $new_note_id declare $original_note_id end on on note $original_note_id := $EVENT_ID wait(500000) note_off($original_note_id) $new_note_id := play_note($EVENT_NOTE + 12,$EVENT_VELOCITY,0,500000) wait(500000) note_off($new_note_id) end on on release if ($EVENT_ID = $new_note_id) message("note off new note") wait (200000) message ("") end if if ($EVENT_ID = $original_note_id) message("note off original note") wait(200000) message ("") end if end on
用户演奏音符后,音符回调函数被执行一次,然而通过观察Kontakt状态栏,释放回调函数却执行了两次。play_note()函数可以看做是一只虚拟手,它也在演奏音符。用户演奏音符后,自然会松开琴键,此时会触发释放回调函数。而程序生成的音符也会随之松开,会再次触发释放回调函数。
note_off()与play_note()相关,note_off()函数释放音符。
note_off(<编号>) |
note_off()函数会释放音符,同时触发释放回调函数。 |
play_note()函数中的时值(duration)参数,是可以组合wait()和note_off()来代替的。但是因为play_note()函数运用广泛,为了提升效率,故也可以使用时值参量。如果读者想要完全忽略某时间,可以使用ignore_event()指令。
on note ignore_event($EVENT_ID) play_note($EVENT_NOTE,$EVENT_VELOCITY,400000,-1) end on
用户演奏的音依然十分正常,音符序号与力度在回调函数中仍然可用,play_note()函数将音符演奏出来,但是加上了400毫秒的延迟。ignore_event也可以用来忽略释放回调函数。
ignore_event(<编号>) |
在回调函数中忽略事件。 |