Write the style pack of the "infer" station of Intelligent Dance Market: exactly one new file, packages/synth/src/stations/infer.ts. Change nothing else in the repository.
Read first: packages/synth/src/stations/README.md (the brief: contract, sound fields, taste, gate), packages/synth/src/stations/example.ts (the reference pack: copy its shape), packages/synth/src/styledata.ts (every field and its range), packages/synth/src/pack.ts (validatePack) and the house tables and SOUND_DEFAULTS at the end of packages/synth/src/engine.ts.
The pack:
- export default { key: "infer", name, genres: ["acid", "futuregarage"], styles, patches? } satisfies StationPack; the only import is
import type { StationPack } from "../pack.ts".
- genres in this order: acid, futuregarage. 2 styles per genre, ids prefixed "infer-", each on a base the README table lists for its genre.
- Data only: one object literal. No functions, loops, computed values, randomness or other imports. No engine edits.
The owner's vibe: "machine inference at night: cold, precise, glitchy. dry tight drums, ticking hats, a 303 that sounds like it is computing, deep steady sub like a reserve, sparse glassy pads, long dark space. calm, never harsh"
Taste:
- Keep each genre recognisable (acid: a 303 line over four-to-the-floor; futuregarage: skippy 2-step drums, a sub and airy chords). Change the producer, not the genre.
- One idea per style, committed; contrast the styles with each other and with the house. Use the sound fields (kit, bass, pad/strings/voice, fx, mix, vinyl, the pack's own lead patches), not only notes and rhythm.
- Avoid harshness: hats under ~0.6 level, snare noise q under ~2, never resonance and drive both at the top of their ranges, fx.master.crush under 8 bits only on purpose.
- One thing owns the sub. Send snares, leads, pads and percussion to the echo and the room, not the kick and the bass.
The gate (it must pass before you finish):
npm ci && npx playwright install chromium
node web/scripts/station-check-pack.mjs infer --diff 5539b7b8ea7c74489e1439beb2e50176a501172e
It must end with "PASS: the pack is ready for the owner to listen". Too quiet or too loud: change that style's trim by the dB difference (trim *= 10 ** (dB / 20)) and run it again.
Deliver only packages/synth/src/stations/infer.ts; the WAVs under sim/ are gitignored, do not commit them.