# CREDITS — 10-aurora-glass 「澜光 · LUMINA」

All visuals in this film are original code written for this project. Nothing was copied
from another demo, shader, or asset pack, and no third-party brand appears anywhere on
screen. The product name 「澜光 / LUMINA」 and the brand line 「LUMINA · 灵光系统」 are invented.

## Fonts

| use | family | source | licence |
|---|---|---|---|
| Chinese UI + wordmark (「澜光」「与光同思」, card copy) | **PingFang SC** (weight 200 / 300) | macOS system font, referenced by CSS font stack only — not vendored | Apple system font licence; used here only as an installed system face, as the brief allows |
| Chinese fallback | **Hiragino Sans GB** | macOS system font, font stack fallback | Apple system font licence |
| Latin wordmark / captions (`LUMINA`, `SPATIAL AI · 2026`) | **Helvetica Neue** | macOS system font | Apple system font licence |

No webfont file is vendored and no font is fetched from a CDN at render time.

## Code / libraries

| item | source | licence |
|---|---|---|
| `parts/aurora.mjs`, `parts/glass.mjs`, `parts/lens.mjs`, `parts/type.mjs`, `parts/film.mjs`, `parts/cues.mjs` | written for this demo | — |
| `shared/ease.mjs` (maths helpers: `clamp`, `span`, `smooth`, `overshoot`, `elasticSettle`, `easeOutCubic`, `easeOutQuint`, `valueNoise2D`, `mulberry32`) | supplied by the MG-15 harness (`/shared/ease.mjs`) | project-internal |
| `shared/audio.py` (synthesis toolkit) | supplied by the MG-15 harness | project-internal |

No GSAP, three.js or any other vendored library is used. The entire film is Canvas 2D:
no WebGL, no CDN, no npm dependency.

## Sound

Entirely synthesised by `audio.py` at render time from `shared/audio.py` generators
(`saw`, `sine`, `lowpass`, `bell`, `blip`, `pop`, `whoosh`, `riser`, `impact`, `stab`,
`noise`) plus the `Timeline` mixer. No samples, no recordings, no third-party loops.

The pad layer (`padnote`) is a small local helper built on `audio.saw` + `audio.lowpass`.

## Determinism

Every frame is a pure function of `t`. Seeded `mulberry32` / `valueNoise2D` only — no
`Math.random()`, no `Date.now()`, no CSS transitions, no `requestAnimationFrame` state.
The light-mote field is generated once at load from a fixed seed.
