# CREDITS — 08-cyberpunk-hud / UMBRA-7

## Visuals
All imagery in this film is **original code** written for this brief in
`parts/film.mjs` (HTML Canvas 2D). Nothing is traced, sampled or copied from any
other project, shader pack, stock asset or screenshot. There are no bitmap or
vector assets: every mark on screen — the hex lattice, the concentric ring set,
the wireframe planet, the radar sweep, the typewriter log, the numbers, the
lock brackets and the chroma/scanline post pass — is generated procedurally at
render time from the frame time `t`.

No real brand, logo, trademark or real-world insignia appears. The organisation
name **UMBRA-7 / 战术态势感知系统** and the target designator **UMBRA-0427** are
invented for this film.

## Fonts
No font files are vendored or downloaded. Only fonts already installed on the
system are referenced, by CSS family stack, so nothing can 404 or fall back to
tofu:

| Stack | Used for | Licence |
|---|---|---|
| `"PingFang SC"` → `"Hiragino Sans GB"` → `"Heiti SC"` → `sans-serif` | All Chinese copy | Apple system font, distributed with macOS |
| `ui-monospace` → `"SF Mono"` → `Menlo` → `Consolas` → `monospace` | Data readouts, coordinates, English labels | Apple system font / Menlo is Bitstream Vera–derived, bundled with macOS |
| `"Helvetica Neue"` → `Helvetica` → `Arial` → `sans-serif` | The `UMBRA-7` wordmark | Apple system font |

Chinese glyph coverage (Simplified) was verified visually in the rendered
stills — no tofu boxes in any frame.

## Libraries
No third-party JavaScript library is used at runtime. The film uses only the
browser's Canvas 2D API plus the project's own shared helper module:

- **`shared/ease.mjs`** (this repository, project-internal) — imported at
  `/shared/ease.mjs` for easing functions, `mulberry32`, `valueNoise2D` and
  `vignette`. Written for MG-15, no external licence required.
- Nothing is loaded from a CDN. `shared/vendor/` (GSAP, three.js) is present in
  the repo but deliberately unused — the wireframe hologram is hand-written
  spherical projection rather than three.js, which keeps each frame a pure
  function of `t` and keeps the draw under 2 ms median.

## Sound
`audio.py` is **original synthesis**, written for this brief on top of the
project's own dependency-free toolkit `shared/audio.py` (standard library only:
`array`, `math`, `random`, `wave`). Every element — the 131.25 BPM darksynth
pulse (kick, offbeat hats, claps, sub-bass, saw pads), the boot sweep, the radar
whoosh, the hologram impact, the riser, the two-tone lock alarm, the UI blips,
the confirmation bell — is generated from oscillators, envelopes and filtered
noise inside that script. No sample packs, no recordings, no third-party
audio.

## Determinism / provenance statement
Every frame is a pure function of `t`. `Math.random()`, `Date.now()`,
`requestAnimationFrame` state, CSS transitions and `t`-driven accumulation are
all absent; randomness comes only from seeded `mulberry32` / integer-lattice
value noise. Rendering is therefore bit-reproducible.
