claude-code-arcane 2.0.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +24 -0
- package/README.md +6 -4
- package/agents/audio/audio-director.md +90 -0
- package/agents/audio/audio-programmer.md +97 -0
- package/agents/audio/audio-qa.md +95 -0
- package/agents/audio/composer.md +88 -0
- package/agents/audio/technical-sound-designer.md +90 -0
- package/agents/audio/voice-director.md +96 -0
- package/docs/SKILLS-CATALOG.md +45 -2
- package/docs/USER-GUIDE.md +2 -2
- package/package.json +1 -1
- package/profiles/audio.yaml +45 -0
- package/profiles/second-brain.yaml +37 -0
- package/rules/gamedev/audio-code.md +45 -0
- package/rules/vault-conventions.md +144 -0
- package/skills/adaptive-music/SKILL.md +171 -0
- package/skills/adaptive-music/references/anti-patterns.md +53 -0
- package/skills/audio-audit/SKILL.md +164 -0
- package/skills/audio-audit/references/anti-patterns.md +65 -0
- package/skills/audio-audit/scripts/check_assets.py +208 -0
- package/skills/audio-bible/SKILL.md +119 -0
- package/skills/audio-bible/references/anti-patterns.md +39 -0
- package/skills/audio-mix/SKILL.md +151 -0
- package/skills/audio-mix/references/anti-patterns.md +65 -0
- package/skills/audio-spec/SKILL.md +107 -0
- package/skills/audio-spec/references/anti-patterns.md +45 -0
- package/skills/brain-dump/SKILL.md +53 -0
- package/skills/hub-note/SKILL.md +68 -0
- package/skills/middleware-integration/SKILL.md +186 -0
- package/skills/middleware-integration/references/anti-patterns.md +69 -0
- package/skills/midi-compose/SKILL.md +136 -0
- package/skills/midi-compose/references/smf-format.md +129 -0
- package/skills/midi-compose/scripts/compose_midi.py +326 -0
- package/skills/midi-compose/templates/example-composition.json +69 -0
- package/skills/music-composition/SKILL.md +106 -0
- package/skills/music-composition/references/form.md +57 -0
- package/skills/music-composition/references/game-music.md +82 -0
- package/skills/music-composition/references/harmony.md +82 -0
- package/skills/music-composition/references/melody.md +48 -0
- package/skills/music-composition/references/orchestration.md +69 -0
- package/skills/music-composition/references/rhythm-groove.md +49 -0
- package/skills/obsidian-bases/SKILL.md +85 -0
- package/skills/obsidian-bases/references/bases-syntax.md +123 -0
- package/skills/obsidian-canvas/SKILL.md +91 -0
- package/skills/obsidian-markdown/SKILL.md +110 -0
- package/skills/pdf-generator/scripts/fill_inspect.py +2 -0
- package/skills/pdf-generator/scripts/render_body.py +2 -0
- package/skills/procedural-audio/SKILL.md +157 -0
- package/skills/procedural-audio/references/anti-patterns.md +45 -0
- package/skills/review-dump/SKILL.md +108 -0
- package/skills/review-monthly/SKILL.md +56 -0
- package/skills/review-weekly/SKILL.md +91 -0
- package/skills/second-brain/SKILL.md +211 -0
- package/skills/second-brain/hooks/hooks.json +16 -0
- package/skills/second-brain/hooks/validate-note.sh +85 -0
- package/skills/second-brain/references/cross-project.md +57 -0
- package/skills/second-brain/references/templates/Atomic.md +22 -0
- package/skills/second-brain/references/templates/Daily.md +25 -0
- package/skills/second-brain/references/templates/Dashboard.base +70 -0
- package/skills/second-brain/references/templates/Dump.md +11 -0
- package/skills/second-brain/references/templates/Hub.md +22 -0
- package/skills/second-brain/references/templates/Monthly.md +29 -0
- package/skills/second-brain/references/templates/Weekly.md +29 -0
- package/skills/second-brain/references/templates/codebases.md +37 -0
- package/skills/second-brain/references/templates/hot.md +37 -0
- package/skills/second-brain/references/templates/vault-CLAUDE.md +127 -0
- package/skills/sfx-design/SKILL.md +130 -0
- package/skills/sfx-design/references/anti-patterns.md +53 -0
- package/skills/spatial-audio/SKILL.md +139 -0
- package/skills/spatial-audio/references/anti-patterns.md +53 -0
- package/skills/ui-sound-design/SKILL.md +133 -0
- package/skills/ui-sound-design/references/anti-patterns.md +57 -0
- package/skills/vault-audit/SKILL.md +72 -0
- package/skills/vault-audit/scripts/vault_audit.py +539 -0
- package/skills/vault-clip/SKILL.md +73 -0
- package/skills/vault-recall/SKILL.md +82 -0
- package/skills/vault-recall/scripts/vault_index.py +626 -0
- package/skills/vault-tidy/SKILL.md +76 -0
- package/skills/voice-pipeline/SKILL.md +150 -0
- package/skills/voice-pipeline/references/anti-patterns.md +69 -0
- package/skills/xlsx-generator/scripts/formula_check.py +2 -0
- package/skills/xlsx-generator/scripts/libreoffice_recalc.py +2 -0
- package/skills/xlsx-generator/scripts/xlsx_add_column.py +2 -0
- package/skills/xlsx-generator/scripts/xlsx_insert_row.py +2 -0
- package/skills/xlsx-generator/scripts/xlsx_reader.py +2 -0
- package/skills/zettel/SKILL.md +66 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# <NOMBRE DEL VAULT>
|
|
2
|
+
|
|
3
|
+
Vault de Obsidian usado como segundo cerebro. Este archivo es el contrato: Claude Code lo lee al inicio de cada sesión y de acá saca dónde va cada cosa. Si una convención cambia, se cambia acá primero.
|
|
4
|
+
|
|
5
|
+
## Quién soy
|
|
6
|
+
|
|
7
|
+
<Rol, en qué proyectos estoy, qué temas me interesan. Dos o tres líneas: sirve para que las síntesis tengan contexto y no sean genéricas.>
|
|
8
|
+
|
|
9
|
+
## Rutas
|
|
10
|
+
|
|
11
|
+
Contrato de rutas: los skills escriben en **roles**, y esta tabla dice qué carpeta es cada rol en este vault. Si cambiás una carpeta de lugar, se cambia acá y todo lo demás sigue funcionando.
|
|
12
|
+
|
|
13
|
+
| Rol | Ruta en este vault |
|
|
14
|
+
|---|---|
|
|
15
|
+
| `inbox` | `_inbox` |
|
|
16
|
+
| `daily` | `Reflect/Daily` |
|
|
17
|
+
| `weekly` | `Reflect/Weekly` |
|
|
18
|
+
| `monthly` | `Reflect/Monthly` |
|
|
19
|
+
| `atomic` | `03_Resources` |
|
|
20
|
+
| `hubs` | `Hubs` |
|
|
21
|
+
| `projects` | `01_Projects` |
|
|
22
|
+
| `areas` | `02_Areas` |
|
|
23
|
+
| `archive` | `04_Archive` |
|
|
24
|
+
| `templates` | `Templates` |
|
|
25
|
+
|
|
26
|
+
Y tres archivos fijos en la raíz: este `CLAUDE.md` (el contrato), `hot.md` (el caché de contexto reciente, lo reescribe `/review-dump`) y `codebases.md` (el puente a los repos, si hay código).
|
|
27
|
+
|
|
28
|
+
Un rol que este vault no usa se marca `(no usa)` en vez de borrar la fila: así queda explícito que la ausencia fue una decisión.
|
|
29
|
+
|
|
30
|
+
Los scripts reciben esto por flag: `--role hubs=Hubs --role atomic=03_Resources`.
|
|
31
|
+
|
|
32
|
+
## Estructura
|
|
33
|
+
|
|
34
|
+
| Carpeta | Qué vive acá |
|
|
35
|
+
|---|---|
|
|
36
|
+
| `_inbox/` | Captura cruda, un archivo por día (`YYYY-MM-DD dump.md`). Sin estructura, sin tags, sin pensar. El sufijo evita que el nombre choque con el del daily. |
|
|
37
|
+
| `Reflect/Daily/` | Síntesis del día (`YYYY-MM-DD.md`), la crea `/review-dump`. |
|
|
38
|
+
| `Reflect/Weekly/` | Retrospectiva semanal (`YYYY-Www.md`). |
|
|
39
|
+
| `Reflect/Monthly/` | Balance del mes (`YYYY-MM.md`). |
|
|
40
|
+
| `01_Projects/` | Algo con deadline o resultado definido. Cuando cierra, va a `04_Archive/`. |
|
|
41
|
+
| `02_Areas/` | Responsabilidad continua sin fecha de fin (salud, finanzas, un rol). |
|
|
42
|
+
| `03_Resources/` | Notas atómicas: una idea por nota, plano, sin subcarpetas. |
|
|
43
|
+
| `04_Archive/` | Cerrado. Nunca se borra nada, se archiva. |
|
|
44
|
+
| `Hubs/` | Una nota por entidad que importa: persona, herramienta, concepto, empresa. |
|
|
45
|
+
| `Bases/` | Vistas `.base`. |
|
|
46
|
+
| `Templates/` | Mis plantillas. Claude no las edita. |
|
|
47
|
+
|
|
48
|
+
## Contrato de frontmatter
|
|
49
|
+
|
|
50
|
+
Todo campo que se escriba tiene que estar acá. Un campo que no está declarado no se inventa: se propone y se agrega primero.
|
|
51
|
+
|
|
52
|
+
```yaml
|
|
53
|
+
---
|
|
54
|
+
created: YYYY-MM-DD # ISO, nunca se reescribe
|
|
55
|
+
type: daily # daily | weekly | monthly | dump | atomic | hub | project | area | clip
|
|
56
|
+
status: seed # madurez, solo en atomic, hub y clip (ver abajo)
|
|
57
|
+
tags: []
|
|
58
|
+
---
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### `status`: madurez de la nota
|
|
62
|
+
|
|
63
|
+
Solo para `atomic`, `hub` y `clip`. Las notas periódicas (`daily`, `weekly`, `monthly`, `dump`) no lo llevan: son registro, no conocimiento, y no maduran.
|
|
64
|
+
|
|
65
|
+
| Valor | Significa | Efecto |
|
|
66
|
+
|---|---|---|
|
|
67
|
+
| `seed` | Apenas plantada, incompleta a propósito | No cuenta como hueca. Si sigue `seed` a los 30 días, el audit la marca: una semilla que no crecio es la falla clasica del vault. |
|
|
68
|
+
| `provisional` | Tiene cuerpo pero no la sostendría en una discusión | Default de una nota recién escrita con contenido |
|
|
69
|
+
| `evergreen` | Dice lo que tiene que decir. Puede quedarse quieta años | **No cuenta como stale.** Es lo que distingue una nota que ya hizo su trabajo de una abandonada. |
|
|
70
|
+
| `contested` | Contradice a otra nota del vault y no está resuelto | El audit la lista para que un review la mire. La contradicción se preserva, no se resuelve sola. |
|
|
71
|
+
| `archived` | Cerrada | Fuera del alcance del audit, viva donde viva |
|
|
72
|
+
|
|
73
|
+
Sin este campo el audit no puede distinguir una nota de referencia que terminó su trabajo de un stub que nunca creció, y reporta las dos como stale.
|
|
74
|
+
|
|
75
|
+
**Los proyectos usan el mismo campo con otro vocabulario** (`activo | pausado | cerrado`): es su ciclo de vida, no su madurez. El audit solo interpreta los cinco valores de arriba, así que un `activo` le resulta inerte y el proyecto se evalúa como cualquier otra nota. Si eso te molesta, renombralo acá y el contrato manda.
|
|
76
|
+
|
|
77
|
+
Campos adicionales por tipo:
|
|
78
|
+
|
|
79
|
+
| `type` | Campos propios |
|
|
80
|
+
|---|---|
|
|
81
|
+
| `project` | `status: activo \| pausado \| cerrado`, `deadline` (opcional), `repos:` si tiene código |
|
|
82
|
+
| `clip` | `source` (URL), `author` (opcional) |
|
|
83
|
+
| `hub` | `aliases` (nombres alternativos de la entidad), `repos:` si la entidad tiene código |
|
|
84
|
+
|
|
85
|
+
`repos:` es el puente al código: la lista de repos que implementan esa entidad. Se traduce a path local en `codebases.md`. **El vault apunta, no copia:** la arquitectura vive en el repo.
|
|
86
|
+
|
|
87
|
+
## Reglas de link
|
|
88
|
+
|
|
89
|
+
- **Los links van hacia arriba, nunca hacia abajo.** Dump linkea a hubs y proyectos. Daily linkea al dump. Weekly linkea a los dailies. Monthly linkea a los weeklies. Los backlinks de Obsidian dan la dirección inversa gratis.
|
|
90
|
+
- **Ninguna nota se cierra sin al menos un `[[wikilink]]`.** Si no hay a qué linkearla, falta un hub file.
|
|
91
|
+
- `[[wikilinks]]` para lo interno, `[texto](url)` solo para URLs externas.
|
|
92
|
+
|
|
93
|
+
## Tareas
|
|
94
|
+
|
|
95
|
+
Las tareas viven en la nota a la que pertenecen, no en una lista central. Una tarea de un proyecto vive en la nota del proyecto; una que apareció en el día vive en el dump de ese día.
|
|
96
|
+
|
|
97
|
+
**Una tarea abierta no se arrastra al día siguiente.** Queda en su día marcada como cancelada (`- [-]`) y se crea de nuevo donde corresponda. No haber hecho algo un día es información.
|
|
98
|
+
|
|
99
|
+
## Qué puede hacer Claude
|
|
100
|
+
|
|
101
|
+
- Crear y editar notas, clasificar el dump, actualizar hub files, generar dailies/weeklies/monthlies, buscar en el vault, proponer links.
|
|
102
|
+
|
|
103
|
+
## Qué no puede hacer Claude
|
|
104
|
+
|
|
105
|
+
- Borrar notas (mueve a `04_Archive/`).
|
|
106
|
+
- Renombrar o mover notas sin que yo lo apruebe.
|
|
107
|
+
- Editar `Templates/` ni nada dentro de `.obsidian/`.
|
|
108
|
+
- Escribir la sección de reflexión de los reviews: los hechos los sintetiza Claude, la interpretación la escribo yo.
|
|
109
|
+
- Editar en masa: los cambios que afectan muchas notas van por `/vault-tidy` con approval.
|
|
110
|
+
|
|
111
|
+
## Plugins instalados
|
|
112
|
+
|
|
113
|
+
<Completado por `/second-brain setup` con la detección real. Lo que no está en esta lista no se usa en las notas.>
|
|
114
|
+
|
|
115
|
+
## Quién escribe qué
|
|
116
|
+
|
|
117
|
+
- **Autorado** (lo escribo yo, Claude no lo toca sin approval): dumps, notas atómicas, hubs, clips, proyectos, este archivo, y la `## Reflexión` de los reviews.
|
|
118
|
+
- **Sintetizado** (Claude lo escribe con mi OK y queda como nota): dailies, weeklies, monthlies, el `## Historial` de los hubs.
|
|
119
|
+
- **Proyectado** (Claude lo reescribe sin preguntar, es derivado y descartable): `hot.md`, `.vault-index.json`, las vistas `.base`. No los edito a mano porque se pisan.
|
|
120
|
+
|
|
121
|
+
## Uso desde otros proyectos
|
|
122
|
+
|
|
123
|
+
Otros repos pueden leer este vault. El orden de lectura es `hot.md` → búsqueda con `vault_index.py` → el hub del tema → la nota. **No se lee el vault para preguntas generales de programación**, y no se escribe en él desde otro proyecto salvo pedido explícito. Receta completa: `/second-brain link`.
|
|
124
|
+
|
|
125
|
+
## Git
|
|
126
|
+
|
|
127
|
+
Este vault es un repo git. Antes de una corrida que escribe varias notas, el árbol tiene que estar limpio: es el único undo confiable.
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sfx-design
|
|
3
|
+
description: "Diseno de efectos de sonido: capas attack/body/tail, variacion y round-robin, pitch randomization, layering de impactos, anti-repeticion. Usar para: disenar SFX, sonidos de impacto, armas, feedback de accion."
|
|
4
|
+
category: "audio"
|
|
5
|
+
argument-hint: "[sound-name | layers | variation | review]"
|
|
6
|
+
user-invocable: true
|
|
7
|
+
allowed-tools: Read, Glob, Grep, Write, Edit
|
|
8
|
+
---
|
|
9
|
+
# sfx-design — Diseño de Efectos
|
|
10
|
+
|
|
11
|
+
Diseña *cómo suena* un efecto: de qué capas se construye, cómo varía, y por qué se lee como el evento que representa.
|
|
12
|
+
|
|
13
|
+
`/audio-spec` escribe el contrato (qué lo dispara, con qué límites). Esta skill diseña el sonido.
|
|
14
|
+
|
|
15
|
+
## Cuándo usar
|
|
16
|
+
|
|
17
|
+
- Sonidos hero que merecen diseño individual: el arma principal, el golpe crítico, el skill definitivo
|
|
18
|
+
- Cuando un efecto "no se siente" y hay que diagnosticar por qué
|
|
19
|
+
- Cuando la biblioteca se escucha repetitiva y hay que resolver variación
|
|
20
|
+
- Antes de grabar o comprar assets, para saber qué buscar
|
|
21
|
+
|
|
22
|
+
## Modos
|
|
23
|
+
|
|
24
|
+
| Modo | Qué hace |
|
|
25
|
+
|---|---|
|
|
26
|
+
| `sound-name` | Diseña un efecto concreto de punta a punta |
|
|
27
|
+
| `layers` | Solo la anatomía por capas: qué banda ocupa cada una |
|
|
28
|
+
| `variation` | Solo el plan de variación: variantes, round-robin, randomización, layer swapping |
|
|
29
|
+
| `review` | Diagnostica un efecto existente contra la tabla de síntomas |
|
|
30
|
+
|
|
31
|
+
## Input
|
|
32
|
+
|
|
33
|
+
1. Leer audio bible (paleta, frequency allocation) y el spec del sonido si existe
|
|
34
|
+
2. Preguntar al usuario: qué evento representa, qué debe sentir el jugador, y si hay referencia sonora
|
|
35
|
+
3. Identificar la restricción: ¿este sonido suena una vez por partida o cien veces por minuto? Eso cambia todo
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Anatomía de un efecto
|
|
40
|
+
|
|
41
|
+
Todo efecto se lee en tres partes. Diseñarlas por separado es la diferencia entre un sonido que funciona y uno que "le falta algo":
|
|
42
|
+
|
|
43
|
+
| Capa | Duración típica | Qué comunica | Se percibe como |
|
|
44
|
+
|---|---|---|---|
|
|
45
|
+
| **Attack** | 1-20 ms | Qué material, cuánta fuerza | Impacto, precisión, "punch" |
|
|
46
|
+
| **Body** | 20-200 ms | Qué tamaño, qué objeto | Peso, escala |
|
|
47
|
+
| **Tail** | 50 ms-2 s | Dónde está, qué espacio | Ambiente, distancia, potencia |
|
|
48
|
+
|
|
49
|
+
**Diagnóstico por síntoma:**
|
|
50
|
+
|
|
51
|
+
| Síntoma | Capa culpable | Arreglo |
|
|
52
|
+
|---|---|---|
|
|
53
|
+
| "Se siente débil" | Attack sin transiente | Sumar una capa de click/crack corta y brillante |
|
|
54
|
+
| "No tiene peso" | Body sin graves | Sumar sub o cuerpo en 60-150 Hz |
|
|
55
|
+
| "Suena a sample de librería" | Tail genérico o ausente | Cola propia, o reverb del espacio real del juego |
|
|
56
|
+
| "Es confuso, no se lee" | Demasiadas capas peleando | Sacar capas hasta que se lea; casi siempre 3 alcanzan |
|
|
57
|
+
| "Se siente lento" | Attack largo | Recortar el pre-ataque; el transiente tiene que estar en los primeros ms |
|
|
58
|
+
| "Molesta después de un rato" | Energía en 2-6 kHz | Bajar; esa banda fatiga rápido |
|
|
59
|
+
|
|
60
|
+
## Layering
|
|
61
|
+
|
|
62
|
+
Construir por función, no por acumulación. Un impacto potente típico:
|
|
63
|
+
|
|
64
|
+
1. **Sub** (40-80 Hz) — peso físico. Corto, 60-120 ms. En un handheld no se va a oír: no puede ser la única fuente de fuerza
|
|
65
|
+
2. **Punch** (100-300 Hz) — el cuerpo que se percibe en cualquier speaker
|
|
66
|
+
3. **Crack** (2-5 kHz) — la definición y el material
|
|
67
|
+
4. **Tail** — el espacio
|
|
68
|
+
|
|
69
|
+
**Regla:** cada capa ocupa una banda distinta. Si dos capas pelean la misma banda, una sobra. Es el mismo principio de frequency allocation del audio bible, aplicado dentro de un solo sonido.
|
|
70
|
+
|
|
71
|
+
Cuatro capas es el techo práctico. Arriba de eso el sonido pierde legibilidad y ganás solo peso de archivo.
|
|
72
|
+
|
|
73
|
+
## Variación y anti-repetición
|
|
74
|
+
|
|
75
|
+
Un sonido sin variación se vuelve audible **como sonido** en vez de como evento. En eventos frecuentes eso pasa alrededor de los 20 minutos de juego.
|
|
76
|
+
|
|
77
|
+
Las herramientas, de más a menos efectiva:
|
|
78
|
+
|
|
79
|
+
| Técnica | Cómo | Nota |
|
|
80
|
+
|---|---|---|
|
|
81
|
+
| **Variantes reales** | 4-8 grabaciones/renders distintos | La única que varía el timbre de verdad |
|
|
82
|
+
| **Round-robin** | Recorrer variantes en orden, sin repetir la última | Le gana a random puro: random repite |
|
|
83
|
+
| **Pitch randomization** | ±2% a ±4% | ±3% es variación; ±20% cambia el objeto |
|
|
84
|
+
| **Volume randomization** | ±1 a ±2 dB | Sutil, siempre suma |
|
|
85
|
+
| **Layer swapping** | Fijar el body, rotar attack y tail | Combinatorio: 3 attacks × 3 tails = 9 sonidos con 6 assets |
|
|
86
|
+
| **Filtro aleatorio** | Cutoff ±10% | Último recurso, se nota poco |
|
|
87
|
+
|
|
88
|
+
**Layer swapping es la de mejor relación resultado/costo** y la menos usada. Con 4 attacks, 2 bodies y 3 tails tenés 24 combinaciones desde 9 archivos.
|
|
89
|
+
|
|
90
|
+
Si el evento es de altísima frecuencia y muchas dimensiones (footsteps sobre 6 superficies × 3 intensidades), la respuesta no es más variantes: es `/procedural-audio`.
|
|
91
|
+
|
|
92
|
+
## Estilización vs realismo
|
|
93
|
+
|
|
94
|
+
El sonido realista casi nunca es el sonido correcto. Un disparo real es un chasquido corto y poco impresionante; una puerta real suena a nada.
|
|
95
|
+
|
|
96
|
+
Criterio: el efecto tiene que comunicar **la función en el gameplay**, no la física. Si el arma hace 40 de daño y la otra 90, tienen que sonar distintas en peso aunque sean el mismo calibre. La legibilidad le gana al realismo siempre que compiten.
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Proceso
|
|
101
|
+
|
|
102
|
+
1. **Definir la lectura** — en una frase, qué tiene que entender el jugador al escucharlo
|
|
103
|
+
2. **Diseñar las capas** por función, con banda asignada a cada una
|
|
104
|
+
3. **Definir la variación** — cuántas variantes, qué randomización, round-robin o no
|
|
105
|
+
4. **Chequear contra el bible** — ¿respeta la paleta y la allocation de frecuencias?
|
|
106
|
+
5. **Chequear en contexto** — un sonido nunca se juzga solo: con música, ambiente y otros 10 SFX encima
|
|
107
|
+
6. **Escribir** — preguntar "¿Escribo el diseño a `<path>`?" antes de usar Write
|
|
108
|
+
|
|
109
|
+
### Chequeo en contexto
|
|
110
|
+
|
|
111
|
+
El error más caro del sound design es aprobar sonidos en aislamiento. Un efecto perfecto solo puede desaparecer en la mezcla o taparle el ataque a otro. Evaluar siempre con el resto sonando, y al volumen real de juego.
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## Verdict
|
|
116
|
+
|
|
117
|
+
- **READY** — el sonido tiene lectura definida, capas por banda, plan de variación, y se validó en contexto
|
|
118
|
+
- **CONCERNS** — está diseñado pero no se probó con el resto del mix, o la variación no alcanza para su frecuencia de uso
|
|
119
|
+
- **BLOCKED** — no está claro qué evento representa o falta la dirección del audio bible
|
|
120
|
+
|
|
121
|
+
## Anti-patterns
|
|
122
|
+
|
|
123
|
+
> → Read references/anti-patterns.md
|
|
124
|
+
|
|
125
|
+
## Next steps
|
|
126
|
+
|
|
127
|
+
- `/audio-spec` para formalizar el contrato del evento (concurrencia, cooldown, prioridad)
|
|
128
|
+
- `/procedural-audio` si el conteo de variantes se vuelve inmanejable
|
|
129
|
+
- `/audio-mix` para ubicarlo en la jerarquía de buses
|
|
130
|
+
- `/middleware-integration` para implementar el round-robin y la randomización en containers
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# SFX Design — Anti-patterns
|
|
2
|
+
|
|
3
|
+
## Aprobar en aislamiento
|
|
4
|
+
|
|
5
|
+
El error más caro. Un sonido perfecto en solo desaparece bajo música y ambiente, o le tapa el ataque a otro. Todo efecto se juzga en contexto y al volumen real de juego.
|
|
6
|
+
|
|
7
|
+
## Apilar capas hasta que "suene grande"
|
|
8
|
+
|
|
9
|
+
Ocho capas no suenan más grandes que tres: suenan barrosas. La grandeza sale de la separación de bandas y del contraste con el silencio previo, no de la cantidad. Cuatro capas es el techo práctico.
|
|
10
|
+
|
|
11
|
+
## Dos capas en la misma banda
|
|
12
|
+
|
|
13
|
+
Si el sub y el punch pelean en 80 Hz, una de las dos está de más. Cada capa, su banda.
|
|
14
|
+
|
|
15
|
+
## Depender del sub para la fuerza
|
|
16
|
+
|
|
17
|
+
En el speaker de un handheld o en earbuds baratos no hay 40 Hz. Si toda la potencia del impacto vive ahí, en la mitad de los dispositivos el sonido es un chasquido. La fuerza tiene que leerse también en 100-300 Hz.
|
|
18
|
+
|
|
19
|
+
## Pitch randomization exagerada
|
|
20
|
+
|
|
21
|
+
±20% no es variación, es otro objeto. El arma parece cambiar de calibre entre disparos. ±2-4% y round-robin.
|
|
22
|
+
|
|
23
|
+
## Random puro en vez de round-robin
|
|
24
|
+
|
|
25
|
+
Random repite: con 4 variantes, la probabilidad de escuchar la misma dos veces seguidas es 25%. Y la repetición inmediata es exactamente lo que se quería evitar. Round-robin excluyendo la última.
|
|
26
|
+
|
|
27
|
+
## Una sola variante en eventos frecuentes
|
|
28
|
+
|
|
29
|
+
Se vuelve audible como sonido a los 20 minutos. Si el evento se dispara seguido, mínimo 4 variantes o layer swapping.
|
|
30
|
+
|
|
31
|
+
## Perseguir realismo
|
|
32
|
+
|
|
33
|
+
Un disparo real es poco impresionante y una puerta real suena a nada. El efecto comunica función de gameplay, no física. Si dos armas hacen daño distinto, tienen que sonar distinto en peso.
|
|
34
|
+
|
|
35
|
+
## Attack con pre-roll
|
|
36
|
+
|
|
37
|
+
50 ms de silencio o de aire antes del transiente hacen que la acción se sienta laggeada aunque el código sea instantáneo. El transiente va en los primeros milisegundos del archivo.
|
|
38
|
+
|
|
39
|
+
## Energía gratis en 2-6 kHz
|
|
40
|
+
|
|
41
|
+
Es la banda donde el oído es más sensible y la que fatiga más rápido. Sirve para definición y para feedback de UI; usada de más en todos los SFX, el juego se vuelve cansador en sesiones largas.
|
|
42
|
+
|
|
43
|
+
## Reverb bakeado en el asset
|
|
44
|
+
|
|
45
|
+
Si la cola trae el espacio grabado, el sonido no se puede reubicar: suena a catedral dentro de un armario. La cola propia va seca y el espacio lo pone el middleware por zona.
|
|
46
|
+
|
|
47
|
+
## Tail que ignora el 3D
|
|
48
|
+
|
|
49
|
+
Una cola larga en un sonido 3D sigue sonando cuando la fuente ya se alejó, o se corta abrupto al salir del rango. Definir la atenuación considerando la cola, no solo el ataque.
|
|
50
|
+
|
|
51
|
+
## Escalar por número de variantes
|
|
52
|
+
|
|
53
|
+
20 samples × 6 superficies × 3 intensidades = 360 archivos y ~180 MB, y aun así se escucha repetición. Cuando el problema tiene varias dimensiones, la respuesta es síntesis, no más grabaciones.
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: spatial-audio
|
|
3
|
+
description: "Audio espacial: HRTF/binaural, Ambisonics, panning, curvas de atenuacion, oclusion y obstruccion, reverb por zona, y presupuesto de CPU por tecnica. Usar para: sonido 3D, audio posicional, VR audio, oclusion, decidir HRTF vs panning."
|
|
4
|
+
category: "audio"
|
|
5
|
+
argument-hint: "[decide | hrtf | ambisonics | occlusion | budget]"
|
|
6
|
+
user-invocable: true
|
|
7
|
+
allowed-tools: Read, Glob, Grep, Write, Edit
|
|
8
|
+
---
|
|
9
|
+
# spatial-audio — Audio Posicional
|
|
10
|
+
|
|
11
|
+
Decide qué técnica de espacialización usar por fuente, y presupuesta el costo. La decisión correcta casi nunca es "la mejor técnica para todo".
|
|
12
|
+
|
|
13
|
+
## Cuándo usar
|
|
14
|
+
|
|
15
|
+
- Definir la estrategia de espacialización de un juego o experiencia VR
|
|
16
|
+
- El audio 3D come demasiado CPU
|
|
17
|
+
- Las fuentes no se localizan bien, o suenan "adentro de la cabeza"
|
|
18
|
+
- Implementar oclusión y obstrucción
|
|
19
|
+
- Diseñar reverb por zona
|
|
20
|
+
|
|
21
|
+
## Input
|
|
22
|
+
|
|
23
|
+
1. Leer audio bible y el presupuesto de performance del proyecto
|
|
24
|
+
2. Determinar: ¿hay auriculares garantizados (VR) o hay que funcionar en speakers?
|
|
25
|
+
3. Contar las fuentes simultáneas esperadas por categoría
|
|
26
|
+
4. Preguntar al usuario: plataforma target más baja y fps objetivo
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Presupuesto — el número que decide todo
|
|
31
|
+
|
|
32
|
+
| Técnica | Costo |
|
|
33
|
+
|---|---|
|
|
34
|
+
| Convolución HRTF (512 taps) | **~2 ms por fuente** |
|
|
35
|
+
| Encode ambisónico | ~0.1 ms por fuente |
|
|
36
|
+
| Decode ambisónico a binaural | ~1 ms total (una vez, no por fuente) |
|
|
37
|
+
| Panning estéreo / vector-based | despreciable |
|
|
38
|
+
| Atenuación por distancia + filtro | despreciable |
|
|
39
|
+
|
|
40
|
+
**El audio entero dispone del 5-10% del frame time.** A 60 fps son 16.6 ms de frame, así que el audio tiene ~0.8-1.7 ms.
|
|
41
|
+
|
|
42
|
+
Ese número mata la idea de HRTF universal de entrada: **50 fuentes × 2 ms = 100 ms de CPU**, seis veces el frame completo. No es "costoso": es imposible.
|
|
43
|
+
|
|
44
|
+
Presupuesto realista: **3-5 fuentes con HRTF**, el resto por otras técnicas.
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Decisión por fuente
|
|
49
|
+
|
|
50
|
+
| Situación | Técnica | Por qué |
|
|
51
|
+
|---|---|---|
|
|
52
|
+
| 3-5 fuentes críticas, con auriculares | **HRTF** | Localización precisa, incluida elevación |
|
|
53
|
+
| Ambiente, campo difuso | **Ambisonics** | Costo por fuente casi nulo; un solo decode |
|
|
54
|
+
| Fuentes lejanas o poco importantes | **Panning + atenuación** | Gratis, e igual son indistinguibles |
|
|
55
|
+
| Música, UI | **2D, sin espacializar** | No tienen posición en el mundo |
|
|
56
|
+
| Diálogo del jugador / narrador | **2D o pseudo-3D** | Tiene que ser siempre inteligible |
|
|
57
|
+
| Fuentes en speakers (no auriculares) | **Panning / surround** | HRTF en speakers no funciona: asume oídos, no una sala |
|
|
58
|
+
|
|
59
|
+
**HRTF asume auriculares.** En speakers el crosstalk entre canales destruye las claves binaurales y el resultado es peor que un panning honesto. Si la plataforma no garantiza auriculares, HRTF necesita detección de ruta o queda descartado.
|
|
60
|
+
|
|
61
|
+
**Estrategia recomendada:** un presupuesto explícito de "slots HRTF" asignado por prioridad dinámica — la fuente más importante y más cercana se lleva el slot, y al alejarse lo devuelve. Todo lo demás, Ambisonics y panning.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Curvas de atenuación
|
|
66
|
+
|
|
67
|
+
La atenuación es lo que más aporta a la percepción de distancia, y es gratis. Componentes:
|
|
68
|
+
|
|
69
|
+
| Componente | Qué comunica |
|
|
70
|
+
|---|---|
|
|
71
|
+
| **Volumen por distancia** | Distancia base |
|
|
72
|
+
| **Filtro low-pass creciente** | El aire absorbe agudos: lejano = más opaco |
|
|
73
|
+
| **Reducción de spread** | Cerca es ancho, lejos es puntual |
|
|
74
|
+
| **Aumento de reverb (wet/dry)** | Lejano = más proporción de espacio |
|
|
75
|
+
|
|
76
|
+
**Los cuatro juntos** venden la distancia mucho mejor que el volumen solo. Un sonido que solo baja de volumen se percibe como "más silencioso", no como "más lejos".
|
|
77
|
+
|
|
78
|
+
Definir siempre `min distance` (dentro de la cual no atenúa) y `max distance` (fuera de la cual no suena), y la forma de la curva. Log es lo más natural para la mayoría de las fuentes; lineal sirve cuando querés control preciso del rango audible.
|
|
79
|
+
|
|
80
|
+
## Oclusión y obstrucción
|
|
81
|
+
|
|
82
|
+
Dos fenómenos distintos que se confunden seguido:
|
|
83
|
+
|
|
84
|
+
| | Qué es | Efecto |
|
|
85
|
+
|---|---|---|
|
|
86
|
+
| **Obstrucción** | Algo bloquea el camino directo, pero el sonido reflejado llega | Baja el directo, mantiene el reverb. Se oye "alrededor" |
|
|
87
|
+
| **Oclusión** | Directo y reflejado bloqueados: pared sólida | Baja los dos + low-pass fuerte |
|
|
88
|
+
|
|
89
|
+
Confundirlas produce el bug clásico: un enemigo detrás de una columna se vuelve inaudible (se aplicó oclusión donde correspondía obstrucción).
|
|
90
|
+
|
|
91
|
+
**Costo:** la parte cara no es el filtro, es el raycast. Con muchas fuentes hay que:
|
|
92
|
+
- Limitar los raycasts por frame y repartirlos entre frames
|
|
93
|
+
- Cachear el resultado y actualizar con menos frecuencia que el frame
|
|
94
|
+
- Interpolar el valor de oclusión hacia el target, nunca aplicarlo de golpe (el salto se escucha)
|
|
95
|
+
|
|
96
|
+
## Reverb por zona
|
|
97
|
+
|
|
98
|
+
- Definir zonas con un preset de reverb cada una, y **crossfade en las transiciones** — un cambio instantáneo de reverb es muy audible
|
|
99
|
+
- El envío a reverb depende de la distancia (ver curvas arriba)
|
|
100
|
+
- Las fuentes 2D (música, UI) normalmente **no** van a reverb de zona
|
|
101
|
+
- La cola del reverb tiene que seguir sonando al cambiar de zona, o se corta de forma antinatural
|
|
102
|
+
|
|
103
|
+
## VR y consideraciones específicas
|
|
104
|
+
|
|
105
|
+
- **Head tracking obligatorio:** la posición de las fuentes se actualiza con la cabeza. Latencia alta rompe la ilusión y marea
|
|
106
|
+
- **Elevación importa:** es lo que HRTF aporta y el panning no puede
|
|
107
|
+
- **Auriculares garantizados:** es el único contexto donde HRTF es la elección obvia
|
|
108
|
+
- **Presupuesto más ajustado:** 90 fps deja ~11 ms de frame, así que el audio tiene menos margen aún
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Proceso
|
|
113
|
+
|
|
114
|
+
1. **Contar fuentes** simultáneas por categoría
|
|
115
|
+
2. **Presupuestar** contra el 5-10% del frame en la plataforma más baja
|
|
116
|
+
3. **Asignar técnica por categoría**, con slots HRTF explícitos y prioridad dinámica
|
|
117
|
+
4. **Definir curvas** de atenuación con los cuatro componentes
|
|
118
|
+
5. **Definir oclusión vs obstrucción** por tipo de geometría, con presupuesto de raycasts e interpolación
|
|
119
|
+
6. **Definir zonas** de reverb y sus transiciones
|
|
120
|
+
7. **Escribir** — preguntar "¿Escribo la estrategia a `<path>`?" antes de usar Write
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Verdict
|
|
125
|
+
|
|
126
|
+
- **READY** — cada categoría tiene técnica asignada, el presupuesto cierra en la plataforma más baja, y oclusión/obstrucción están diferenciadas
|
|
127
|
+
- **CONCERNS** — la estrategia existe pero el presupuesto no se midió, o HRTF se asume sin verificar que haya auriculares
|
|
128
|
+
- **BLOCKED** — falta el conteo de fuentes simultáneas o el presupuesto de performance del proyecto
|
|
129
|
+
|
|
130
|
+
## Anti-patterns
|
|
131
|
+
|
|
132
|
+
> → Read references/anti-patterns.md
|
|
133
|
+
|
|
134
|
+
## Next steps
|
|
135
|
+
|
|
136
|
+
- `/audio-audit` para medir CPU y voice count reales en runtime
|
|
137
|
+
- `/middleware-integration` para implementar atenuaciones, oclusión y buses de reverb
|
|
138
|
+
- `/procedural-audio` si las fuentes ambiente son muchas y conviene generarlas
|
|
139
|
+
- `/audio-mix` para el reparto de buses y el ducking del diálogo
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Audio Espacial — Anti-patterns
|
|
2
|
+
|
|
3
|
+
## HRTF en todas las fuentes
|
|
4
|
+
|
|
5
|
+
50 fuentes × 2 ms = 100 ms de CPU, contra un frame de 16.6 ms a 60 fps. No es costoso: es seis veces imposible. El presupuesto real es 3-5 fuentes con HRTF y el resto por Ambisonics o panning.
|
|
6
|
+
|
|
7
|
+
## HRTF en speakers
|
|
8
|
+
|
|
9
|
+
HRTF asume auriculares. En speakers el crosstalk entre canales destruye las claves binaurales y suena peor que un panning honesto. Si no hay auriculares garantizados, hace falta detección de ruta o se descarta.
|
|
10
|
+
|
|
11
|
+
## Volumen como única clave de distancia
|
|
12
|
+
|
|
13
|
+
Un sonido que solo baja de volumen se percibe como "más silencioso", no como "más lejos". Hacen falta los cuatro componentes: volumen, low-pass creciente, spread decreciente y más reverb.
|
|
14
|
+
|
|
15
|
+
## Confundir oclusión con obstrucción
|
|
16
|
+
|
|
17
|
+
Aplicar oclusión total donde había obstrucción hace que un enemigo detrás de una columna sea inaudible. Obstrucción baja el directo y mantiene el reflejado; oclusión baja los dos.
|
|
18
|
+
|
|
19
|
+
## Raycasts sin presupuesto
|
|
20
|
+
|
|
21
|
+
La parte cara de la oclusión es el raycast, no el filtro. Con 30 fuentes haciendo raycast por frame el costo se dispara. Limitar, repartir entre frames, cachear.
|
|
22
|
+
|
|
23
|
+
## Oclusión sin interpolar
|
|
24
|
+
|
|
25
|
+
Aplicar el valor de golpe produce un salto muy audible cada vez que el jugador cruza el borde de una geometría. Interpolar siempre hacia el target.
|
|
26
|
+
|
|
27
|
+
## Curvas sin min/max distance
|
|
28
|
+
|
|
29
|
+
Dejar el default del middleware produce sonidos audibles a 200 m o que desaparecen a 3 m. Los dos valores y la forma de la curva son parte del spec.
|
|
30
|
+
|
|
31
|
+
## Reverb de zona con cambio instantáneo
|
|
32
|
+
|
|
33
|
+
El salto de preset se escucha como un corte. Crossfade en la transición, y dejar que la cola anterior termine.
|
|
34
|
+
|
|
35
|
+
## Música y UI espacializadas
|
|
36
|
+
|
|
37
|
+
No tienen posición en el mundo. Espacializarlas produce paneos raros y costo inútil.
|
|
38
|
+
|
|
39
|
+
## Diálogo tratado como una fuente 3D más
|
|
40
|
+
|
|
41
|
+
Si el diálogo importante se ocluye y se atenúa como cualquier SFX, el jugador pierde información. Suele necesitar un tratamiento pseudo-3D: dirección sí, oclusión no.
|
|
42
|
+
|
|
43
|
+
## Presupuestar contra la plataforma más alta
|
|
44
|
+
|
|
45
|
+
El modelo entra en PC y no en el target más bajo. El presupuesto se hace contra el piso, no contra el techo.
|
|
46
|
+
|
|
47
|
+
## Ambisonics para fuentes puntuales importantes
|
|
48
|
+
|
|
49
|
+
Ambisonics brilla en campo difuso y ambiente. Para la fuente crítica que el jugador tiene que localizar con precisión, no reemplaza a HRTF.
|
|
50
|
+
|
|
51
|
+
## Ignorar el presupuesto más ajustado de VR
|
|
52
|
+
|
|
53
|
+
90 fps deja ~11 ms de frame. Un plan de espacialización calculado para 60 fps no entra.
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ui-sound-design
|
|
3
|
+
description: "Sonido de interfaz y feedback: duraciones y niveles por tipo de evento, jerarquia de feedback, coordinacion con haptics, respeto del volumen del sistema, accesibilidad. Usar para: sonidos de UI, feedback de menu, notificaciones, sonido de app."
|
|
4
|
+
category: "audio"
|
|
5
|
+
argument-hint: "[set | event-name | review | haptics]"
|
|
6
|
+
user-invocable: true
|
|
7
|
+
allowed-tools: Read, Glob, Grep, Write, Edit
|
|
8
|
+
---
|
|
9
|
+
# ui-sound-design — Feedback de Interfaz
|
|
10
|
+
|
|
11
|
+
Diseña el sonido que confirma acciones. Es el audio que el usuario escucha más veces y el que más rápido se vuelve molesto si está mal calibrado.
|
|
12
|
+
|
|
13
|
+
## Cuándo usar
|
|
14
|
+
|
|
15
|
+
- Definir el set de sonidos de UI de un juego o una app
|
|
16
|
+
- El feedback se siente molesto, invasivo o inconsistente
|
|
17
|
+
- Falta jerarquía: todo suena igual de importante
|
|
18
|
+
- Coordinar audio con haptics
|
|
19
|
+
|
|
20
|
+
## Input
|
|
21
|
+
|
|
22
|
+
1. Leer audio bible (paleta, frequency allocation, mix hierarchy)
|
|
23
|
+
2. Listar los eventos de UI reales de la interfaz
|
|
24
|
+
3. Preguntar al usuario: plataforma (desktop / consola / móvil), si hay haptics, y si el juego se juega en sesiones largas
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Especificaciones por tipo
|
|
29
|
+
|
|
30
|
+
Estos rangos son el punto de partida calibrado. Salirse de ellos requiere razón.
|
|
31
|
+
|
|
32
|
+
| Tipo | Duración | Carácter | Nivel |
|
|
33
|
+
|---|---|---|---|
|
|
34
|
+
| **Tap / hover** | 30-80 ms | Click suave, alta frecuencia | −24 dB |
|
|
35
|
+
| **Confirmación** | 80-150 ms | Transiente definido, neutro | −21 dB |
|
|
36
|
+
| **Éxito** | 150-300 ms | Tono ascendente, positivo | −18 dB |
|
|
37
|
+
| **Error** | 200-400 ms | Descendente, menor | −18 dB |
|
|
38
|
+
| **Notificación** | 300-800 ms | Distintivo, llama atención | −18 dB |
|
|
39
|
+
| **Transición / navegación** | 100-250 ms | Movimiento sutil | −24 dB |
|
|
40
|
+
| **Toggle** | 40-100 ms | Dos estados distinguibles | −24 dB |
|
|
41
|
+
|
|
42
|
+
**El nivel es lo que más se equivoca.** Los sonidos de UI van entre **−18 y −24 dB** relativos al material de gameplay. Un click a −3 dB compite con la acción del juego y agota en minutos.
|
|
43
|
+
|
|
44
|
+
Regla de proporcionalidad: **el nivel y la duración son proporcionales a la importancia del evento**. Un hover es lo más corto y lo más bajo. Un error de transacción es lo más largo y lo más alto. Si el hover y el error suenan parecido, no hay jerarquía.
|
|
45
|
+
|
|
46
|
+
## Frecuencia y fatiga
|
|
47
|
+
|
|
48
|
+
El feedback de UI vive en **2-6 kHz**: es donde el oído es más sensible, así que un sonido bajo se lee claro sin volumen. Es también la banda que **más rápido fatiga**.
|
|
49
|
+
|
|
50
|
+
Consecuencias de diseño:
|
|
51
|
+
|
|
52
|
+
- Transientes cortos, no tonos sostenidos: la energía breve informa sin cansar
|
|
53
|
+
- En un juego de sesiones largas, correr el feedback hacia abajo (1-3 kHz) reduce la fatiga a costa de algo de claridad
|
|
54
|
+
- Si el juego tiene mucha percusión brillante o hi-hats, el UI compite: bajar el UI no alcanza, hay que hacerle lugar en el arreglo (ver `/audio-mix`)
|
|
55
|
+
|
|
56
|
+
## Jerarquía
|
|
57
|
+
|
|
58
|
+
Tres niveles, y cada evento cae en uno:
|
|
59
|
+
|
|
60
|
+
| Nivel | Qué entra | Puede interrumpir |
|
|
61
|
+
|---|---|---|
|
|
62
|
+
| **Ambiental** | Hover, navegación, toggle | Nada. Se pierde y no importa |
|
|
63
|
+
| **Confirmatorio** | Tap, confirmación, éxito | Nada, pero no se debe perder |
|
|
64
|
+
| **Crítico** | Error, alerta, timeout | Duckea el resto |
|
|
65
|
+
|
|
66
|
+
Solo el nivel crítico duckea. Si los tres duckean, la música desaparece cada vez que el usuario navega un menú.
|
|
67
|
+
|
|
68
|
+
## Haptics
|
|
69
|
+
|
|
70
|
+
Cuando hay haptics, audio y vibración son **un solo evento percibido**. Reglas:
|
|
71
|
+
|
|
72
|
+
- **Sincronía dura:** un desfasaje mayor a ~30 ms se percibe como dos eventos separados
|
|
73
|
+
- **No duplicar la información:** si el haptic ya comunica la intensidad, el audio no necesita subir de nivel
|
|
74
|
+
- **Complementariedad de banda:** el haptic cubre lo que el speaker chico no puede dar (el sub). Diseñar el audio sin depender del grave si hay haptic
|
|
75
|
+
- **Respetar el ajuste del usuario:** haptics desactivado no debe dejar el evento sin feedback
|
|
76
|
+
|
|
77
|
+
## Plataforma
|
|
78
|
+
|
|
79
|
+
### Móvil — sesiones de audio
|
|
80
|
+
|
|
81
|
+
Ignorar la sesión de audio es el bug más común de audio en móvil: la app pierde el audio en una llamada y no lo recupera nunca.
|
|
82
|
+
|
|
83
|
+
| iOS `AVAudioSession` | Comportamiento |
|
|
84
|
+
|---|---|
|
|
85
|
+
| `.ambient` | Se mezcla con otro audio; el switch de silencio lo silencia |
|
|
86
|
+
| `.playback` | Interrumpe otro audio; ignora el switch de silencio |
|
|
87
|
+
| `.playAndRecord` | Para apps con voz |
|
|
88
|
+
| `.soloAmbient` | Default; silencia otro audio |
|
|
89
|
+
|
|
90
|
+
En Android el equivalente es AudioFocus. En los dos casos hay que manejar **interrupciones** (llamada, alarma) y **cambios de ruta** (auriculares conectados/desconectados).
|
|
91
|
+
|
|
92
|
+
**Un juego que suena en background o que ignora el switch de silencio es un rechazo de store esperando pasar.** Para un juego, `.ambient` o `.soloAmbient` según si querés dejar que el usuario escuche su música.
|
|
93
|
+
|
|
94
|
+
### Respetar el volumen del sistema
|
|
95
|
+
|
|
96
|
+
Nunca normalizar por encima del volumen del sistema ni forzar un mínimo. Si el usuario bajó el volumen, bajó el volumen.
|
|
97
|
+
|
|
98
|
+
## Accesibilidad
|
|
99
|
+
|
|
100
|
+
- El sonido de UI **nunca puede ser el único canal** de información crítica: siempre acompañado de señal visual
|
|
101
|
+
- Éxito y error tienen que distinguirse por **contorno melódico** (ascendente vs descendente), no solo por timbre — es lo que sobrevive a pérdida de agudos
|
|
102
|
+
- Ofrecer control de volumen de UI separado de música y SFX
|
|
103
|
+
- Los sonidos repetitivos de navegación tienen que poder desactivarse sin perder el feedback crítico
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Proceso
|
|
108
|
+
|
|
109
|
+
1. **Listar los eventos** de UI reales y asignar cada uno a un nivel de jerarquía
|
|
110
|
+
2. **Especificar** duración, carácter y nivel por evento, contra la tabla de referencia
|
|
111
|
+
3. **Verificar la jerarquía** — hover y crítico tienen que ser inconfundibles
|
|
112
|
+
4. **Definir haptics** si aplica, con sincronía y reparto de banda
|
|
113
|
+
5. **Definir el manejo de sesión** en móvil
|
|
114
|
+
6. **Chequear accesibilidad** — contorno melódico, canal redundante, controles separados
|
|
115
|
+
7. **Escribir** — preguntar "¿Escribo el set a `<path>`?" antes de usar Write
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## Verdict
|
|
120
|
+
|
|
121
|
+
- **READY** — cada evento tiene nivel, duración y jerarquía; la accesibilidad está cubierta; en móvil la sesión de audio está definida
|
|
122
|
+
- **CONCERNS** — el set existe pero no hay jerarquía diferenciada, o el nivel está por encima de −18 dB, o falta el manejo de interrupciones
|
|
123
|
+
- **BLOCKED** — no está definida la lista de eventos de UI o falta la dirección del audio bible
|
|
124
|
+
|
|
125
|
+
## Anti-patterns
|
|
126
|
+
|
|
127
|
+
> → Read references/anti-patterns.md
|
|
128
|
+
|
|
129
|
+
## Next steps
|
|
130
|
+
|
|
131
|
+
- `/audio-mix` para el bus de UI y el ducking del nivel crítico
|
|
132
|
+
- `/audio-spec` para formalizar cooldowns (navegación rápida spamea el evento)
|
|
133
|
+
- `/audio-audit` para verificar niveles medidos contra los especificados
|