Sounds

Everything the city plays, and where each one came from. Press any of them. Most are CC0; the three animal calls are credited by name, and a few were built here out of noise and sine waves.

๐Ÿ”Š 31 sounds

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 at normalisation time, because they repeat.

The bay is silent, and why

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/<event>-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
gull cry Solo seagull sound effects, OpenGameArt CC0 1.0
two of them grunting Commons, rec. LokYYs CC BY-SA 4.0
Great White Pelican Commons, rec. Marco Dragonetti CC BY 4.0
Red-masked Parakeet Commons, rec. Igor Lazo CC BY-SA 4.0
a splash 40 CC0 water splash / slime SFX, OpenGameArt CC0 1.0
a far bigger one: the longest splash dropped a fifth for mass, another under it for the surface same pack CC0 1.0

is Psittacara erythrogenys, the species that actually lives on Telegraph Hill. Being CC BY-SA, it and 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
โ€ฆ one note each rendered from Sonic Pi's :piano synth MIT synth, rendered here
breaking waves, looping; not currently played, see above Beach ocean waves, OpenGameArt, two takes joined CC0 1.0
airship hum, low-passed Kenney Sci-fi Sounds CC0 1.0
a chime Kenney Interface Sounds CC0 1.0
gemstone tick Kenney Interface Sounds CC0 1.0
a theremin glide Epro theremin middle bach.ogg, rec. Effebit Public domain
paper turning Kenney RPG Audio CC0 1.0
a keycap going down synthesised here, see below ours
a letter arriving synthesised here, see below ours
a gem going in the bag synthesised here, see below ours
the Golden Gate's own, one blast FoghornGoldenGateBridge0312, Freesound, rec. tim.kahn CC0 1.0

Quests and interface

All Kenney, CC0 1.0: and , , , (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 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 synthesised ones

, and are built from noise and sine waves, so they are ours and owe nobody a credit. All three are peak-normalised to -6 dBFS like the other short ones; the commands are in the commits that added them.

is a small handful going into a bag: three clicks at 1560, 1960 and 1180 Hz spread unevenly over 118ms, the last one lowest so the sound settles rather than trailing off upwards. Each is a noise burst band-passed at 3600 Hz and dead in about 20ms for the strike, over partials at 1, 2.76, 5.40 and 8.93 for the ring โ€” the struck-bar set, which is what makes metal and glass sound like metal and glass.

Inharmonic partials are right in a click and wrong in anything that rings on. What this replaced was a rising major arpeggio rung on partials at 3.01 and 4.98, reaching for the same bell quality. Against the true third and fourth harmonics those beat a few times a second, and held under four overlapping notes the wavering read as out of tune rather than as a bell: the word for it was "sad". These three are gone in 0.38s, long before any beating is audible. Judge a replacement the same way, by how long the ring lasts rather than by how metallic the ratios look.

It answers the ordinary find only. A gem somebody wrote themselves already arrives under the quest fanfare, and _gem.html.erb is what withholds the chime there, because only the server knows whose gem it is.

is every panel folding and every menu opening โ€” one keycap going down. It is a click and a body played together: noise band-passed to 700-4200 Hz decaying at exp(-90t) over sines at 178 and 89 Hz decaying slower, 0.13s in all. The interface tick it replaced was a Kenney chime with nothing under 500 Hz, 16 dB down there against the 2 kHz it peaked at, which is what made it read as a beep rather than as a key. Judge a replacement by the same measurement: this one carries -20 dB under 500 Hz and -22 dB across 2-5 kHz, so the click and the thock arrive together.

is a message landing in the chatbox: two noise swishes 100ms apart, band-passed 1400-7000 and 900-5000, and a soft two-tone tap at 432/648 Hz under the end of them, 0.34s in all. It is the one sound here that answers something nobody on the page did, so it stays a rustle rather than a chime โ€” the whole file measures 5 dB below the fanfares in the band an ear picks first.

The x-ray glasses

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.