A.2: granular repitch on far-from-root sampled notes (opt-in, render-only)

The sampler's granular capability now fires automatically: a unit that sets recipe `granular:` takes the formant/length-preserving grain path for any note whose playback rate stretches the sample >= that many semitones from a zone root — instead of chipmunk/rumble rate-stretch.

• sampler.js mixPCM: threshold trigger off sends.granularOverSt (per-note rate); n.granular still forces it. Absent => byte-identical.

• state-engine samplerUnit: carry granularOverSt/grainSec from the recipe.

• press.js + stream-renderer.js: pass the config through the per-unit sends.

• genre-kernel: RECIPE_PASSTHROUGH set so the scalar flag blends WITHOUT an inRange draw — the composition is byte-identical, ONLY the render changes (vaporwave events+features unchanged; just the new state key).

Verified: fixtures scoped to vaporwave state only (events/features identical); verify.sh green; segment-parity ALL byte-equal incl vaporwave_s1. ~13% of the sax notes trigger.

▶ Play it: Food Court Eternity → Smoke Arithmetic — a shuttle between the two genres this change names — the blend is the point https://stellate.app/?genre=vaporwave&seed=3301&path=1679.4415,292.16891&xdur=0.06

38c3a6b https://github.com/aboard-io/stellate/commit/38c3a6bd07b685d7bbf7263006d20e7124ca2e1d