Pick a borough and a day, live or any day back to 2020, and its hourly air readings play as a synthesizer under a sky. Every gap in the record is named on the page. Worse air plays the same piece, wrecked.
The data came first. I specced the first version in March, before I'd looked at any hourly data. In August I audited the EPA's record for New York, and my estimated presets were two to seven times off. The plan went. Each pollutant already had a shape, and those shapes became the score.
Ozone
Nitrogen dioxide
PM2.5
Three pollutants, three jobs. Ozone is the melody. Each hour is a note, placed by how high it sits against the city's usual range. Nitrogen dioxide is the pulse and the bass: more NO₂, more and harder hits. PM2.5 is the dissonance. It picks the scale, roughens the tone and pulls the melody out of tune. An hour no monitor reported is a rest.

TakenThree channels, ozone, nitrogen dioxide and PM2.5.
RejectedKeep PM10 as a fourth, estimated from PM2.5 wherever it isn't measured.
The instrument live and on four measured days. Values are citywide.

The same piece, wrecked. One hour is one beat, so every day is twenty-four. A bad day doesn't get faster, it gets denser. Six scales, one per EPA grade, run from Major to Chromatic, each with less sense of a home key.
A chord bed cycles under the melody. The data wrecks it but never rewrites it. A clear October afternoon and the smoke of June 7 are the same sixteen seconds, one in tune and one coming apart.
TakenA fixed clock at 90 BPM.
RejectedTempo from AQI, 60 to 140 BPM.
TakenLocrian at Very Unhealthy.
RejectedWhole tone.
The gaps stay on the page.
Only the Bronx and Queens report all three pollutants. At first a missing voice dropped out, and Brooklyn, playing particulates alone, sounded worse than the wildfire day. The silence meant something the data hadn't earned.
Now a borough without a monitor borrows the citywide reading, and the page says so. New York publishes no live NO₂, so live days use a typical profile from the archive, labelled the same way. A sonification that hides its gaps is a mood piece. One that shows them is an instrument.

| Days | From | How | Cached |
|---|---|---|---|
| 2020 to the snapshot | EPA bulk files | One file per borough per year, built on my machine | No server |
| This year | EPA AQS API | Days since the snapshot, a month per request | A day |
| Live | AirNow | Every site round the city, New Jersey's dropped, NO₂ filled and flagged | Thirty minutes |
No route computes an AQI. The page does, the same way for every day. If AirNow has nothing for New York, a coarser feed fills in, marked citywide.
One number, seen and heard. The sky models the sun's real position for that date. Over it, a smoke plume is drawn from the same PM2.5 the synth hears. Ozone brightens the sky, so a high-ozone afternoon reads white. The sun is the playhead, crossing the sky in the sixteen seconds a day takes to play.


TakenComposite the smoke as its own layer above the sky, as light it absorbs and light it throws back.
RejectedTurn up the haze inside the sky model.
Mine, start to finish. Made the first prototype with Figma Make in March. Claude Code for the rest.
Looking back
The project stalled between the March prototype and the August audit, because I planned the sound before I read the data. For a sonification, the audit is the design work. I did it second.
I cut the part I wanted most. Imagine would have played a day at WHO guideline levels or a Delhi winter average. Delhi made another city's ordinary air this city's worst case, a comparison the piece had no standing to make. WHO levels sit so close to a clear New York day that you'd barely hear the difference. The piece can tell you what the air was, and it can't tell you what it could be.
The central claim rests on one listener, me. I skipped the test with three strangers. Whether someone who has heard October 29 recognizes June 7 as the same piece is still open.
I chose the sky partly for the portfolio. It replaced a typographic score because this collection needed one polished, product-grade web piece.
- 0018installSights and Sounds of the Body PoliticThe other data piece in sound. Media speech through orchestration and effects, where this one synthesizes everything.
- 0019buildBushwick NightcrawlersSame city, sound from samples. Recorded rat calls, where this one makes every sound from scratch.