在上一篇教程里,我们学习了Kontakt Script中的基本回调函数和指令。在这一节里我们将学习非常重要的一个模块——流程控制。流程控制用于改变程序的运行顺序。常见的流程控制指令有if、select、exit等。
布尔运算
在Kontakt Script中,布尔运算主要用于值大小的判断。布尔运算被用在if和while语句中,布尔运算返回True(真)和False(假)的信息。下表给出了布尔运算的类型。
x > y 大于
x < y 小于
x >= y 大于等于
x <= y 小于等于
x = y 等于
x # y 不等于
in_range(x,y,z) 当x处于y和z之间时(x∈[y,z]即y≤x≤z)
not a a不成立
a and b a与b同时成立
a or b a或b单独成立
条件语句
on init message ("") {清除之前的输出} end on on note select($EVENT_VELOCITY) {对$EVENT_VELOCITY进行选择} case 1 to 40 {$EVENT_VELOCITY∈[1,40]时} message("Script message: key struck SOFT") case 41 to 100 {$EVENT_VELOCITY∈[41,100]时} message("Script message: key struck MEDIUM") case 101 to 126 {$EVENT_VELOCITY∈[101,126]时} message("Script message: key struck HARD") case 127 {$EVENT_VELOCITY=127时} message("Script message: key struck BRUTAL") end select {select语句结束} end on on release if ($EVENT_NOTE = 60) {进行判断,如果释放的是中央C} message ("You released middle C!") {如果是则输出消息} else {否则} message ($EVENT_NOTE) {输出音符序号} end if {if判断结束} end on
上述代码可能比较长,它涉及到了之前学习的init、note和release函数,还涉及到了message指令。这段代码用到了我们即将学习的if和select语句和$EVENT_NOTE变量。
if…else…end
if是一个非常重要的条件语句,它用于判断某个条件是否成立,并作出成立与不成立的反应。它的语法结构如下:
if (条件) 条件成立的语句 else 条件不成立的语句 end if
其中else是一个可以省略的语句,它只在需要的时候使用。else中也可以继续嵌套条件语句,如:
if (条件) 条件成立的语句 else if (条件) 条件成立的语句 else 条件不成立的语句 ... end if end if
但是过多的if…else…end嵌套会让代码变得难以读懂,所以在涉及到这种情况的时候我们往往选用select语句。
select
select语句与if语句类似,但是它可以有任意数量的分支语句。select语句与单个case语句进行匹配并作出判断。select在它的第一个case被满足时被调用。case通常是一个常量或者范围。select语句的语法结构如下:
select (变量) case 条件1 语句 case 条件2 语句 ... end select
select语句也可以包含在if中使用。
$EVENT_NAME
$EVENT_NAME是一个内建变量,它用于表示触发回调函数的音符序号。如果您已经测试过了上面的程序,你会发现程序的输出基本都是数字,那么这个数字是怎么产生的呢,下面我将为您介绍。在Yamaha的标准中,C3是中央C,下面的介绍也以此为标准。Midi音符序号以0为起始,我们规定0对应的音符是C-2,每升高半音这个数字就+1.那么我们可以推出每升高八度这个数字加12, 所以我们可以得到:
- 0⇒C-2
- 12⇒C-1
- 24⇒C0
- 36⇒C1
- 48⇒C2
- 60⇒C3(中央C)
- 72⇒C4
- 84⇒C5
- 96⇒C6
- 108⇒C7
- 120⇒C8
- 127⇒G8
相应地,中间的音便可以依照相邻音的序号推出。关于具体的数字转换成音高的程序我们会在后面学习。
结尾
本期教程中我们学习了Kontakt Script中的流程控制和内建变量。下一节我们将学习循环和运算。