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.