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

 找回密码
 新人加入
查看: 3484|回复: 7

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

Moderator

Effect Researcher.

Rank: 5Rank: 5

发表于 2016-3-7 22:46:54 |显示全部楼层
本帖最后由 面麻 于 2016-3-7 22:56 编辑

迟迟没有网络发上来;
一共4个效果,有用到 tcAudio 和粒子;第4个效果有待揣摩。
另外,粒子数据结构的构造可以用 tcaxLib.pyd 中的函数 PixPoints(pix),
但是我没有尝试,你可以自己替换相应部分进行测试。
tcAudio 所用到的音频以及整个效果的预览,在下面的百度网盘中:
http://pan.baidu.com/s/1jGXN1Ds 密码: uhw9
整个工程在下面的附件中:
bokumachi_op_jp.zip (218.4 KB, 下载次数: 1459)

代码还是有点复杂,所以贴出来:
  1. from tcaxPy import *
  2. from util.tcAudio import *


  3. def tcaxPy_User():
  4.     pass


  5. def tcaxPy_Fin():
  6.     tcAudioFin()
  7.     FinFont(userfont)


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


  28. def drawsquarelistdown():
  29.     outdraw = 'm -1440 -4 l 1440 -4 l 1440 5 l -1440 5 l -1440 -4'
  30.     squarelistdraw = ''
  31.     lx = -1440
  32.     lr = lx + 4
  33.     while lr <= 1440:
  34.         temp = 'm {0} -3 l {1} -3 l {1} 1 l {0} 1 l {0} -3 '.format(lx, lr)
  35.         squarelistdraw += temp
  36.         lx += 6
  37.         lr += 6
  38.     return squarelistdraw


  39. def drawsquarelistup():
  40.     outdraw = 'm -1440 -4 l 1440 -4 l 1440 5 l -1440 5 l -1440 -4'
  41.     squarelistdraw = ''
  42.     lx = -1440
  43.     lr = lx + 4
  44.     while lr <= 1440:
  45.         temp = 'm {0} 0 l {1} 0 l {1} 4 l {0} 4 l {0} 0 '.format(lx, lr)
  46.         squarelistdraw += temp
  47.         lx += 6
  48.         lr += 6
  49.     return squarelistdraw


  50. def tcaxPy_Init():
  51.     tcAudioInit()
  52.     global channel
  53.     global freq
  54.     global framedurms
  55.     global fontsize
  56.     global userfont
  57.     fontsize = GetVal(val_FontSize)
  58.     channel = tcAudioOpen("[Ohys-Raws] Boku dake ga Inai Machi - 03 (CX 1280x720 x264 AAC)_track2.aac")
  59.     freq = tcAudioGetFreq(channel)
  60.     framedurms = 1000 / GetVal(val_FXFPS)
  61.     fontfile = GetVal(val_FontFileName)
  62.     faceid = GetVal(val_FaceID)
  63.     spacing = GetVal(val_Spacing)
  64.     spacescale = GetVal(val_SpaceScale)
  65.     userfont = InitFont(fontfile, faceid, fontsize, spacing, spacescale, MakeRGB(255, 255, 255), 0, 0)


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

  67.     ASS_BUF  = []        # used for saving ASS FX lines
  68.     TCAS_BUF = []        # used for saving TCAS FX raw data

  69.     #############################
  70.     # TODO: write your codes here #
  71.     if _i == 0:
  72.         ts = _start
  73.         te = ts + framedurms / 10
  74.         while te <= _end + framedurms / 10:
  75.             tcAudioSetPos(channel, tcAudioSec2Bytes(channel, ts / 100))
  76.             fft = tcAudioGetFFT(channel, 2048)
  77.             bars = Spectrum(fft)
  78.             #tcaxLog(bars)
  79.             EFT = pos(randint(1, 1279), _y) + blur(1) + alpha1(255)
  80.             if bars[1] > 40:
  81.                 param = pow(bars[1] / 40, 2.5)
  82.                 EFT += bord(param) + blur(param)
  83.             ass_main(ASS_BUF, SubL(ts, te, 0, 'TCMS'), EFT, '.')
  84.             ts += framedurms / 10
  85.             te += framedurms / 10
  86.     if 1 <= _i <= 8:
  87.         # NextLineBT = GetVal(val_BegTime)[_i + 1]
  88.         # NextLineET = GetVal(val_EndTime)[_i + 1]
  89.         initPosX = (GetVal(val_ResolutionX) - GetVal(val_TextLength)[_i]) / 2 + GetVal(val_OffsetX)        # an 8, 5, 2
  90.         linerightedge = initPosX + GetVal(val_TextAdvanceDiff)[_i][_n - 1] + GetVal(val_TextAdvance)[_i][_n - 1] / 2
  91.         lineleftedge = initPosX + GetVal(val_TextAdvanceDiff)[_i][0] + GetVal(val_TextAdvance)[_i][0] / 2
  92.         EFT = pos(_x, _y) + fad(500, 0) + b(1)
  93.         if _txt == '。':
  94.             EFT += (alpha1(255) + alpha3(255))
  95.         ass_main(ASS_BUF, SubL(_start, _end, 1, 'TCMS'), EFT, _txt)
  96.         # EFT = fad(500, 0) + pos(_x, _y - fontsize / 2 - 6) + an(7)
  97.         # ass_main(ASS_BUF, SubL(ts + 10, te, 1, 'TCMS'), EFT + color3('000000'), '{\p1}m -22 -4 l 22 -4 l 22 4 l -22 4 l -22 -4 {\p0}')
  98.         # ass_main(ASS_BUF, SubL(ts + 10, te, 2, 'TCMS'), EFT + color1('FFFFFF') + bord(0), '{\p1}m -22 -2 l -14 -2 l -14 3 l -22 3 l -22 -2 m -10 -2 l -2 -2 l -2 3 l -10 3 l -10 -2 m 2 -2 l 10 -2 l 10 3 l 2 3 l 2 -2 m 14 -2 l 22 -2 l 22 3 l 14 3 l 14 -2 {\p0}')
  99.         # EFT = fad(500, 0) + pos(_x, _y + fontsize / 2 + 6) + an(7)
  100.         # ass_main(ASS_BUF, SubL(ts + 10, te, 1, 'TCMS'), EFT + color3('000000'), '{\p1}m -22 -4 l 22 -4 l 22 4 l -22 4 l -22 -4 {\p0}')
  101.         # ass_main(ASS_BUF, SubL(ts + 10, te, 2, 'TCMS'), EFT + color1('FFFFFF') + bord(0), '{\p1}m -22 -2 l -14 -2 l -14 3 l -22 3 l -22 -2 m -10 -2 l -2 -2 l -2 3 l -10 3 l -10 -2 m 2 -2 l 10 -2 l 10 3 l 2 3 l 2 -2 m 14 -2 l 22 -2 l 22 3 l 14 3 l 14 -2 {\p0}')
  102.         EFT = pos(_x + _a / 2 + 2, _y) + an(7) + fad(500, 0) + bord(0)
  103.         ass_main(ASS_BUF, SubL(_start, _end, 0, 'TCMS'), EFT, '{\p1}m -0.8 -25 l 0.8 -25 l 0.8 25 l -0.8 25 l -0.8 -25 {\p0}')
  104.         backsquaredraw = 'm -{0} -{1} l {2} -{1} l {2} {1} l -{0} {1} l -{0} {1}'.format(_a / 2 + 4, fontsize / 2, _a / 2)
  105.         ts = _start + _elapk
  106.         te = _end
  107.         EFT = color1('998884') + bord(0) + alpha(255) + t(0, _k * 10, alpha(0)) + pos(_x, _y) + an(7)
  108.         ass_main(ASS_BUF, SubL(ts, te, 0, 'TCMS'), EFT, '{\p1}'+backsquaredraw+'{\p0}')
  109.         if _j == 0:
  110.             EFT = pos(_x - _a / 2 - 4, _y) + an(7) + fad(500, 0) + bord(0)
  111.             ass_main(ASS_BUF, SubL(_start, _end, 0, 'TCMS'), EFT, '{\p1}m -0.8 -25 l 0.8 -25 l 0.8 25 l -0.8 25 l -0.8 -25 {\p0}')
  112.             EFT = move(-360, _y - fontsize / 2 - 6, 200, _y - fontsize / 2 - 6) + an(7) + bord(0)
  113.             EFT += clip(lineleftedge - _a / 2 - 5, _y - fontsize / 2 - 6 - 10, linerightedge + _a / 2 + 5, _y - fontsize / 2 - 6 + 15)
  114.             ass_main(ASS_BUF, SubL(_start, _end, 1, 'TCMS'), EFT, '{\p1}m -1440 -4 l 1440 -4 l 1440 5 l -1440 5 l -1440 -4 {\p0}')
  115.             EFT = move(-360, _y - fontsize / 2 - 6, 200, _y - fontsize / 2 - 6) + an(7) + bord(0) + color1('FFFFFF')
  116.             EFT += clip(lineleftedge - _a / 2 - 5, _y - fontsize / 2 - 6 - 10, linerightedge + _a / 2 + 5, _y - fontsize / 2 - 6 + 15)
  117.             ass_main(ASS_BUF, SubL(_start, _end, 2, 'TCMS'), EFT, '{\p1}'+drawsquarelistup()+'{\p0}')
  118.             EFT = move(-360, _y + fontsize / 2 + 6, 200, _y + fontsize / 2 + 6) + an(7) + bord(0)
  119.             EFT += clip(lineleftedge - _a / 2 - 5, _y + fontsize / 2 + 6 - 10, linerightedge + _a / 2 + 5, _y + fontsize / 2 + 6 + 15)
  120.             ass_main(ASS_BUF, SubL(_start, _end, 1, 'TCMS'), EFT, '{\p1}m -1440 -4 l 1440 -4 l 1440 5 l -1440 5 l -1440 -4 {\p0}')
  121.             EFT = move(-360, _y + fontsize / 2 + 6, 200, _y + fontsize / 2 + 6) + an(7) + bord(0) + color1('FFFFFF')
  122.             EFT += clip(lineleftedge - _a / 2 - 5, _y + fontsize / 2 + 6 - 10, linerightedge + _a / 2 + 5, _y + fontsize / 2 + 6 + 15)
  123.             ass_main(ASS_BUF, SubL(_start, _end, 2, 'TCMS'), EFT, '{\p1}'+drawsquarelistdown()+'{\p0}')
  124.     if 9 <= _i <= 12:
  125.         if IsLineChanged(_i):
  126.             global ALinePix
  127.             global num
  128.             ALinePix = []
  129.             num = []
  130.         ATextPix = []
  131.         count = 0
  132.         pixel = TextPix(userfont, _txt)
  133.         initPosX = _x - int(_a / 2 + 0.5) + pixel[0][0]             # 00, initX, a float, offset of the PIX in the horizontal direction
  134.         initPosY = _y - int(fontsize / 2 + 0.5) + pixel[0][1]       # 01, initY, a float, offset of the PIX in the vertical direction
  135.         for h in range(pixel[1][1]):                                # 11, height, an integer, height of the PIX
  136.             posY = initPosY + h
  137.             for w in range(pixel[1][0]):                            # 10, width, an integer, width of the PIX
  138.                 posX = initPosX + w
  139.                 idx = 4 * (h * pixel[1][0] + w)
  140.                 pixA = pixel[2][idx + 3]
  141.                 if pixA != 0:
  142.                     ATextPix.append((posX, posY, pixA))
  143.                     count += 1
  144.         num.append(count)
  145.         ALinePix.append(ATextPix)
  146.         if _j == _n-1:
  147.             i = 0
  148.             while i < len(ALinePix)-1:
  149.                 # localrnd = 0
  150.                 if num[i] < num[i+1]:
  151.                     if num[i+1] / num[i] <= 1.6:
  152.                         temp = ALinePix[i]
  153.                         for k in range(num[i+1]-num[i]):
  154.                             param = int(RandomGauss(0, num[i]-1, 6))
  155.                             temp.append(ALinePix[i][param])
  156.                     else:
  157.                         count = 0
  158.                         for k in range(num[i+1]-num[i]):
  159.                             temp = ALinePix[i]
  160.                             temp.append(ALinePix[i][count%num[i]])
  161.                             count += 1
  162.                     for j in range(num[i+1]):
  163.                         # rnd = randint(0, 40)
  164.                         # localrnd = rnd
  165.                         EFT = move(temp[j][0], temp[j][1], ALinePix[i+1][j][0], ALinePix[i+1][j][1], 0, GetVal(val_KarTime)[_i][i] * 10) + alpha(255 - temp[j][2]) + bord(randint(0, 1)) + blur(randint(1, 3))
  166.                         ts = _start + GetVal(val_KarTimeDiff)[_i][i]
  167.                         ass_main(ASS_BUF, SubL(ts, ts + GetVal(val_KarTime)[_i][i], Layer=1, Style='TCPS'), EFT, '{\p5}m -5 -15 l -15 0 l -6 7 l 9 12 l 5 4 l 13 -13 ')
  168.                         # if i == 0:
  169.                         #     EFT = pos(temp[j][0], temp[j][1]) + alpha(255 - temp[j][2]) + bord(randint(0, 1)) + blur(randint(1, 3))
  170.                         #     ass_main(ASS_BUF, SubL(ts + rnd, _end, Layer=0, Style='TCPS'), EFT, DrawPoint())
  171.                 else:
  172.                     if num[i] / num[i+1] <= 1.6:
  173.                         temp = ALinePix[i+1]
  174.                         for k in range(num[i]-num[i+1]):
  175.                             param = int(RandomGauss(0, num[i+1]-1, 6))
  176.                             temp.append(ALinePix[i+1][param])
  177.                     else:
  178.                         count = 0
  179.                         for k in range(num[i]-num[i+1]):
  180.                             temp = ALinePix[i+1]
  181.                             temp.append(ALinePix[i+1][count%num[i+1]])
  182.                             count += 1
  183.                     for j in range(num[i]):
  184.                         # if localrnd == 0:
  185.                         #     rnd = randint(0, 40)
  186.                         # else:
  187.                         #     rnd = localrnd
  188.                         EFT = move(ALinePix[i][j][0], ALinePix[i][j][1], temp[j][0], temp[j][1], 0, GetVal(val_KarTime)[_i][i] * 10) + alpha(255 - ALinePix[i][j][2]) + bord(randint(0, 1)) + blur(randint(1, 3))
  189.                         ts = _start + GetVal(val_KarTimeDiff)[_i][i]
  190.                         ass_main(ASS_BUF, SubL(ts, ts + GetVal(val_KarTime)[_i][i], Layer=1, Style='TCPS'), EFT, '{\p4}m -5 -15 l -15 0 l -6 7 l 9 12 l 5 4 l 13 -13 ')
  191.                         # if i == 0:
  192.                         #     EFT = pos(ALinePix[i][j][0], ALinePix[i][j][1]) + alpha(255 - temp[j][2]) + bord(randint(0, 1)) + blur(randint(1, 3))
  193.                         #     ass_main(ASS_BUF, SubL(ts + rnd, _end, Layer=0, Style='TCPS'), EFT, DrawPoint())
  194.                 i += 1
  195.             ts = _start + GetVal(val_KarTimeDiff)[_i][i]
  196.             for j in range(num[i]):
  197.                 EFT = pos(ALinePix[i][j][0], ALinePix[i][j][1]) + alpha(255 - ALinePix[i][j][2]) + bord(randint(0, 1)) + blur(randint(1, 3))
  198.                 ass_main(ASS_BUF, SubL(ts, _end, Layer=1, Style='TCPS'), EFT, '{\p4}m -5 -15 l -15 0 l -6 7 l 9 12 l 5 4 l 13 -13 ')

  199.         ass_main(ASS_BUF, SubL(_start, _end, 0, 'TCMS'), pos(_x, _y) + alpha1(255) + bord(3) + blur(2) + color3('000000') + b(1), _txt)
  200.    
  201.     if 13 <= _i <= 14:
  202.         ts = _start
  203.         te = ts + framedurms / 10
  204.         if _i == 13:
  205.             color = 'C2530F'
  206.         else:
  207.             color = 'H847BC6'
  208.         if IsLineChanged(_i):
  209.             global key
  210.             key = randint(0, 3)
  211.         while te <= _end + framedurms / 10:
  212.             tcAudioSetPos(channel, tcAudioSec2Bytes(channel, ts / 100))
  213.             fft = tcAudioGetFFT(channel, 2048)
  214.             bars = Spectrum(fft)
  215.             #tcaxLog(bars)
  216.             EFT = pos(_x, _y) + blur(2) + color1('FFFFFF') + b(1) + color3('000000')
  217.             if bars[1] > 70:
  218.                 EFT += alpha1(HexToDec('80'))
  219.             else:
  220.                 EFT += alpha1(HexToDec('44'))
  221.             ass_main(ASS_BUF, SubL(ts, te, 1, 'TCMS'), EFT, _txt)
  222.             #ass_main(ASS_BUF, SubL(ts, te, 0, 'TCMS'), pos(_x + RandomDouble(-0.5, 1), _y + RandomDouble(-0.5, 1)) + blur(1) + color3(color[randint(0, 5)]) + alpha1(255) + b(1), _txt)
  223.             ts += framedurms / 10
  224.             te += framedurms / 10
  225.         ts = _start + _elapk
  226.         te = _end
  227.         EFT = pos(_x, _y) + alpha(255) + t(0, _k * 10, alpha(0)) + color1(color) + b(1) + color3('000000') + blur(2)
  228.         ass_main(ASS_BUF, SubL(ts, te, 0, 'TCMS'), EFT, _txt)

  229.     if 15 <= _i <= 18:
  230.         EFT = blur(1) + color1('FFFFFF') + b(1) + pos(_x, _y)
  231.         if _i == 18:
  232.             endextra = randint(20, 70) - 50
  233.             ass_main(ASS_BUF, SubL(_start, _end - endextra, 1, 'TCMS'), EFT, _txt)
  234.             for k in range(3):
  235.                 #size = randint(500, 2500)
  236.                 EFT = bord(0) + color1('FFFFFF') + b(1) + t(alpha1(255)+blur(randint(25, 35))+fs(randint(95, 105)))
  237.                 EFT += move(_x, _y, _x + randint(-30, 30), _y + randint(-40, 40))
  238.                 ass_main(ASS_BUF, SubL(_end - endextra, _end - endextra + 40, 1, 'TCMS'), EFT, _txt)
  239.         else:
  240.             endextra = 0
  241.             ass_main(ASS_BUF, SubL(_start, _end, 1, 'TCMS'), EFT, _txt)
  242.         color = ('305F67', 'EF8D2C', '2216B1', '4BE029', '090735', 'FF69FA')
  243.         ts = _start
  244.         te = ts + framedurms / 5
  245.         if _i != 16:
  246.             while te <= _end - endextra + framedurms / 10:
  247.                 EFT = pos(_x + randint(-2, 3), _y + randint(-2, 3)) + blur(1) + color3(color[randint(0, 5)]) + b(1)
  248.                 ass_main(ASS_BUF, SubL(ts, te, 0, 'TCMS'), EFT, _txt)
  249.                 ts += framedurms / 10
  250.                 te += framedurms / 10
  251.     #ass_main(ASS_BUF, SubL(_start, _end), pos(_x, _y) + K(_elapk) + K(_k), _txt)
  252.     #############################

  253.     return (ASS_BUF, TCAS_BUF)
复制代码
2

查看全部评分

Rank: 4

发表于 2016-3-8 12:09:40 |显示全部楼层
一血拿下

Rank: 4

发表于 2016-3-29 06:09:24 |显示全部楼层
這個真心的很強

Rank: 1

发表于 2016-4-26 21:48:48 |显示全部楼层
太牛了吧 虽然看不懂但感觉好厉害的样子

Rank: 4

发表于 2016-5-2 19:52:27 |显示全部楼层
下载了工程文件自己压制,文字之间的竖线和文字后面的灰色方块在aegisub预览时能看到,压制出来就没有了,是怎么回事呢?

Moderator

Effect Researcher.

Rank: 5Rank: 5

发表于 2016-5-2 21:59:36 |显示全部楼层
猫头鹰咕咕咕 发表于 2016-5-2 19:52
下载了工程文件自己压制,文字之间的竖线和文字后面的灰色方块在aegisub预览时能看到,压制出来就没有了, ...

换用 xy-VSFIlter.dll 试试

Rank: 4

发表于 2016-5-4 11:18:18 |显示全部楼层
面麻 发表于 2016-5-2 21:59
换用 xy-VSFIlter.dll 试试

压制用的小丸工具箱,里面有这个模块,是作为外置滤镜加载吗?

Moderator

Effect Researcher.

Rank: 5Rank: 5

发表于 2016-5-5 12:34:23 |显示全部楼层
没有使用过小丸工具箱,你自己尝试一下吧。

Rank: 4

发表于 2020-3-9 15:26:51 |显示全部楼层
本帖最后由 Seekladoom 于 2021-8-11 14:30 编辑

胶卷和粒子在文字间飞行依文字轮廓改变形状的效果啊!

Rank: 4

发表于 2021-8-11 16:41:45 |显示全部楼层
本帖最后由 Seekladoom 于 2021-12-13 23:47 编辑

呃,这代码和奶大给的手册(http://www.tcax.org/forum.php?mod=viewthread&tid=47)有很多地方不一样啊,是用1.2.0以前的时期TCAX生成的特效吗?

很多地方都没法直接用,需要统一代码写法。


追加:
上述特效脚本在碰到K值字幕文件中有全角空格时需要用全角标点符号(比如句号”。“)替代,才能确保正常的排版效果。
而碰到英文部分时则需要专门写个对英文词汇的判定才行,比如:
  1.     if _txt == 'TCAX':
  2.         EFT += fsp(0)
复制代码

这样一来就能解决中英、日英混排的歌词排版问题了。
您需要登录后才可以回帖 登录 | 新人加入

GitHub|TCAX 主页

GMT+8, 2024-3-29 20:26

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部
RealH