arthur — rotoscope + frame removal

source + landmarks

outer lip — · inner lip — · lids — · iris — · brows —

stabilised (head-local)

should sit still except the mouth and eyes · grey = held plate outline
dark green ghost = unshifted mouth when lead ≠ 0 · red lid ring = blink

flat render — 320×200 indexed

audio drives the clock — dropped frames, never drift
exposure holds the picture on a grid: rip at 24, render on 2s for 12. The dense track and the audio are untouched, so it is reversible
plate representation: B cycles · photo modes are registered into raster space, so tracing them lands on the mouth

frames — green kept (gets its own drawing) · dim held from the last kept frame

← → step · X delete · K keep · B background · [ ] lead · click to select · double-click or shift-click to toggle · the mouth keeps every frame regardless

knobs

mouth lead shifts the performance tracks earlier (positive) against the audio and the head. Averaging has no phase lag but it blurs onsets, so an opening reads later than it is; animators also draw mouths a frame or two ahead of the sound as standard practice. [ ].
contour avg 0 = off, 1 = ±1 frame. Removes per-frame landmark jitter. Push past 2 and it starts eating articulation.
anchor avg smooths the head transform only — never the contour.
teeth contrast gates on how far apart the cavity's dark and bright halves are — Otsu always returns some threshold, so this is what stops it inventing teeth in a dark mouth. cavity erode pulls the sampled region in from the lip edge; blob grow/erode resizes the found blob itself. tongue reject drops pixels that are red relative to their own brightness; prefer upper biases component choice toward the top of the cavity, where teeth are and the tongue is not. dwell is how many frames a presence change must persist.
blink cut is lid gap over corner distance — normalised, so one value carries across takes. blink hold is the minimum length of a blink: a real blink is one frame at 12fps and a single frame of closed eye reads as a dropout, so it is extended to a beat. brow step and brow dwell quantise the brow's HEIGHT above the eye, not its shape — the traced ring is his, the height snaps between a few levels and holds. Both ends move independently, so raise and tilt come out of one control: both up is surprise, inner up is worry, inner down is anger. brow weight thickens the ring, which it needs at three pixels tall.
pupil is a square, in whole pixels, 0 to turn it off: at this size a circle of radius 1.5 is a plus sign with the corners gnawed off and it changes shape as it moves, where a square stays the mark you drew.
gaze step is the grid the iris snaps to, in raster pixels, and gaze dwell is how long a new cell must hold — together they turn drift into saccades. gaze gain exaggerates or damps the throw; measured excursion is small and a character usually wants more of it.
suggest tolerance only affects the Suggest button: max head movement allowed before a new drawing is required.

gaze field

green = every cell the iris visits in the take · grey = raw · amber = where it is now, quantised

teeth measurement

green = kept pixels · amber = extracted contour

palette

Flat indexed fills, no antialiasing — the rasteriser writes palette indices, the way csd_render_poly does.

drawings needed — registered reference per kept frame, with the range it holds