- UID
 - 2443
 - 积分
 - 1311
 - 帖子
 - 78
 - 主题
 - 21
 - 论坛币
 - 909 
 - 威望
 - 8 
 - EP值
 - 449 
 - MP值
 - 0 
 - 阅读权限
 - 100
 - 注册时间
 - 2015-3-7
 - 在线时间
 - 121 小时
 - 最后登录
 - 2018-7-21
  
 
 
 
   
 | 
 本帖最后由 面麻 于 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 量。- from tcaxPy import *
 
 - from util.tcAudio import *
 
  
- def Spectrum(fft):      # convert fft data to graph
 
 -     SPECWIDTH = 368
 
 -     SPECHEIGHT = 127
 
 -     BANDS = 6
 
 -     bars = []
 
 -     b0 = 0
 
 -     for x in range(BANDS):
 
 -         peak = 0        # peak of a certain bar
 
 -         b1 = pow(2, x * 10.0 / (BANDS - 1))
 
 -         if b1 > 1023:
 
 -             b1 = 1023
 
 -         if b1 <= b0:
 
 -             b1 = b0 + 1    # make sure it uses at least 1 FFT bin
 
 -         while b0 < b1:     # peak = max(fft[1:b1])
 
 -             if peak < fft[1 + b0]:
 
 -                 peak = fft[1 + b0]
 
 -             b0 += 1
 
 -         y = int(sqrt(peak) * 5 * SPECHEIGHT)
 
 -         bars.append(y)
 
 -     return bars
 
  
- def tcaxPy_Init():    # TCC 文件 < tcaxpy init = true >
 
 -     global dFrameDur
 
 -     global channel
 
 -     global freq
 
 -     dFrameDur = 1000 / GetVal(val_FXFPS)    # 帧时间,毫秒
 
 -     # tcAudio
 
 -     tcAudioInit()
 
 -     channel = tcAudioOpen("D:\RH\JokerGame\JokerGameED.wav")    # tcAudio 模块,注意个性化音频路径
 
 -     freq = tcAudioGetFreq(channel)
 
  
- def tcaxPy_Fin():     # TCC 文件 < tcaxpy fin = true >
 
 -     tcAudioFin()
 
  
- def tcaxPy_Main(_i, _j, _n, _start, _end, _elapk, _k, _x, _y, _a, _txt):
 
  
-     ASS_BUF  = []        # used for saving ASS FX lines
 
  
-     if _i < 6:
 
 -         if _j % 2 == 0:
 
 -             nSign = -1
 
 -         else:
 
 -             nSign = 1
 
 -         # 简单入场效果,上下淡入
 
 -         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))
 
 -         ass_main(ASS_BUF, SubL(_start - 20, _start + _elapk), EFT1, _txt)
 
 -         # K 效果,变色
 
 -         EFT2 = pos(_x, _y) + blur(2) + color1('08067C') + color3('FFFFFF') + t(color1('FFFFFF') + color3('08067C'))
 
 -         ass_main(ASS_BUF, SubL(_start + _elapk, _start + _elapk + _k), EFT2, _txt)
 
 -         # 出场效果,向左旋转飞出,此处 bord 和 blur 的变化注意自己调整到合适
 
 -         ts3 = _start + _elapk + _k
 
 -         te3 = ts3 + randint(10, 20)
 
 -         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))
 
 -         ass_main(ASS_BUF, SubL(ts3, te3), EFT3, _txt)
 
 -     else:
 
 -         # 入场效果,左右整行进入,设置三组增加重影效果
 
 -         for i in range(3):
 
 -             nPosXDelta = randint(100, 150)
 
 -             ass_main(ASS_BUF, SubL(_start - 20, _start, 0), move(_x - nPosXDelta, _y, _x, _y) + fad(100, 0) + blur(2), _txt)
 
 -             ass_main(ASS_BUF, SubL(_start - 20, _start, 1), move(_x + nPosXDelta, _y, _x, _y) + fad(100, 0) + blur(2), _txt)
 
 -         # 存在,无效果
 
 -         ass_main(ASS_BUF, SubL(_start, _start + _elapk), pos(_x, _y) + blur(2), _txt)
 
 -         # 统计 K 时间的帧数
 
 -         nFrameCnt = int(10 * _k / dFrameDur + 0.5)
 
 -         nAngle = 0   # 必须在循环外初始化,否则旋转不连续
 
 -         for i in range(nFrameCnt):
 
 -             tcAudioSetPos(channel, tcAudioSec2Bytes(channel, (10 * (_start + _elapk) + i * dFrameDur) / 1000))
 
 -             fft = tcAudioGetFFT(channel, 2048)
 
 -             bar = Spectrum(fft)
 
 -             # 将 bar 高转化为旋转量
 
 -             if bar[1] > 77:    # 鼓声在音频的低频段,bar 高的阈值可以利用统计方法得出
 
 -                 nAngle += int(bar[1] / 10 + 0.5) * 2
 
 -             EFT = an(5) + pos(_x, _y) + blur(2) + frz(nAngle)
 
 -             ts = _start + _elapk + (i * dFrameDur / 10)
 
 -             te = ts + dFrameDur / 10
 
 -             ass_main(ASS_BUF, SubL(ts, te), EFT, _txt)
 
  
-     return (ASS_BUF, None)
 
  复制代码 |   
 
  
 |