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.
Files changed (86) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +6 -4
  3. package/agents/audio/audio-director.md +90 -0
  4. package/agents/audio/audio-programmer.md +97 -0
  5. package/agents/audio/audio-qa.md +95 -0
  6. package/agents/audio/composer.md +88 -0
  7. package/agents/audio/technical-sound-designer.md +90 -0
  8. package/agents/audio/voice-director.md +96 -0
  9. package/docs/SKILLS-CATALOG.md +45 -2
  10. package/docs/USER-GUIDE.md +2 -2
  11. package/package.json +1 -1
  12. package/profiles/audio.yaml +45 -0
  13. package/profiles/second-brain.yaml +37 -0
  14. package/rules/gamedev/audio-code.md +45 -0
  15. package/rules/vault-conventions.md +144 -0
  16. package/skills/adaptive-music/SKILL.md +171 -0
  17. package/skills/adaptive-music/references/anti-patterns.md +53 -0
  18. package/skills/audio-audit/SKILL.md +164 -0
  19. package/skills/audio-audit/references/anti-patterns.md +65 -0
  20. package/skills/audio-audit/scripts/check_assets.py +208 -0
  21. package/skills/audio-bible/SKILL.md +119 -0
  22. package/skills/audio-bible/references/anti-patterns.md +39 -0
  23. package/skills/audio-mix/SKILL.md +151 -0
  24. package/skills/audio-mix/references/anti-patterns.md +65 -0
  25. package/skills/audio-spec/SKILL.md +107 -0
  26. package/skills/audio-spec/references/anti-patterns.md +45 -0
  27. package/skills/brain-dump/SKILL.md +53 -0
  28. package/skills/hub-note/SKILL.md +68 -0
  29. package/skills/middleware-integration/SKILL.md +186 -0
  30. package/skills/middleware-integration/references/anti-patterns.md +69 -0
  31. package/skills/midi-compose/SKILL.md +136 -0
  32. package/skills/midi-compose/references/smf-format.md +129 -0
  33. package/skills/midi-compose/scripts/compose_midi.py +326 -0
  34. package/skills/midi-compose/templates/example-composition.json +69 -0
  35. package/skills/music-composition/SKILL.md +106 -0
  36. package/skills/music-composition/references/form.md +57 -0
  37. package/skills/music-composition/references/game-music.md +82 -0
  38. package/skills/music-composition/references/harmony.md +82 -0
  39. package/skills/music-composition/references/melody.md +48 -0
  40. package/skills/music-composition/references/orchestration.md +69 -0
  41. package/skills/music-composition/references/rhythm-groove.md +49 -0
  42. package/skills/obsidian-bases/SKILL.md +85 -0
  43. package/skills/obsidian-bases/references/bases-syntax.md +123 -0
  44. package/skills/obsidian-canvas/SKILL.md +91 -0
  45. package/skills/obsidian-markdown/SKILL.md +110 -0
  46. package/skills/pdf-generator/scripts/fill_inspect.py +2 -0
  47. package/skills/pdf-generator/scripts/render_body.py +2 -0
  48. package/skills/procedural-audio/SKILL.md +157 -0
  49. package/skills/procedural-audio/references/anti-patterns.md +45 -0
  50. package/skills/review-dump/SKILL.md +108 -0
  51. package/skills/review-monthly/SKILL.md +56 -0
  52. package/skills/review-weekly/SKILL.md +91 -0
  53. package/skills/second-brain/SKILL.md +211 -0
  54. package/skills/second-brain/hooks/hooks.json +16 -0
  55. package/skills/second-brain/hooks/validate-note.sh +85 -0
  56. package/skills/second-brain/references/cross-project.md +57 -0
  57. package/skills/second-brain/references/templates/Atomic.md +22 -0
  58. package/skills/second-brain/references/templates/Daily.md +25 -0
  59. package/skills/second-brain/references/templates/Dashboard.base +70 -0
  60. package/skills/second-brain/references/templates/Dump.md +11 -0
  61. package/skills/second-brain/references/templates/Hub.md +22 -0
  62. package/skills/second-brain/references/templates/Monthly.md +29 -0
  63. package/skills/second-brain/references/templates/Weekly.md +29 -0
  64. package/skills/second-brain/references/templates/codebases.md +37 -0
  65. package/skills/second-brain/references/templates/hot.md +37 -0
  66. package/skills/second-brain/references/templates/vault-CLAUDE.md +127 -0
  67. package/skills/sfx-design/SKILL.md +130 -0
  68. package/skills/sfx-design/references/anti-patterns.md +53 -0
  69. package/skills/spatial-audio/SKILL.md +139 -0
  70. package/skills/spatial-audio/references/anti-patterns.md +53 -0
  71. package/skills/ui-sound-design/SKILL.md +133 -0
  72. package/skills/ui-sound-design/references/anti-patterns.md +57 -0
  73. package/skills/vault-audit/SKILL.md +72 -0
  74. package/skills/vault-audit/scripts/vault_audit.py +539 -0
  75. package/skills/vault-clip/SKILL.md +73 -0
  76. package/skills/vault-recall/SKILL.md +82 -0
  77. package/skills/vault-recall/scripts/vault_index.py +626 -0
  78. package/skills/vault-tidy/SKILL.md +76 -0
  79. package/skills/voice-pipeline/SKILL.md +150 -0
  80. package/skills/voice-pipeline/references/anti-patterns.md +69 -0
  81. package/skills/xlsx-generator/scripts/formula_check.py +2 -0
  82. package/skills/xlsx-generator/scripts/libreoffice_recalc.py +2 -0
  83. package/skills/xlsx-generator/scripts/xlsx_add_column.py +2 -0
  84. package/skills/xlsx-generator/scripts/xlsx_insert_row.py +2 -0
  85. package/skills/xlsx-generator/scripts/xlsx_reader.py +2 -0
  86. 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