| 
UID2443积分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)
 | 
 |