• Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
    Dedicated community for Japanese speakers
  • 한국 커뮤니티
    Dedicated community for Korean speakers
Exit
1

Time clock/Countdown effect issue. Ahead of real time

Community Beginner ,
Aug 05, 2016 Aug 05, 2016

Copy link to clipboard

Copied

So I put a time icon in my song so it can have a little more visual appearance. Just one issue...It's a few seconds ahead of how long the song actually is. I put in the code

amtOfDigits = 2;

seconds = Math.round( time % 59 );

minutes = Math.floor( time / 59 );

function addLeadingZeroes( v ){

    for( i = 0; i < Math.abs( amtOfDigits - (v + "").length ); i++)

       v = "0" + v;

    return v;

} addLeadingZeroes(minutes) + ":" + addLeadingZeroes(seconds)

Notice the song is on 3 minutes but the time says 3:03

time clock issue.png

Views

17.9K

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines

correct answers 1 Correct answer

LEGEND , Aug 08, 2016 Aug 08, 2016

Yes. you need to set the speed (rate) to 1 and the clockstart to 0. it should be written like this:

rate = 1;

clockStart = 0;

function padZero(n){

  if (n < 10) return "0" + n else return "" + n

}

clockTime = clockStart + rate*(time - inPoint);

if (clockTime < 0){

  sign = "-";

  clockTime = -clockTime;

}else{

  sign = "";

}

t = Math.floor(clockTime);

hr = Math.floor(t/3600);

min = Math.floor((t%3600)/60);

sec = Math.floor(t%60);

ms = clockTime.toFixed(3).substr(-3);

sign + padZero(hr) + ":" + padZero(min) + ":"

...

Votes

Translate

Translate
LEGEND ,
Aug 05, 2016 Aug 05, 2016

Copy link to clipboard

Copied

Well, 59 is not 29.97 nor is it 59.94, is it not? You math is crooked. Just fill in the correect values.

Mylenium

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Beginner ,
Aug 08, 2016 Aug 08, 2016

Copy link to clipboard

Copied

Ok that definitely helped the real time! Thank you. Now 1 more thing...Now the time goes up to :60 seconds and then goes onto the next minute. So it'll will be at 3:60, then it will hit 4:00. I want it so be the :59 seconds then hit the next minute. Any idea how to do this?

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
LEGEND ,
Aug 08, 2016 Aug 08, 2016

Copy link to clipboard

Copied

seanm987654 you can see that this thread went way way beyond your question but our top specialist here wrote that your expression does not work. you can try this timer by the master genius Dan Ebberts that is claimed to be perfect: Dan Ebberts's Expressioneering Design Guide

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Beginner ,
Aug 08, 2016 Aug 08, 2016

Copy link to clipboard

Copied

Hmm I just tried that and got these results. Any reason why? Roei Tzoreftime clock issue.png

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
LEGEND ,
Aug 08, 2016 Aug 08, 2016

Copy link to clipboard

Copied

Yes. you need to set the speed (rate) to 1 and the clockstart to 0. it should be written like this:

rate = 1;

clockStart = 0;

function padZero(n){

  if (n < 10) return "0" + n else return "" + n

}

clockTime = clockStart + rate*(time - inPoint);

if (clockTime < 0){

  sign = "-";

  clockTime = -clockTime;

}else{

  sign = "";

}

t = Math.floor(clockTime);

hr = Math.floor(t/3600);

min = Math.floor((t%3600)/60);

sec = Math.floor(t%60);

ms = clockTime.toFixed(3).substr(-3);

sign + padZero(hr) + ":" + padZero(min) + ":" + padZero(sec)

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Aug 08, 2016 Aug 08, 2016

Copy link to clipboard

Copied

Set the rate to 1 and the start time to 0 (first two lines).

At the bottom of the expression you will see language that displays milliseconds. Delete that.

If you had read Dan's post who would understand that his example is counting down to zero at two times normal speed.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Beginner ,
Aug 08, 2016 Aug 08, 2016

Copy link to clipboard

Copied

You guys are the best!! Thank you so much! I got it Rick Gerard Roei Tzoref

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
LEGEND ,
Aug 08, 2016 Aug 08, 2016

Copy link to clipboard

Copied

you're welcome! glad to help. thanks for updating the thread for the correct answer. Rick doesn't mind the points, they are running out of screen space for his anyways

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
LEGEND ,
Aug 06, 2016 Aug 06, 2016

Copy link to clipboard

Copied

I find that the expression you provided not working as it should, no matter what number you put in there. after some research, I found the following expression that does the same thing and is much simpler:

sec = Math.floor(time%60);

min = Math.floor(time/60);

if(sec<10)

{"0" + min +":0" + sec;}

else

{"0" + min +":" + sec;}

got it from here: After Effects: Tutorial | How to display time & create a countdown - YouTube

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Aug 06, 2016 Aug 06, 2016

Copy link to clipboard

Copied

One of the best approaches is to use Dan Ebberts Universal Timer from his Motion Script site. You have more control, can count up or down and can adjust the rate of the counter.

If you are just counting up a very quick option and the one I would probably use is to use the Expression Language Menu from AE and just grab the time to timecode option from there and then must mask off the hours and frames:

Screen Shot 2016-08-06 at 8.17.18 AM.png

Showing mask but mask currently set to none.

Screen Shot 2016-08-06 at 8.54.43 AM.png

This is painless, quick and easy and suitable for any beginner. Just make sure you use a monospaced font so the numbers don't jump around. There is also a Timecode Effect under the Effects>Text but that does not give you the option to choose your font so it's kind of clunky.

You can modify either of those expressions to subtract the in point of the layer so the timer will start from the in point or you can set a marker that will start the timer.

But Wait, the numbers say 02:59;29 and the Timeline says 2;59;28. If you move the CTI so the Current time is 2;59;29 then the numbers read 3:00:00. Move forward one more frame and the CTI will read 3;00;02 and the numbers will read 3:00:01. What's going on.  

Screen Shot 2016-08-06 at 8.39.38 AM.pngFor the time to display correctly as hours minutes and seconds when using NTSC based footage with fractional frame rates of 29.97 or any of the other fractional time rates you must set your comp to Drop Frame timecode.

This is automatically assigned if you use any of the NTSC based presets. No frames are dropped, only frame numbers because the frames cannot be divided into even numbers. This Drop Frame way of counting frames, again not dropping frames but counting frames, happened when color television was introduced and they had to add a couple more scan lines to the TV signal to send along color burst information. Drop frame timecode is indicated in the timeline by the use of a ; instead of a : to separate the hours, minutes, seconds and frames.

That explains the CTI display, what about the numbers display when you use the expression for time to timecode? Why does it appear to be one frame behind? Because at 1 minute into the count DropFrame timecode starts dropping frame numbers and the Time to Timecode expression from the Expression Language menu takes this into account because the dreamt time base is 30 not 29.97. There is an option for Time  to NTSC timecode that will match up the CTI and the number display.

One last point, The numbers time display is one frame behind the actual time it takes the layer to play because the CTI stops at the head of the last frame. If your video is 3 minutes long then it will take exactly 3 minutes to playback even though the last frame in the video has a frame number one frame less than the length of the video. If you want your time display to actually show 3:00 you'll have to extend the layer by 1 frame to give the number time to display.

Ok, a second last point... Your expression will work properly if you change the 59 to 59.94 because you are using rounding to jump up one frame and 59.94 is the proper divisor for time when you are using drop frame timecode.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
LEGEND ,
Aug 06, 2016 Aug 06, 2016

Copy link to clipboard

Copied

Thank you Rick for laying it down. trying to be picky here so after runnings some more tests it seems that both expressions (Op's and the one I copied) cannot represent the actual time code. I have downloaded a music with a video playing at 29.97 - this is the video: The Cars - Magic (HQ).mp4 - Google Drive

when I drag it to a composition it seems the only way to make the timecode work at all frames is to use like you said - the ntsc expression:

timeToNTSCTimecode(t = time + thisComp.displayStartTime, ntscDropFrame = false, isDuration = false)

would you agree?

nothing else sticks. not Op's expression (with 59.94 or not), not Dan's expresiion, and not the one I contributed here. drop frame or no.

notice the difference between what's on screen and the Timeline actual timecode:

Op's expression set to 59.94 ND Frame

Op's expression set to 59.94 D Frame

Dan's Expression ND Frame

Dan's Expression D Frame

I also tried another video at 23.97 and still the timecode won't stick, but only with the ntsc expression.

Dan's expression

what do you make of this?

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Expert ,
Aug 07, 2016 Aug 07, 2016

Copy link to clipboard

Copied

First, Adding a video to the timeline has nothing to do with the time display at all. If you have a video of a known length, say 3 minutes, and it is properly interpreted you can drop it in any comp, even one that is 10 fps, and it will still playback at the right speed. There was no need for you to add a video to your test. All you need be concerned with in this problem is the display of the comp time and frame number as it relates to true time. Let me talk about this example set of comps:

Screen Shot 2016-08-07 at 3.20.38 AM.png

First let's talk about how the CTI works in conjunction with an entered time. If your comp is set to 29.97 (or any fractional time base) and you type 3;00;00 and the comp is set to drop frame timecode as it should be, AE will round down the time you entered and position the CTI on the frame that is nearest to 3 seconds giving time for the last frame to playback. This means that when your comp is set to 29.97 the nearest frame to 3 seconds is 2;29;28 because frame 2;29;29 would actually last approximately .02 seconds longer than 3 seconds. If you submit a program or commercial to a broadcaster that is 1 frame longer or even .02 seconds longer than it should be it may be rejected. When the frame rate is 24 or 23.976 drop frame time display is not an option. It only works with 29.97 or 59.94. If you are not using Drop Frame timecode display the rounding is disabled so you end up at 3:00:00. That's how it works with all NLE's and all compositing apps because that's the standard as written by SMPTE. This math is correct and has been industry standard forever. When you have drop-frame timecode selected and you zoom into the timeline all the way the 'dropped' frame number is highlighted. It's always going to be after the nearest whole second and always be 02 in a 29.97 comp.

Screen Shot 2016-08-07 at 3.35.18 AM.png

NON DROP frame timecode never gives the correct time after the first minute. If you use non drop frame timecode display and your timeline is longer than 1 minute the time display and true running time of your comp will always be incorrect. There is no practical reason at all for using non-drop frame timecode. The need for non-drop frame timecode went away with the demise editing video tape with magnetic powder and a razor blade and digital control of tape decks. It was never used for timing a program because the running time in hours, minutes and seconds after 1 minute is always wrong.

The default time base for Time to Time code is 30 fps. If you want that to give you frame numbers at different frame rates you need to change that. Set it to 24 for your 24 fps comp. This method will not give you the correct frame number in a 23.976 comp because those comps are not set to drop-frame timecode and the method assumes that they are whole frame numbers. It's a bug in the method. You can see that in the 23.976 comp on the right. The frame count at three seconds is off by five.

Now let's talk about the NTSC default expression language method. The default the NTSC method is non drop frame. You have to change that to drop frame by changing the nonDropFrame to true to display the correct time for NTSC (29.97 or 59.94) drop frame comp.

Screen Shot 2016-08-07 at 2.55.04 AM.png

This method will display the correct time and frame number plus one because it does not round down. The fractional frame rates like 23.976 will be off in the frame count because there has been no provision in the method for 23.976 fps which are not interpreted as drop frame for the purposes of the method. Currently there is no automatic precise way to get a drop frame frame count in a comp that is 23.976 fps. If you apply the NTSC method set to drop frame then you won't get the correct frame count for the 23.976 comp, you'll get the correct frame count if the comp was 29.96 drop frame. You can get the proper frame count for any frame rate comp by combining 1/this.Comp.frameDuration with some other math but I won't go into that now. Let's just say that it's a modification of Dan's universal timer that changes milliseconds to frames.

Dan's expression will always give you the correct running time of the composition including the last frame no matter what the frame rate of the comp because it works strictly on time. The differences in the time display for the tree comps using Dan's expression is the difference in the length of time it will take the last frame to play. As long as you set the speed to 1 and the starting time to 0 Dan's expression will always give you the correct running time of the comp. In your example showing a difference in the timeline and the displayed time from Dan's expression you are not taking into account the duration of the last frame. Dan's method is correct because it always displays the current time of the composition including the time it takes to playback the last frame.

Last example. I originally wrote that you could correct seanm987654's expression by changing 59 to 59.94 I was not correct. His expression just doesn't work. It appears to work when you set the CTI to 3;00;00 but if you back down the count goes from 3:00 to 3:60 then on down so the true time is never displayed. With a little head scratching I could make the idea work but it's just not worth it. I should have caught that problem but I didn't take the time to really think about the math.

The original question was how to fix the time display in a 29.97 comp - That's been answered.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
LEGEND ,
Aug 07, 2016 Aug 07, 2016

Copy link to clipboard

Copied

thank you Rick. you are an encyclopedia for this software and as always - appreciate you are taking the time. I admit the technicalities of drop frame vs non drop is beyond me. part of it's is because my poor math skills, and the other is because almost all of my work is on whole frame rates. I work in a PAL country so it's either that for broadcast or HD square. I am not experienced by practice with this issue. I realize the CTI is not a "clock on the wall" and that's what's so confusing.   you wrote valuable information here but I am sorry to say that I can get maybe only half of it. maybe after a while and with more practice I will wrap my head around it and fully get it.

There was no need for you to add a video to your test.

got it. thank you

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Beginner ,
Feb 16, 2021 Feb 16, 2021

Copy link to clipboard

Copied

Wow! Such a deep dive into the world of timers and countdowns 🙂

 

If it helps anyone, and in case you are in a rush to fix the 29.97fps problem, I used Dan Ebberts Universal Timer, like Rick recommended,  and changed the rate to 0.999 as a result of 29.97/30.

 

That worked great for my minute countdown from 30 mins to 0 mins.

 

Thanks all for your contributions.

Dani

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Apr 10, 2024 Apr 10, 2024

Copy link to clipboard

Copied

hello!  wondering if anyone can help me.. i have to create a countdown at 29.97 non drop frame, theres also a shape layer circle that has trim paths animation to wipe the circle fully every second, problem is when i loop that trim path using loop expression,  it seems to lose sync with the countdown further down the timeline. 

any thoughts?

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Explorer ,
Apr 10, 2024 Apr 10, 2024

Copy link to clipboard

Copied

LATEST

just to note re. monospaced font, for those that need to use a non monospaced font, you can add dans expression to a text layer using the vertical type tool instead of the usual horizontal, then unfold text layer - animate menu, add a rotation to the characters, then rotate the layer, your text is now monospaced.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines