fix(web): los 16 botones del catalogo sonaban EXACTAMENTE igual

Fallo mio, reportado por el autor y confirmado midiendo en WebAudio. `play()`
emitia `{ name: 'probe', family, target }` y NUNCA pasaba el nombre
seleccionado: el motor resolvia contra los packs registrados, ninguno de los
cuales casa con el elemento pelado de esta pagina, asi que los dieciseis
chips reproducian la BASE DE FAMILIA. Dieciseis botones, un sonido.

Es el peor tipo de fallo en una demo: la pagina MEDIA una cosa (la tabla de
capas, que estaba bien) y REPRODUCIA otra, asi que enseñaba justo lo
contrario de lo que dice. Quien la abriera concluiria que el sistema no
distingue nada.

El signal lleva ahora el nombre como override por evento, que el resolver
aplica en la capa 1.5 — el mismo hueco donde cae la regla de un pack — luego
lo que se oye es exactamente lo que la tabla calcula.

MEDIDO en el grafo de audio real, interceptando createOscillator/createGain:
antes todos los chips daban freq=[700,1050]; ahora van de 550 a 1080 Hz con
picos distintos (subtle 0.03 · loud 0.0825 · air 1080Hz · settle 920Hz ·
snap 1040Hz/arc).

Añade tambien `playLayers()`: reproduce base → nombre → intent en secuencia,
para que la aritmetica de la tabla se pueda OIR capa a capa. Sin cablear
todavia a un boton.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
alpha-0.1-dir-prefs
dev 2 months ago
parent d161cedccf
commit 09f8d76e02

@ -85,15 +85,35 @@
const AXES = ['gain', 'pitch', 'contour', 'centroid', 'roughness', 'duration'] as const;
function play(name: string) {
/**
* Emit the CHOSEN name. The signal carries it as a per-event override, which
* the resolver applies at layer 1.5 — the same slot a component's pack rule
* lands in — so what you hear is exactly what the table above computes.
*
* It used to emit without the name at all: the engine then resolved against
* the registered packs, none of which match this page's bare stage element,
* so EVERY chip played the family base. Sixteen buttons, one sound. The page
* was measuring one thing and playing another.
*/
function play(name: string, withIntent = true) {
if (!stage) return;
void uix.events?.emit({
name: 'probe',
family: family as never,
target: stage,
...(intent !== 'neutral' ? { intent: intent as never } : {})
overrides: { sound: name as SoundName },
...(withIntent && intent !== 'neutral' ? { intent: intent as never } : {})
});
void name;
}
/** Play the three layers in sequence, so the arithmetic becomes audible. */
async function playLayers() {
if (!stage) return;
void uix.events?.emit({ name: 'probe', family: family as never, target: stage });
await new Promise((r) => setTimeout(r, 520));
play(sound, false);
await new Promise((r) => setTimeout(r, 520));
play(sound, true);
}
function playName(name: string) {

Loading…
Cancel
Save

Powered by TurnKey Linux.