claude-code-arcane 2.1.0 → 2.3.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 +29 -0
- package/README.md +57 -55
- 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/agents/career/career-strategist.md +88 -0
- package/agents/career/cv-reviewer.md +81 -0
- package/agents/career/hiring-manager.md +68 -0
- package/agents/career/mock-interviewer.md +76 -0
- package/agents/freelance/client-screener.md +84 -0
- package/agents/freelance/discovery-call.md +65 -0
- package/agents/freelance/pipeline-strategist.md +99 -0
- package/agents/freelance/proposal-reviewer.md +82 -0
- package/dist/cli.js +52 -13
- package/docs/RELEASE-SETUP.md +1 -1
- package/docs/SKILLS-CATALOG.md +47 -3
- package/docs/USER-GUIDE.md +77 -72
- package/docs/agent-hierarchy.md +21 -1
- package/docs/presentations/build_arcane_deck.py +2 -2
- package/docs/presentations/build_arcane_deck_12.py +2 -2
- package/package.json +2 -2
- package/profiles/audio.yaml +45 -0
- package/profiles/freelance.yaml +43 -0
- package/profiles/job-hunt.yaml +5 -2
- package/rules/drafter-reviewer.md +16 -3
- package/rules/freelance-guardrails.md +53 -0
- package/rules/gamedev/audio-code.md +45 -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/career-registry/SKILL.md +95 -0
- package/skills/career-registry/scripts/career_registry.py +488 -0
- package/skills/client-screen/SKILL.md +83 -0
- package/skills/client-screen/references/red-flags.md +95 -0
- package/skills/cover-letter/SKILL.md +4 -3
- package/skills/cv-tailor/SKILL.md +11 -2
- package/skills/freelance-deliver/SKILL.md +90 -0
- package/skills/freelance-hunt/SKILL.md +126 -0
- package/skills/freelance-hunt/references/templates/Connects.md +39 -0
- package/skills/freelance-hunt/references/templates/Contrato.md +60 -0
- package/skills/freelance-hunt/references/templates/Propuesta.md +66 -0
- package/skills/freelance-kickoff/SKILL.md +94 -0
- package/skills/freelance-pipeline/SKILL.md +109 -0
- package/skills/freelance-pipeline/scripts/import_history.py +425 -0
- package/skills/freelance-profile/SKILL.md +93 -0
- package/skills/freelance-proposal/SKILL.md +112 -0
- package/skills/freelance-scan/SKILL.md +196 -0
- package/skills/freelance-scan/references/dedup.md +35 -0
- package/skills/freelance-scan/references/platforms.md +167 -0
- package/skills/freelance-scan/scripts/freelance_search.py +1077 -0
- package/skills/interview-prep/SKILL.md +11 -3
- package/skills/job-aplicar/SKILL.md +5 -1
- package/skills/job-hunt/SKILL.md +17 -0
- package/skills/job-outcome/SKILL.md +15 -1
- package/skills/job-upskill/SKILL.md +10 -2
- 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/procedural-audio/SKILL.md +157 -0
- package/skills/procedural-audio/references/anti-patterns.md +45 -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/voice-pipeline/SKILL.md +150 -0
- package/skills/voice-pipeline/references/anti-patterns.md +69 -0
|
@@ -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
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# UI Sound Design — Anti-patterns
|
|
2
|
+
|
|
3
|
+
## Sonidos de UI al nivel del gameplay
|
|
4
|
+
|
|
5
|
+
Un click a −3 dB compite con la acción del juego y agota en minutos. El UI va entre −18 y −24 dB. Es el error más frecuente y el más fácil de arreglar.
|
|
6
|
+
|
|
7
|
+
## Todo al mismo nivel
|
|
8
|
+
|
|
9
|
+
Si el hover y el error de transacción suenan igual de importantes, no hay jerarquía y el usuario deja de prestar atención a los dos. Nivel y duración proporcionales a la importancia del evento.
|
|
10
|
+
|
|
11
|
+
## Todo duckea
|
|
12
|
+
|
|
13
|
+
Si cada navegación de menú baja la música, la música desaparece. Solo el nivel crítico duckea.
|
|
14
|
+
|
|
15
|
+
## Sin cooldown en navegación
|
|
16
|
+
|
|
17
|
+
Recorrer un menú rápido con el stick dispara el mismo tick veinte veces en 300 ms. Suena a glitch. Cooldown mínimo en todo evento de navegación.
|
|
18
|
+
|
|
19
|
+
## Tonos sostenidos en 2-6 kHz
|
|
20
|
+
|
|
21
|
+
Es la banda más sensible del oído y la que más fatiga. Un tono sostenido ahí cansa en una sesión. Transientes cortos.
|
|
22
|
+
|
|
23
|
+
## Ignorar la sesión de audio en móvil
|
|
24
|
+
|
|
25
|
+
Entra una llamada, la app pierde el audio y no lo recupera. O el juego suena con el switch de silencio activado. Los dos son rechazo de store. Manejar interrupciones y cambios de ruta explícitamente.
|
|
26
|
+
|
|
27
|
+
## Forzar volumen por encima del sistema
|
|
28
|
+
|
|
29
|
+
Normalizar hacia arriba o imponer un piso de volumen ignora una decisión explícita del usuario. Nunca.
|
|
30
|
+
|
|
31
|
+
## Éxito y error que solo se distinguen por timbre
|
|
32
|
+
|
|
33
|
+
Con pérdida de agudos, en un speaker malo o con el volumen bajo, los dos suenan igual. La diferencia tiene que estar en el contorno: ascendente para éxito, descendente para error.
|
|
34
|
+
|
|
35
|
+
## Audio como único canal de información crítica
|
|
36
|
+
|
|
37
|
+
Un usuario con hipoacusia, con el sonido apagado o en un lugar ruidoso pierde la información. Siempre acompañado de señal visual.
|
|
38
|
+
|
|
39
|
+
## Haptic y audio desfasados
|
|
40
|
+
|
|
41
|
+
Arriba de ~30 ms se perciben como dos eventos y se siente roto. Y si el haptic está desactivado, el evento no puede quedarse sin ningún feedback.
|
|
42
|
+
|
|
43
|
+
## Duplicar información entre audio y haptic
|
|
44
|
+
|
|
45
|
+
Si el haptic ya comunica intensidad, subir el audio para "reforzar" solo agrega molestia.
|
|
46
|
+
|
|
47
|
+
## Depender del grave en dispositivos chicos
|
|
48
|
+
|
|
49
|
+
Un sonido de UI cuyo peso vive en 80 Hz no existe en el speaker de un teléfono. Con haptics, el grave es trabajo del haptic; sin haptics, el sonido tiene que leerse en medios.
|
|
50
|
+
|
|
51
|
+
## Un set sin toggle
|
|
52
|
+
|
|
53
|
+
Los sonidos de navegación repetitivos tienen que poder apagarse, y apagarlos no debe silenciar los críticos. Controles de volumen separados de música y SFX.
|
|
54
|
+
|
|
55
|
+
## Diseñar el set sin probar navegación real
|
|
56
|
+
|
|
57
|
+
Un sonido aprobado clic por clic se vuelve insoportable cuando el usuario recorre seis pantallas en cuatro segundos. Probar con flujos reales, a velocidad real.
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: voice-pipeline
|
|
3
|
+
description: "Pipeline de voz: script de VO, casting, sesiones de grabacion, naming y batch processing, localizacion, lipsync y barks. Usar para: dialogo grabado, voice over, doblaje, localizacion de voz, gestion de assets de VO."
|
|
4
|
+
category: "audio"
|
|
5
|
+
argument-hint: "[script | casting | naming | loc | barks]"
|
|
6
|
+
user-invocable: true
|
|
7
|
+
allowed-tools: Read, Glob, Grep, Write, Edit
|
|
8
|
+
---
|
|
9
|
+
# voice-pipeline — Voz y Localización
|
|
10
|
+
|
|
11
|
+
Gestiona el ciclo completo de voz grabada: del script al asset integrado y localizado.
|
|
12
|
+
|
|
13
|
+
La voz es el área de audio donde los errores son **más caros**: rehacer una sesión de grabación cuesta dinero y agenda de actores, y un error de naming multiplicado por 12 idiomas es inmanejable a mano.
|
|
14
|
+
|
|
15
|
+
## Cuándo usar
|
|
16
|
+
|
|
17
|
+
- Preparar un script de VO para grabación
|
|
18
|
+
- Definir naming y estructura antes de recibir assets
|
|
19
|
+
- Planificar localización a varios idiomas
|
|
20
|
+
- Gestionar barks (chatter de combate) y su variación
|
|
21
|
+
- El pipeline de VO se desordenó y hay que reorganizarlo
|
|
22
|
+
|
|
23
|
+
## Input
|
|
24
|
+
|
|
25
|
+
1. Leer audio bible (dirección de voz si existe) y el guion narrativo
|
|
26
|
+
2. Determinar: cuántos idiomas, cuántos personajes, si hay lipsync
|
|
27
|
+
3. Preguntar al usuario: presupuesto de grabación, si hay actores ya contratados, y plataforma de destino
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Naming — la decisión más importante
|
|
32
|
+
|
|
33
|
+
**El naming se define antes de grabar una sola línea.** Renombrar 4.000 archivos × 12 idiomas después no es una tarea, es un proyecto.
|
|
34
|
+
|
|
35
|
+
Patrón recomendado:
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
vo_<personaje>_<contexto>_<id>_<variante>
|
|
39
|
+
vo_kira_combat_taunt_003_a
|
|
40
|
+
vo_kira_story_ch02_017
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**Requisitos del patrón:**
|
|
44
|
+
- **ID estable y único** — nunca se reusa, ni si la línea se corta. Los huecos son gratis; renumerar no
|
|
45
|
+
- **Sin espacios ni acentos** — sobrevive a cualquier filesystem y a batch scripts
|
|
46
|
+
- **El idioma NO va en el nombre del archivo** — va en la ruta o en el bank de idioma. Así el mismo nombre resuelve en cualquier locale
|
|
47
|
+
- **Ordenable alfabéticamente** en el orden en que se usa
|
|
48
|
+
- **Longitud acotada** — algunas plataformas tienen límites de path
|
|
49
|
+
|
|
50
|
+
El ID es la llave que une script, sesión de grabación, asset, subtítulo y traducción. Si cambia en algún punto, el vínculo se rompe.
|
|
51
|
+
|
|
52
|
+
## Script de VO
|
|
53
|
+
|
|
54
|
+
Lo que el actor y el director necesitan por línea:
|
|
55
|
+
|
|
56
|
+
| Campo | Por qué |
|
|
57
|
+
|---|---|
|
|
58
|
+
| **ID** | La llave de todo el pipeline |
|
|
59
|
+
| **Personaje** | |
|
|
60
|
+
| **Texto** | Exacto, es lo que se graba y se subtitula |
|
|
61
|
+
| **Contexto** | Qué pasó antes; sin esto la actuación es a ciegas |
|
|
62
|
+
| **Dirección** | Emoción, intensidad, a quién le habla |
|
|
63
|
+
| **Restricción de duración** | Si tiene que calzar en una animación o un hueco de gameplay |
|
|
64
|
+
| **Tomas pedidas** | Cuántas variantes de intención |
|
|
65
|
+
|
|
66
|
+
**El contexto es lo que más se omite y lo que más arruina sesiones.** Un actor grabando líneas sueltas en orden alfabético, sin saber a quién le habla ni qué acaba de pasar, entrega material que no sirve y hay que volver a convocarlo.
|
|
67
|
+
|
|
68
|
+
**Orden de grabación:** por personaje y por escena, no por ID. Agrupar además por intensidad emocional — dejar los gritos para el final de la sesión, porque desgastan la voz y arruinan lo que venga después.
|
|
69
|
+
|
|
70
|
+
## Casting
|
|
71
|
+
|
|
72
|
+
- **Rango, no solo timbre** — el personaje que grita en el acto tres necesita un actor que pueda gritar sin perder la voz
|
|
73
|
+
- **Distinguibilidad** — dos personajes que suenan parecido confunden en un juego donde el jugador no siempre ve quién habla. Test: escuchar sin ver
|
|
74
|
+
- **Disponibilidad para pickups** — siempre hay pickups. Un actor imposible de reconvocar es un riesgo de producción
|
|
75
|
+
- **Consistencia entre idiomas** — el casting de localización debería mantener el *rol tímbrico*, no imitar al actor original
|
|
76
|
+
|
|
77
|
+
## Barks
|
|
78
|
+
|
|
79
|
+
El chatter de combate tiene reglas propias porque se escucha muchísimo:
|
|
80
|
+
|
|
81
|
+
- **Muchas variantes por intención** — mínimo 5-8 por tipo. Un bark repetido es lo primero que el jugador nota
|
|
82
|
+
- **Cortos** — 0.5 a 2 s. Un bark largo se pisa con el gameplay
|
|
83
|
+
- **Cooldown global por personaje y por tipo** — dos enemigos gritando lo mismo a la vez suena a bug
|
|
84
|
+
- **Prioridad baja** — un bark nunca debe tapar diálogo narrativo ni feedback del jugador
|
|
85
|
+
- **Bus separado** de `Dialogue` para que no duckeen la música (ver `/audio-mix`)
|
|
86
|
+
- **Interrumpibles** — si el personaje muere a mitad del bark, se corta
|
|
87
|
+
|
|
88
|
+
## Localización
|
|
89
|
+
|
|
90
|
+
| Decisión | Recomendación |
|
|
91
|
+
|---|---|
|
|
92
|
+
| Estructura | Un bank o carpeta por idioma, mismos nombres de archivo adentro |
|
|
93
|
+
| Idioma en runtime | Se resuelve cargando el bank del locale, sin lógica en gameplay |
|
|
94
|
+
| Fallback | Idioma base si falta el asset — nunca silencio |
|
|
95
|
+
| Expansión de texto | El alemán y el español crecen 20-35% sobre el inglés: los huecos de tiempo tienen que tolerarlo |
|
|
96
|
+
| Subtítulos | Mismo ID que el audio. Un ID sin subtítulo es un bug de accesibilidad |
|
|
97
|
+
| Sin doblar | Idiomas con subtítulo solo: definir explícitamente cuáles y que la mezcla lo contemple |
|
|
98
|
+
|
|
99
|
+
**La expansión de texto es el problema práctico más común.** Una línea que calza justo en inglés se pasa 30% en alemán, y si hay una animación fija o un hueco de gameplay, no entra. Presupuestar el hueco contra el idioma más largo del target, no contra el inglés.
|
|
100
|
+
|
|
101
|
+
## Procesamiento por lotes
|
|
102
|
+
|
|
103
|
+
El VO llega en crudo y necesita el mismo tratamiento en miles de archivos. Lo que debe ser automatizado, no manual:
|
|
104
|
+
|
|
105
|
+
1. **Recorte de silencios** con umbral consistente
|
|
106
|
+
2. **Normalización de loudness** a un target común
|
|
107
|
+
3. **De-noise / de-click** si la fuente lo pide
|
|
108
|
+
4. **Fades** de entrada y salida cortos
|
|
109
|
+
5. **Verificación**: sample rate, bit depth, canales, duración vs restricción
|
|
110
|
+
6. **Reporte** de los que no cumplen
|
|
111
|
+
|
|
112
|
+
El paso 5 y 6 son los que hay que exigir: sin verificación automática, los assets que no cumplen se descubren en integración.
|
|
113
|
+
|
|
114
|
+
## Lipsync
|
|
115
|
+
|
|
116
|
+
- **Basado en fonemas** (extraído del audio o del texto) o **basado en amplitud** (más barato, mucho peor)
|
|
117
|
+
- Si hay lipsync, el **texto tiene que coincidir exactamente** con lo grabado — una improvisación del actor rompe la sincronía
|
|
118
|
+
- La localización necesita lipsync regenerado por idioma, o aceptar el desfasaje explícitamente
|
|
119
|
+
- Los pickups tienen que regenerar el lipsync de la línea afectada
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Proceso
|
|
124
|
+
|
|
125
|
+
1. **Definir el naming** y congelarlo. Este paso primero, sin excepción
|
|
126
|
+
2. **Armar el script** con contexto y dirección por línea
|
|
127
|
+
3. **Planificar las sesiones** por personaje/escena, con los gritos al final
|
|
128
|
+
4. **Definir la estructura** de localización y el fallback
|
|
129
|
+
5. **Definir el pipeline** de batch con su paso de verificación
|
|
130
|
+
6. **Definir barks** con variantes, cooldown y bus
|
|
131
|
+
7. **Escribir** — preguntar "¿Escribo el pipeline a `<path>`?" antes de usar Write
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Verdict
|
|
136
|
+
|
|
137
|
+
- **READY** — naming congelado, script con contexto y dirección, estructura de localización con fallback, pipeline de batch con verificación automática
|
|
138
|
+
- **CONCERNS** — el pipeline existe pero el script no tiene contexto por línea, o la expansión de texto no se presupuestó, o los barks no tienen cooldown
|
|
139
|
+
- **BLOCKED** — el naming no está definido: cualquier grabación antes de eso genera trabajo que se va a rehacer
|
|
140
|
+
|
|
141
|
+
## Anti-patterns
|
|
142
|
+
|
|
143
|
+
> → Read references/anti-patterns.md
|
|
144
|
+
|
|
145
|
+
## Next steps
|
|
146
|
+
|
|
147
|
+
- `/audio-mix` para el bus de diálogo y el ducking
|
|
148
|
+
- `/audio-spec` para el contrato de eventos de barks (concurrencia y cooldown)
|
|
149
|
+
- `/audio-audit` para verificar los assets entregados contra el spec
|
|
150
|
+
- `/middleware-integration` para los banks de idioma
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Voice Pipeline — Anti-patterns
|
|
2
|
+
|
|
3
|
+
## Grabar antes de definir el naming
|
|
4
|
+
|
|
5
|
+
El error más caro del pipeline. Renombrar 4.000 archivos × 12 idiomas, y actualizar script, subtítulos y referencias en el middleware, no es una tarea: es un proyecto. El naming se congela primero.
|
|
6
|
+
|
|
7
|
+
## Idioma en el nombre del archivo
|
|
8
|
+
|
|
9
|
+
`vo_kira_line_003_es.wav` obliga a lógica de resolución de nombre en runtime. El idioma va en la ruta o en el bank; el nombre del archivo es idéntico en todos los locales.
|
|
10
|
+
|
|
11
|
+
## Renumerar IDs
|
|
12
|
+
|
|
13
|
+
Se corta una línea y se renumeran las siguientes para "que quede ordenado". Se rompe el vínculo con subtítulos, traducciones y assets ya grabados. Los huecos en la numeración son gratis.
|
|
14
|
+
|
|
15
|
+
## Script sin contexto
|
|
16
|
+
|
|
17
|
+
El actor graba líneas sueltas en orden alfabético sin saber a quién le habla ni qué acaba de pasar. El material no sirve y hay que reconvocarlo. El contexto por línea es obligatorio.
|
|
18
|
+
|
|
19
|
+
## Grabar en orden de ID
|
|
20
|
+
|
|
21
|
+
El orden es por personaje y por escena. Y los gritos al final de la sesión: desgastan la voz y arruinan todo lo que venga después.
|
|
22
|
+
|
|
23
|
+
## Casting por timbre solamente
|
|
24
|
+
|
|
25
|
+
El personaje que grita en el acto tres necesita un actor con rango para gritar sin perder la voz. Y si dos personajes suenan parecido, el jugador que no ve quién habla se confunde.
|
|
26
|
+
|
|
27
|
+
## Actor imposible de reconvocar
|
|
28
|
+
|
|
29
|
+
Siempre hay pickups. Un actor sin disponibilidad futura es un riesgo de producción, no un detalle de contrato.
|
|
30
|
+
|
|
31
|
+
## Presupuestar los huecos contra el inglés
|
|
32
|
+
|
|
33
|
+
El alemán y el español crecen 20-35%. Una línea que calza justo en inglés no entra en alemán, y si hay animación fija, no hay arreglo. Presupuestar contra el idioma más largo del target.
|
|
34
|
+
|
|
35
|
+
## Fallback a silencio
|
|
36
|
+
|
|
37
|
+
Falta el asset en un idioma y no suena nada. El fallback es el idioma base, siempre.
|
|
38
|
+
|
|
39
|
+
## Subtítulo sin el mismo ID
|
|
40
|
+
|
|
41
|
+
Si el subtítulo no comparte la llave con el audio, mantener los dos sincronizados pasa a ser manual. Y una línea sin subtítulo es un bug de accesibilidad, no un pendiente.
|
|
42
|
+
|
|
43
|
+
## Barks con pocas variantes
|
|
44
|
+
|
|
45
|
+
Un bark repetido es lo primero que el jugador nota. Mínimo 5-8 por intención.
|
|
46
|
+
|
|
47
|
+
## Barks sin cooldown
|
|
48
|
+
|
|
49
|
+
Tres enemigos gritan la misma frase simultáneamente y suena a bug. Cooldown global por personaje y por tipo.
|
|
50
|
+
|
|
51
|
+
## Barks en el bus de diálogo
|
|
52
|
+
|
|
53
|
+
Cada bark de combate duckea la música. Bus separado.
|
|
54
|
+
|
|
55
|
+
## Barks que no se interrumpen
|
|
56
|
+
|
|
57
|
+
El personaje muere y su grito sigue sonando desde un cadáver.
|
|
58
|
+
|
|
59
|
+
## Batch sin verificación
|
|
60
|
+
|
|
61
|
+
Procesar miles de archivos sin un paso que valide sample rate, canales y duración deja que lo que no cumple se descubra en integración, cuando ya es tarde.
|
|
62
|
+
|
|
63
|
+
## Lipsync con texto que no coincide
|
|
64
|
+
|
|
65
|
+
El actor improvisó y el texto de referencia quedó viejo. La sincronía se rompe y nadie sabe por qué. El texto grabado y el de referencia son el mismo o el lipsync miente.
|
|
66
|
+
|
|
67
|
+
## Localización sin regenerar lipsync
|
|
68
|
+
|
|
69
|
+
O se regenera por idioma, o se acepta el desfasaje explícitamente como decisión. Lo que no se puede es descubrirlo en certificación.
|