# Cadence Desk > 23.976 IS NOT A FRAME RATE. It is 24 divided by 1.001. So going between 24 and 23.976 adds no > frame, drops no frame and repeats no frame - the picture is untouched and perfect - while the > sound drifts 3.6 seconds an hour. Judder, separately, is not a quality or an encoder setting: it > is a repeat pattern falling out of a ratio. Five lanes over one timeline of mixed-rate clips, > plus a free browser-side engine doing exact rational arithmetic on every conversion. URL: https://cadence-desk.skillsafe.ai/ API: https://cadence-desk.skillsafe.ai/api.html Derived from digitalsamba/claude-code-video-tools (https://github.com/digitalsamba/claude-code-video-tools), MIT: a set of tools for video processing and editing workflows. Not affiliated with or endorsed by digitalsamba. ## The one line everything follows from ```text 23.976 = 24000/1001 = 24 / 1.001 29.97 = 30000/1001 = 30 / 1.001 59.94 = 60000/1001 = 60 / 1.001 ``` Going between 24 and 23.976 is NOT A CONVERSION. No frame is added, dropped or repeated. The clip plays 1.001 times longer, so the sound has to come with it - and if it does not, the clip drifts by one part in a thousand: 3.6 SECONDS PER HOUR, from a change that left every frame exactly where it was. That is why it survives review. There is nothing to see in the picture, and every clip is in sync at its head, so a spot check at the top of a scene passes every time on a programme that is seconds out by the end. ## What judder is Reduce source:target to p:q and walk the output frames, asking which source frame each one comes from. That walk is the cadence. ```text 24 into 30 -> 4:5 -> 2 1 1 1 one frame held twice in every four 24 into 60 -> 2:5 -> 3 2 the 3:2 pulldown everybody has seen 24 into 48 -> 1:2 -> 2 every frame twice - even, invisible 25 into 24 -> 25:24 -> one frame in 25 dropped ``` p and q are coprime once reduced, so the walk is even in EXACTLY TWO CASES: p is 1, and every source frame repeats the same number of times; or q is 1, and every pth frame is kept and the rest dropped. Any other coprime pair HAS to be uneven somewhere. No encoder setting avoids it - the unevenness is the ratio. DIRECTION CHANGES WHAT THE NUMBERS MEAN. Going up, every source frame survives and a viewer feels one held longer than its neighbours, so the cadence is repeats. Going down, every survivor is shown once and a viewer feels the gap, so the cadence is strides. Say which you are quoting. A SHORT CADENCE IS TOLERABLE AND A LONG ONE IS NOT. 3:2 repeats every four frames and the eye adapts, which is why half of everything ever broadcast in America looks acceptable. 25 into 23.976 is 1001:960 and repeats every 1001 frames - about forty seconds - so there is no rhythm to adapt to and it reads as continuous unsteadiness. Both are judder. They do not look remotely alike. ## The two families 24, 30, 60 and their 1000/1001 versions are one world; 25 and 50 are the other, and they share no factor. Inside a world, conversions are clean or nearly so. Between them, every conversion has a long cadence - the one case where re-sourcing a shot is often cheaper than fixing it. A 1000/1001 rate is NOT a third world. 23.976 is in the 24 family, and going between them is the speed change above rather than a conversion. Treating 23.976 as its own unrelated rate is the mistake that produces a 1001:960 monster out of what should have been a 0.1% slow-down. ## Timeline hygiene - ONE TIMELINE, ONE METHOD. Speed-changing some clips and frame-converting others puts sound and picture on different clocks in the same programme, so the error is not constant and no single offset fixes it. - A CLIP WITH NO DURATION IS IN NO TOTAL. It does not drift zero - it drifts an unknown amount, and the total is too low by exactly that. Say the total is a floor. - A MISSPELT KEY IS READ BY NOTHING. `audios` is not `audio`, so the treatment is unstated and the drift check does not run - and a run with no drift finding looks exactly like a run that passed. It is the one error here that makes the answer look BETTER rather than worse. ## Exactness Everything here is exact rational arithmetic over rates and durations you supply. No model, no estimate, no judgement about how bad something looks. Never soften a figure into a word: `3.6s` is the drift, not "noticeable drift"; `1001:960` is the cadence, not "heavy judder". And never convert a cadence into a prediction about whether a viewer will complain - the pattern is arithmetic and the complaint is not. ## The sheet ```text TIMELINE target | 23.976 audio | uncorrected CLIPS c01 | 24 | 900 | the interview c02 | 25 | 480 | the Berlin unit ``` `audio` is one of `corrected`, `uncorrected` or `resampled`. Each clip is an id, its source rate, its duration in seconds, and a description. A clip with no duration is still checked for cadence - it is only left out of the drift totals. ## The lanes - `plan` - picks the delivery rate and costs the alternatives, because no rate makes both worlds cheap - `check` - says what every conversion in the timeline actually does, and which finding matters most - `cadence` - writes out one conversion frame by frame, with the period in seconds - `audio` - works out where the sound ends up, per clip and cumulative, and where it becomes audible - `deliver` - sorts findings into fix, accept and re-source, which severity alone does not decide ## What it does not do It converts nothing and renders nothing. Every figure is exact arithmetic over the rates and durations you supply, so it is only as good as the timeline you write down.