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

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

( 90 )
 
[收藏]
-  第 1 页  -
#1 15-2-21 00:09

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


1158
15年前,我第一次听说了MIDI制作,当时日本扒带业务刚刚以正面的姿态进入中国(之前是与韩国合作的),日方专门安排专业人员到中国进行培训,当时是一起玩乐队的小伙伴先接触上这个业务,我们商演时也扒过带,但与日本扒带相比,其精细程度完全不在一个层面。当时的速度是一首曲子扒了一个多月,还不停被日方NG。不过,也正因为有大量的NG书作为学习,大家的MIDI制作水平,以及扒带水平成直线上飙。这第一批由日方培养的制作人,很快的达到了日方的初级制作标准。在这个培训过程中,有大量专业音乐能力不错的人,因受不了日本方面的“蛋中挑骨”而退出,坚持下来的伙伴们也几乎没有完整的牙齿,都在变态的要求下咬碎了。

后来又由这第一批制作人开始培训新加入的制作人,随着业务量的不断增加,大家都感觉到了吃力,特别是老一批制作人,虽然制作要求都已掌握,虽然制作水平都不成问题,但面对巨大的曲量压力,都恨不得1个人变身成10个人……,即使是以带学生制作,然后再由自己来检查修改的方式,也无法支撑这种变态的要求以及曲量压力。于是大家想到了用MIDI键盘输入来代替鼠标,用MIDI吉他来代替鼠标……,希望找到提升输入效率的方法,但在一段时间的尝试后,全体放弃了这一方式,主要原因有两点:
1、这种输入方式太粗糙,完全达不到业务上的精细要求!不是效率问题,而是直接无法达到要求,比如每一个吉他弯音都要依照品位来写入标准值,比如力度是要以5为倍数设置的,比如钢琴不能使用延音踏板,而必须用拉长音符的方式来表达延音,比如扫弦必须将和声音程关系以GM格式的方式表达(即每个和弦音都要写出来)……等等,太多……
2、键盘或吉他输入,存在无法拷贝性,这里的无法拷贝,并不是指数据上的拷贝,而是能力上的拷贝。我们的制作人并不是所有的人都会吉他演奏,也并不是所有的人都会键盘演奏,最关键的是,就算会演奏,大多数人的演奏水平,又不可能完全驾驭曲中出现的演奏水平,在我接触的曲子中,很多曲子的演奏水平是相当高的,更有一些吉他为主的曲子,其演奏水平与风格,用MIDI键盘或MIDI吉他来输入,只能是笑话,单单是后期调整到日本要求的标准上,就要花去大量时间,更别说一些类似速度又快,演奏又华丽的非键盘类乐器了,就连完成演奏都是个难题……

当然,理论上有这样一种人,在数以百计,甚至千计的各种乐器演奏水平上,此人都能完胜,至少是能跟得上日本歌曲中出现过的乐手水平,假设这样一个演奏超人愿意以扒带为职业,可这依然是不可操作的,因为他的演奏水平无法在短时间内拷贝给别的制作人,从而,他一个人无法完成日本要求的曲量。

所以了解了上面所诉的朋友,就不难发现,真正的鼠标党与键盘党之间的区别是什么了,总结出来就是日本扒带(这里只可以达到提交日本的水平),只能是鼠标输入这一种方式,而键盘输入,其实只能搞对MIDI数据没有过于变态要求的MIDI作品,比如音频扒带,比如原创作品,比如编曲……,
只要是标准由自己说了算的,键盘输入才能派上用场,一但对MIDI数据有具体要求的业务,就只能是鼠标输入。

终于,我听说了CAL,当时告诉我CAL的人也不太明白它的具体编写方法,但他会用CAL,且将网上收集的CAL发给我试用了一下,那是一个处理吉他扫弦的CAL。在此之前,我们处理扫弦的方法是一个音符一个音符的去移动位置,然后一个音符一个音符的缩短时值,一个音符一个音符的处理力度。因为一首曲子中,和声是不停走动的,所以一般是先做完一小节,马上处理成扫弦,然后拷贝到下一小节,再调整和声。相信直到今天,有不少不知道CAL的同学依然是这样做扫弦或是柱式节奏的,这样制作有个巨大的缺点,就是后期发现有错误时,调整起来也相当麻烦,但有了这个CAL后,呕稀买嘎!从此箱琴可以以柱式和弦的方式直接将全曲写完,最后执行CAL,就完全搞定。

后来又陆续在网上下载到一些相当有名的CAL,音符粘合;八度生成……等等,这些CAL直接改变了用鼠标写入MIDI数据的概念,使鼠标输入MIDI的效率突飞猛进。从此,制作人与检测者的压力都有所缓解。

之后,我花了一翻功夫研究CAL的编写,最开始是利用CW9中的CAL录制功能,它就像PS中的动作录制一样,可以将一些实质性的操作转换成CAL语句记录下来,生成CAL文件。但后来发现,真正强大的CAL都是由别的语句直接编写的,用录制的方式能实现的目的太少,太简陋。

一次偶然的机会,我在一个日本人的博客中看到了一个简单的CAL功能列表,当时的网页上全是日语与英语。说实话,我只感觉那网页是天书,但我把功能列表看懂了,因为十分简单,加上日语的字面意思与中文相近,连猜带试的总结出了一套自己的功能列表,之后又花去了一些时间来实践CAL的编写,终于掌握了CAL的编写精要,最终发现,编Xie-真的十分简单,功能真的超级强大。

目前网上能下载的CAL,比较强大的都是外国人编写的,国内肯定也有编写CAL的高手,不过这类CAL一般就是私人针对指定业务所编写,因为其功能非常有针对性,所以在网上几乎没有流传。

这是我在2015年发的第一个贴子,给大家带来两个好消息:

第一个好消息是写给会编写CAL程序的老鬼们,通过一段时间的大脑搅拌,对于SONAR数字系列,以及后来的X系列……等等不支持个别CAL的问题,这里终于有了突破性进展,我编写的CAL程序,除了一个以外,已经100%移植成功。在CW9上能跑的CAL,之所以在SONAR数字系列以及X系列上不正常,完全是由个别内置变量的精度固定在960上造成的,后文中会给出我的研究结果,希望能帮助老鬼们将自己的CAL系统整个搬到SONAR所有系列上使用。

第二个好消息是写给CAL新手们的,完全不了解CAL的朋友们也可以看看,也许就会有惊喜。下文中,我会讲解CAL的编写方法,也会将我所了解到的CAL语句全部列出来,希望更多的朋友学会编写CAL程序,从而简化甚至改变MIDI的输入方式。

366
#2 15-2-21 00:27
期待后续更新

1652
#3 15-2-21 01:48
镇楼!

2264
#4 15-2-21 02:33
看着好牛,是不是还得会编程呢

8411
#5 15-2-21 06:08
支持,期待下文。

1215
#6 15-2-21 08:23
支持!
期待先录个视频,让大家见识一下cal的效率性!
谢谢!

1565
#7 15-2-21 09:53
支持感谢分享!讨论:
reaper的python脚本也可以达到cal功能目的?

1158
#8 15-2-21 10:42

CAL输入方式展示

这里展示几个视频,都是CAL热键交叉使用的效果:
1、这个是鼓组与BASS的快速制作,都以第一个小节的动机为标准来制作鼓组与BASS的。
以这种方式制作后,就只需要对马口位置作一些变化修改即可……
http://www.56.com/u53/v_MTM0OTAyNjM0.html



2、这个是GM标准格式箱琴的制作,其中的节奏向下克隆;节奏克隆给后面的单音;和声生成……等等,可以用于更多方向……,
复制剪切粘贴一键化更是常用操作……
http://v.youku.com/v_show/id_XODk0ODQwMTc2.html



3、输入的旋律,或是柱式和弦出现节奏修改是十分常见的操作,如果要一个个的去修改,就太麻烦了,
虽然SONAR各系列都有集体处理的操作,但其实并非十分理想。
这个是一个修改节奏点的CAL展示,将光标当作结果节奏,使第一个节奏点调整到光标位置,后面的所有音符自动跟进。
http://v.youku.com/v_show/id_XODgxNzgxNzcy.html



4、这是一段SOLO吉他的即兴编曲,主要展示各种弯音技巧的写入。
a、在按下弯音写入热键时,跳出的对话框将自动算出该弯音在前后音符间的音程关系,如果修改这个值,则写入修改后的音程关系。
b、框选音符,将不同音高的音符转为一个长音,音高变化转为弯音表达。
c、将框选的音符在调内的音阶中移动。
http://v.youku.com/v_show/id_XODgxNzgxODY0.html

[ 本帖最后由 溺水鱼 于 15-2-21 11:06 编辑 ]
观众反应

205
#9 15-2-21 11:50
早就听说CAL的功能强大,看看楼主的教程学习试试

1158
#10 15-2-21 16:07

给会编写CAL的老鬼们的好消息!

在 Cakewalk Pro Audio 9(之后简称CW9) 时代编写CAL真心令人怀念,因为CW9中,CAL中的各项内置变量参数值,都是以用户设定的精度来表达的。即:
    如果用户设定工程精度为480TK,那么CAL中的所有内置变量就都是480TK为精度来表达;
    如果用户设定工程精度为48TK,则CAL中所有的内置变量就会以48TK为精度来表达;

但这个理所当然的概念,在SONAR时代被无情的打破
(不知道这是设计团队的疏忽与失误?还是说有不可跨越的困难,所以只能这样设计?)
SONAR系列以及之后的版本中,CAL的一些内置变量是无法跟随用户设定来改变的,
无论用户设定的工程精度是多少,这些内置变量始终以960为精度表达!

以下是我通过十数天的仔细研究,找出来的正常变量以及存在BUG变量,并附上解决方法:

int;word;long;dword:这四个最常用的自定义变量都可以正常使用。
(但与BUG内置变量发生关系时,需要改为异常方式表达)

Event.Chan:正常
(GetCurrentTrack):异常!这是一个函数变量,在CW9中表示当前激活的轨道号,但在SONAR及以后的版本中,它的值比实际值高出了123,原因不明。
Event.Time:正常(但与BUG内置变量发生关系时,需要改为异常方式表达)
Event.Kind:正常


NOTE:正常
PATCH:正常
CONTROL:正常
WHEEL:正常


Note.Key:正常
Note.Vel:正常
Note.Dur:正常(但与BUG内置变量发生关系时,需要改为异常方式表达)
Patch.Num:正常
Patch.Bank:正常
Control.Num:正常
Control.Val:正常
Wheel.Val:正常


Now:异常!本内置变量在SONAR版本中,是固定以960精度为表达的,它不能随用户设置的精度改变!
           解决方法,在与正常变量发生关系时,需要手动缩小到用户精度,表达示为:(/ (* Now TIMEBASE) 960)
           与异常变量发生关系时,不用作任何处理。
From:异常!使用与解决方法上同!
Thru:异常!使用与解决方法上同!
End:异常!使用与解决方法上同!



makeTime:异常!这个异常与别的异常相反,在以正常方式写入“小节:节拍:TK值”之后,需要整体放大到960精度标准上去。
                    比如:(makeTime 小节 拍子 TK) 要改写成:(/ (* (makeTime 小节 拍子 TK)  960) TIMEBASE)
meas:异常!这个小节变量在与异常变量发生关系时,不用处理,比如以光标或选区作为关系对象时,不要作出任何处理,
            其表达式为:(meas Now) ;(meas From) ;(meas Thru) ……等等即可。
            但如果与正常变量发生关系时,需要将正常变量放大到960精度来表达,
            如:(meas Event.Time) 要放大为:(meas (/ (* Event.Time 960) TIMEBASE))

beat:异常!解决方案与meas相同。
tick:异常!这个异常变量的解决与上两个都不一样,如果精度设定为960,什么问题没有,可以照CW9中那样编写,
         但只要精度设定不是960,就必须要先将正常变量放大到960,再整体缩小到用户精度,
         比如:(tick Event.Time),需要这样表达:(/ (* (tick (/ (* Event.Time 960) TIMEBASE)) TIMEBASE) 960)
注:这四个变量的异常非常晕,编写时需要用到这四个变量的朋友请仔细的,反复的多看几次,再多试试就能掌握编写方法。

函数指令几乎都不能使用,一用就死软件。这很令人无语,比如以下这两个:
EditCopy40:拷贝指令
EditPaste40:粘贴指令

我在用CW9来扒带时,将选中的事件拷贝或剪切到激活轨时,CAL中就要用到这两个指令,
但SONAR禁用了这两个指令后,这个功能就无法实现了,好在有别的方式可以补救,
我发现,当选中需要移动的事件后,再激活主窗口,然后直接按小键盘上的上下键(8或2),
这些被选中的事件就会在轨道间移动,大家可以试试……

最后要提到的,就是CAL中十分重要的语句:插入语句!
会写CAL的老手们都知道,插入语句只有四个,即——插入音符;插入弯音;插入控制器;插入音色号。
需要注意的是,插入时的位置变量,是以用户设定精度为标准的,
所以在插入时,如果位置一栏中的变量属于正常变量,就照CW9的编写方式即可,
但如果位置一栏中需要用到异常变量,就要用上面提到的解决方法来编写。
比如我要在某个音符的音头位置,插入一个控制器,
在CW9与SONAR中的编写方法都一样:(insert Event.Time Event.Chan CONTROL Control.Num Control.Val)
如果我要在光标位置插入一个控制器,则会有所不同,
在CW9中写为:(insert Now Event.Chan CONTROL Control.Num Control.Val)
在SONAR中写为:(insert (/ (* Now TIMEBASE) 960) Event.Chan CONTROL Control.Num Control.Val)

TIMEBASE:这是一拍的长度(单位是TK),它是正常的,其值是跟随用户设定改变的。

综合上诉来看,正常变量都是跟随用户设定的精度改变而改变的。
而异常变量则是固定在960精度上,所以在编写时,不牵涉到异常变量时,编写方式就与CW9所用的CAL编写方式是一样的,
但只要涉及到异常变量,特别是正常变量与异常变量混在一段语句中时,
我们要么就是缩小异常变量到用户精度上,要么就是放大正常变量到960精度上,(怎样能使程序看起来更简捷,就怎么写!)
这使得SONAR的CAL编写十分考逻辑性,也使CAL程序变得异常臃肿,计算速度在极个别CAL上有明显区别,特别是用到了while指令的CAL,
在CW9上,处理全轨也许只要20秒,但在X3上居然要超过60秒!

OK,以上是给老手们的一些提示,希望老手们可以顺利的将自己的CAL系统搬到SONAR上去爽一爽……
本想将研究的所有结果都表达出来,写文时才发现,似乎这些文字看起来还是有点晕,如有问题,希望大家多多交流。

[ 本帖最后由 溺水鱼 于 15-2-21 16:26 编辑 ]

1158
#11 15-2-21 16:28

回复 longlong546 在 #4 的 pid=4401276 的贴子

“CAL的编写看起来,很像C语言编程”,注意!这是网上能搜到的少数对CAL有简单介绍的文章中写的,
具体是不是像C语言,我也不知道,因为我完全不懂编程。

707
#12 15-2-21 16:41

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

reaper的js也能做不少东西的

3158
#13 15-2-21 16:55
前提是现在还有多少人用Sonar……
如果是一个通用的模块,也许还好,建议如果电脑比较强硬的话,直接使用Reaper的JS语言或者用Kontakt的脚本
毕竟,两者都是可以把MIDI事件传回宿主的

1158
#14 15-2-21 17:35

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

网上查了一下,JS语言是一种可编写的MIDI效果器控制插件,似乎并不是用于写入MIDI用的。Kontakt 也是一个挂音源插件的连接系统。这二者与MIDI的输入是什么关系呢,我不是太了解,特别是Kontakt,我一直有用它,挂音源确实方便,
但是,这个可以用于输入MIDI么?怎么写?

348
#15 15-2-21 18:08
支持CUBASE 8吗
原帖溺水鱼 于 15-2-21 10:42 发表
这里展示几个视频,都是CAL热键交叉使用的效果:
1、这个是鼓组与BASS的快速制作,都以第一个小节的动机为标准来制作鼓组与BASS的。
以这种方式制作后,就只需要对马口位置作一些变化修改即可……
http://www.56. ...
您需要登录后才可以回帖 登录 | 注册

本版积分规则

搜索