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

 找回密码
 新人加入
查看: 7063|回复: 3

[完整特效] [SAI]034_hyoukaOP2 [复制链接]

Administrator

Shanzhai Pro.

Rank: 7Rank: 7Rank: 7

发表于 2012-8-24 19:58:19 |显示全部楼层
預覽:http://pan.baidu.com/s/1hqqY9CC#dir/path=%2FSaiyakuFX_Preview

關於頻譜算法 表示我是參考needlessED2 和 paniponiED
看著看著 算法就出來了。。。
  1. from tcaxPy import *

  2. from util.tcAudio import *

  3. SPECHEIGHT = 60

  4. def tcaxPy_Init():


  5.     # some common pre-defined global values


  6.     global fontSize    # as name implies

  7.     global resX        # horizontal resolution

  8.     global resY        # vertical resolution

  9.     global marginX     # horizontal margin

  10.     global marginY     # vertical margin

  11.     global spacing     # space between texts

  12.     global frameDur    # milliseconds per frame

  13.     global lineNum     # number of lines

  14.     global textNum     # textNum[i], number of texts in ith line

  15.     global _BT         # _BT[i], start time of a line

  16.     global _ET         # _ET[i], end time of a line

  17.     global _KT         # _KT[i][j], karaoke time of a syllable

  18.     global _SK         # _SK[i][j], elapsed karaoke time before reaching a certain syllable

  19.     global _TXT        # _TXT[i][j], as name implies

  20.     global _L          # _L[i], total width of a line

  21.     global _W          # _W[i][j], width of a text

  22.     global _H          # _H[i][j], height of a text

  23.     global _A          # _A[i][j], advance of a text, usually larger than width

  24.     global _AD         # _AD[i][j], distance between the current text to the first text of the line

  25.     fontSize     = GetVal(val_FontSize)

  26.     resX         = GetVal(val_ResolutionX)

  27.     resY         = GetVal(val_ResolutionY)

  28.     marginX      = GetVal(val_OffsetX)

  29.     marginY      = GetVal(val_OffsetY)

  30.     spacing      = GetVal(val_Spacing)

  31.     frameDur     = 1000 / GetVal(val_FXFPS)

  32.     lineNum      = GetVal(val_nLines)

  33.     textNum      = GetVal(val_nTexts)

  34.     _BT          = GetVal(val_BegTime)

  35.     _ET          = GetVal(val_EndTime)

  36.     _KT          = GetVal(val_KarTime)

  37.     _SK          = GetVal(val_KarTimeDiff)

  38.     _TXT         = GetVal(val_Text)

  39.     _L           = GetVal(val_TextLength)

  40.     _W           = GetVal(val_TextWidth)

  41.     _H           = GetVal(val_TextHeight)

  42.     _A           = GetVal(val_TextAdvance)

  43.     _AD          = GetVal(val_TextAdvanceDiff)

  44. def Spectrum(fft):      # convert fft data to graph

  45.     bars = []

  46.     b0 = 0

  47.     for x in range(BANDS):

  48.         peak = 0        # peak of a certain bar

  49.         b1 = pow(2, x * 10.0 / (BANDS - 1))

  50.         if b1 > 1023:

  51.             b1 = 1023

  52.         if b1 <= b0:

  53.             b1 = b0 + 1    # make sure it uses at least 1 FFT bin

  54.         while b0 < b1:

  55.             if peak < fft[1 + b0]:

  56.                 peak = fft[1 + b0]

  57.             b0 += 1

  58.         y = int(sqrt(peak) * 3 * SPECHEIGHT - 4)   # scale it (sqrt to make low values more visible)

  59.         if y > SPECHEIGHT:

  60.             y = SPECHEIGHT     # cap it

  61.         bars.append(y)

  62.     return bars


  63. def tcaxPy_User():

  64.     file_name = GetVal(val_OutFile) + '.ass'

  65.     ass_header = GetVal(val_AssHeader)

  66.     ASS_FILE = CreateAssFile(file_name, ass_header)

  67.     tcAudioInit()

  68.     channel = tcAudioOpen('h.mp3')

  69.     freq = tcAudioGetFreq(channel)      # usually 44100 Hz

  70.     duration = tcAudioGetDuration(channel)

  71.     num = int(duration * freq / 2048)

  72.     F = []
  73.     for k in range(num):
  74.         fft = tcAudioGetFFT(channel, 2048)
  75.         F.append(fft)

  76.     for i in range(lineNum):

  77.         initPosX = (resX - _L[i]) / 2 + marginX        # if marginX = 0, then it's just on the middle

  78.         initPosY = 720- marginY

  79.         SPECWIDTH = _L[i] +50

  80.         global BANDS
  81.         BANDS = int(SPECWIDTH/5)

  82.         for a in range(num):
  83.             ASS_BUF = []
  84.             bars = Spectrum(F[a])
  85.             bar_width = SPECWIDTH/BANDS
  86.             count = len(bars)
  87.             P = []
  88.             for b in range(count):
  89.       
  90.                 start = a * 100 * 2048 / freq

  91.                 end = (a + 1) * 100 * 2048 / freq

  92.                 x = (1280 - SPECWIDTH) / 2 + bar_width * b+25

  93.                 y = initPosY-20

  94.                 if b < count -1:            
  95.                    if bars[b]>bars[b+1] :
  96.                         if bars[b]>30:
  97.                             bars[b] = 30
  98.                         if b%2 == 0:
  99.                             P.append((x,y+bars[b]))
  100.                         else:
  101.                             P.append((x,y-bars[b]))
  102.         
  103.             if P != [] and start > _BT[i] and end <_ET[i]+10:
  104.                 sb = '{\p1}m '+str(int((1280 - SPECWIDTH) / 2))+' '+str(int(y))+' l '+str(int((1280 - SPECWIDTH) / 2)+25)+' '+str(int(y)) +' '+' '.join('l '+str(int(p[0]))+' '+str(int(p[1])) for p in P)+' l '+str(int((1280 - SPECWIDTH) / 2+_L[i])+50)+' '+str(int(y))
  105.                 TP = P[::-1]
  106.                 sb = sb+' l '+str(int((1280 - SPECWIDTH) / 2+_L[i])+50)+' '+str(int(y-1)) +' ' +' '.join('l '+ str(int(tp[0]))+' '+str(int(tp[1])-1) for tp in TP)+' l '+str(int((1280 - SPECWIDTH) / 2)+25)+' '+str(int(y-1)) +' l '+str(int((1280 - SPECWIDTH) / 2))+' '+str(int(y-1))
  107.                 ass_main(ASS_BUF, SubL(start, end, 1, Pix_Style), an(7) +alpha(0)+color1('000000')+bord(1)+color3('000000') +shad(1)+color4('FFFFFF') + pos(0, 0) , sb)

  108.             WriteAssFile(ASS_FILE, ASS_BUF)


  109.         for j in range(textNum[i]):
  110.             COLOR =["7A90FF","49D297","CDAF50"]

  111.             CLR1 = color1("FFFFFF")+color3("000000") + alpha1(0)  



  112.             ASS_BUF = []

  113.             if _TXT[i][j] == '' or _TXT[i][j] == ' ' or _TXT[i][j] == ' ':

  114.                 continue

  115.             posX = initPosX + _AD[i][j] + _A[i][j] / 2

  116.             posY = initPosY - 19

  117.             ass_main(ASS_BUF, SubL(_BT[i]+_SK[i][j]+_KT[i][j], _ET[i]+j*5, 200),fad(0,200)+ an(5) + pos(posX, posY) + CLR1+bord(1.8)+shad(1.5) ,_TXT[i][j] )

  118.             ass_main(ASS_BUF, SubL(_BT[i]+_SK[i][j]-10, _BT[i]+_SK[i][j]+_KT[i][j], 200),  an(5) + pos(posX, posY)+t(0,15,fsc(135,135)) +t(100,_KT[i][j]*10,fsc(100,100))+bord(1.8)+ CLR1 , _TXT[i][j])

  119.             if i>9:

  120.                 if j == 0:

  121.                     nposX = posX - 40
  122.                 else:
  123.                     nposX = initPosX + _AD[i][j-1] + _A[i][j-1] / 2
  124.                 for q in range(3):
  125.                     C = COLOR[q]
  126.                     CLR2 = color1(C)

  127.                     POS = Bezier3( _KT[i][j],nposX,posY,posX, posY,posX+randint(-50,50), posY+randint(-75,75),posX+randint(-50,50), posY+randint(-75,75))

  128.                     for w in range(_KT[i][j]):
  129.                         ass_main(ASS_BUF, SubL(_BT[i]+_SK[i][j]-20+w*1, _BT[i]+_SK[i][j]-20+(w+1)*1,151), an(5)+bord(0)+frz(60)+shad(0)+color3(C)+color1("00FFFF")+blur(0.8) + pos(POS[w][0], POS[w][1])+fs(10), "★")
  130.                         ass_main(ASS_BUF, SubL(_BT[i]+_SK[i][j]-20+w*1, _BT[i]+_SK[i][j]-20+50+(w+1)*1,150-w), fad(50,300)+an(5)+blur(1.8)+bord(0)+shad(0)+CLR2 +t(fsc(int(280),int(50*100/_KT[i][j])))+ pos(POS[w][0], POS[w][1])+fs(5), "■")

  131.             WriteAssFile(ASS_FILE, ASS_BUF)     # write the buffer in memory to the file

  132.         Progress(i,j)

  133.     tcAudioFin()

  134.     FinAssFile(ASS_FILE)
复制代码
1

查看全部评分

Moderator

疯子

Rank: 5Rank: 5

发表于 2012-8-24 20:03:11 |显示全部楼层
一如既往的...看不太懂

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

发表于 2012-8-24 20:21:01 |显示全部楼层
一上来就看到灾厄连撸三发...

Rank: 6Rank: 6

发表于 2016-7-11 13:37:44 |显示全部楼层
码一个 回家继续啃

Rank: 4

发表于 2022-1-17 00:55:41 |显示全部楼层
本帖最后由 Seekladoom 于 2022-1-17 01:01 编辑

已对sai大脚本进行1080P化修改,请将下列压缩包都下好后再一起解压:
TCAX Karaoke Effect Kinesis.part1.rar (950 KB, 下载次数: 2612)
TCAX Karaoke Effect Kinesis.part2.rar (950 KB, 下载次数: 2582)
TCAX Karaoke Effect Kinesis.part3.rar (950 KB, 下载次数: 2576)
TCAX Karaoke Effect Kinesis.part4.rar (241.14 KB, 下载次数: 2457)

在线预览:
【音频可视化-特效测试】两个世界的超能力者
您需要登录后才可以回帖 登录 | 新人加入

GitHub|TCAX 主页

GMT+8, 2024-12-9 06:55

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部
RealH