Skip to main content
Inspiring
November 7, 2022
Answered

Link ∞ number of markers to ∞ number of keyframes

  • November 7, 2022
  • 2 replies
  • 375 views

Hello!

I know how to manually make code that says, "value of keyframe 1 at time of marker 1, value of keyframe 2 to time of marker 2, etc." As an example:

L = thisLayer;
t1 = L.marker.key(1).time; // Marker 1
t2 = L.marker.key(2).time; // Marker 2
t3 = L.marker.key(3).time; // Marker 3
t4 = L.marker.key(4).time; // Marker 4
v1 = valueAtTime(key(1).time); // Value 1 (Keyframe 1)
v2 = valueAtTime(key(2).time); // Value 2 (Keyframe 2)
v3 = valueAtTime(key(3).time); // Value 3 (Keyframe 3)
v4 = valueAtTime(key(4).time); // Value 4 (Keyframe 4)
change1 = easeValues(linear, t1, t2, v1, v2);
change2 = easeValues(linear, t2, t3, v2, v3);
change3 = easeValues(linear, t3, t4, v3, v4);

if (time<t1) {v1}
else if (time<t2) {change1;}
else if (time<t3) {change2;}
else if (time<t4) {change3;}else{v4;}

 

What I'm looking for is a blanket code that does this automatically, without me having to code each keyframe-value/marker-time manually. This way, I can add markers and keyframes with new times and values, without adjusting the code at all.

Is this possible? If it matters at all, I am using CS5.5, so I don't have all of AE's newest features.

Thanks for helping.

This topic has been closed for replies.
Correct answer Dan Ebberts

Something like this maybe:

m = marker;
val = value;
maxKeys = Math.min(numKeys,m.numKeys);
if(maxKeys > 1){
  n = m.nearestKey(time).index;
  if (time < m.key(n).time) n--;
  n = Math.max(n,1);
  if (n < maxKeys){
    val = ease(time,m.key(n).time,m.key(n+1).time,key(n).value,key(n+1).value);
  }else{
    val = key(maxKeys).value;
  }
}
val

2 replies

Dan Ebberts
Community Expert
Dan EbbertsCommunity ExpertCorrect answer
Community Expert
November 7, 2022

Something like this maybe:

m = marker;
val = value;
maxKeys = Math.min(numKeys,m.numKeys);
if(maxKeys > 1){
  n = m.nearestKey(time).index;
  if (time < m.key(n).time) n--;
  n = Math.max(n,1);
  if (n < maxKeys){
    val = ease(time,m.key(n).time,m.key(n+1).time,key(n).value,key(n+1).value);
  }else{
    val = key(maxKeys).value;
  }
}
val
Inspiring
November 7, 2022

This is exactly what I needed. Thank you, Dan!

Mylenium
Legend
November 7, 2022

If you really want a direct match a simple loop could do:

 

for(i=1;i<=numKeys;i++){ }

 

where i would substitute your numbers. For your interpolation the logic would then simply be to interpolate i-1 to i.

 

Mylenium