录音/制作/创作 吉他 扩声技术 视频技术 作品展示 生活 信息 更多... | 音频应用专卖店
Sonar / Cakewalk

[教程] CAL编写教程(打造自己独特的MIDI系统)

( 90 )
 
[收藏]
-  第 3 页  -

1161
#31 15-2-22 17:58

CAL教程02(熟习CAL语句的用法)

首先,我们先来大概了解一下CAL语句的编写格式。
CAL中所有的语句,都由前括号“(”开始,后括号“)”终结,这是一个死格式,如果少了任何一个括号,整个程序将报错,且无法执行。
另外,前后括号也是相对应的,我们不能在前边的功能语句中少写一两个,然后到另一段语句结束后去补后括号,这样也是会报错的,
所有的前后括号,都必须对应当前功能的完整性。
例:
(do
需要进行的内容……
)
这表示程序开始,它将执行下面需要进行的内容,而中间不管写了多少内容,最后必须给出一个后括号以终止这个执行。
当然,在中间的内容中,依然可以再次出现“(do”指令,但中间的“(do”指令也必须有一个后括号来终止它,如:
(do
内容1
内容2
(do
  内容A
  内容B
)
内容3
)
以上只是以“do”指令为例,事实上,所有的执行指令,都是相同的方式开始与终止。


现在我们从上面的列表顺序开始逐一讲解:
一:变量类型

这是自定义变量类型,它不属于我们在音乐制作中的所有内置变量类型,
我们知道,在音乐制作中,有很多事件,比如:音高,位置,控制器,弯音,音色,这些都有自己的固定表达语句。
那么用户自定义的变量类型是用来做什么的呢?
这样说大家就理解了,我们的计算器中都有一写着“M”的按键,它的作用很重要,
我们在计算过程中,时常希望保存一个计算结果,然后进行别的计算,当那些计算完成后,我们又需要与之前保存的这个结果进行计算,
如果没有这个M键,这种需要就无法实现。CAL中的自定义变量,就是做来实现这个功能的。
当然,它们的作用远不止如此,在以后的实践讲解中,我们会反复用到它,到时大家就会更清晰的明白它的重要作用。

下面我们来说一说它的用法:(注意,CAL中的所有语句都有其大小写区别,这是不能更改的,请小心使用)
变量的设置有一个固定的格式,即——前括号,变量类型,变量名,变量初始值,后括号。
其中,变量初始值是可以不写的,那就默认为“零”了。
另外,变量名也只能用英文或数字,中文是禁用的。并且设置的英文名,一定要回避上面列表中已经有了的内置变量名。

int:
它的设置方法很简单,即——(int AAA) 或 (ing AAA 64)
前一个的意思是:将“AAA”设置为int变量,初始值为0。
后一个的意思是:将“AAA”设置为int变量,初始值为64。


其它的如:“word” “long” “dword” 等变量的设置方式也一样,唯一不同的,就是它们能承担的取值范围不一样。


int:
它的取值是“-32768”到“32767”,在设置默认值或是计算过程中,它的值不能超出取值范围。
它可以在之后的语句执行过程中,以弹出对话框的方式进行手动赋值。是十分重要的变量类型。

word:
它的取值是“0”到“65535”,在设置默认值或是计算过程中,它的值不能超出取值范围。
它也可以在之后的语句执行过程中,以弹出对话框的方式进行手动赋值。是十分重要的变量类型。



long:
它的取值是“-20亿”到“正20亿”,在设置默认值或是计算过程中,它的值不能超出取值范围。
注意,它不能手动赋值,但因为取值范围很大,所以也十分常用。


dword:
它的取值是“0”到“40亿”,在设置默认值或是计算过程中,它的值不能超出取值范围。
它也不能手动赋值,但因为取值范围很大,所以也十分常用。
特别是“事件位置”这个变量,因为SONAR的很多内置变量都以960为精度,即一拍就是960TK,一小节就是3840TK,
在一些运算中,还会有难以想像的巨值出现,所以它是对应位置变量最常用的变量。

我们在CAL的编写中,如果需要用到用户自定义变量的,一般就只牵涉以上四种变量,
设置用户自定义变量时,一般设置在整个CAL语句的最开头,如下:
(do
(int K -1)
(dword T)
……等等
)
然后下面才跟着编写别的语句。

二:通用事件参数变量
这一栏中的四个变量,都是内置变量,他们分别代表MIDI制作中的四个概念,即


Event.Chan:所选事件所在的通道号。(实际值比眼睛看到的少1,如果眼睛看到的是13通道,其值将是12通道。)
在CW9中,如果进行过轨道间的拷贝剪切,或是有激活某通道时,却在别的通道上写入过数据,那么它将是比较混乱的,除非重启MIDI工程。

(GetCurrentTrack):当前被激活的轨道。(实际值比眼睛看到的少1……)

Event.Time:选中的事件中,正在被处理或扫描的事件位置。
它的单位是以TK为标准的,比如当程序正在扫描或处理第2小节第2拍第0TK位置的事件时,如果当前精度为960TK,它的值就是4800TK。

Event.Kind:变量类型,它的概念有些抽象,常用在假设语句中,在之后的实例中,它的出现频率将非常高,到时大家就会明白它的作用。

三:事件类型变量
这一栏中的四个常用变量,也是内置变量,即

NOTE:音符类型
PATCH:音色类型
CONTROL:控制器类型
WHEEL:弯音类型



此四种变量最常出现的地方,也是假设语句中,它们也出现在插入语句中,当需要插入某种类型的事件时,就会用到它们。

四:从属变量
Note.Key:音高
Note.Vel:力度
Note.Dur:长度
Patch.Num:音色号
Patch.Bank:音色库号
Control.Num:控制器号
Control.Val:控制器值
Wheel.Val:弯音值
这些变量其实就是上面四种类型变量的具体延伸。

五:标记变量
上表中有具体定义,这里就不重复了。

六:插入指令

(insert Event.Time Event.Chan NOTE Note.Key Note.Vel Note.Dur) 插入音符
(insert Event.Time Event.Chan PATCH Patch.Num Patch.Bank) 插入音色
(insert Event.Time Event.Chan CONTROL Control.Num Control.Val) 插入控制器
(insert Event.Time Event.Chan WHEEL Wheel.Val) 插入弯音

插入指令其实有一个很规律的格式,以上四种类型的插入中,其实前边四个位置都是一样的,后面则是因为类型的不同才发生了变化。

格式如下:
(插入 位置 通道 音符 音高 力度 时值)
(插入 位置 通道 音色 音色号 库号)

(插入 位置 通道 控制器 控制器号 控制器值)
(插入 位置 通道 弯音 弯音值)

了解了格式,那么只要不破坏格式,其中的内容就可以随意修改,比如我们的MIDI工程精度设置是48TK(即一拍等于48TK)
现在,我们要在第1小节第2拍第24TK位置插入一个音符,其音高是C5,力度为120,音长为36TK,写法如下:
(insert 72 Event.Chan NOTE 60 120 36)
这里面的72与60需要一个小小的解释,
在我们的CAL中,音高是以键位号的方式表达的,当光标指向某个音高时,钢琴窗的左上方会出现键位值。C5对应的键位值,就是60。
插入语句中的位置,是以TK为单位的,所以,当精度为48TK时,第1小节第2拍第24TK位置,换算成TK值,就是72TK。
当然,关于位置,我们也可以输入小节,拍子,TK来表达,这需要用到后面的时间转换语句,即这样写:
(insert (makeTime 1 2 24)  Event.Chan NOTE 60 120 36)

七:运算符

算术运算符
+ 相加,编写格式:(+ 64 2),表示64+2,结果将是66
- 相减,编写格式:(- 77 7),表示77-7,结果将是70
* 相乘,编写格式:(* 2 9),表示2*9,结果将是18
/ 相除,编写格式:(/ 48 3),表示48/3,结果将是16
% 取余,编写格式:(% 17 3),表示17/3,除完后取余下的值,结果将是2(这是调内音阶上下移动的关键算法)
++ 累加,编写格式:(++ A),表示变量A给自身+1
-- 累减;编写格式:(-- A),表示变量A给自身-1
random 随机值,编写格式:(random 85 105),表示括号内的值将在85到105之间随机取一个值。

关系运算符
<
>
<=
>=
==
!=
以上运算常用于判断语句中,比如:(if (>= A B) (-- A) (--B)),表示如果A大于或等于B,就执行A-1,否则B-1。

逻辑运算符
&& 条件绝对并存,如:(if (&& (> A B) (< A C)),表示 A大于B,A小于C,此两个条件都成立时,此假设才成立。
|| 条件任取其一,如:(if (|| (> A B) (< A C)),表示 A大于B,A小于C,此两个条件任何一个成立时,此假设都成立。

赋值运算符
=  例:(= A (+ 52 4)),表示A最终将等于56
+=  例:(+= A (+ 52 4)),表示A最终将等于A+56
-=  例:(-= A (+ 52 4)),表示A最终将等于A-56
*=  例:(*= A (+ 52 4)),表示A最终将等于A*56
/=  例:(/= A (+ 52 4)),表示A最终将等于A/56
%=  例:(%= A (+ 52 4)),表示A最终将等于A/56之后的余值


未完待续……

[ 本帖最后由 溺水鱼 于 15-2-23 18:36 编辑 ]
观众反应
:求前辈指点下怎么才能用上CAL

58
#32 15-2-22 20:42

回复 溺水鱼 在 #18 的 pid=4402068 的贴子

謝謝樓主的無私分享!還有相除的編寫格式有誤,請更正。

1161
#33 15-2-22 21:25

回复 溺水鱼 在 #18 的 pid=4402068 的贴子

感谢“zhangdoa”提示,已经更正。

1161
#34 15-2-22 21:29

回复 溺水鱼 在 #18 的 pid=4402068 的贴子

回复qq77547123:CAL的执行方式有两种,
一种是点击菜单中的执行命令执行(默认热键是CTRL+F1),
一种是设置成热键后,按热键执行。
在之后的讲解中,会写这方面的方法。

1161
#35 15-2-22 21:34

回复 Eviluess 在 #11 的 pid=4401554 的贴子

是的,其实相比学会编写的方法,更困难的是能产生出真正方便实用的MIDI操作方法。我在视频展示中,那个箱琴扫弦制作,很多想法就是来自于现在的新音源的操作方式。

1020
#36 15-2-22 21:49

回复 溺水鱼 在 #18 的 pid=4402068 的贴子

谢谢前辈

1161
#37 15-2-23 14:43

CAL教程03(熟习CAL语句的用法)

继续上贴的内容:
八:输出与输入

message:输出指令
,将当前指定的内容输出到状态栏,这可以帮助我们了解程序运行到了什么状态。

pause:输出指令
,将用户指定的内容,以弹出对话框的方式显示到屏幕上,同时,程序将暂停,直到用户点击确定或取消。

getInt:输入指令
,以弹出对话框的方式,向用户提供输入状态,可将用户输入的数据赋给指定的int类型变量,输入取值:-32768至32767。

getWord:输入指令
,以弹出对话框的方式,向用户提供输入状态,可将用户输入的数据赋给指定的word类型变量,输入取值:0至65535。

getTime:输入指令
,以弹出对话框的方式,向用户提供输入状态,可将用户输入的数据赋给指定的word类型变量。输入方式:小节 拍子 TK


九:打包语句(执行指令)

do:将任意多条指令打包成一项指令。无论有多少条指令,只要在do指令的前后括号内,都会被视为一条指令概念来执行。
用法格式:
(do
(指令A)
(指令B)
(指令C)
(指令……)
)

if:假设指令。
用法格式:
(if
(条件)
  (当条件成立时执行的指令)
  (当条件失败时执行的指令)
)

forEachEvent:遍历语句,对被选中的所有事件都执行一次下面的指令。
用法格式:
(forEachEvent
(需要执行的指令)

)

while:循环指令,很像if指令,只要条件成立,就反复执行下列指令,直到条件不成立为止。
用法格式:
(while 条件
(需要执行的指令)
)


switch:对比指令,给出“母条件”,当碰上相同的“对照条件”时,执行该对照条件后面的指令,并在完成后跳出此对比指令。
用法格式:
(switch 母条件
对照条件 (需要执行的指令)
对照条件 (需要执行的指令)
对照条件 (需要执行的指令)
……
)


include:钳入另一个CAL脚本,完成那个CAL后跳回当前语句中继续执行。

用法格式:(两种方式)
(include "306.cal") 此方式是钳入一个名为306的CAL文件,此文件必须与当前执行的CAL在同一个目录中。
(include "路径\306*.cal") 此方式是钳入一个名为306的CAL文件,此文件可以在任意目录中,只需要把它的所在路径写清楚即可。


十:时间转换指令


makeTime:将音乐方式转换为TK方式。
用法格式:
(makeTime 小节 拍子 TK)

meas:将TK方式转换为小节。
(meas TK值)

beat:将TK方式转换为拍子。
(beat TK值)

tick:将TK方式转换为TK值。
(tick TK值)

注意,上面红色的TK表示的是全曲长度中的任意位置,而黑色的TK则表示每拍中的TK位置。

十一:函数指令
这类指令因在SONAR中无法正常使用,加上这类指令本身使用率很低,故不需要掌握。



到此,CAL所有需要掌握的指令与编写格式就介绍完毕了,
有了这个基础,我们就可以进行CAL的编写了,
之后会进入实战教程,我将放出一些自己编写的CAL内容作为实例讲解,
相信经过几个CAL文件的分析,大家就可以编写自己心中所需的MIDI功能了……

待续……

1020
#38 15-2-23 16:40

回复 溺水鱼 在 #19 的 pid=4402508 的贴子

一直关注您这个!期待前辈有时间搞个视频教程,怎么入门

1161
#39 15-2-23 18:44

回复 溺水鱼 在 #19 的 pid=4402508 的贴子

CAL的编写,入门是很简单的,先把我在前边讲的那些内容看一看,当然,没入门会看得云里雾里,但还是看看吧,
在之后,我会列举一些编写CAL的实例,
到时再结合上面提到的内容,一下子就会明白的。

1568
#40 15-2-23 23:35

回复 溺水鱼 在 #19 的 pid=4402508 的贴子

期待实例,特别期待您箱琴的那个操作。

857
#41 15-2-24 06:58
期侍老师的教程    先谢谢了!

475
#42 15-2-24 09:05
强贴留名,不明觉厉

1825
#43 15-2-24 12:05
LZ高手,很有钻研精神。期待放出一些好CAL给大家使用!!

59
#44 15-2-24 14:28
好文留名!

1020
#45 15-2-24 16:32
您前面的内容我也看了~~~我在sonar X3 里试试了Ctrl+F1 可以打开CAL命令脚本文件!但是没有你视频上演示的那么方便~~~你的好像都是快捷键方式的!还有CAL命令脚本怎么搞还是云里雾里
您需要登录后才可以回帖 登录 | 注册

本版积分规则

搜索