nordic-skating / commit
docs: installing the app, the icon's credit, and what the film cannot say
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).