About this project
A live ambient piece played by LA's transit system
LA Metro: Ambient turns the Los Angeles rail network into a generative music instrument. Every note you hear is a real train arriving at a real station right now. Each of the six rail lines and two BRT lines has its own synthesizer voice. The piece evolves througout the day as trains and busses come online and go offline, becoming dense during rushhour and more spacious late at night. The piece is ever changing and no two days are the same.
If you haven't tried it yet, Conductor lets you shape the sound while the city plays. Pick instruments per line, set volume and pan, transpose, and dial in mix. You can also flip on Place Trains to pause the live feed and run your own arrangement, then share the result with friends so they can hear what you made.
This project was inspired by many sources, but to name just a few: the sound and music system from the game Mini Metro by Disasterpeace AKA Rich Vreeland, Brian Eno and Robert Fripp's work with systems music, and another live train data to music project trainjazz.com by Josh Wolk.
The harmonic system shifts through seven modes across the day. The geography of the city shapes the stereo field, with trains on the East to the right and trains to the West on the left. There are also a couple special sound triggers for LAX and Union Station. This is a piece that changes with time of day, that doesn't demand your attention, that rewards having it on in the background.
This project is updated regularly with new features, tuning changes, occasional additions when Metro opens new lines or stations. If you have an idea for something you'd like to see (or hear), I'd genuinely like to know about it. Send a note to jack@weisswideweb.com.
A project by Jack Weiss / sound designer and re-recording mixer, Los Angeles.
Each note is a Metro train arriving at a station right now.
Changelog
v2.9 Beta
+Conductor panel now plays a soft two-note tone as it opens and closes, timed to the slide animation: the pitch rises when the panel opens and falls when it closes, giving the gesture audible feedback. The tone follows the global transpose and stays quiet and reverbed so it reads as feedback rather than a melody note
fixQuick double-taps on buttons no longer zoom the whole page on mobile. Because touch-action is not inherited, the site-wide setting did not cover individual controls, so it is now applied directly to every interactive element. Pinch-zoom on the map is preserved
v2.8.3 Beta
changedString instrument revoiced for ambient use: attackNoise reduced from 1.5 to 0.2 (note materializes rather than plucks), dampening lowered from 3000 Hz to 800 Hz (dark and warm), resonance raised from 0.85 to 0.96 (long ring, notes blur and overlap)
changedAll instrument names updated to reflect how they actually sound: Pad → Cloud, Melody → Drift, Bass → Deep, Keys → Warm, Bells → Chime, Triangle → Mellow, Organ → Reed, Flute → Breath, Pluck → String, AM → Metallic, FM Bell → Shimmer. Crystal, Drone, and Gong unchanged
fixConductor footer buttons now lay out across two rows so they all fit without overflowing: Simulate Live Trains (or Clear All) takes the full top row, with Reset All and Share Your Creation sharing the row below
changedOpening animation accelerated to 2x speed: canvas line drawing (REVEAL_SEG_DRAW_MS: 1000ms → 500ms), segment stagger (REVEAL_SEG_STAGGER: 420ms → 210ms), start screen fade (400ms → 200ms), and trains arrival (12900ms → 6450ms). First-run explainer text popup timing preserved at 14400ms as specified
v2.7 Beta
changedOpening animation timing halved: start screen now fades at 400ms (was 800ms), and all subsequent animations scale proportionally for a snappier intro experience
changedRoute reveal animation refined: station dots no longer animate spawning in on the canvas. The animated line drawing completes uninterrupted (~9.8 seconds), then the canvas fades away to reveal the actual Leaflet map with real station markers. Live trains now appear after the canvas fade, so the route network draws cleanly before any vehicle movement begins
fixConductor button pulse animation now deactivates when all changes are reset: Reset All clears the pulse, and Clear All trains also silences it so the button only pulses when there are active uncommitted changes in the Conductor
fixClosing the Conductor panel no longer destroys simulated trains. The panel and the simulation are now independent: closing the panel just hides it, and your placed trains keep running on the map. The Conductor button updates its label to show how many simulated trains are active. Reopen the panel and turn off Place Trains to return to live mode
v2.6 Beta
+Reset All button added to the Conductor panel footer. Restores all lines to default instruments, volume, pan, transpose, and unmutes any muted lines in one tap
fixConductor footer button layout unified: all three action buttons now share the same height, padding, and border style for a consistent row; the Clear All / Simulate Live Trains swap slot switched from absolute positioning to a CSS grid overlay so it no longer creates layout inconsistency
v2.5 Beta
fixSimulated vehicle speeds recalibrated to match real-world LA Metro end-to-end journey times. Each line's speed value now accounts for its tick multiplier, bringing traversal times in line with actual schedules (A Line ~75 min, B Line ~30 min, C Line ~49 min, E Line ~49 min, D Line ~20 min, K Line ~25 min, G Line ~45 min, J Line ~63 min)
v2.4 Beta
+Conductor button now pulses subtly whenever the user makes a change in the Conductor panel or Place Trains mode, providing visual feedback that their adjustment has taken effect
v2.3 Beta
+Vehicle in Service and Vehicle out of Service sound toggles added to the Event Sounds section in the Conductor panel, alongside LAX chime and Union Station chime toggles, so users can quickly disable the train entry/exit whoosh sounds
changed"Station Sounds" section renamed to "Event Sounds" to reflect the addition of vehicle service event toggles
v2.2 Beta
+Conductor button now carries a small subtitle, "Choose sounds, add trains", so first-time users can tell what it opens before tapping it
+Lines tab now leads with a small hint, "Tap a line letter to mute", so the mute affordance on the colored line letter is discoverable
+"Reset instruments" moved from the bottom of the Lines tab up into the Lines header row as a small inline link, so it sits next to the instrument dropdowns it acts on
fixPlace Trains hint rewritten from "Enables + / − buttons to add simulated trains" to "Pause the live feed and run your own trains", describing what the toggle does rather than which UI it unlocks
fixConductor footer no longer shifts position when Clear All and Simulate Live Trains swap visibility. The two mode-action buttons now share a fixed left slot, so Share Your Creation stays anchored on the right
v2.1 Beta
+Mobile layout pass for iPhone 14 Pro and similar screens: legend, arrival feed, mode display, and version label hidden on narrow viewports to clear the map; Conductor and sound panels expand to near full width; bottom buttons enlarged to meet touch target guidelines; About modal slides up as a bottom sheet; iOS home indicator safe area respected throughout
v2 Beta
+Conductor button moved to center bottom of the screen for better visibility
+Place Trains toggle moved into the Lines tab, directly above the per-line density controls, so the connection between the toggle and the + / − buttons is clear
+Simulate Live Trains (formerly Remix This Moment) moved to the footer and renamed for clarity: it places simulated copies of the current live trains so you can play with the arrangement
+Conductor now has two tabs instead of three: Lines and Saves. The former Trains and Sound tabs are merged into a single Lines tab so all controls for a given line sit in one place
+Scale and Key controls pinned at the top of the Lines tab, visible without scrolling
+Instrument picker is now a dropdown select per line instead of arrow cycling, showing all 14 voices at once
+Per-line Volume, Pan, and Transpose sliders tucked behind a ▾ expand button on each line row
+Fire button (▶) flashes in the line's color on click
+Tab content fades in with a short slide animation when switching tabs
fixLive Sound panel simplified to Scale and Key only, with a note pointing to Conductor for per-line detail
v3.1 Alpha
fixTrains tab cleanup: removed the redundant small mute dot next to each line letter. Click the colored line letter badge to mute or unmute the line. Muted state shows as a dimmed badge
fixRemoved the per-line expand chevron from the Trains tab. Volume, Pan, and Transpose sliders moved into the Sound tab beneath each line's instrument picker, where they sit alongside the other sound-shaping controls
fixConductor panel now caps at the viewport height with scrolling tab content, so the taller Sound tab no longer overflows the screen
v3.0 Alpha
+Sandbox Mode is now Conductor. The mode boundary is dissolved: sound controls work on live trains by default, and Place Trains is a toggle inside the panel that pauses the live feed when you want to run your own arrangement
+Remix This Moment: freezes the trains currently on the map and drops you straight into Place Trains with those exact positions so you can play with what you are hearing
+Local save slots (Saves tab): three named slots stored in the browser, each capturing scale, key, mutes, instruments, mix, and train placement
+Per-line mix controls (tap the chevron next to a line): Volume, Pan override, and Transpose in semitones
+Density label replaces the unlabeled train count and reads more naturally for what the control does
+Line letter badges in the Conductor panel pulse briefly when their line fires a note, tying the panel to the sound
+Saves tab joins Trains and Sound as a third tab in the Conductor panel
fixLegacy standalone Sound button removed from the map - its functionality is now part of Conductor
v2.5 Alpha
+Sandbox intro modal: entering Sandbox mode now shows a brief explanation of what it is and what you can do, with a "Don't show this again" option
+Live Sound panel: a new Sound button appears on the map while live trains are running, giving access to scale, key, and per-line instrument controls without pausing the feed
v2.4 Alpha
fixStation arrivals ticker now shows the correct destination terminal for every line. The old direction-label table had C, E, and D Lines inverted relative to the station array order, so those three lines were displaying the wrong "To ___" label on every arrival
fixDestination is now derived from the train's observed motion (station-index history first, then motion-vector projection onto neighbor stations), not from GTFS direction_id - which was unreliable on first arrival after spawn
v2.9 Alpha
fixOpening animation: C Line LAX Extension (the 2024 reroute north to LAX/Metro Transit Center) now draws after the K Line LAX Extension and K Line South Bay phases, correctly reflecting that the C Line connection only became possible once the K Line infrastructure was in place
v2.8 Alpha
fixOpening animation: C Line history corrected. The 1995 Green Line now draws only the east-west segment (Aviation/Imperial to Norwalk), plus a separate southward branch in C Line green down through Mariposa, El Segundo, Douglas, and Redondo Beach — reflecting the original L-shaped Green Line route. In 2024, the C Line's new connector north to LAX/Metro Transit Center draws in green. The K Line South Bay phase then draws over the south branch in K Line pink, showing the November 2024 service transfer. The histColor system now supports per-segment crossfade timing via swapAtIndex.
v2.7 Alpha
fixOpening animation: K Line history corrected. The original 2022 opening (Expo/Crenshaw to Westchester/Veterans) now draws as a separate phase. The 2024 LAX/Metro Transit Center extension draws next. The South Bay stations (Mariposa, El Segundo, Douglas, Redondo Beach) draw last in C Line green, then crossfade to K Line pink — reflecting that they were built as part of the original 1995 Green Line and transferred to K Line service in November 2024.
v2.6 Alpha
fixOpening animation: canvas z-index restored to 1800. It had been changed to 100, which placed it behind Leaflet's tile layer (z-index 200+), making the entire route-drawing animation invisible even though it was running correctly.
fixOpening animation: start screen fade now fires on a fixed 800ms timer after Listen is pressed, independent of audio initialization, so it no longer races against reverb generation.
fixOpening animation: station dots now spawn again after the lines finish drawing. The drawStations call had been accidentally removed from the animation frame loop.
v2.3 Alpha
fixScoped the v2.2 in-app browser audio fix so it only activates when an in-app browser is actually detected (Instagram, Facebook, TikTok, etc). Desktop Firefox could not get past the start screen after v2.2 because the unconditional AudioContext swap was breaking Tone.js initialization
v2.2 Alpha
fixPlayback inside Instagram's in-app browser now matches Safari and Chrome. AudioContext is created with latencyHint 'playback' so iOS WKWebView uses the media audio session instead of the communication one, which was downsampling the mix and gating quiet reverb tails
v2.1 Alpha
+Share Your Creation now encodes all sandbox state: scale, key, muted lines, instrument choices per line, and train counts per line
+Opening a shared link auto-enters Sandbox mode and restores all trains and sounds
+Start screen shows a notice when a shared link is detected
+A dismissable banner confirms to the recipient that they opened someone else's shared setup
v2.0 Alpha
fixStation dots no longer scale up during zoom-out: converted from SVG circleMarkers to CSS div markers, which are immune to Leaflet's SVG pane zoom animation
fixStation dots reduced in size (8px diameter, down from 10px) for better legibility alongside train vehicles
v1.9 Alpha
fixE Line octave-up notes now play at much lower velocity so they don't pierce through the mix
v1.8 Alpha
+D Line Section 1 (opens May 8, 2026): added Wilshire/La Brea, Wilshire/Fairfax, and Wilshire/La Cienega stations with accurate coordinates
+D Line map geometry extended westward to Beverly Hills
+Opening animation: D Line Section 1 draws as a new 2026 build phase; Phase 2A fractions recalculated for extended geometry
fixD Line westbound destination updated to Beverly Hills
v1.6 Alpha
fixExplainer text no longer appears over the service-ended screen
+Freeplay renamed to Studio - covers both sound design and train arrangement
+Sound tab: note indicating that instrument choices carry over to Live mode
+Sound tab: Reset to defaults button restores all instruments to factory settings
v1.5 Alpha
+Opening animation: historically accurate pre-2023 line colors (Gold Line gold #FDB913, Expo Line aqua #5BC2E7) crossfade to current A and E Line colors when the Regional Connector phase fires
v1.4 Alpha
+Sound tab: per-line instrument picker - cycle through 14 synth voices per line
v1.3 Alpha
+Start screen now includes the about text - one screen instead of two
v1.2 Alpha
+Freeplay panel: Trains and Sound tabs
+Sound tab: scale picker (8 modes) and key stepper (all 12 roots)
+Per-line mute dots in Trains tab
+Share button encodes your sound setup as a URL others can open
v1.1 Alpha
+Freeplay panel: hardcoded dark background, consistent in both day and night modes
+Night toggle replaced with animated sun/moon icon, snappy spin on switch
+Bottom-right controls: matched circle buttons, tightened spacing
v1.0 Alpha
+About popup explains the project to first-time visitors; reopenable via ? button
+UI button refresh: rounded corners throughout, pill-shaped controls
v0.9 Alpha
fixStation markers now match night/day mode changes
fixIntro animation station colors now match the active day/night mode
fixOpening explainer text now sits above the intro animation canvas
v0.8 Alpha
+Opening chord synced to reveal animation; each build phase triggers its line's note
-Removed iOS-specific reverb substitution; all devices now use the same reverb
v0.6 Alpha
+Chronological route reveal animation, 16 build phases, 1990–2025
+Canvas station markers pixel-matched to map style
+Map locked during animation, unlocked on completion
+Smooth fractional zoom (no level snapping)
+Thinner map lines for cleaner look
v0.5 Alpha
+Union Station arrival bell (three-stroke bronze chime)
fixLight mode flash on night load eliminated
fixLight/dark tile crossfade now smooth at 60fps
fixStation clicks no longer blocked after first tap
fixiOS Safari audio now unlocks correctly
-Instrument names removed from legend
v0.4 Alpha
+Live dot is red for real data, purple for simulation
+Changelog panel (click the version label)
fixGPS sanity check stops trains jumping erratically
v0.3 Alpha
+Manual dark mode toggle button
fixUser preference overrides the auto time-of-day switch
v0.2 Alpha
+Live listener counter with blue pulsing dot
+Frosted background on explainer text
-Vehicle dot changed to red, viewer dot to blue
v0.1 Alpha
+Initial release. Six rail lines, real-time trains, aleatoric ambient sound.