- 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)
复制代码 |
|