TCAX 字幕特效制作工具官方论坛 | ASS | TCAS | Python | Aegisub | Lua

 找回密码
 新人加入
查看: 11029|回复: 9

TCAX内置特效脚本编写规范 [复制链接]

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

发表于 2011-8-15 19:02:30 |显示全部楼层
引言: 以下这些约束的意义在于保证该脚本能被作为内置特效脚本正常使用, 其中基本约束是必须遵守的, 它保证脚本能够被正常执行, 高级约束是用来保证不同类型特效之间切换时, 时间及空间上的连贯性, 附加约束则是让内置脚本更具可用性.


参考: 内置特效类型说明, 内置特效效果说明


基本约束

实现接口(或者说定义函数) tcaxPy_Init (可以为空函数), tcaxPy_Fin (可以为空函数), 以及 tcaxPy_Main


高级约束

1. 在IN, MAIN, OUT类型脚本中定义变量 time_gap, time_fac 并赋值为一个小整数, 推荐为1或2. 通常在 tcaxPy_Main 函数之前(外部)声明.
2. 特效的开始及结束时间遵循以下公式, 其中ts表示起始时间, te表示结束时间, _FD为一帧的长度, 由公式_FD = 1000 / GetVal(val_FXFPS)计算而得, 通常在tcaxPy_Init函数中将其声明为全局变量, duration为效果持续的时间, 其它变量均为tcaxPy_Main函数自带的参数, 关于其具体含义可参考tcaxPy 脚本模板详解, 实例教程中有中文解释.

    a) IN 歌词的进入方式 (Introduction Effect)
        ts = _start + _j * time_fac * _FD / 10 - time_gap * _FD / 10 - duration
        te = _start + _j * time_fac * _FD / 10 - time_gap * _FD / 10

    b) MAIN 歌词的存在方式 (Existence Effect)
        ts = _start + _j * time_fac * _FD / 10 - time_gap * _FD / 10
        te = _end - (_n - _j - 1) * time_fac * _FD / 10 + time_gap * _FD / 10

    c) EFT 卡拉OK的表现方式 (Highlight Effect)
        无严格标准, 以下公式仅作参考:
            ts = _start + _elapk
            te = _start + _elapk + _k

    d) OUT 歌词的消失方式 (Disappearance Effect)
        ts = _end - (_n - _j - 1) * time_fac * _FD / 10 + time_gap * _FD / 10
        te = _end - (_n - _j - 1) * time_fac * _FD / 10 + time_gap * _FD / 10 + duration

    e) EXT 附加效果 (Extra Effect)
        无严格标准, 请依需要设置

3. 对于坐标计算, 请使用_x, _y, 保证效果切换处的连续性即可.


附加约束

1. 脚本命名约束:
通常我们将内置特效分成6种类型 (参考帖子: http://www.tcax.org/forum.php?mod=viewthread&tid=41), 并统一放置在
TCAX程序根目录\scripts\特效类型, 如 C:\Program Files\tcax\scripts\IN
文件夹下, 脚本文件命名规范为
特效类型_xxx.py, 如 in_001.py
其中x表示0到9的自然数.

在TCC文件中, 对于py脚本文件路径来说, 前面加个 ! (感叹号) 表示从程序根目录下去寻找指定的脚本, 如, 可设置 < py file = !\scripts\IN\in_001.py >, 在接下来的版本中, 可以简单使用 !in_001.py 来代替 !\scripts\IN\in_001.py.


2. 多利用TCC文件提供的常量, 比如颜色, 字体大小, 边框厚度等. 一般我们编写普通特效脚本时, 都习惯直接在脚本中写入常量, 比如 color1('FF0000'), t(0, 300, fs(60)), 等, 因为这些量我们改起来很轻松, 但对于直接使用内置特效脚本的用户来说, 这些量都是透明的(即, 不可见的), 他们比较容易修改的是TCC文件中的值, 所以, 如果我们在写内置特效脚本时, 用 color1(_1C), 其中 _1C = GetVal(val_1C), t(0, 300, fs(_Fs + 20)), 或 t(0, 300, fs(1.5 * _Fs)), 其中 _Fs = GetVal(val_FontSize), 那么该脚本的灵活性(对于脚本用户来讲)就要更高一些. 同样的例子还有很多, 需要编写者在实践中去发现.


脚本实例

以下脚本在结构上相似性是很高的, 对于同一种类型的特效来说更是如此. 通常只需要做少量的修改就能使产生的效果有所变化. 另外, 可以在新版本的TCAX中找到更多的内置特效脚本(全部都是开源的, 存放路径在程序根目录的scripts文件夹下)

in_001.py
  1. ################################################################################
  2. ### description:
  3. ### fade in


  4. from tcaxPy import *


  5. def tcaxPy_Init():
  6.     global _FD                              # frame duration, in millisecond
  7.     global _Blur
  8.     _FD = 1000 / GetVal(val_FXFPS)
  9.     _Blur = GetVal(val_Blur)


  10. def tcaxPy_Fin():
  11.     pass


  12. time_gap = 1    # you can change this value to 0, or 2 or any other number
  13. time_fac = 1    # you can change this value to 0, or 2 or any other number

  14. def tcaxPy_Main(_i, _j, _n, _start, _end, _elapk, _k, _x, _y, _a, _txt):
  15.     ASS_BUF  = []        # used for saving ASS FX lines
  16.     TCAS_BUF = []        # used for saving TCAS FX raw data

  17.     duration = 10 * _FD                                                               # effect duration, in millisecond
  18.     ts = _start + _j * time_fac * _FD / 10 - time_gap * _FD / 10 - duration / 10      # start time, in semi-second
  19.     te = _start + _j * time_fac * _FD / 10 - time_gap * _FD / 10                      # end time, in semi-second
  20.     EFT = pos(_x, _y) + fad(duration, 0)                                              # ASS events
  21.     if _Blur > 0:
  22.         EFT += blur(_Blur)
  23.     ass_main(ASS_BUF, SubL(ts, te), EFT, _txt)                                        # store the effect

  24.     return (ASS_BUF, TCAS_BUF)
复制代码
main_001.py
  1. ################################################################################
  2. ### description:
  3. ### normal


  4. from tcaxPy import *


  5. def tcaxPy_Init():
  6.     global _FD                         # frame duration, in millisecond
  7.     global _Blur
  8.     _FD = 1000 / GetVal(val_FXFPS)
  9.     _Blur = GetVal(val_Blur)


  10. def tcaxPy_Fin():
  11.     pass


  12. time_gap = 1    # you can change this value to 0, or 2 or any other number
  13. time_fac = 1    # you can change this value to 0, or 2 or any other number

  14. def tcaxPy_Main(_i, _j, _n, _start, _end, _elapk, _k, _x, _y, _a, _txt):
  15.     ASS_BUF  = []        # used for saving ASS FX lines
  16.     TCAS_BUF = []        # used for saving TCAS FX raw data

  17.     ts = _start + _j * time_fac * _FD / 10 - time_gap * _FD / 10                 # start time, in semi-second
  18.     te = _end - (_n - _j - 1) * time_fac * _FD / 10 + time_gap * _FD / 10       # end time, in semi-second
  19.     EFT = pos(_x, _y)                                                            # ASS events
  20.     if _Blur > 0:
  21.         EFT += blur(_Blur)
  22.     ass_main(ASS_BUF, SubL(ts, te, 5), EFT, _txt)                               # store the effect

  23.     return (ASS_BUF, TCAS_BUF)
复制代码
eft_001.py
  1. ################################################################################
  2. ### description:
  3. ### normal karaoke


  4. from tcaxPy import *


  5. def tcaxPy_Init():
  6.     global _FD                         # frame duration, in millisecond
  7.     global _Blur
  8.     _FD = 1000 / GetVal(val_FXFPS)
  9.     _Blur = GetVal(val_Blur)


  10. def tcaxPy_Fin():
  11.     pass


  12. def tcaxPy_Main(_i, _j, _n, _start, _end, _elapk, _k, _x, _y, _a, _txt):
  13.     ASS_BUF  = []        # used for saving ASS FX lines
  14.     TCAS_BUF = []        # used for saving TCAS FX raw data

  15.     ts = _start + _elapk                                   # start time, in semi-second
  16.     te = _start + _elapk + _k                              # end time, in semi-second
  17.     EFT = pos(_x, _y) + K(_k)                              # ASS events
  18.     if _Blur > 0:
  19.         EFT += blur(_Blur)
  20.     ass_main(ASS_BUF, SubL(ts, te, 10), EFT, _txt)         # store the effect

  21.     return (ASS_BUF, TCAS_BUF)
复制代码
out_001.py
  1. ################################################################################
  2. ### description:
  3. ### fade out


  4. from tcaxPy import *


  5. def tcaxPy_Init():
  6.     global _FD                                      # frame duration, in millisecond
  7.     global _Blur
  8.     _FD = 1000 / GetVal(val_FXFPS)
  9.     _Blur = GetVal(val_Blur)


  10. def tcaxPy_Fin():
  11.     pass


  12. time_gap = 1    # you can change this value to 0, or 2 or any other number
  13. time_fac = 1    # you can change this value to 0, or 2 or any other number

  14. def tcaxPy_Main(_i, _j, _n, _start, _end, _elapk, _k, _x, _y, _a, _txt):
  15.     ASS_BUF  = []        # used for saving ASS FX lines
  16.     TCAS_BUF = []        # used for saving TCAS FX raw data

  17.     duration = 10 * _FD                                                                        # effect duration, in millisecond
  18.     ts = _end - (_n - _j - 1) * time_fac * _FD / 10 + time_gap * _FD / 10                     # start time, in semi-second
  19.     te = _end - (_n - _j - 1) * time_fac * _FD / 10 + time_gap * _FD / 10 + duration / 10    # end time, in semi-second
  20.     EFT = pos(_x, _y) + fad(0, duration)                                                      # ASS events
  21.     if _Blur > 0:
  22.         EFT += blur(_Blur)
  23.     ass_main(ASS_BUF, SubL(ts, te), EFT, _txt)                                                # store the effect

  24.     return (ASS_BUF, TCAS_BUF)
复制代码
ext_001.py
  1. ################################################################################
  2. ### description:
  3. ### shining stars


  4. from tcaxPy import *


  5. def tcaxPy_Init():
  6.     global _FD                         # frame duration, in millisecond
  7.     global _Fs
  8.     global _KarTime
  9.     _FD = 1000 / GetVal(val_FXFPS)
  10.     _Fs = GetVal(val_FontSize)
  11.     _KarTime = GetVal(val_KarTime)


  12. def tcaxPy_Fin():
  13.     pass


  14. def tcaxPy_Main(_i, _j, _n, _start, _end, _elapk, _k, _x, _y, _a, _txt):
  15.     ASS_BUF  = []        # used for saving ASS FX lines
  16.     TCAS_BUF = []        # used for saving TCAS FX raw data

  17.     CLR = ('FFFFFF', 'DDDDDD', '3CCEFF')
  18.     if _j == 0 or _j == _n - 1:
  19.         fac = 2
  20.     else:
  21.         fac = 4
  22.     num = _k * fac
  23.     for i in range(num):
  24.         if 0 < _j and _j < _n - 1:
  25.             rnd = randint(-int(_KarTime[_i][_j - 1] / 2), _k + int(_KarTime[_i][_j + 1] / 2))
  26.         else:
  27.             rnd = randint(0, _k)
  28.         ts = _start + _elapk + rnd
  29.         te = _start + _elapk + rnd + randint(int(2 * _FD / 10), int(4 * _FD / 10))
  30.         POS = pos(_x + randint(-int(_a / 2) + 4, int(_a / 2) - 4), _y + randint(-int(_Fs / 2) + 6, int(_Fs / 2) - 6))
  31.         EFT = fn('Arial') + fs(10) + bord(0) + fsc(randint(40, 80), randint(40, 80)) + color(CLR[randint(0, 2)])
  32.         ass_main(ASS_BUF, SubL(ts, te, 15), POS + EFT, '★')

  33.     return (ASS_BUF, TCAS_BUF)
复制代码

Rank: 4

发表于 2012-1-28 11:46:16 |显示全部楼层
求解释一下
  1.     CLR = ('FFFFFF', 'DDDDDD', '3CCEFF')

  2.     if _j == 0 or _j == _n - 1:

  3.         fac = 2

  4.     else:

  5.         fac = 4

  6.     num = _k * fac

  7.     for i in range(num):

  8.         if 0 < _j and _j < _n - 1:

  9.             rnd = randint(-int(_KarTime[_i][_j - 1] / 2), _k + int(_KarTime[_i][_j + 1] / 2))

  10.         else:

  11.             rnd = randint(0, _k)

  12.         ts = _start + _elapk + rnd

  13.         te = _start + _elapk + rnd + randint(int(2 * _FD / 10), int(4 * _FD / 10))

  14.         POS = pos(_x + randint(-int(_a / 2) + 4, int(_a / 2) - 4), _y + randint(-int(_Fs / 2) + 6, int(_Fs / 2) - 6))

  15.         EFT = fn('Arial') + fs(10) + bord(0) + fsc(randint(40, 80), randint(40, 80)) + color(CLR[randint(0, 2)])

  16.         ass_main(ASS_BUF, SubL(ts, te, 15), POS + EFT, '★')



  17.     return (ASS_BUF, TCAS_BUF)
复制代码
  1. te = _start + _j * time_fac * _FD / 10 - time_gap * _FD / 10
复制代码
这部分代码的具体意思,其余的还勉强看得明白。

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

发表于 2012-1-28 12:38:41 |显示全部楼层
kk123456 发表于 2012-1-28 11:46
求解释一下和这部分代码的具体意思,其余的还勉强看得明白。

第一块代码是内置特效脚本中的吧?你把具体不明白的地方说下吧,整块解释还真不好下手…

第二块代码只是一个时间的计算,可以把具体的数值带入算算… 关于这么计算的意义,在 问题求助 区已有帖子解释过了。可以去翻阅下… 手机发的,链接就不帮你找了…

Rank: 4

发表于 2012-1-28 15:04:00 |显示全部楼层
milkyjing 发表于 2012-1-28 12:38
第一块代码是内置特效脚本中的吧?你把具体不明白的地方说下吧,整块解释还真不好下手…

第二块代码只是 ...

num = _k * fac

    for i in range(num):

        if 0 < _j and _j < _n - 1:

            rnd = randint(-int(_KarTime[_i][_j - 1] / 2), _k + int(_KarTime[_i][_j + 1] / 2))

        else:

            rnd = randint(0, _k)

        ts = _start + _elapk + rnd
本人完全没有python基础,这段完全不懂。
另外在时间计算中的(_n - _j - 1) * time_fac 这个是什么意思,那个_j和_n并没有在tcaxPy.pyc中定义啊?

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

发表于 2012-1-28 19:05:14 |显示全部楼层
kk123456 发表于 2012-1-28 15:04
num = _k * fac

    for i in range(num):

循环语句, 条件语句, randint是取随机的函数.
python知识是不可少的, 至少学个入门吧...

_j, _n是tcaxPy_Main函数的参数.

Rank: 4

发表于 2012-1-28 19:31:58 |显示全部楼层
milkyjing 发表于 2012-1-28 19:05
循环语句, 条件语句, randint是取随机的函数.
python知识是不可少的, 至少学个入门吧...

本人正在学习python,那些python教程也还勉强看得懂,不过总觉得单单做字幕特效有好多都用不上。

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

发表于 2012-1-28 19:43:42 |显示全部楼层
kk123456 发表于 2012-1-28 19:31
本人正在学习python,那些python教程也还勉强看得懂,不过总觉得单单做字幕特效有好多都用不上。 ...

是有很多不需要的...所以说只要入个门就好了..

Q: Python学到何种程度才能编写自己的TCAX Py脚本?
A: 基本上来说, 只要入个门就行. 推荐先学TCAX Py脚本所要用到的东西. 这里简单(不完全)列举如下:
    1. 了解Python语法, 知道如何书写Python代码, 了解变量及函数的定义 (对于类等面向对象的内容可以跳过)
    2. 常用的Python语句如下:
        a) 条件语句 (if, elif, else)
        b) 循环语句 (for, while)
    3. 常用的数据结构如下:
        a) 字符串 (string)
        b) 数组 (list)
        c) 元组 (tuple)
    4. 常用的函数如下:
        a) len()
        b) range()
        c) int()
        d) randint()

Rank: 4

发表于 2016-9-3 00:06:06 |显示全部楼层
milkyjing 发表于 2012-1-28 19:43
是有很多不需要的...所以说只要入个门就好了..

学过java语言的我 只认识你说的     条件语句 (if, elif, else) 循环语句 (for, while) 字符串 (string) 数组 (list) 最多加个int 数字之类的

Rank: 1

发表于 2017-11-16 21:05:07 |显示全部楼层
菌泠 发表于 2016-9-3 00:06
学过java语言的我 只认识你说的     条件语句 (if, elif, else) 循环语句 (for, while)  ...

同感啊,看来要下一些功夫才行啊。

Rank: 1

发表于 2018-1-5 11:15:31 |显示全部楼层
想问一下为什么我加载脚本的时候老提示出错,连内置脚本都加载不了。。
]D)U00LYY3LP(T5FVJK_S~G.png
}V`@QVCMTW2SZNRR6)LN$6Q.png
您需要登录后才可以回帖 登录 | 新人加入

GitHub|TCAX 主页

GMT+8, 2024-4-19 10:34

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部
RealH