目录
什么是卡拉OK模板执行器
- 就是这个东西
卡拉OK模板执行流程
- 找到卡拉OK模板执行器。
- 获取打好K值的行。
- 编写一个K值替换模板:
- 在开头插入新的一行作为模板行。
- 将步骤1中的新行的样式改为与K值的行一样。
- 声明template行和code行:
- template行和code行要把注释(Comment)左边的方框打上√
- 在特效栏,第一个被空格分隔的单词决定了该行是template行还是code行,是打好时间的karaoke行,还是设置好样式(被应用模板后)的karaoke行抑或其他的东西。
- 如果在特效栏填入的第一个单词是template,这行就是template行。
- 如果在特效栏填入的第一个单词是code,这行就是code行。
- 如果在特效栏看到 fx,这行就是karaoke行被应用模板后生成的行,执行自动化模板时,这些行首先会被删除。
- 如果在特效栏看到Karaoke,karaoke 或者是空白的,这行就是打好时间的karaoke行。
- 如果特效栏含有其它的东西,这行就是未声明类型,不会被自动化模板执行器处理。
- 应用卡拉OK模板。
概念解析
template行
- 模板行是字幕文件中以特殊方式标记的行,通常以“注释”的形式出现,并且在特效栏中以template开头。
- 模板行有几种类型,区分的方式为在template后的不同模版修饰语。
- 模板行中的主文本被称作“模板内容”,执行模板行将会使被模板修饰语匹配的其他行拥有同样的模板内容。
- template行作用于与template行样式相同的行。
code行
- code行是一种特殊的template行,在特效兰中以code开头。
- code行中只应该含有Lua代码,并且无法独立作用生成新的行。
- code行有两种用途:
- 定义或更新变量,为变量在template行中的使用做准备。
- 定义函数,为函数再template行中的使用做准备。
- ex: 如果你需要一个随机数,但是需要在template行中两次用到同一个随机数,就可以采用code line来生成这个随机数,再在template行里使用。
code区
- code区是template行中使用lua代码的一个区块。
- code区要求是一个单独的Lua表达式。
- code区的插入方式是使用一对半角感叹号(!),两个感叹号中间的区域即code区。
{\t($start,!syl.start_time+20!,\bord0)}
- 在code区中可以使用内联变量。它们在code区执行前就已经被赋值,所以对于Lua解释器来说,它们就是常量。
- 想要在code区进行简单的逻辑判断需要使用 and 和 or。
{\k!syl.duration > 100 and "f" or ""!$kdur}
- 以上例子的意思为当音节的持续时间(syl.duration)大于100ms时,表达式syl.duration > 100为真,code区返回“f”作为结果,否则整个and表达式为false。右边的参数or表达式会被执行但是返回空。
- 在Lua中, and 的优先级高于 or ,这意味着 and 表达式会先被评估。如果用小括号分组表示优先级,就像这样: ((syl.duration > 100) and "f") or ""。
模板修饰语
- 模板修饰语是写在template行和code行后的单词。
- 修饰语不是在所有情况下都兼容,不是对所有的template行和code行都生效。
- 书写方式为在template或code后面添加空格后再添加修饰语。
声明类修饰语
- 在没有声明类的修饰语情况下,template行默认使用syl修饰语。
- 在没有声明类的修饰语情况下,codel行默认使用once修饰语。
once
-
这个声明类的修饰语只对code行生效。
-
写了该修饰语的code行在一次卡拉ok执行器执行的过程中只运行一次,优先于其他code行和tempplate行,执行顺序按照声明顺序。
-
一般用来声明模板中的函数。
-
ex:这个例子声明了一个新的函数,它用来控制输出行的 层次(Layer) 信息。
line [name]
-
这个声明类的修饰语对template行和code行都生效。
-
参数name为可选参数,可自定义但是不能与现有修饰语相同。
-
两个有相同name的模板行在应用时会被拼接到一起。
-
code行不能写name。
-
无名称模板不能含有行前(pre-line)内容。
-
ex:这个例子中code行对每个输入行运行一次,它开启/关闭一个特效群(fxgroup),依靠输入行的说话人信息(line.actor)进行判断。
- ex:这个例子中模板行声明了一个无名称的行类模板,效果是在音节的持续时间内边框粗度由默认值变成0。
- 未执行模板前
- 执行模板后
- 可以发现执行模板后生成的fx行的边框粗度从10变成了0。
pre-line [name]
-
这个类型的修饰语只对行类模板有效。
-
参数name为可选参数,可自定义但是不能与现有修饰语相同。
-
两个有相同name的模板会被一起应用。
-
无名称模板如果只有 pre-line 修饰语,那么模板执行后输入行会被保留,同时生成的新行前加入了模板行的内容。
-
有名称的 pre-line 模板行会按顺序把模板内容叠加。最后合成的一个模板再进行应用,所以这些模板内容是在解析模板时进行的,而不是执行时。
-
ex:这个模板行声明了一个无名称的行类模板,会给每个匹配到的行添加{\3c&H0000FF&\bord10}标签。
-
未执行模板前
- 执行模板后
-
可以发现执行模板后生成的fx行拥有了template pre-line行中的特效内容。
-
ex:这个例子中声明了一个名字为jumper的行类模板,配合行前(pre-line)模板,能产生“跳跃”的特效。
-
未执行模板前
- 执行模板后
syl
-
音节类模板。
-
对code行和template行都有效。
-
ex:这行声明了一个syl类模板,它的作用是拆分音节后保持音节字符原来的位置。
-
执行模板前
- 执行模板后
furi
-
假名标注类模板。
-
编写方法为标准假名标注格式。(具体格式见本文后续标准假名标注格式的写法章节)
-
对code行和template行都有效。
-
执行之后只有假名标注。
-
执行模板前
- 执行模板后
syl furi
-
同时使用syl和furi修饰语会生成两个不同的行,一个由syl生成另一个由furi生成。
-
只有这一种多类修饰语。
-
只有使用这个才会同时生成歌词行和注音行。
-
执行模板前
- 执行模板后
其他修饰语
all
-
将模板应用到所有样式而不只是与模板行样式相同的行。
-
对code行和template行都有效。
-
要写在声明类修饰语的后面。
-
执行模板前
- 执行模板后
char
-
将模板应用于每个字符而不是每个音节。
-
会改变模板的应用顺序。
-
例子不写了,看看官方手册的理解一下。
fx name
- 使模板只应用于含有内联特效(inline-fx)的音节。(内联特效具体格式见本文后续卡拉OK内联特效章节)
- name是必填参数。
- name跟关键字和修饰语不要重复。
fxgroup name
- 声明这个模板属于一个有名称的特效组。
- name是必填参数。
- name跟关键字和修饰语不要重复。
multi
- 使模板对每个高亮应用一次,多应用于假名标注类字幕。(具体使用方法见本文后续标准假名标注格式的写法章节)
- 高亮标记为#号。
- 其中“涙”有三个音节,那么我们用两个#号来占位后两个音节,这就是创建了两个高亮。
{\k26}涙{\k33}#{\k24}#{\k36}の{\k48}薫{\k26}#{\k22}り{\k29}が{\k18}す{\k38}る
- ex:这个效果是一种简单的 “边框扩张”,但是在唱到 涙 和 薫 时,会产生多次这个效果。如果没有 multi 修饰语的话,一个汉字只会产生一次效果。
- 执行模板前
- 执行模板后
- 以下是没有 multi 修饰语的效果:
keeptags
-
使原始的标签在应用完模板后得到保留。
-
这个修饰语在char或者multi下没有效果。
-
ex: 比如我有一行K轴,其中一个字是红色,我想要在模板执行结束后不覆盖这个红色字体,就要用keeptags。
-
这行template的效果是音节 “沿X轴翻转”,并在高亮的时间内翻转回去。
-
执行模板前
- 执行模板后
noblank
- 该模板不会对认为是“空”的音节起作用。
- 认为是“空”的几种情况(去掉标签后):
- 剩下的是ASCII的空格;
- 剩下的是全角空格;
- 真正是空的 特殊情况;
- 音节的持续时间是0 (\k0)。
notext
-
说明原文本在应用模板后不会在输出行中被显示。
-
一般用于清除文本的同时输出图形。
-
不能用于code行。
-
ex: 定义一个剑尖朝下的剑形状,使用move标签使剑下落到音节上,使用notext让执行之后的行没有文字只有图形。
-
执行模板前
- 执行模板后
repeat n, loop n
- 模板会按照给定数值多次执行,需要给定数字。
- 循环次数必须是正整数,不能是变量或者算式。
- repeat 和 loop 一样。
- 注意 loop 修饰的行模板和 loop 修饰的 音节/假名标记(syl/furi)模板执行顺序不同。
- ex:loop 修饰语用于创建4个音节的副本。这四个副本每个都沿随机方向移动,在X/Y方向上最大范围30像素,带有淡出。
- 执行模板前
- 执行模板后
内联变量
- 以上例子中$和$后面的就叫内联变量。
如何使用内联变量
- 所有的内联变量头部都是一个$符。
- 内联变量只在template行起作用,code行只能写lua代码,但是可以在code区使用。
{\pos($x,$y)\t($start,$end,\bord0)}
-
以上例子中的
$x
、$y
、$start
、$end
就是内联变量。 -
当一个模板被应用时,内联变量会被替换为对应的值,
-
其中
$x
、$y
就会被音节的坐标x,y替代,$start
、$end
就会被音节的开始时间和结束时间替代。 -
内联变量的大小写影响。
变量类型
- 内联变量同时适用“line”和“syllable”两种模式。“line”模式时,变量为被处理行的信息,“syl”模式时,则为被处理的音节的信息。
- 内联变量中也有很多变量能够自动适应,它们既能变成line模式,也能变成syl模式,这取决于它们的template修饰语。 自适应变量只有在pre-line中,会自动为行变量,其它地方将自动为音节变量。
- 记忆方法:行变量开头是小写l,音节变量开头是小写s。
行(Line)变量
变量名称 | 变量含义 |
---|---|
layer | 行所在层数 |
lstart, lend | 行开始时间、行结束时间(ms) |
ldur, lmid | 行持续时间、行中点时间(=0.5 * (开始时间 + 结束时间))(ms) |
style | 行样式名称 |
actor | 行说话人名称 |
margin_l, margin_r | 有效左边距和右边距 |
margin_v, margin_t,margin_b | 有效垂直边距、顶部边距、底部边距( 垂直边距和顶部边距含义相同) |
syln | 行内音节的个数 |
li | 行数(起始数量为1) |
lleft, lcenter, lright | 行的左边缘、水平中心、右边缘距离 |
ltop, lmiddle, lbottom | 行的上边缘、垂直中心、下边缘距离 |
lx, ly | 对\pos代码使用的x,y坐标 |
lwidth, lheight | 行的宽度和高度(以像素为单位) |
音节(Syllable)变量
变量名称 | 变量含义 |
---|---|
sstart, send, smid | 音节(相对于行)的开始时间、结束时间、中点时间,适合配合\t和\move使用 |
sdur, skdur | 音节的持续时间,前者以毫秒为单位,后者以厘秒为单位 |
si | 该行的第几个音节 |
sleft, scenter, sright | 音节的绝对的左边缘、水平中心和右边缘距离,从屏幕左边缘开始计算, 配合\pos和\move |
sbottom, smiddle, stop | 音节的绝对的下边缘、垂直中心和上边缘距离,从屏幕左边缘开始计算, 配合\pos和\move, 可根据假名定位进行调整 |
sx, sy | 音节在默认对齐方式下的绝对位置(x,y),配合\pos和\move |
swidth, sheight | 音节的宽度和高度(以像素为单位)这两个变量会被取整,所以也许和位置变量不完全吻合 |
自适应(Automatic)变量
变量名称 | 变量含义 |
---|---|
start, end, mid | 行或音节的开始时间、结束时间、中点时间,行是绝对时间,音节是相对行的时间(通用,自动进行判断) |
dur, kdur | 行或音节的持续时间,前者以1ms为单位1,后者以10ms为单位1 |
i | 行数或音节数 |
left, center, right | 行或音节的绝对的左边缘、水平中心和右边缘距离, 从屏幕左边缘开始计算 |
top, middle, bottom | 行或音节的绝对的上边缘、垂直中心和下边缘距离,从屏幕左边缘开始计算 |
x, y | 行或音节的默认对齐方式下的坐标(x,y) |
width, height | 行或音节的默认对齐方式下的坐标(x,y)行或音节的宽度和高度,这两个变量会被取整,所以也许和位置变量不完全吻合 |
标准假名标注格式的写法
- 首先我们先按照音节拆分这一行的内容,汉字先不按照音节划分,正常K轴如下。
- ex:涙(なみだ)の薫(かお)りがする
{\k83}涙{\k36}の{\k74}薫{\k22}り{\k29}が{\k18}す{\k38}る
- 然后将汉字或其他需要注音的音节也打上K,并将汉字打到读音的第一个音节,其他音节用#号占位。
{\k26}涙{\k33}#{\k24}#{\k36}の{\k48}薫{\k26}#{\k22}り{\k29}が{\k18}す{\k38}る
- 之后填写汉字的读音,在汉字或#号的后面添加|<再写假名注音,如果有需要就添加!分隔符用来留空。
- 用|<之后假名会按汉字的位置居中,用|则不居中。
{\k26}涙|<な{\k33}#|<み{\k24}#|<だ{\k36}の{\k48}薫|<か{\k26}#|<お{\k22}り{\k29}が{\k18}す{\k38}る
卡拉OK内联特效
-
inline-fx即内联特效是用来给打过的K轴的其中一部分分配不同的特效来使用的。
-
inline-fx标记本身并不会有任何影响,只有当应用可以识别它的卡拉ok特效脚本时才会应用于打了k的轴。
-
内联标签的写法为
\-name
。 -
首先我们先按照音节拆分这一行的内容,正常K轴如下。
-
ex:涙の薫りがする
{\k83}涙{\k36}の{\k74}薫{\k22}り{\k29}が{\k18}す{\k38}る
- 现在我想给の后面到り前的位置加上名为paint的特效,给り及后面直到结束加上名为cloud的特效,那么这行K轴为:
{\k83}涙{\k36-paint}の{\k74}薫{\k22-cloud}り{\k29}が{\k18}す{\k38}る
音节 | 内联特效 |
---|---|
涙 | 空 |
の | paint |
薫 | paint |
り | cloud |
が | cloud |
す | cloud |
る | cloud |
- 现在我们已经给K行加上内联特效了,那么在template行里用fx修饰语来执行。
- 其中template syl行对所有音节生效;
- template syl fx paint对拥有paint内联特效的音节生效,同时叠加生效syl行中的内容;
- template syl fx cloud对拥有cloud内联特效的音节生效,同时叠加生效syl行中的内容。