Scope. This lab only treats the observable physics of a display: trajectories, burst geometry, light and sound. It contains no chemical compositions, mixing ratios or construction details, and it is not a safety-distance calculator; real displays follow national regulations and trained operators.
Shell ballistics. Newton's law with quadratic drag and wind w:
dv/dt = -k(h) |v-w| (v-w) - g ŷ, k = ρ Cd A / (2m)
For a vertical shot at constant density the equation integrates exactly: tup = atan(v0√(k/g)) / √(gk) and h = ln(1 + k v0²/g) / (2k). With k → 0 this becomes the textbook v²sin²θ/2g. A 100 mm class shell (k about 0.005 per metre) launched at 80 m/s reaches about half the vacuum height, which is why the launch speed is solved numerically from the wanted burst height.
Fuse versus apogee. The burst conserves momentum: each star moves with vshell + u. At the apogee the shell has almost no vertical speed, so the cloud is symmetric and starts to fall together. Bursting early sends the whole cloud upward, bursting late sends it downward; the sweep experiment measures this.
Star motion. Each star is a small burning body with its own drag parameter ks. Without gravity the radial motion has the closed form
u(t) = u₀ / (1 + k u₀ t), r(t) = ln(1 + k u₀ t) / k
so the radius grows only logarithmically: doubling the star speed does not double the burst radius. For linear (Stokes-like) drag the result would be r = (u₀/c)(1 - e-ct) with a finite limit u₀/c. Because r(u₀) is not linear, drag also slightly distorts shape-mapped bursts (ring, heart): fast stars lose proportionally more. Gravity adds a droop of about ½ g t² to the whole cloud, and willow trails are simply long-burning stars that droop visibly.
Sparks and trails. Trail particles use linear drag relative to the wind, v(t) = vg + (v₀ - vg) e-ct with vg = w + (0, -g/c, 0), evaluated analytically on the GPU. Incandescent sparks cool from yellow to red along their life.
Colour. Hot gas and vapour emit at discrete wavelengths; the photon energy is E = hc/λ = 1239.84 eV·nm / λ. Named metals give recognisable emission features: strontium red (about 650 nm), barium green (about 524 nm), copper blue (about 450 nm), sodium yellow (589.0 and 589.6 nm), calcium orange (about 620 nm), lithium crimson (670.8 nm). In flames most of these are molecular bands rather than single atomic lines; the sodium D doublet and the lithium line are true atomic lines. Gold and white come from thermal (Planck) radiation of hot particles. Wavelengths are converted with a multi-lobe fit of the CIE 1931 colour matching functions (Wyman, Sloan and Shirley, 2013) and clipped to sRGB, so spectral colours look slightly less pure on a screen than in reality.
Light and sound. Light arrives in about d/c₀ ≈ 3 μs per kilometre; sound travels at c = 331.3 √(1 + T/273.15) m/s, so the bang lags by d/c, about 2.9 s per kilometre. Apparent size is θ = 2 atan(R/d); a fist at arm's length covers about 10°.
Simplifications. Constant drag coefficient (no Reynolds dependence, no spin or Magnus force), uniform wind, exponential atmosphere with 8.5 km scale height for the shell, constant star mass, no smoke, sound refraction ignored, and artistic brightness. Shell mass assumes a bulk density near 950 kg/m³ (order of magnitude only).
Sources. T. Shimizu, Fireworks: The Art, Science and Technique (1981); Wyman, Sloan and Shirley, J. Comput. Graph. Tech. 2 (2013); CIE 1931 standard observer; NIST Atomic Spectra Database for the Na D and Li lines.