# Sound credits Everything here is CC0 or public domain except three animal calls — bison, parrot and pelican — which are CC BY-SA / CC BY and are credited in the map's corner panel (`app/views/events/2026-bits/pier/_map_credits.html.erb`). Move a sound out of that panel only by replacing it with something that needs no credit. All files are mono 22.05 kHz MP3 with a short fade at each end, normalised to **-20 LUFS** so nothing jumps out against anything else. Gated loudness rather than peak, because a splash that is mostly decay and a sustained hum measure the same at the peak and nowhere near the same to an ear; a limiter takes the transients instead of the gain being refused. Ticks under about 400ms are too short for R128 to gate, so those are peak-normalised to -6 dBFS instead. The player sets `VOICE` 0.6 for every one-shot. Footsteps take no level of their own and play at `VOICE` like the rest; their 6 dB is baked into `step.mp3` at normalisation time, because they repeat. ## The bay is silent, and why `ocean.mp3` is still here and nothing plays it. Three levels were fitted to it and it kept arriving as an event rather than a room, which no constant fixes, because both causes are in the file: - **It is a full-level effect, not a bed.** Max momentary loudness reads -13.7 LUFS against -17.0 to -19.1 across every animal, so at equal gain its biggest wave is the loudest thing on the map. - **It stops twice a cycle.** 0.469s of digital silence sits at the two-take join (3.54-4.01s) and 0.243s at the tail, of 7.51s. Silence into a breaking wave is the most attention-getting shape a loop can have, so it won the ear at levels measuring far below the voices. Restoring it wants a seamless, genuinely ambient recording rather than a new number. `rake pier:water` and `config/pier/-water.json` are kept for that: the cells are the markers a level would be measured against. Playback needs the `[data-ambience="ocean"]` markers back in the pier view and a loop in the sound controller; both came out together, see git history for the shape. Set any replacement by ear against the animals, not the piano, which is the loudest one-shot here at -14.6 and flattered the bay when it was the anchor. Measure in max momentary LUFS, since sample peak rates the two alike: ``` ffmpeg -i FILE -af ebur128=metadata=1,ametadata=mode=print:key=lavfi.r128.M:file=- -f null - ``` ## Animals Every file here is trimmed, converted to mono 22.05 kHz MP3, normalised and faded. That counts as modification under CC BY §3(a)(1), so the map's credit panel says so and links back to this file for the sources. | File | What it is | Source | Licence | | --- | --- | --- | --- | | `seagull.mp3` | gull cry | [Solo seagull sound effects](https://opengameart.org/content/solo-seagull-sound-effects), OpenGameArt | CC0 1.0 | | `bison.mp3` | two of them grunting | [Commons](https://commons.wikimedia.org/wiki/File:Two.european.bison.grunting.ogg), rec. LokYYs | **CC BY-SA 4.0** | | `pelican.mp3` | Great White Pelican | [Commons](https://commons.wikimedia.org/wiki/File:Great_White_Pelican_(Pelecanus_onocrotalus)_sounds.ogg), rec. Marco Dragonetti | **CC BY 4.0** | | `parrot.mp3` | Red-masked Parakeet | [Commons](https://commons.wikimedia.org/wiki/File:Psittacara_erythrogenys_-_Red_masked_Parakeet.wav), rec. Igor Lazo | **CC BY-SA 4.0** | | `sea-lion.mp3` | a splash | [40 CC0 water splash / slime SFX](https://opengameart.org/content/40-cc0-water-splash-slime-sfx), OpenGameArt | CC0 1.0 | | `whale.mp3` | a far bigger one: the longest splash dropped a fifth for mass, another under it for the surface | same pack | CC0 1.0 | `parrot.mp3` is *Psittacara erythrogenys*, the species that actually lives on Telegraph Hill. Being CC BY-SA, it and `bison.mp3` carry CC BY-SA 4.0 too; the site around it does not, since a page embedding a sound is a collection rather than a derivative of it. Swap it for something CC0 if that ever gets uncomfortable, and drop the credit line with it. ## The city | File | What it is | Source | Licence | | --- | --- | --- | --- | | `piano-0.mp3` … `piano-7.mp3` | one note each | rendered from Sonic Pi's `:piano` synth | MIT synth, rendered here | | `ocean.mp3` | breaking waves, looping; **not currently played**, see above | [Beach ocean waves](https://opengameart.org/content/beach-ocean-waves), OpenGameArt, two takes joined | CC0 1.0 | | `blimp.mp3` | airship hum, low-passed | Kenney Sci-fi Sounds | CC0 1.0 | | `sponsor.mp3` | a chime | Kenney Interface Sounds | CC0 1.0 | | `ruby.mp3` | gemstone tick | Kenney Interface Sounds | CC0 1.0 | | `martian.mp3` | a theremin glide | [`Epro theremin middle bach.ogg`](https://commons.wikimedia.org/wiki/File:Epro_theremin_middle_bach.ogg), rec. Effebit | Public domain | | `card.mp3` | paper turning | Kenney RPG Audio | CC0 1.0 | | `tick.mp3` | a panel folding | Kenney Interface Sounds | CC0 1.0 | | `foghorn.mp3` | the Golden Gate's own, one blast | [Foghorn_GoldenGateBridge_0312](https://freesound.org/s/140898/), Freesound, rec. tim.kahn | CC0 1.0 | ## Quests and interface All [Kenney](https://kenney.nl/assets/category:Audio), CC0 1.0: `quest-complete.mp3` and `quest-unlocked.mp3`, `coin.mp3`, `heart.mp3`, `hover.mp3` (the toggle's own click). ## The residents are a piano Each of the 450 keeps one note of a C major pentatonic run for good, picked by a hash of their slug, so hovering along a street plays a melody, a crowd is a chord, and crossing the same street twice sounds the same both times. Pentatonic because any order of those notes agrees with itself; a hash rather than position because neighbours would otherwise all sound the same note. The notes are rendered from Sonic Pi's own `:piano`, one take split at the onsets. Sonic Pi's synth designs are MIT and audio rendered from a synth is not a derivative of its source, so these owe nothing legally; the handful of synths that are GPL are not among them. It is credited in the map's corner panel anyway. Sonic Pi is a Ruby tool by Sam Aaron, this is a Ruby conference, and a credit costs a line. ## Where each one fires Hovering is the trigger on a pointer, but only after resting on something for a moment, and each thing keeps quiet for a while afterwards: a sweep across 450 residents plays one sound, not 450. A touch screen has no hover, so the tap that opens a sprite's bubble speaks it instead, through the same throttles; the second tap belongs to the bubble and leaves for wherever it links. Nothing plays on a touch screen that a thumb did not ask for. Nothing here loops or plays on its own, so a tab left in the background is silent without being told to be. That was not true while the bay played. ## The foghorn The one sound nobody asks for. Every other thing here answers a hover, a tap or a quest; this sounds on its own somewhere between 40 and 80 seconds, on the map alone, and only while the tab is being looked at. Uneven on purpose: a fixed minute reads as a metronome, and the point is weather. It is one blast carved out of a 105-second recording made at the bridge, the cleanest of the six in it, at 60.0-62.7s. Carrying the whole recording to play 2.75 seconds of it would cost 2.4MB against 14KB. Its level is set in the file rather than by the player, the way `step.mp3` is, since `play` takes no level of its own: -22.4 LUFS max momentary, roughly 5 dB under a sea lion, so it carries across the bay without being an alarm. Re-cut it and set the level by measurement, not by loudnorm, which cannot gate anything this short. ## The button says what is true, not what is preferred No browser plays anything before the visitor has interacted with the page, and a refusal is silent, so an unmuted button on a fresh visit promises a sound it cannot yet make. Pressing it then made things worse: the honest first press muted an already-silent map, and it took a second to get sound. So the button reports `audible`, wanted *and* possible, rather than the stored preference. It ships muted in the markup, flips on the first click or keypress anywhere, and that first press on the button is itself the gesture, so one press does it. Panning the map flips it too, without the button being touched. The gesture is remembered in `sessionStorage` so a Turbo navigation does not put the button back to muted while sound plainly works. ## No background music, and how to add some Tried and dropped: a bed under everything else masked the quiet hover sounds it was supposed to sit beneath. If it is wanted again, Sonic Pi's bundled examples are the source. Those marked `# Coded by Sam Aaron` are his, CC BY-SA 4.0 like the rest, so shipping one means crediting him in the map's corner panel. `magician/ambient.rb` is the calm one, `sorcerer/square_skit.rb` the chiptune one, and he also wrote an `illusionist/ocean.rb` and a `wizard/blimp_zones.rb`, both oddly apt here. Sonic Pi 5 renders headlessly, so no GUI and no loopback device are needed. Its own `app/server/ruby/bin/headless-record.rb` drives the engine's record tap directly and could not reach that port on this machine; sending `recording_start`, then the piece, then `recording_save` as three separate runs through the spider does work. Seed the run, or the take differs every time: the pieces are built on `choose` and `rrand`. ## The x-ray glasses `xray.mp3` is glass then a filtered hum, a lens powering up. It answers the hover, where the quest fanfare answers the pickup, so the two never overlap.