"""AFTERLIGHT trailer, third cut: one timeline shared by the picture and the score.""" ROOT = '/home/claude/afterlight' FPS = 24 def clip(sheet_key): import json D = json.load(open(f'{ROOT}/archive/sheet_index.json')) return f'{ROOT}/archive/clips/{D[sheet_key]}.mp4' # volumes: name -> (source, in, dur) SRC = { 'runner': ('sun10', 0.3, 3.8), 'moon': ('moo10', 0.0, 4.0), 'mirror': ('mir6', 2.0, 4.0), 'sunset': ('sun22', 0.0, 3.0), 'fire': ('fir6', 0.0, 3.4), 'barn': ('sun11', 4.0, 4.0), 'eye': ('mir8', 2.0, 4.0), 'road': ('nig0', 3.2, 4.0), 'neon': ('lam1', 6.0, 4.0), 'face': ('han17', 0.0, 2.4), 'hand': ('han21', 25.0, 4.0), 'stone': ('SMALLSUN', 95.0, 4.2), 'rays': ('sun5', 3.0, 4.0), 'poppy': ('lam2', 1.0, 4.0), 'blaze': ('fir14', 0.0, 3.0), } def C(yaw=0, pitch=0, dist=1050, fov=50, pz=0, cx=0, cy=0, roll=0): return dict(yaw=yaw, pitch=pitch, dist=dist, fov=fov, pz=pz, cx=cx, cy=cy, roll=roll) # (volume, start, end, cam0, cam1, opts). decode: seconds the scanline takes to deposit the volume. heat: how much of the past glows infrared. SHOTS = [ ('runner', 2.6, 12.8, C(0.0, 0, 1150), C(0.12, -0.03, 260), dict(tau=60, rate=0.75, decode=2.6, heat=0.55)), ('moon', 12.6, 16.2, C(0.05, 0, 1200, pz=2), C(1.2, -0.1, 1450, pz=24), dict(tau=50, decode=1.0, heat=0.6)), ('mirror', 16.0, 19.7, C(-0.15, 0.03, 820), C(0.04, 0, 600), dict(tau=4, decode=0.9, heat=0.5)), ('sunset', 19.6, 23.3, C(0, 0, 1250), C(-0.5, -0.06, 650, pz=8), dict(tau=36, decode=0.8, heat=1.0)), ('fire', 23.1, 26.8, C(0.5, 0, 1100, pz=10), C(0.0, 0, 760), dict(tau=14, decode=0.8, heat=1.2)), ('barn', 26.6, 30.5, C(-0.15, 0.03, 1150), C(0.05, 0, 170), dict(tau=40, decode=0.8, heat=0.8)), ('eye', 30.3, 33.8, C(0, 0, 760), C(0, 0, 980), dict(tau=5, decode=0.85, heat=0.7)), ('road', 33.6, 36.7, C(0, 0, 1000), C(0, 0, 160), dict(tau=50, decode=0.8, heat=0.6)), ('neon', 36.5, 40.8, C(0.3, 0, 1150), C(-0.3, 0.04, 900), dict(tau=24, decode=0.8, heat=0.5)), ('face', 40.6, 44.3, C(0.12, 0, 860), C(-0.08, 0, 680), dict(tau=6, rate=0.6, decode=0.85, heat=1.0, double=1)), ('hand', 44.1, 47.8, C(-0.5, 0.08, 1100, pz=10), C(0, 0, 860), dict(tau=12, decode=0.85, heat=1.0, double=1)), ('stone', 47.6, 55.8, C(0.2, 0, 1100), C(-0.05, 0, 700), dict(tau=20, rate=0.6, decode=0.9, heat=1.0, beamout=51.6)), ] CARDS = [ # (start, end, label, line) (3.6, 6.4, None, 'Plato’s prisoners watched shadows.'), (6.8, 9.4, None, 'The fire was behind their backs.'), (9.8, 12.4, None, 'Could they feel the warmth?'), (12.75, 19.5, 'BORROW', 'Who makes the light we see?'), (19.75, 26.6, 'FOCUS', 'What changes when light is gathered?'), (26.75, 33.6, 'REVEAL', 'What does an instrument make knowable?'), (33.75, 40.6, 'ANSWER', 'When does a light become a message?'), (40.75, 47.6, 'EMBODY', 'How does a body negotiate exposure?'), (47.75, 55.4, 'REMAIN', 'What survives when the source is absent?'), ] # the avalanche: the twenty-four swarms that have no film yet, each one waking for a moment SWARMS = [(10, 'MLS deformation'), (11, 'video puppetry tabletop'), (12, 'localized deformation weights'), (13, 'secondary motion'), (15, 'learned layered puppet'), (19, 'smart bones'), (20, 'production rig'), (21, 'photo to actor'), (22, 'live performance capture'), (23, 'skeletal runtime'), (26, 'archive stage'), (28, 'mask and plate'), (30, 'prompted masks'), (32, 'forward kinematics'), (34, 'as-rigid-as-possible'), (35, 'gesture warp'), (36, 'bounded biharmonic weights'), (37, 'weighted skinning'), (40, 'paper performance'), (42, 'few-shot structure'), (44, 'multiplane parallax'), (48, 'characters that can refuse'), (49, 'open-content reservoir'), (51, 'montage research')] AV0 = 55.8 _d = [0.78 * 0.968 ** i for i in range(len(SWARMS))] AV_T = []; _t = AV0 for d in _d: AV_T.append((_t, _t + d)); _t += d AV1 = _t # ~ 64.9 EMBER = AV1 + 0.05 # cut to silence and one ember TITLE0 = EMBER + 1.2 CRED0 = TITLE0 + 6.0 END = CRED0 + 5.0