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

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

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

3158
#16 15-2-21 18:15

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

Kontakt选项中,可以勾选Generated CC & Notes发送到宿主也就是,Host MIDI Track1 --> Konakt1 + Script --> Host MIDI Track2

303
#17 15-2-21 19:07
好几年前自己也研究CAL的编程,语言累似于最早的汇骗语言,当时也就想着做个11号控制器的批处理文件。

3158
#18 15-2-21 19:14

回复 Chiphell 在 #13 的 pid=4401627 的贴子

当时做了个连接音符首尾的Auto Legato,以及自动画Padel的,就没怎么用过了

707
#19 15-2-21 19:18

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

reaper js的midisend就是激发midi的,可以从js里面直接输出midi,挂在Input FX上就能直接录midi了

1565
#20 15-2-21 20:34

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

脚本能直接执行对midi进行破坏性更改还是挺好的。js插件像非破坏的midi编辑这样用可能比较方便。

1565
#21 15-2-21 20:47

回复 小偷 在 #7 的 pid=4401341 的贴子

js常用在非破坏的midi编辑,Reaper的脚本破坏性编辑比较方便是这样吧?

3158
#22 15-2-22 10:04

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

各有各的好,其实在采样器基本固定为kontakt,大家都必装的前提下,以Konakt为载体开发MIDI修饰器其实也是不错的

1158
#23 15-2-22 11:00

回复 yearmiki2013 在 #12 的 pid=4401594 的贴子

CAL只能在“Cakewalk Pro Audio 9”“SONAR数字系列”“SONAR X系列”上使用,NEW上不知道能不能用,我没试过。

1158
#24 15-2-22 11:05

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

Kontakt 与 JS 的MIDI功能,我都没有使用过,这里也就没有什么发言权了,下文中我会陆续放出CAL的编写方法,以及一些编写的实际应用与讲解,
具体哪个更方便快捷,更适合自己,大家可以根据自己的喜好来选择。

11
#25 15-2-22 12:35
太深奥了!

3158
#26 15-2-22 12:53

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

其实CAL也好,JS也罢,或者是我推荐的KSP脚本,其实精通其中一个,其他的几个只不过是语法结构上和功能范畴不同而已。主要是在编写中领会针对MIDI事件的处理,给编曲带来方便就是最终的目的。要过度到其他语种也是很容易的事情,支持楼主继续发表

766
#27 15-2-22 13:45
和Ableton Live的 Max 7 语言有什么异同吗,好像都是针对DAW的MIDI编程语言,好像MAX for Live还很强大啊。

1158
#28 15-2-22 15:01

CAL教程01(语句列表A)

以下是我总结出来的各类指令列表,以及功能说明,
黑色的是常用指令灰色的是几乎没怎么用的指令蓝色是无法在SONAR上使用的指令。
大家可以自行建一个CAL语句表,方便编写时直接拷贝来用:

语句定义取值用法
变量类型   
int整型-32768 327671,12,3799,-5,-74,-8000,等等
word字型0至655353,28,99,34568,A,G,等等
long长整型-20亿至20亿类似int,只是值更大!
dword双字型0至40亿类似word,只是值更大!
string字符串型任意(string FX "ACDC U2^^^^")
Boolean布尔型0或1 
undef不属于上面五种的另一种类型  
通用事件参数变量   
Event.Chan事件通道变量0至15 
(GetCurrentTrack)当前激活的轨道 (GetCurrentTrack)
Event.Time事件起始时间变量 (+ Event.Time 0)
Event.Kind事件类型变量 (forEachEvent
(if (== Event.Kind NOTE)
事件类型   
NOTE音符(事件类型) (if (== Event.Kind NOTE)
PATCH音色(事件类型) (if (== Event.Kind PATCH)
CONTROL控制器(事件类型) (if (== Event.Kind CONTROL)
WHEEL弯音轮(事件类型) (if (== Event.Kind WHEEL)
CHANAFT通道触后(事件类型) (if (== Event.Kind CHANAFT)
KEYAFT键触后(事件类型) (if (== Event.Kind KEYAFT)
SYSX系统信息(事件类型) (if (== Event.Kind SYSX)
TEXT文本 (if (== Event.Kind TEXT)
LYRIC歌词  
SYSXSysEx 银行  
WAVE音频  
MCIMCI 指令  
EXPRESSION强弱符号  
HAIRPIN发夹  
CHORD口令  
SYSXDATASysEx 数据  
RPNRPN   
NRPNNRPN   
从属变量   
Note.Key当前音符---音高(变量)0至127 
Note.Vel当前音符---力度(变量)0至127 
Note.Dur当前音符---时值(变量)0至65535 
Patch.Num当前选择---音色(变量)0至127 
Patch.Bank当前选择---库号(变量)0至65535 
Control.Num当前控制器---编号(变量)0至127 
Control.Val当前控制器---值(变量)0至127 
Wheel.Val当前弯音---值(变量)-8192至8191 
标记变量   
Now当前光标位置 (= Now Thru)(= Now From)
From选区开始位置 (= From (makeTime 2 1 0))
Thru选区结束位置 (= Thru End)
End乐曲结束位置  
插入 

insert插入音符 (insert Event.Time Event.Chan NOTE Note.Key Note.Vel Note.Dur)
insert插入音色 (insert Event.Time Event.Chan PATCH Patch.Num Patch.Bank)
insert插入控制器 (insert Event.Time Event.Chan CONTROL Control.Num Control.Val)
insert插入弯音 (insert Event.Time Event.Chan WHEEL Wheel.Val)
算术运算符   
+ (+ 64 24)
- (- 63 4)
* (* 2 8)
/ (/ 15 3)
%取余 (% 17 3)
++加1 (++ AAA)
--减1 (-- AAA)
random随机化与变量类型有关(random 85 105)
关系运算符   
<小于  
>大于  
<=小于等于  
>=大于等于  
==等于  
!=不等于  
逻辑运算符   
&&绝对双条件包 (&& (== Event.Chan 19) (== Event.Kind NOTE))
||相对双条件包 (|| (== Event.Chan 19) (== Event.Kind NOTE))
赋值运算符   
=同等 (= AAA (+ 52 4))
+=等于加入 (+= AAA (+ 52 4))
-=等于减去 (-= AAA (+ 52 4))
*=等于相乘 (*= AAA (+ 52 4))
/=等于相除 (/= AAA (+ 52 4))
%=等于余值 (%= AAA (+ 7 3))






[ 本帖最后由 溺水鱼 于 15-2-22 15:31 编辑 ]

1158
#29 15-2-22 15:29

CAL教程01(语句列表B)

输出,输入   
message在状态栏中显示当前处理信息 (message  "正在处理" Control.Num "号控制器")
pause弹出对话框,显示当前处理信息 (pause "提示"  参数 "提示")
format格式化输入 (= A (format  Note.Key))
getInt手动整型输入 (getInt AAA  "_" -32768 32767)
getWord手动字型输入 (getWord fvd  "Wheel_" 0 65535)
getTime手动双字型输入 (getTime ABC  "TK?")
打包语句   
do执行语句  
if假设语句 (do (if (== AAA -12)  (= BBB -8192) (do (if (== AAA -12) (= BBB -8192)))))
forEachEvent遍历语句 (forEachEvent
     (if (== Event.Kind NOTE)
while循环语句 (while  条件
     (do ……)
    )
switch对比语句 (switch  Event.Kind
     NOTE (do
     PATCH (do
     CONTROL (do
     WHEEL (do
    )
include钳入外部CAL (include  "306.cal")
    或
    (include "C:\audio\cw9\JAVA\4.cal")
FileOpen钳入MIDI文件 (FileOpen  "306.mid")
    或
    (FileOpen "D:\Cakewalk Pro Audio 9\B-标帝\卡拉OK\0MIDI\A制作中\0.mid")
时间转换   
makeTime小节、拍子、TK数→总TK值*变小(makeTime 小节 拍子 TK)
meas总TK值→小节数变大(meas Event.Time)
beat总TK值→拍子数变大(beat Event.Time)
tick总TK值→TK数变大(tick Event.Time)
执行指令   
NIL不执行  
(delete)删除当前事件 (delete)
TIMEBASE4分之一拍的TK值  
(exit)退出 (exit)
Event事件  
Kind各类,各种  
count数据  
主窗口设置   
TrackChannel给轨道设置通道号 (TrackChannel 9  24),(TrackChannel 9 -1)
TrackName指定轨道的轨道命名 (TrackName  "Flag" 24)
TrackBank指定轨道的库号设置 (TrackBank -1 28)
TrackPatch指定轨道的音色号设置 (TrackPatch -1 28)
TrackKey+指定轨道的升降调设置 (TrackKey+ 0 28)
TrackVel+指定轨道的力度加减设置 (TrackVel+ 0 28)
TrackPan指定轨道的声相设置 (TrackPan -1 28)
TrackVolume指定轨道的音量加减设置 (TrackVolume -1 28)
TrackPort指定轨道的MIDI端口设置 (TrackPort 0 18)
函数命令   
EditCopy40拷贝命令 (EditCopy40 1 0 0 0 0  0 )
EditPaste40粘贴命令 (EditPaste40 From 0 0  1 1 1 1 1 1 1 0 0 0 0 )
GotoSearchNext光标至下一个音符 (GotoSearchNext)


[ 本帖最后由 溺水鱼 于 15-2-22 15:32 编辑 ]

707
#30 15-2-22 16:11

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

首先支持楼主。其实最主要的是思维,很多时候知道语言运用也不一定能想到要怎样应用
您需要登录后才可以回帖 登录 | 注册

本版积分规则

搜索