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

 找回密码
 新人加入
查看: 2896|回复: 1
打印 上一主题 下一主题

[完整特效] [K] Joker_Game_ED [复制链接]

Moderator

Effect Researcher.

Rank: 5Rank: 5

跳转到指定楼层
楼主
发表于 2016-5-31 16:33:56 |只看该作者 |倒序浏览
本帖最后由 面麻 于 2016-5-31 16:34 编辑

完整工程和相关文件都在百度网盘。
链接: http://pan.baidu.com/s/1hrOSQJq 密码: kuv7
一般 TV Raw 的音频用来做 tcAudio 效果都不好。

关于 tcaxLog() 函数的使用。
它可以把变量的值输出到 log 文件,方便 debug。
这里举例,用来统计音高的平均值。
设置全局变量,利用 IsLineChanged 函数初始化为0,对于一句歌词的每一帧,
将对应时间的音高求和,最后在 _j == _n - 1 时将和除以帧数。
这样可以得出每一句的平均音高,利用 tcaxLog 输出。
把它们存储在元组中,在 tcaxPy_Init 函数中将元组声明为全局变量。

另外,鼓声一般是在音频的低频段,BANDS 数设置最好不小于 6,频段选择 0 和 1都比较合适。
这个效果是把音高转化为旋转量,算是个新点子。
也可以转化为其它量,之前 Durarara_2_Ten_ED_JP 是转化为 bord 和 blur 量。
  1. from tcaxPy import *
  2. from util.tcAudio import *

  3. def Spectrum(fft):      # convert fft data to graph
  4.     SPECWIDTH = 368
  5.     SPECHEIGHT = 127
  6.     BANDS = 6
  7.     bars = []
  8.     b0 = 0
  9.     for x in range(BANDS):
  10.         peak = 0        # peak of a certain bar
  11.         b1 = pow(2, x * 10.0 / (BANDS - 1))
  12.         if b1 > 1023:
  13.             b1 = 1023
  14.         if b1 <= b0:
  15.             b1 = b0 + 1    # make sure it uses at least 1 FFT bin
  16.         while b0 < b1:     # peak = max(fft[1:b1])
  17.             if peak < fft[1 + b0]:
  18.                 peak = fft[1 + b0]
  19.             b0 += 1
  20.         y = int(sqrt(peak) * 5 * SPECHEIGHT)
  21.         bars.append(y)
  22.     return bars

  23. def tcaxPy_Init():    # TCC 文件 < tcaxpy init = true >
  24.     global dFrameDur
  25.     global channel
  26.     global freq
  27.     dFrameDur = 1000 / GetVal(val_FXFPS)    # 帧时间,毫秒
  28.     # tcAudio
  29.     tcAudioInit()
  30.     channel = tcAudioOpen("D:\RH\JokerGame\JokerGameED.wav")    # tcAudio 模块,注意个性化音频路径
  31.     freq = tcAudioGetFreq(channel)

  32. def tcaxPy_Fin():     # TCC 文件 < tcaxpy fin = true >
  33.     tcAudioFin()

  34. def tcaxPy_Main(_i, _j, _n, _start, _end, _elapk, _k, _x, _y, _a, _txt):

  35.     ASS_BUF  = []        # used for saving ASS FX lines

  36.     if _i < 6:
  37.         if _j % 2 == 0:
  38.             nSign = -1
  39.         else:
  40.             nSign = 1
  41.         # 简单入场效果,上下淡入
  42.         EFT1 = move(_x, _y + nSign * randint(30, 60), _x, _y, 0, 200) + color1('08067C') + color3('FFFFFF') + alpha1(255) + alpha3(255) + t(0, 200, alpha1(0) + alpha3(0) + blur(2))
  43.         ass_main(ASS_BUF, SubL(_start - 20, _start + _elapk), EFT1, _txt)
  44.         # K 效果,变色
  45.         EFT2 = pos(_x, _y) + blur(2) + color1('08067C') + color3('FFFFFF') + t(color1('FFFFFF') + color3('08067C'))
  46.         ass_main(ASS_BUF, SubL(_start + _elapk, _start + _elapk + _k), EFT2, _txt)
  47.         # 出场效果,向左旋转飞出,此处 bord 和 blur 的变化注意自己调整到合适
  48.         ts3 = _start + _elapk + _k
  49.         te3 = ts3 + randint(10, 20)
  50.         EFT3 = move(_x, _y, _x - randint(20, 40), _y + randint(-20, 20)) + color1('FFFFFF') + color3('08067C') + t(frz(randint(-180, 180)) + bord(50) + blur(50) + alpha1(255) + alpha3(255))
  51.         ass_main(ASS_BUF, SubL(ts3, te3), EFT3, _txt)
  52.     else:
  53.         # 入场效果,左右整行进入,设置三组增加重影效果
  54.         for i in range(3):
  55.             nPosXDelta = randint(100, 150)
  56.             ass_main(ASS_BUF, SubL(_start - 20, _start, 0), move(_x - nPosXDelta, _y, _x, _y) + fad(100, 0) + blur(2), _txt)
  57.             ass_main(ASS_BUF, SubL(_start - 20, _start, 1), move(_x + nPosXDelta, _y, _x, _y) + fad(100, 0) + blur(2), _txt)
  58.         # 存在,无效果
  59.         ass_main(ASS_BUF, SubL(_start, _start + _elapk), pos(_x, _y) + blur(2), _txt)
  60.         # 统计 K 时间的帧数
  61.         nFrameCnt = int(10 * _k / dFrameDur + 0.5)
  62.         nAngle = 0   # 必须在循环外初始化,否则旋转不连续
  63.         for i in range(nFrameCnt):
  64.             tcAudioSetPos(channel, tcAudioSec2Bytes(channel, (10 * (_start + _elapk) + i * dFrameDur) / 1000))
  65.             fft = tcAudioGetFFT(channel, 2048)
  66.             bar = Spectrum(fft)
  67.             # 将 bar 高转化为旋转量
  68.             if bar[1] > 77:    # 鼓声在音频的低频段,bar 高的阈值可以利用统计方法得出
  69.                 nAngle += int(bar[1] / 10 + 0.5) * 2
  70.             EFT = an(5) + pos(_x, _y) + blur(2) + frz(nAngle)
  71.             ts = _start + _elapk + (i * dFrameDur / 10)
  72.             te = ts + dFrameDur / 10
  73.             ass_main(ASS_BUF, SubL(ts, te), EFT, _txt)

  74.     return (ASS_BUF, None)
复制代码

Rank: 4

沙发
发表于 2016-6-28 01:33:24 |只看该作者

谢谢楼主大大免费分享!学习了

Rank: 4

板凳
发表于 2022-2-19 02:39:55 |只看该作者
本帖最后由 Seekladoom 于 2022-2-19 02:40 编辑

这里可以用python自带的math.fmod去计算啊:
  1. if _i < 6:
  2.         if _j % 2 == 0:
  3.             nSign = -1
  4.         else:
  5.             nSign = 1
复制代码
您需要登录后才可以回帖 登录 | 新人加入

GitHub|TCAX 主页

GMT+8, 2024-4-24 18:48

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部
RealH