鼠标点一下变两下
不知道大家在制作音频工程的时候有没有碰到过如下经历:
元气满满的一天就这样从进行“筛选素材——导入工程——创建Cue”这种纯粹又富有韵律的动作中开始了。
让我们操练起来!
当然,在进行这种活动的时候难免有时候可能会神游天外,于是经常也有可能出现某些下饭操作……
在听到了不少朋友们的吐槽之后,我们致力于让声音设计师摸鱼的开发大大有了一个大胆的想法——用Robot做一套脚本不就完了么!
在素材量不是很大的情况下,几乎可以原封不动的完成瞬间转化!
我们当然也不会藏私,脚本详解以及样例工程都在此分享给大家!
让我们开始本次的案例分享吧!
1
远程连接的准备工作
在我们官方入门教程的最后一课中,我们曾讲过Robot是可以进行远程控制的,今天就让我们来实战演练一下。
*教程链接:https://www.criware.cn/Home/Goods/study_1_list/cat_id/47/article_id/282.html#
为了在Python里可以调用cri的robot api,我们需要导入相应的运行库。这些运行库可以在AtomCraft根目录下的robot/remote/python文件夹里找到。届时需要import相应api时,需要将脚本放在正确的目录结构里。比如远程连接AtomCraft的时候需要import cri.atomcraft.criatomcraft_lib,因此我们执行的脚本就需要对齐robot/remote/python下的cri文件夹的内容。
为了能够使用Python来控制Reaper,我们需要用到Reaper的ReaScript,ReaScript可以支持很多类型的脚本包括Python,不过我们首先需要进行一些设置。找到Reaper菜单栏中的Option->Perference,找到里面的Plug-ins->ReaScript,勾选上[Enable Python for use with ReaScript]。并且手动指定Python的路径已经相应的动态运行库。如此以来,我们就可以是使用了Python来控制Reaper了。然后通过ReaScript,导入AtomCraft的Robot的远程连接用的Api,从而实现Reaper和AtomCraft的联动。
2
从ReaScript启动脚本
找到Reaper菜单栏的Actions->Show Action List。如果你已经安装过一些插件脚本,那么这里会显示很多便利的脚本。然后找到[New Action]->[Load ReaScript],在这里就可以加载我们即将要执行并且用来连接Robot的脚本,我们的脚本需要import cri.atomcraft.criatomcraft_lib这个库,因此加载的脚本需要和[cri]文件夹处于同一目录。
3
打开AtomCraft服务器
AtomCraft这一侧也需要做好相应的准备,找到AtomCraft菜单栏的[脚本]->[Server]->[启动脚本Server]。启动之后,就可以通过Python远程连接AtomCraft了。
4
一键生成AtomCraft的Cue
作为本次的样例脚本,我们尝试了将Reaper的工程界面里的Track以及以下的MediaItem原封不动的一键转移到AtomCraft的一个Cue里面,其中Reaper的一个project对应AtomCraft 的Cue,Track对应Track,MediaItem对应WaveFormRegion。(想要熟练使用ReaScript以及Robot需要了解各自的对象结构,其中AtomCraft的对象结构可以参照我们以往的Robot教程)
5
脚本如下(附带详解):
要注意的是,这个脚本还在完善中,还有很多可能出错的地方没有照顾到,以及一些参数需要配合本地工程的设置,主要供大家学习参考使用。在实际使用的时候需要自行完善以及修改一些参数。
import cri.atomcraft.criatomcraft_api_lib as
acconnect
import cri.atomcraft.debug as acdebug
import cri.atomcraft.project as acproject
def GenerateAtomCue():
# get all mediaitems
#(遍历获取所有的mediaitem,RPR_GetNumTracks()和RPR_GetTrackNumMediaItems()可以分别获取reaper工程里track的数量以及track里item的数量,最后结果保存到mediaitems这个二维list里。)
mediatrack = []
mediaitems = []
for i
in range(RPR_GetNumTracks()) :
mediatrack.append(RPR_GetTrack(0, i))
_mediaitem = []
for
j in range(RPR_GetTrackNumMediaItems(mediatrack[i])) :
_mediaitem.append(RPR_GetTrackMediaItem(mediatrack[i],j))
mediaitems.append(_mediaitem)
# get each item position
#(使用RPR_GetMediaItemInfo_Value()遍历获取所有的mediaitem在时间轴上的位置,RPR_GetMediaItemInfo_Value可以获取的不仅仅是position,还可以获取item里各式各样的属性,最后结果保存到positions这个二维list里。)
positions = []
for i
in mediaitems:
_position = []
for
j in i:
_position.append(RPR_GetMediaItemInfo_Value(j, “D_POSITION”))
positions.append(_position)
# get each sound source path
from each item
#(为了把源素材文件注册到AtomCraft里,需要获取素材的文件地址。在reaper里,一个item里面可以有复数个take 存在,在这次的样例脚本里,我们默认一个item只对应一个take(序列为0的take),在实际的情况里,可以按照设计师的需求进一步的进行分化。最后使用RPR_GetMediaSourceFileName()获取这个take的素材的文件地址,结果保存到source_filenames这个二维list里。)
source_filenames = []
for i
in mediaitems:
_source_filename = []
for
j in i:
_take = RPR_GetMediaItemTake(j, 0)
_source = RPR_GetMediaItemTake_Source(_take)
_result = RPR_GetMediaSourceFileName(_source, “”, 512)
_filename = _result[1]
_source_filename.append(_filename)
source_filenames.append(_source_filename)
# connect to AtomCraft
#(这一部分是连接到AtomCraft所必须的步骤,在这次样例脚本里,我们直接连接本机。(AtomCraft的server开放的端口为9000))
result
= acconnect.initialize()
if
result != 0:
RPR_ShowConsoleMsg(“initialize error”)
return
result
= acconnect.connect(“127.0.0.1”, 9000)
if
result != 0:
RPR_ShowConsoleMsg(“connection failed”)
acconnect.finalize()
return
# get workunit
#(获取当前工程的WorkUnit,默认名称为(WorkUnit_0))
result =
acproject.get_workunit(“WorkUnit_0”)
if not
result[“succeed”]:
acdebug.warning(“Failed to get WorkUnit”)
RPR_ShowConsoleMsg(“Failed to get WorkUnit”)
return
workunit =
result[“data”]
# register material
#(使用保存的素材文件地址的list,使用register_material注册相应的素材到AtomCraft的素材树里,相应的文件也会被自动复制到AtomCraft工程里的素材目录里,最后范围的material对象保存到materials里,以供之后使用。)
material_rootfolder =
acproject.get_material_rootfolder(workunit)[“data”]
materials = []
for i
in source_filenames:
_material = []
for
j in i:
result = acproject.register_material(material_rootfolder, j)
if not result[“succeed”]:
RPR_ShowConsoleMsg(“Failed to register material”)
break
_material.append(result[“data”])
materials.append(_material)
# get CueSheet (you can
create a CueSheet by yourself)
#(获取我们要创建cue所需的CueSheet,在样例脚本里,我们直接默认工程里已经建好了一个名为CueSheet_0的CueSheet。)
cuesheet_rootfolder =
acproject.get_cuesheet_rootfolder(workunit)[“data”]
cuesheet_folder = acproject.get_child_object(cuesheet_rootfolder,
“CueSheetFolder”, “WorkUnit_0”)[“data”]
cuesheet = acproject.get_child_object(cuesheet_folder,
“CueSheet”, “CueSheet_0”)[“data”]
#
create a Cue
#(创建这次的Reaper工程所对应的Cue,如果已经有了这个Cue,那么直接获取它。)
cue =
acproject.create_object(cuesheet, “Cue”,
“From_Reaper”)[“data”]
cue =
acproject.get_child_object(cuesheet, “Cue”,
“From_Reaper”)[“data”]
# create Tracks and
Waveformregions
#(根据我们之前获取的mediaitem,使用create_object分别创建相应的track,以及使用create_waveform_region根据每一个item创建track下面的waveformregion,并且使用set_value根据时间轴来设置起开始播放的位置。)
tracks
= []
waveform_regions = []
x = 0
for i
in materials:
x =
x + 1
_track = acproject.create_object(cue, “Track”,
“Track”+str(x) )[“data”]
tracks.append(_track)
waveform_region = []
for
j in i:
result = acproject.create_waveform_region(tracks[materials.index(i)],
j)
waveform_region.append(result[“data”])
acproject.set_value(result[“data”], “DelayTimeMS”,
positions[materials.index(i)][materials[materials.index(i)].index(j)]*1000)
waveform_regions.append(waveform_region)
#
disconnect
acconnect.disconnect()
acconnect.finalize()
RPR_ShowConsoleMsg(“Cue Generated”)
return
GenerateAtomCue()
6
实际执行:
为了测试我们的脚本,我们使用以下的样本工程来进行尝试。打开样本工程后,选择菜单[Actions]->[Show Action List],打开脚本管理界面。选择[New Action]->[Load ReaScript],找到之前我们编辑的Python脚本,然后添加。要注意的是,我们的脚本必须要导入CRI提供的Robot运行库,即要和运行库文件层级在同一个目录下。添加之后,我们就可以执行脚本了。执行之后,会弹出对话框,如果成功,则AtomCraft内显示如下。可以看到Reaper内工程的结构已经原封不动的注册到AtomCraft的一个Cue里了。是不是感觉非常的神奇。
7
总结
利用这一类的方法,音频工作者可以很方便的进行AtomCraft的整合。当然实际的应用中,可能会有更多不同的场景和不同的需求,用户需要自行对脚本进行修改和进行开发。程序端如果熟练掌握了AtomCraft Robot的API,就可以为音频设计师提供大量的方便的自动化工具,从而大幅度提升开发效率。同时,以上的脚本和Reaper工程我们也会开放链接给大家下载。链接:https://pan.baidu.com/s/1NYda1nPIXeU9AmvZno_6BQ
提取码:ADX2
使用中遇到问题,欢迎加入我们的官方QQ群一起讨论!
494015882
往期推荐
CRIWARE开始征稿啦!
最专业的游戏影音一体化解决方案厂商——CRI中国成立两周年!
由LipSync实现的生动口型同步 采访『ALTDEUS: BC』开发团队——关于魅力角色的真实感
多一个点在看,多一条小鱼干