Subject: Shoro RoyStatus: acceptingLast observed: New York
build 0023 · 2026

AQI Synth

New York's air, hour by hour, played as music

Built with
React, Tone.js, three.js, Figma Make, Claude Code
Live
AQI Synth, image on file
Summary of findings

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.

Ozonethe arch

Nitrogen dioxidethe rush

PM2.5no shape

Every day of July 2023, each scaled to its own range. PM2.5 has no shape. One day predicts the next with a correlation of 0.05.

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.

The Monitor view: PM2.5, ozone and NO2 routed to scale, tone, detune, reverb, brightness and beats
The Monitor view. Each line runs from a pollutant to what it controls.
Attached · decisionPM10
Attached · decisionPM10

TakenThree channels, ozone, nitrogen dioxide and PM2.5.

RejectedKeep PM10 as a fourth, estimated from PM2.5 wherever it isn't measured.

WhyPM10 is measured one day in six, in two boroughs. Everywhere else it would be a formula, playing a sound the air never made.
0023.02[A]
Attached · mechanismThe pinned days5 tabs
Attached · mechanismThe pinned days5 tabs

The instrument live and on four measured days. Values are citywide.

The live instrument for New York City: the hourly AQI under the day's sky
LiveOctober 5, 2026, whatever the air was.
Tab 1 of 50023.02[B]
0023.02[B]

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.

The line is the scale, from Major down to Chromatic. The band round each note is how far it drifts off pitch.
Attached · decisionThe ladder
Attached · decisionThe ladder

TakenA fixed clock at 90 BPM.

RejectedTempo from AQI, 60 to 140 BPM.

WhyAt a fixed clock the wildfire day lines up with a clear day beat for beat. Urgency comes from the pulse filling in.

TakenLocrian at Very Unhealthy.

RejectedWhole tone.

WhyWhole tone sounded vague where the air was severe. Locrian is the darkest step before chromatic.
0023.03[C]

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.

Brooklyn on Clear Day, October 29, 2023: the ozone and NO2 tabs marked citywide, and the source line saying Brooklyn's O3 and NO2 are citywide
Brooklyn measures only particulates. The tabs and the line at the foot say so.
Attached · detailsThe pipeline
Attached · detailsThe pipeline
DaysFromHowCached
2020 to the snapshotEPA bulk filesOne file per borough per year, built on my machineNo server
This yearEPA AQS APIDays since the snapshot, a month per requestA day
LiveAirNowEvery site round the city, New Jersey's dropped, NO₂ filled and flaggedThirty 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.

0023.04[D]

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.

Ozone Spike, July 12, 2023, scrubbed to 1pm: the sun overhead and the sky washed white
July 12 at 1pm. The sun is overhead and the sky reads white.
Attached · decisionSmoke
Attached · decisionSmoke
June 7, 2023, the wildfire day: AQI 241 under an orange-tan sky

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.

WhyJune 7 was a plume between the city and the sky, which a haze setting can't draw. As its own layer, heavy smoke turns the noon sky orange-tan and goes brown only at the horizon.
0023.05[E]
Attached · embedPlay it yourselflive
Attached · embedPlay it yourselflive
https://aqi-synth.vercel.app0023.05[F]
0023.05[F]
Ownership

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.

Establish contact

· approach with care
Status
Subject accepting new roles.
Last observed
New York.
Set in Syne Mono; the subject in Pirata One ·built in Next.jsFile maintained by subject.Last amended 2026-10-07© 2026