AEJoy —— 表达式之速度和频率控制(七)【JS】

377 阅读2分钟

效果图

线性关键帧积分表达式被用于将时间重映射的镜头提前,以跟随音频轨道的节拍

04.gif

其他应用程序

事实证明,线性关键帧积分器在除了速度和频率控制以外的事情上也可以非常方便。例如,当你将音频转换为关键帧时,你会得到一堆线性关键帧。如果你对它应用线性关键帧积分器,你可以使用该结果在时间内去伴随着音频的 “节拍” 动画化任意数量的属性。

时间重映射

您可以使用线性关键帧积分器在每个节拍上加速时间重映射的剪辑。下面是代码的样子:

spd = thisComp.layer("Audio Amplitude").effect("Both Channels")("Slider");
mult = .5;
n = spd.numKeys;
/// @note 当关键帧的个数超过 0,且当前时间已经超过了第一个关键帧的时间
if (n > 0 && spd.key(1).time < time) {
    /// @note 第一个关键帧的速度 * (第一个关键帧的时间 - 入点时间)
    accum = spd.key(1).value * (spd.key(1).time - inPoint);
    for (i = 2; i <= n; i++) {
        if (spd.key(i).time > time) ///< 判断当前时间是否位于第 i 个关键帧之前
            break;
        
        k1 = spd.key(i - 1);
        k2 = spd.key(i);
        /// @note 累加部分可以看做 k1 k2 的平均速度乘上它们之间的时间差【梯形面积】
        accum += (k1.value + k2.value) * (k2.time - k1.time) / 2;
    }
    accum += (spd.value + spd.key(i - 1).value) * (time - spd.key(i - 1).time) / 2;
} else {
    /// @note 简单速度乘上时间差
    accum = spd.value * (time - inPoint);
}
value + accum * mult

注意,变量 spd 已经被链接到(由转换音频到关键帧的操作创建的) “Both Channels” 滑块上。我还引入了一个新的变量,你可以用它来放大或减弱效果。还要注意,表达式在最后一行中包含 value +,这意味着积分器的结果被加到打上关键帧且时间重映射了的 value 中。这意味着剪辑总是向前移动(即使没有音频)。如果相反,你想要剪辑的时间完全由积分器控制,你可以修改最后一行(效果如上效果图所示):

accum*mult

其他属性

不需要太多的想象力就能想出这个东西的其他用途。如果你增加变量mult 的值,在每个节拍上增加旋转属性,也是一个很好的表达式。

改变最后一行代码将给你一个缩放表达式,将使层随着节拍膨胀(你可能想为这个增加 mult 的值):

value + [accum,accum]*mult

这是最后一行代码的另一个变体,可以用作位置表达式,在每个节拍上向右移动一个图层:

value + [accum*mult,0]

你懂的。

请注意,当您将音频转换为关键帧时,您将为音频的每一帧获得一个关键帧。随着时间的推移,在合成中会产生大量的工作。如果在较长的合成中停滞不前,不要感到惊讶。

(完)