fuzzyworld

nordic-skating / commit

docs: installing the app, the icon's credit, and what the film cannot say

8b498d5171a93d2063128b9321d7962ec0560e15 · Pavel Safronov · 2026-10-09 22:12:58 -0700 · parents 1fdf083d2eb1

Claude Code usage: this commit ≈0 out / ≈0 cached · cost unknown (no per-model trailer) · session 1 tally 800 in / 673.2K out / 80.3M cached · usage by commit and session

docs: installing the app, the icon's credit, and what the film cannot say

Usage: 800 in / 673.2K out / 80.3M cached (session tally)
rtk:   1.7M saved, 25.3% over 2667 cmds (global/lifetime)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
 PLAN.md   | 56 ++++++++++++++++++++++++++++++++++----------------------
 README.md | 36 ++++++++++++++++++++++++++++++++----
 2 files changed, 66 insertions(+), 26 deletions(-)

diff --git a/PLAN.md b/PLAN.md
index 8607453..5648cc2 100644
--- a/PLAN.md
+++ b/PLAN.md
@@ -93,16 +93,23 @@ how hilly, the colour of the aurora, how fast it moves.
 **Ideas for more settings**, none started: speed, how far the autopilot carves, how long
 the strides are, how much the ice cracks, falling through, the haze.
 
-### 3. Installable app
+### 3. Installable app — built, not yet tried on a phone
 
-**Decided: add it.** A home-screen icon, a full-screen launch with no browser bars, and
-working offline. Needs a web manifest, icons in several sizes, and a service worker.
-Earlier project to copy from: `~/code/galaxy-z-flip7-butterchurn`, which uses
-`vite-plugin-pwa`.
+A web manifest and a service worker, made by `vite-plugin-pwa`. Installed, the app has
+its own icon, opens full screen with no browser bars, and works with no network: the
+whole of it is kept on the phone, and nothing is fetched after that. A new version is
+taken up the next time it is opened.
 
-**Open questions.**
-- What is the icon? (A skate, a crack in black ice, the island?)
-- Should it lock to one orientation when installed, or keep both as now?
+Checked in a desktop browser: with the network off and the server stopped, the app
+opens, opens a lake by number, and Randomize works. Not checked: installing it on a
+phone, on either Android or an iPhone.
+
+**The icon** is a skate, supplied by Pavel: by Icongeek26, from Flaticon, credited in
+the About box and the README as its licence requires. The artwork is
+`assets/skate-shoes.png`, and `npm run icons` makes the home-screen and tab icons from
+it, pale on the colour of black ice.
+
+**Open.** It opens in whichever orientation the phone is held. Should it lock to one?
 
 ### 4. An obstacle to loop around: the patch of grass
 
@@ -123,22 +130,27 @@ side; the skater may choose the other, or circle it.
 - Channels that fork and later rejoin, and three-way forks, would both come from the
   same work. Worth doing together?
 
-### 5. Check the chirps against the film
+### 5. Check the chirps against the film — tried, and the film cannot say
 
 **Pavel's request.** The falling "pew" of a distant crack is the one part of the sound
-that comes from the model alone. The first attempt to fit the film's chirps to the model
-failed: 3 of 124 bursts fitted, because the film's soundtrack is edited and its sounds
-overlap.
-
-**What to try.**
-- Pick a handful of the clearest chirps by eye from the spectrogram, instead of
-  detecting them automatically, and fit only those.
-- Follow the ridge of the chirp with a method made for sweeping tones (a reassigned
-  spectrogram), rather than taking the loudest frequency in each short window.
-- Fit the distance and the ice thickness together, and see whether the thickness that
-  comes out agrees with the 4.1 cm that the note gives.
-- If the film will not give it up, say so in the README, and look for a second source:
-  the paper's own recordings, or another recording of thin ice with a known thickness.
+that comes from the model alone.
+
+**What was tried** (2026-10-09), three ways, the last kept in `tools/analyse-video.mjs`:
+1. Follow the loudest frequency down after each burst and fit it: 3 of 124 fitted.
+2. Split each burst into bands from 1 to 7 kHz and time each band's arrival, to test
+   the one thing about a chirp that does not depend on where the crack was: that
+   arrival times fall as frequency to the power -0.6. 3 of 203 bursts had any spread.
+3. The same in the band just above the note, where the chirps' sound is: 3 of 122, and
+   those three disagree with each other.
+
+**Finding.** In nearly every burst every band arrives within 30 ms of every other. The
+likely reason is that the microphones were close to the skater: a sound from close by
+has had no distance to spread out over. The film gives the note (740 Hz, so 4.1 cm) and
+not the chirp. Not looked at: the reassigned spectrogram, which sharpens a ridge but
+cannot put spread into a sound that has none.
+
+**What would settle it**, if it matters: a recording made some hundreds of metres from
+the cracks, with the ice's thickness known. The paper's own data are of that kind.
 
 ### 6. Phone controls
 
diff --git a/README.md b/README.md
index 1014539..d1b1903 100644
--- a/README.md
+++ b/README.md
@@ -59,6 +59,17 @@ until it is closed: by its button, by Escape, or by a touch outside it.
 the page. The browser's Back button returns to the lake you left, and Forward goes on
 again.
 
+## Install
+
+The app can be put on a phone's home screen, where it has its own icon, opens full
+screen without the browser's bars, and works with no network.
+
+- **Android (Chrome):** the menu, then "Add to Home screen" or "Install app".
+- **iPhone (Safari):** the Share button, then "Add to Home Screen".
+
+Nothing is fetched once it is installed: the whole app is kept on the phone and the
+lake is computed. A new version is taken up the next time it is opened with a network.
+
 ## Settings
 
 Each takes effect as it is touched, behind the box, and is remembered for next time.
@@ -224,9 +235,15 @@ freshwater ice and nothing tuned, the model here gives 4.2 cm for 725 Hz.
 | Time between skate strikes | median 0.66 s | Not used: at that rate the view rocks from leg to leg without rest. Strides here are long glides of 1.4 to 3.2 s, each a different length |
 | How fast a ring dies | 36 dB a second | The ring's decay: to 1/e in 0.24 s |
 
-Fitting the fall of the film's chirps to the model was tried and did not work: its
-soundtrack is edited and the chirps overlap. The chirps here are the model's, unchecked
-against the film.
+**The chirps cannot be checked against the film.** Three ways of doing it were tried,
+and the last is still in the tool: split each burst of sound into frequency bands, time
+when each band arrives, and see whether higher bands arrive earlier by as much as the
+model says. Of 122 bursts, 119 show no spread to measure: every band arrives within
+30 ms of every other. The other three do not agree with each other or with the model.
+The likely reason is that the film's microphones were close to the skater, and a sound
+from close by has had no distance to spread out over. So the film gives the note and
+not the chirp. The chirps here are the model's, which is the paper's, and the paper
+measured the spreading directly, with instruments on the ice.
 
 ### What is synthesized
 
@@ -263,6 +280,7 @@ npm run preview  # serve dist/
 npm run screenshots  # build, then photograph the app at phone size into docs/screenshots/
 npm run sound-check  # render the synthesized sound and draw its spectrogram into docs/sound/
 npm run analyse-video  # measure a local copy of the reference film
+npm run icons  # remake the home-screen and tab icons from assets/skate-shoes.png
 ```
 
 On the address: `?seed=1` asks for lake number 1, `?time=night` for a time of day (`day`,
@@ -283,12 +301,22 @@ named `public`, and a `public/` already in the repository would collide with it.
 
 ## Licence
 
-[MIT](LICENSE). What it builds on is credited below.
+[MIT](LICENSE), for everything here but the icon. What it builds on is credited below.
 
 ## Attribution
 
+- The app's icon is a skate by [Icongeek26](https://www.flaticon.com/authors/icongeek26),
+  from Flaticon, used under the Flaticon free licence, which requires attribution. The
+  credit is in the app's About box as well as here. The artwork is
+  `assets/skate-shoes.png`; the icons in `static/` are made from it by `npm run icons`,
+  which uses only its shape: pale on the colour of black ice for a home screen, and
+  as it was drawn, black on a see-through background, for a browser's tab (white where
+  the browser is dark). It is not covered by this project's MIT licence.
 - [three.js](https://threejs.org/) — MIT licence.
 - [simplex-noise](https://github.com/jwagner/simplex-noise.js) — MIT licence.
+- [Workbox](https://developer.chrome.com/docs/workbox), by way of
+  [vite-plugin-pwa](https://vite-pwa-org.netlify.app/) — MIT licence. It is the service
+  worker that keeps the app on the phone.
 - The physics of the sound: Romeyn, R., Hanssen, A., Ruud, B. O., and Johansen, T. A.,
   [Sea ice thickness from air-coupled flexural waves](https://doi.org/10.5194/tc-15-2939-2021),
   *The Cryosphere* 15, 2939–2955, 2021 (CC BY 4.0).