Выражение: Колебание с аудио
Допустим, мы разработали выражение для анимации определенного свойства. Мы настроили его так, чтобы анимация начиналась в нулевое время и использовала в расчетах глобальное время объекта. Что мы хотели бы сделать, так это запускать это выражение всякий раз, когда уровень звука пересекает определенный порог. Например, предположим, что у нас есть следующее выражение, которое создает затухающие колебания при применении к свойству масштаба слоя:
amp = 25; freq = 5; decay = 4.0; angle = freq * 2 * Math.PI * time; wobble = 1 + amp * Math.sin(angle) / Math.exp(decay * time) / 100; [value[0] * wobble, value[1] / wobble]
Выражение, как написано, заставит слой колебаться один раз, начиная с нулевого времени. На самом деле мы хотим, чтобы выражение колебания выполнялось только тогда, когда уровень звука пересекает пороговое значение.
Техника, которую мы здесь будем использовать, хорошо работает для выражений (таких как приведенное выше), которые вычисляют свои результаты на основе глобального времени объекта (которое представляет текущее время компиляции).
Наш базовый план атаки будет довольно простым по своей концепции (но детали будут немного сложными). Во-первых, нам нужно добавить к нашему выражению «детектор биений». Для этого мы добавим некоторый код, который начинается с текущего кадра и перемещается назад во времени, исследуя амплитуду звука кадр за кадром, ища самый последний переход, когда амплитуда поднимается от порога ниже порога до уровня выше порога. Как только мы найдем этот переход, мы установим переменную t на время (в секундах), прошедшее с момента перехода.
Затем все, что нам нужно сделать, это изменить исходный код выражения колебания, чтобы любая ссылка на время была заменена ссылкой на нашу новую переменную t . Это должно привести к тому, что код вобуляции начнет выполняться каждый раз, когда происходит переход.
threshold = 10.0; audioLev = thisComp.layer("Audio Amplitude").effect("Both Channels")("Slider"); above = false; frame = Math.round(time / thisComp.frameDuration); while (true){ t = frame * thisComp.frameDuration; if (above){ if (audioLev.valueAtTime(t) < threshold){ frame++; break; } }else if (audioLev.valueAtTime(t) >= threshold){ above = true; } if (frame == 0){ break; } frame-- } if (! above){ t = 0; }else{ t = time - frame * thisComp.frameDuration; } amp = 25; freq = 5; decay = 4.0; angle = freq * 2 * Math.PI * t; wobble = 1 + amp * Math.sin(angle) / Math.exp(decay * t) / 100; [value[0] * wobble, value[1] / wobble]
Блог Motion Richy — Создавай иначе!