"""AFTERLIGHT trailer, fourth cut: the afterlife of light. No title cards. The archive speaks; pixels leave as embers and stay as stars.""" ROOT = '/home/claude/afterlight' FPS = 24 C2 = f'{ROOT}/archive/clips2/' def clip(sheet_key): import json return f'{ROOT}/archive/clips/{json.load(open(f"{ROOT}/archive/sheet_index.json"))[sheet_key]}.mp4' # sources for picture volumes: name -> (path, in, dur) SRC = { 'rca': (C2 + '8095f755-7150-5d96-bde8-83d7e001fb57.mp4', 11.0, 4.0), 'zigs': (C2 + '../clips/10fe67d6-3449-5fb7-97d8-709a0d297de0.mp4', 0.0, 4.0), 'sunset': (clip('sun22'), 0.0, 3.0), 'wax': (C2 + 'b3ef2f32-ea89-5744-8940-c804848c95e0.mp4', 9.8, 4.0), 'fire': (C2 + '49073308-69cc-5104-b475-c2c72d6f8ca9.mp4', 10.5, 4.0), 'gamma': (clip('moo0'), 20.5, 4.0), 'face': (clip('han17'), 0.0, 2.4), 'stone': (f'{ROOT}/film3/small-sun-3.mp4', 95.0, 4.2), 'valley': (C2 + 'a95bb4f0-0823-589c-b7e7-fac6eb482777.mp4', 22.0, 4.0), 'moon': (clip('moo10'), 0.0, 4.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): every shot condenses out of static and leaves as embers that become stars SHOTS = [ ('rca', 3.6, 11.4, C(0.0, 0.02, 1250), C(0.10, 0, 950), dict(tau=10, rate=0.5, exp=0.62)), ('zigs', 10.0, 16.8, C(-0.08, 0, 1150), C(0.06, -0.02, 900), dict(tau=8, rate=0.55, heat=0.35, exp=0.9, gam=1.8)), ('sunset', 15.4, 21.6, C(0, 0, 1300), C(-0.25, -0.04, 900, pz=6), dict(tau=36, rate=0.5, heat=1.0)), ('wax', 20.2, 27.2, C(0.12, 0, 1000), C(-0.04, 0, 780), dict(tau=8, rate=0.5, heat=0.8)), ('fire', 25.6, 33.6, C(-0.1, 0, 1150), C(0.12, -0.03, 820), dict(tau=20, rate=0.55, heat=1.2)), ('gamma', 32.2, 39.6, C(0.0, 0, 1250), C(0.3, -0.06, 1050, pz=6), dict(tau=30, rate=0.5)), ('face', 38.2, 43.8, C(0.1, 0, 900), C(-0.06, 0, 700), dict(tau=6, rate=0.4, heat=1.0, double=1)), ('stone', 42.4, 48.6, C(0.15, 0, 1100), C(-0.04, 0, 760), dict(tau=20, rate=0.45, heat=1.0)), ('valley', 47.2, 56.6, C(-0.06, 0.02, 1250), C(0.08, 0, 820), dict(tau=8, rate=0.42, heat=0.25, exp=0.95, gam=2.2)), ] # the archive's own voices (clip, in, out, at): what they say is in the transcripts of the CINEOSIS lab VOICES = [ ('8095f755-7150-5d96-bde8-83d7e001fb57.mp4', 11.55, 15.35, 5.0, 'Here is an actual picture of sound photographed on film'), ('../clips/10fe67d6-3449-5fb7-97d8-709a0d297de0.mp4', 0.30, 3.20, 11.6, 'The sunlight marks the zigs and the shadows of the zags.'), ('b3ef2f32-ea89-5744-8940-c804848c95e0.mp4', 10.05, 13.45, 21.8, 'A hot flame melts all bubbles and flaws out of the wax'), ('49073308-69cc-5104-b475-c2c72d6f8ca9.mp4', 10.85, 15.95, 27.2, 'The battle between man and fire raged on for nine nights and days.'), ('../clips/201b010b-d025-5ea8-8ec8-714d0faf41ae.mp4', 20.75, 25.00, 33.8, 'Here they may measure gamma ray, x-ray, ultraviolet'), ('a95bb4f0-0823-589c-b7e7-fac6eb482777.mp4', 22.35, 28.35, 48.8, 'But as we reflect on those who came before, sights and sounds of an earlier time echo through this valley.'), ('1f03935f-5db5-5c2c-bbea-092b327ca8a7.mp4', 4.95, 5.85, 55.6, 'only an echo'), ] SWARMS = [10, 11, 12, 13, 15, 19, 20, 21, 22, 23, 26, 28, 30, 32, 34, 35, 36, 37, 40, 42, 44, 48, 49, 51] AV0 = 56.2 SW_STEP = 0.5; SW_LIFE = 1.1 # each swarm glows for 1.1 s, a new one every 0.5 s: always two layered AV_T = [(AV0 + i * SW_STEP, AV0 + i * SW_STEP + SW_LIFE) for i in range(len(SWARMS))] AV1 = AV_T[-1][1] # ~ 68.8 SILENCE = AV1 + 0.1 GOODNIGHT = SILENCE + 1.3 # 'Good night.' TITLE0 = GOODNIGHT + 0.6 CRED0 = TITLE0 + 6.5 END = CRED0 + 5.5