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,151 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: audio-mix
|
|
3
|
+
description: "Mezcla de juego: jerarquia de buses, ducking y sidechain, mix states/snapshots, frequency masking, headroom y targets de loudness. Usar para: estructura de buses, ducking de dialogo, mix dinamico, resolver que el mix suena barroso."
|
|
4
|
+
category: "audio"
|
|
5
|
+
argument-hint: "[buses | ducking | states | loudness | review]"
|
|
6
|
+
user-invocable: true
|
|
7
|
+
allowed-tools: Read, Glob, Grep, Write, Edit
|
|
8
|
+
---
|
|
9
|
+
# audio-mix — Mezcla Dinámica
|
|
10
|
+
|
|
11
|
+
Diseña la estructura de buses y las reglas que deciden **qué se escucha cuando todo suena a la vez**.
|
|
12
|
+
|
|
13
|
+
El mix de un juego no es un mix estático: es un sistema de reglas, porque no se sabe de antemano qué va a sonar simultáneamente.
|
|
14
|
+
|
|
15
|
+
## Cuándo usar
|
|
16
|
+
|
|
17
|
+
- Definir la arquitectura de buses del proyecto
|
|
18
|
+
- El mix suena barroso, o el diálogo no se entiende
|
|
19
|
+
- Falta control dinámico: momentos importantes no destacan
|
|
20
|
+
- Cumplir targets de loudness de plataforma
|
|
21
|
+
|
|
22
|
+
## Input
|
|
23
|
+
|
|
24
|
+
1. Leer audio bible, sección 4 (frequency allocation) y 5 (mix hierarchy)
|
|
25
|
+
2. Listar las categorías de audio del proyecto
|
|
26
|
+
3. Preguntar al usuario: plataformas target, si hay diálogo, y si existe algún requisito de certificación
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Jerarquía de buses
|
|
31
|
+
|
|
32
|
+
Estructura base que sirve para casi cualquier juego:
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
Master
|
|
36
|
+
├── Music
|
|
37
|
+
├── SFX
|
|
38
|
+
│ ├── Player (feedback de la acción del jugador)
|
|
39
|
+
│ ├── World (enemigos, props, entorno)
|
|
40
|
+
│ └── Ambience
|
|
41
|
+
├── Voice
|
|
42
|
+
│ ├── Dialogue (narrativa, crítico)
|
|
43
|
+
│ └── Barks (chatter de combate)
|
|
44
|
+
└── UI
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**Por qué esta forma:**
|
|
48
|
+
- `Player` separado de `World` permite proteger el feedback de la acción del jugador cuando hay 40 enemigos
|
|
49
|
+
- `Dialogue` separado de `Barks` permite duckear por diálogo importante sin que cada bark baje la música
|
|
50
|
+
- `UI` afuera de `SFX` porque tiene su propio nivel (−18 a −24 dB) y su propio control de usuario
|
|
51
|
+
- `Ambience` separado porque es lo primero que se sacrifica cuando el mix se llena
|
|
52
|
+
|
|
53
|
+
**Cada bus necesita:** volumen base, control de usuario expuesto o no, y si va a reverb de zona.
|
|
54
|
+
|
|
55
|
+
## Ducking
|
|
56
|
+
|
|
57
|
+
Bajar una categoría cuando otra suena. Los casos reales:
|
|
58
|
+
|
|
59
|
+
| Trigger | Qué duckea | Cuánto | Attack / Release |
|
|
60
|
+
|---|---|---|---|
|
|
61
|
+
| Diálogo | Music, Ambience | −6 a −9 dB | 50 ms / 400 ms |
|
|
62
|
+
| UI crítico | Music, SFX | −3 a −6 dB | 20 ms / 200 ms |
|
|
63
|
+
| Momento narrativo | Todo menos Voice | −12 dB | 200 ms / 800 ms |
|
|
64
|
+
| Barks | nada, o −2 dB | mínimo | rápido |
|
|
65
|
+
|
|
66
|
+
**El release siempre más largo que el attack.** Un release corto produce bombeo audible: la música sube y baja a cada palabra. 300-500 ms de release para diálogo es lo que suena natural.
|
|
67
|
+
|
|
68
|
+
**El ducking no reemplaza al arreglo.** Si la música vive en 500 Hz-2 kHz y el diálogo también, hay que duckear tanto que se escucha. La solución es dejar ese rango libre en el arreglo (ver `/music-composition`, orquestación production-aware). El ducking es el ajuste fino, no la solución estructural.
|
|
69
|
+
|
|
70
|
+
**Sidechain vs ducking por evento:** el ducking por evento (el middleware baja el bus cuando el evento está activo) es más predecible y más barato. El sidechain real (detectar la señal) responde mejor a diálogo de duración variable. Para VO grabado, ducking por evento alcanza.
|
|
71
|
+
|
|
72
|
+
## Frequency masking
|
|
73
|
+
|
|
74
|
+
Dos sonidos que ocupan la misma banda compiten, y el más fuerte gana. El EQ correctivo adelgaza todo; la solución es la **asignación de bandas** del audio bible.
|
|
75
|
+
|
|
76
|
+
Cuando ya está producido y hay que arreglarlo:
|
|
77
|
+
|
|
78
|
+
| Problema | Arreglo de mezcla |
|
|
79
|
+
|---|---|
|
|
80
|
+
| Diálogo tapado por música | EQ dinámico en Music: hueco en 1-3 kHz solo cuando hay VO |
|
|
81
|
+
| Impactos sin peso | High-pass en Music y Ambience por debajo de 80 Hz |
|
|
82
|
+
| Mix barroso | High-pass en todo lo que no necesita graves; casi nada necesita por debajo de 60 Hz |
|
|
83
|
+
| UI perdido | Reducir el brillo de la percusión, no subir el UI |
|
|
84
|
+
| Todo suena chico | Demasiadas fuentes; el problema es voice count, no EQ |
|
|
85
|
+
|
|
86
|
+
## Mix states
|
|
87
|
+
|
|
88
|
+
Snapshots de la mezcla que se activan por contexto. El mix dinámico es lo que hace que un juego suene "bien mezclado" en situaciones que nadie mezcló a mano.
|
|
89
|
+
|
|
90
|
+
| Estado | Qué cambia |
|
|
91
|
+
|---|---|
|
|
92
|
+
| Exploration | Base |
|
|
93
|
+
| Combat | Player y World arriba, Ambience abajo |
|
|
94
|
+
| Cutscene | Voice arriba, todo lo demás abajo, sin UI |
|
|
95
|
+
| Menu (pausa) | Todo salvo UI y Music muy abajo o silenciado |
|
|
96
|
+
| Low health | Filtro en Music, tinnitus, resto atenuado |
|
|
97
|
+
| Death | Corte o filtro extremo |
|
|
98
|
+
|
|
99
|
+
**Interpolar entre estados**, nunca saltar. 200-500 ms según qué tan dramático sea el cambio. Y definir qué pasa si dos estados quieren activarse a la vez: prioridad explícita.
|
|
100
|
+
|
|
101
|
+
## Headroom y loudness
|
|
102
|
+
|
|
103
|
+
**Headroom:** dejar margen en el master para que los picos simultáneos no clippeen. El mix se hace apuntando a que el caso peor (explosión + música + diálogo) tenga espacio, no el caso promedio.
|
|
104
|
+
|
|
105
|
+
**Targets de loudness.** La referencia de industria en juegos es **ASWG-R001** (Sony), que es la única especificación de una plataforma mayor:
|
|
106
|
+
|
|
107
|
+
| Contexto | Loudness promedio | True peak máximo |
|
|
108
|
+
|---|---|---|
|
|
109
|
+
| Consola / home | **−23 LUFS** (±2) | **−1 dBTP** |
|
|
110
|
+
| Portable / handheld | **−18 LUFS** | −1 dBTP |
|
|
111
|
+
|
|
112
|
+
El target portable es más alto porque se juega en ambientes ruidosos y con speakers chicos.
|
|
113
|
+
|
|
114
|
+
Notas de aplicación:
|
|
115
|
+
- La medición es del **programa completo en gameplay representativo**, no de un asset aislado
|
|
116
|
+
- Verificar los targets vigentes de cada plataforma antes de certificación: las recomendaciones se revisan (el promedio de ASWG estuvo también citado como −24 LKFS)
|
|
117
|
+
- El true peak de −1 dBTP deja margen para la codificación lossy, que puede generar picos por encima del valor medido en PCM
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Proceso
|
|
122
|
+
|
|
123
|
+
1. **Definir la jerarquía de buses** con sus volúmenes base y controles de usuario
|
|
124
|
+
2. **Definir reglas de ducking** con attack/release y cuánto
|
|
125
|
+
3. **Definir mix states** con sus transiciones y prioridades
|
|
126
|
+
4. **Verificar masking** contra la frequency allocation del bible
|
|
127
|
+
5. **Definir targets de loudness** por plataforma y cómo se van a medir
|
|
128
|
+
6. **Escribir** — preguntar "¿Escribo el diseño de mezcla a `<path>`?" antes de usar Write
|
|
129
|
+
|
|
130
|
+
### Verificación
|
|
131
|
+
|
|
132
|
+
El mix se valida **jugando**, en el caso peor: máxima densidad de enemigos, con diálogo, con música de combate, en el dispositivo más chico del target. Si ahí se entiende el diálogo y se lee el feedback del jugador, el mix funciona.
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## Verdict
|
|
137
|
+
|
|
138
|
+
- **COMPLIANT** — buses definidos, ducking con release más largo que attack, mix states interpolados con prioridad, y loudness medido dentro del target de cada plataforma
|
|
139
|
+
- **CONCERNS** — la estructura existe pero el loudness no se midió en gameplay real, o el ducking está tapando un problema de arreglo
|
|
140
|
+
- **NON-COMPLIANT** — el loudness está fuera del target de plataforma, o hay clipping en el caso peor
|
|
141
|
+
|
|
142
|
+
## Anti-patterns
|
|
143
|
+
|
|
144
|
+
> → Read references/anti-patterns.md
|
|
145
|
+
|
|
146
|
+
## Next steps
|
|
147
|
+
|
|
148
|
+
- `/audio-audit` para medir loudness, picos y voice count en gameplay real
|
|
149
|
+
- `/middleware-integration` para implementar buses, ducking y states
|
|
150
|
+
- `/ui-sound-design` para el nivel del bus UI
|
|
151
|
+
- `/music-composition` si el masking se tiene que resolver en el arreglo y no en la mezcla
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Audio Mix — Anti-patterns
|
|
2
|
+
|
|
3
|
+
## Mezclar en aislamiento
|
|
4
|
+
|
|
5
|
+
Aprobar cada categoría por separado y esperar que el conjunto funcione. El mix se valida jugando el caso peor: máxima densidad, con diálogo, con música de combate, en el dispositivo más chico.
|
|
6
|
+
|
|
7
|
+
## Release de ducking demasiado corto
|
|
8
|
+
|
|
9
|
+
La música sube y baja a cada palabra y se escucha el bombeo. El release siempre más largo que el attack: 300-500 ms para diálogo.
|
|
10
|
+
|
|
11
|
+
## Ducking como solución al masking
|
|
12
|
+
|
|
13
|
+
Si la música y el diálogo viven los dos en 500 Hz-2 kHz, hay que duckear tanto que el efecto es audible. Eso se resuelve en el arreglo, dejando el rango libre. El ducking es ajuste fino.
|
|
14
|
+
|
|
15
|
+
## Todo duckea a todo
|
|
16
|
+
|
|
17
|
+
Barks duckeando música, UI duckeando SFX, ambiente duckeando barks. El resultado es un mix que respira todo el tiempo y nunca está quieto. Definir qué duckea a qué, y que sea poco.
|
|
18
|
+
|
|
19
|
+
## Un solo bus de SFX
|
|
20
|
+
|
|
21
|
+
Con 40 enemigos, el feedback de la acción del jugador se pierde entre el resto. Separar `Player` de `World` es lo que permite protegerlo.
|
|
22
|
+
|
|
23
|
+
## Diálogo y barks en el mismo bus
|
|
24
|
+
|
|
25
|
+
Cada bark de combate duckea la música. Separarlos permite duckear por diálogo importante nada más.
|
|
26
|
+
|
|
27
|
+
## UI dentro de SFX
|
|
28
|
+
|
|
29
|
+
El UI tiene otro nivel (−18 a −24 dB) y suele necesitar control de usuario propio. Metido en SFX, hereda un volumen que no le corresponde.
|
|
30
|
+
|
|
31
|
+
## Mix states que saltan
|
|
32
|
+
|
|
33
|
+
Cambiar de snapshot instantáneamente se escucha como un corte. Interpolar 200-500 ms según el cambio.
|
|
34
|
+
|
|
35
|
+
## Estados sin prioridad
|
|
36
|
+
|
|
37
|
+
Combat y Low health quieren activarse a la vez y el resultado depende del orden de evaluación. Prioridad explícita.
|
|
38
|
+
|
|
39
|
+
## EQ correctivo en todo
|
|
40
|
+
|
|
41
|
+
Adelgazar cada fuente con EQ hasta que dejen de pelear produce un mix delgado y sin peso. El problema de raíz es la asignación de bandas, o hay demasiadas fuentes sonando.
|
|
42
|
+
|
|
43
|
+
## Confundir "suena chico" con problema de EQ
|
|
44
|
+
|
|
45
|
+
Cuando todo suena chico, casi siempre hay demasiadas voces activas y ninguna tiene lugar. Es un problema de voice count, y el EQ no lo arregla.
|
|
46
|
+
|
|
47
|
+
## Nada de headroom
|
|
48
|
+
|
|
49
|
+
Mezclar apuntando al caso promedio y clippear cuando coinciden explosión, música y diálogo. El margen se calcula contra el peor caso.
|
|
50
|
+
|
|
51
|
+
## Medir loudness en un asset aislado
|
|
52
|
+
|
|
53
|
+
Los targets de LUFS son del programa completo en gameplay representativo. Medir un archivo no dice nada del cumplimiento.
|
|
54
|
+
|
|
55
|
+
## Asumir un target sin verificar
|
|
56
|
+
|
|
57
|
+
Los targets de plataforma se revisan. Confirmar el vigente antes de certificación en vez de confiar en un número memorizado.
|
|
58
|
+
|
|
59
|
+
## Ignorar el true peak
|
|
60
|
+
|
|
61
|
+
Un mix que llega a 0 dBFS en PCM puede generar picos por encima al codificarse en lossy. −1 dBTP existe por eso.
|
|
62
|
+
|
|
63
|
+
## Mezclar solo con auriculares buenos
|
|
64
|
+
|
|
65
|
+
El mix suena perfecto en los monitores del sound designer y se cae en el speaker de un handheld. Validar en el dispositivo más chico del target.
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: audio-spec
|
|
3
|
+
description: "SFX spec sheets y audio event lists: trigger, prioridad, concurrencia, cooldown, variaciones, propiedades espaciales. Usar para: especificar sonidos, event list por sistema, brief para sound designer."
|
|
4
|
+
category: "audio"
|
|
5
|
+
argument-hint: "[system-name | all | events]"
|
|
6
|
+
user-invocable: true
|
|
7
|
+
allowed-tools: Read, Glob, Grep, Write, Edit
|
|
8
|
+
---
|
|
9
|
+
# audio-spec — SFX Specs & Event Lists
|
|
10
|
+
|
|
11
|
+
Convierte dirección sonora en especificaciones que un sound designer externo puede producir sin más briefing, y en event lists que un programador puede implementar sin adivinar.
|
|
12
|
+
|
|
13
|
+
Dos entregables distintos y complementarios:
|
|
14
|
+
- **Spec sheet** — describe *el sonido*: cómo suena, cuánto dura, cuántas variantes
|
|
15
|
+
- **Event list** — describe *el contrato*: qué lo dispara, con qué prioridad, cuántas instancias, qué parámetros recibe
|
|
16
|
+
|
|
17
|
+
## Cuándo usar
|
|
18
|
+
|
|
19
|
+
- Después de `/audio-bible` (la dirección tiene que existir primero)
|
|
20
|
+
- Cuando vas a tercerizar producción de SFX y necesitás un brief cerrado
|
|
21
|
+
- Cuando el código necesita saber qué eventos postear antes de que existan los assets
|
|
22
|
+
- Antes de `/middleware-integration` — la event list es su input
|
|
23
|
+
|
|
24
|
+
## Modos
|
|
25
|
+
|
|
26
|
+
| Modo | Qué hace |
|
|
27
|
+
|---|---|
|
|
28
|
+
| `system-name` | Especifica un sistema concreto: spec sheets + event list de, por ejemplo, `combat` |
|
|
29
|
+
| `all` | Barre todos los sistemas del proyecto, uno por vez |
|
|
30
|
+
| `events` | Solo la event list, sin spec sheets. Para cuando el código necesita el contrato antes de que existan los assets |
|
|
31
|
+
|
|
32
|
+
## Input
|
|
33
|
+
|
|
34
|
+
1. Leer audio bible (paleta, frequency allocation, mix hierarchy, standards). Si no existe, avisar y ofrecer `/audio-bible` primero
|
|
35
|
+
2. Identificar el sistema a especificar (combate, locomoción, UI, ambiente, props...) o `all`
|
|
36
|
+
3. Leer el código/GDD del sistema para extraer los momentos que piden sonido
|
|
37
|
+
4. Preguntar al usuario: nivel de detalle (spec completo vs event list sola) y si hay assets existentes que reusar
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Spec sheet — campos obligatorios
|
|
42
|
+
|
|
43
|
+
Cada sonido lleva estos campos. Un campo vacío es una decisión que alguien va a tomar por vos:
|
|
44
|
+
|
|
45
|
+
| Campo | Qué define | Ejemplo |
|
|
46
|
+
|---|---|---|
|
|
47
|
+
| **ID** | Nombre canónico, matchea naming del bible | `sfx_weapon_shotgun_fire` |
|
|
48
|
+
| **Descripción** | Qué es, en una línea funcional | Disparo de escopeta de doble caño, seco, sin cola de reverb |
|
|
49
|
+
| **Referencias** | 1-3 sonidos concretos con qué tomar de cada uno | — |
|
|
50
|
+
| **Carácter frecuencial** | Dónde vive, contra la allocation del bible | Sub-punch 50-70 Hz + crack 3-5 kHz, vacío en mids |
|
|
51
|
+
| **Duración** | Rango, no valor único | 180-260 ms |
|
|
52
|
+
| **Envolvente** | Attack / body / tail explícitos | Attack <5 ms, body 60 ms, tail 120 ms |
|
|
53
|
+
| **Rango de volumen** | Nivel relativo a la categoría | −6 dB a −3 dB del bus SFX |
|
|
54
|
+
| **Propiedades espaciales** | 2D/3D, curva de atenuación, min/max distance | 3D, 2-40 m, log |
|
|
55
|
+
| **Variaciones** | Cuántas variantes y qué randomización | 5 variantes, pitch ±3%, volumen ±1.5 dB |
|
|
56
|
+
| **Prioridad** | Qué se cae primero bajo presión de voces | Alta (feedback de acción del jugador) |
|
|
57
|
+
|
|
58
|
+
## Event list — campos obligatorios
|
|
59
|
+
|
|
60
|
+
| Campo | Qué define |
|
|
61
|
+
|---|---|
|
|
62
|
+
| **Evento** | Nombre que postea el código |
|
|
63
|
+
| **Trigger** | Condición exacta de gameplay que lo dispara |
|
|
64
|
+
| **Sonidos** | Qué IDs de spec resuelve (uno o un container) |
|
|
65
|
+
| **Concurrencia** | Máximo de instancias simultáneas + qué hacer al exceder (drop oldest / drop newest / reject) |
|
|
66
|
+
| **Cooldown** | Mínimo entre disparos, para eventos que pueden spamearse |
|
|
67
|
+
| **Parámetros** | RTPCs que recibe, con rango normalizado |
|
|
68
|
+
| **Stop condition** | Cómo termina: one-shot, loop con stop explícito, o fade |
|
|
69
|
+
|
|
70
|
+
**Concurrencia y cooldown no son opcionales.** Son la diferencia entre un sistema que sobrevive 40 enemigos en pantalla y uno que satura el voice budget. Todo evento que puede dispararse más de una vez por frame necesita ambos.
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Proceso
|
|
75
|
+
|
|
76
|
+
1. **Barrer el sistema** — listar cada momento que pide sonido, incluyendo los negativos (dónde el silencio es la decisión)
|
|
77
|
+
2. **Agrupar** — sonidos que comparten carácter van juntos; identificar qué puede ser variación de un mismo asset en vez de asset nuevo
|
|
78
|
+
3. **Draftar** specs y event list del grupo
|
|
79
|
+
4. **Presentar** al usuario para review
|
|
80
|
+
5. **Escribir** — preguntar "¿Escribo el spec de `<sistema>` a `<path>`?" antes de usar Write
|
|
81
|
+
|
|
82
|
+
No batchear sistemas: cerrar uno antes de abrir el siguiente.
|
|
83
|
+
|
|
84
|
+
### Reducción de assets
|
|
85
|
+
|
|
86
|
+
Antes de especificar N sonidos nuevos, preguntar si el caso se resuelve con variación o con síntesis. El caso canónico: 20 samples × 6 superficies × 3 intensidades = 360 archivos (~180 MB) vs footsteps procedurales (~50 KB) con variación infinita. Si el sistema es de alta frecuencia y muchas dimensiones, derivar a `/procedural-audio` antes de escribir el spec.
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## Verdict
|
|
91
|
+
|
|
92
|
+
Por sistema especificado:
|
|
93
|
+
|
|
94
|
+
- **READY** — todo sonido tiene los 10 campos, todo evento tiene concurrencia y cooldown. Un externo puede producir y un programador puede implementar
|
|
95
|
+
- **CONCERNS** — hay campos vacíos o eventos sin límites; listar cuáles
|
|
96
|
+
- **BLOCKED** — falta el audio bible, o el sistema de gameplay no está definido lo suficiente para saber qué momentos existen
|
|
97
|
+
|
|
98
|
+
## Anti-patterns
|
|
99
|
+
|
|
100
|
+
> → Read references/anti-patterns.md
|
|
101
|
+
|
|
102
|
+
## Next steps
|
|
103
|
+
|
|
104
|
+
- `/middleware-integration` para implementar la event list en Wwise/FMOD
|
|
105
|
+
- `/procedural-audio` para los sistemas de alta frecuencia que no conviene samplear
|
|
106
|
+
- `/sfx-design` para profundizar el diseño de los sonidos hero
|
|
107
|
+
- `/audio-audit` para verificar los assets entregados contra el spec
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Audio Spec — Anti-patterns
|
|
2
|
+
|
|
3
|
+
## Spec sin números
|
|
4
|
+
|
|
5
|
+
"Impacto potente y satisfactorio" no es producible. Duración, envolvente, bandas de frecuencia y nivel relativo sí. Si el campo no tiene número o rango, no está especificado.
|
|
6
|
+
|
|
7
|
+
## Duración como valor único
|
|
8
|
+
|
|
9
|
+
"200 ms" fuerza al sound designer a mentir o a pedir aprobación. Un rango (180-260 ms) le da lugar a que el sonido termine donde tiene que terminar.
|
|
10
|
+
|
|
11
|
+
## Eventos sin concurrencia
|
|
12
|
+
|
|
13
|
+
El spec dice "sonido de casquillo al caer". Llegan 40 enemigos, 300 casquillos, el voice budget explota y el mix desaparece. Todo evento que puede dispararse más de una vez por frame necesita máximo de instancias y política de descarte.
|
|
14
|
+
|
|
15
|
+
## Cooldown ausente en eventos de UI
|
|
16
|
+
|
|
17
|
+
Navegación rápida en un menú dispara el mismo tick 15 veces en 200 ms. Suena como un glitch. Cooldown mínimo, siempre.
|
|
18
|
+
|
|
19
|
+
## Una variante
|
|
20
|
+
|
|
21
|
+
Un sonido sin variantes se vuelve audible como *sonido* en vez de como evento en unos 20 minutos de juego. Si el evento es frecuente, mínimo 4-5 variantes o randomización de pitch, y preferentemente ambas.
|
|
22
|
+
|
|
23
|
+
## Pitch randomization exagerada
|
|
24
|
+
|
|
25
|
+
±3% es variación. ±20% cambia el objeto: el arma parece otra arma. Rango chico y round-robin le gana a rango grande.
|
|
26
|
+
|
|
27
|
+
## Specs 3D sin curva
|
|
28
|
+
|
|
29
|
+
Marcar "3D" y no definir min/max distance ni forma de la curva deja la atenuación en el default del middleware, que casi nunca es el correcto. El sonido se oye a 200 m o desaparece a 3 m.
|
|
30
|
+
|
|
31
|
+
## Especificar antes de decidir procedural
|
|
32
|
+
|
|
33
|
+
Escribir 360 spec sheets de footsteps es trabajo perdido si la respuesta correcta era síntesis. Evaluar el eje frecuencia × dimensiones antes de especificar.
|
|
34
|
+
|
|
35
|
+
## Event list sin stop condition
|
|
36
|
+
|
|
37
|
+
Los loops son la fuente número uno de audio colgado. Todo sonido que loopea necesita decir explícitamente quién lo para y qué pasa si el objeto dueño se destruye primero.
|
|
38
|
+
|
|
39
|
+
## Prioridades todas iguales
|
|
40
|
+
|
|
41
|
+
Si todo es prioridad alta, el voice limiter descarta al azar y se cae el feedback de la acción del jugador antes que un ambiente lejano. Las prioridades solo sirven si están diferenciadas.
|
|
42
|
+
|
|
43
|
+
## IDs que no siguen el naming del bible
|
|
44
|
+
|
|
45
|
+
`shotgun2_FINAL_v3` rompe búsqueda, batch processing y automatización de banks. El ID sale del pattern del bible, sin excepciones.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: brain-dump
|
|
3
|
+
description: "Captura sin friccion al dump del dia en el vault de Obsidian: tareas, ideas, links, transcripciones. Sin tags, sin decidir donde va. Triggers: anota, capturar, brain dump, tirame esto al vault, apunta esto, agregar al inbox, dump del dia."
|
|
4
|
+
argument-hint: "[texto a capturar]"
|
|
5
|
+
category: "pkm"
|
|
6
|
+
user-invocable: true
|
|
7
|
+
allowed-tools: Read, Glob, Write, Edit
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Brain Dump - Captura sin fricción
|
|
11
|
+
|
|
12
|
+
Agregás lo que el usuario te pasa al dump del día y te callás. Este skill existe para que capturar cueste cero: el momento en que el usuario tiene que pensar "¿dónde va esto?", el sistema ya falló.
|
|
13
|
+
|
|
14
|
+
Contenido a capturar: `$ARGUMENTS`
|
|
15
|
+
|
|
16
|
+
Aplica la rule `vault-conventions`.
|
|
17
|
+
|
|
18
|
+
**Rutas por rol:** el destino se nombra por rol (`inbox`, `templates`), y la ruta real sale del `## Rutas` del `CLAUDE.md` del vault. Los defaults entre paréntesis solo aplican si el vault no declara otra cosa.
|
|
19
|
+
|
|
20
|
+
## Pasos
|
|
21
|
+
|
|
22
|
+
1. **Ubicar el vault.** Flag `--vault <path>`, env `OBSIDIAN_VAULT`, o el directorio actual si contiene `.obsidian/`. Si no hay vault, decirlo en una línea y ofrecer `/second-brain setup`. No inventar una carpeta.
|
|
23
|
+
|
|
24
|
+
2. **Resolver el rol `inbox`.** Leer el `## Rutas` del `CLAUDE.md` del vault. Es lo único que hace falta leer del contrato acá, y cuesta una lectura: escribir en `_inbox/` cuando el vault usa otra carpeta deja la captura en un lugar que ningún review va a mirar. Si el vault no tiene `CLAUDE.md`, usar el default y avisar en la misma línea de confirmación.
|
|
25
|
+
|
|
26
|
+
3. **Abrir el dump de hoy.** `<inbox>/YYYY-MM-DD dump.md` (default `_inbox/`) con la fecha de hoy. El dump se llama `YYYY-MM-DD dump.md` y no `YYYY-MM-DD.md` a propósito: el daily de ese día ya se llama `YYYY-MM-DD.md`, y dos archivos con el mismo nombre hacen que `[[2026-07-28]]` resuelva de forma impredecible en todo el vault. Es la colisión que el audit reporta como `ambiguous_names`, y sin el sufijo pasaría todos los días. Si el vault ya tiene dumps con el nombre viejo, seguir su convención y avisarlo, en vez de partir la serie en dos.
|
|
27
|
+
|
|
28
|
+
Si no existe, crearlo desde `<templates>/Dump.md` (default `Templates/`), o con el frontmatter mínimo `created`, `type: dump`, `tags: []` si el template no está.
|
|
29
|
+
|
|
30
|
+
4. **Agregar el contenido al final**, una línea por cosa, sin reordenar ni reescribir lo que ya había:
|
|
31
|
+
- Lo que suena a tarea va como `- [ ] <texto>`. Lo que suena a idea, nota o link va como `- <texto>`.
|
|
32
|
+
- URLs sueltas se dejan crudas, con el título de la página al lado solo si el usuario lo dio. No abrir la URL: eso es `/vault-clip`.
|
|
33
|
+
- Se preserva la redacción del usuario. No corregís su ortografía ni su registro, no resumís, no traducís.
|
|
34
|
+
|
|
35
|
+
5. **Si no vino contenido en `$ARGUMENTS`**, preguntar qué capturar en una sola línea y esperar. No abrir un cuestionario.
|
|
36
|
+
|
|
37
|
+
6. **Confirmar en una línea** qué se agregó y a qué archivo. Nada más: el usuario está en medio de otra cosa.
|
|
38
|
+
|
|
39
|
+
## Approval
|
|
40
|
+
|
|
41
|
+
La invocación del skill es la aprobación para agregar al dump de hoy: pedir confirmación en cada captura destruiría el punto del skill. Los límites son estrictos en cambio para todo lo demás: **pedí approval explícito antes de escribir fuera del rol `inbox`**, antes de editar líneas que ya estaban en el dump, y antes de crear cualquier nota en los roles `atomic` o `hubs`. Clasificar es trabajo de `/review-dump`, no de acá.
|
|
42
|
+
|
|
43
|
+
## Reglas
|
|
44
|
+
|
|
45
|
+
- No clasificar, no taggear, no linkear, no crear notas nuevas. Nada de eso pasa en la captura.
|
|
46
|
+
- No juzgar el contenido ni sugerir mejoras. Es un dump, no un borrador.
|
|
47
|
+
- Nunca reescribir ni reordenar lo que ya estaba en el archivo: solo append.
|
|
48
|
+
- Sin guiones largos en lo que agregues de tu parte.
|
|
49
|
+
- Si el usuario captura algo que claramente es una tarea de un proyecto que existe, **igual va al dump**. La ruteada la hace el review, así el usuario nunca decide en el momento.
|
|
50
|
+
|
|
51
|
+
## Handoff
|
|
52
|
+
|
|
53
|
+
Captura COMPLETE cuando el contenido está en el dump del día. A la noche, o cuando el usuario quiera cerrar el día, el siguiente paso es `/review-dump` para clasificar todo lo capturado y generar el daily.
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: hub-note
|
|
3
|
+
description: "Crea o actualiza un hub file (MOC) del vault: una nota por entidad que importa (persona, herramienta, concepto, empresa) que acumula conocimiento y conecta PARA con Zettelkasten. Triggers: hub file, MOC, mapa de contenido, nota de entidad, crear hub de, actualizar hub, nota de persona."
|
|
4
|
+
argument-hint: "[entidad] [--update]"
|
|
5
|
+
category: "pkm"
|
|
6
|
+
user-invocable: true
|
|
7
|
+
allowed-tools: Read, Glob, Grep, Write, Edit
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Hub Note - Tejido conectivo del vault
|
|
11
|
+
|
|
12
|
+
Un hub file es una nota por entidad que importa. No contiene conocimiento propio: contiene **el estado actual** de esa entidad y **los links** a todo lo que se sabe de ella. Es lo que hace que PARA (carpetas) y Zettelkasten (notas planas) convivan sin pelearse.
|
|
13
|
+
|
|
14
|
+
Entidad: `$ARGUMENTS`
|
|
15
|
+
|
|
16
|
+
Aplica la rule `vault-conventions`.
|
|
17
|
+
|
|
18
|
+
**Rutas por rol:** los destinos se nombran por rol y la ruta real de cada uno sale del `## Rutas` del `CLAUDE.md` del vault (leelo antes de escribir). Los defaults entre paréntesis solo aplican si el vault no declara otra cosa.
|
|
19
|
+
|
|
20
|
+
## Fase 1 - Decidir si la entidad merece hub
|
|
21
|
+
|
|
22
|
+
El criterio es la recurrencia, no la importancia: **la entidad apareció en tres dumps o notas distintas**. Antes de eso es una mención, y un hub por mención produce cientos de notas de una línea que nadie visita.
|
|
23
|
+
|
|
24
|
+
1. Buscar la entidad con `/vault-recall` si está disponible, o `Grep` en los roles `inbox`, `daily` y `atomic` (defaults `_inbox/`, `Reflect/Daily/`, `03_Resources/`) por el nombre y sus variantes.
|
|
25
|
+
2. Contar apariciones y reportarlas con los links.
|
|
26
|
+
3. Si hay menos de tres, decirlo y proponer esperar. Si el usuario quiere el hub igual (una persona nueva en el equipo, un proyecto que arranca), se crea: la anticipación es un motivo válido, la duda no.
|
|
27
|
+
|
|
28
|
+
Verdict: PASS si hay tres apariciones o una razón explícita del usuario.
|
|
29
|
+
|
|
30
|
+
## Fase 2 - Buscar el hub existente
|
|
31
|
+
|
|
32
|
+
`Glob` en `<hubs>` (default `Hubs/`) y revisar los `aliases` del frontmatter de los hubs que haya. Las entidades llegan con nombres distintos ("Educabot", "educabot", "EB"): si ya existe un hub para la entidad bajo otro nombre, **actualizar ese** y agregar el nombre nuevo a `aliases`. Nunca crear un segundo hub para la misma entidad: es el duplicado más caro del vault, porque parte el conocimiento en dos lugares que nadie reconcilia.
|
|
33
|
+
|
|
34
|
+
## Fase 3 - Escribir
|
|
35
|
+
|
|
36
|
+
Con approval, crear o actualizar el hub en `<hubs>` (default `Hubs/`) desde `<templates>/Hub.md`.
|
|
37
|
+
|
|
38
|
+
Al **crear**:
|
|
39
|
+
- Título: el nombre canónico de la entidad. Las variantes van a `aliases`.
|
|
40
|
+
- Una o dos líneas de qué es y por qué tiene nota propia.
|
|
41
|
+
- `## Estado actual`: lo que hay que saber hoy.
|
|
42
|
+
- `## Notas`: links a las notas atómicas y proyectos del tema que ya existan (los que encontraste en la fase 1).
|
|
43
|
+
- `## Historial`: una línea por aparición relevante, formato `- YYYY-MM-DD - qué pasó`, lo más nuevo arriba.
|
|
44
|
+
- `status`: `seed` al crearlo, `provisional` cuando ya acumuló contenido. Un hub que el usuario mantiene al día puede quedar `evergreen`, pero lo marca él.
|
|
45
|
+
- `repos:` si la entidad tiene código (una herramienta propia, un proyecto, un servicio). Es el puente al repo, y se traduce a path local en `codebases.md` del vault. **No copies arquitectura al hub:** el hub dice qué es y por qué, el repo dice cómo está hecho, y el que copia se desactualiza.
|
|
46
|
+
|
|
47
|
+
Al **actualizar** (`--update`, o cuando el hub ya existe):
|
|
48
|
+
- Agregar la entrada nueva al `## Historial`, sin duplicar una que ya esté con la misma fecha y el mismo contenido.
|
|
49
|
+
- **`## Estado actual` se reescribe, no se acumula.** Es la sección que responde "qué sé hoy de esto"; si se convierte en un log, el hub deja de servir para lo único que sirve. Lo que se reemplaza y sigue siendo relevante baja al historial.
|
|
50
|
+
- `## Notas`: agregar los links nuevos.
|
|
51
|
+
|
|
52
|
+
## Fase 4 - Conectar
|
|
53
|
+
|
|
54
|
+
- El hub linkea hacia las notas atómicas y los proyectos. Los dumps y dailies linkean **hacia** el hub. El hub no linkea a dumps ni a dailies: son registro, no conocimiento, y llenan el hub de ruido en un mes.
|
|
55
|
+
- Si el hub cubre un tema amplio y ya pasó las 30 o 40 entradas en `## Notas`, proponer partirlo en sub-hubs por subtema. Un hub que nadie puede leer de arriba a abajo dejó de ser un mapa.
|
|
56
|
+
|
|
57
|
+
Hub COMPLETE cuando tiene estado actual, al menos un link saliente, y las apariciones encontradas quedaron en el historial.
|
|
58
|
+
|
|
59
|
+
## Reglas
|
|
60
|
+
|
|
61
|
+
- Un hub por entidad. Los alias van al frontmatter, no a un hub nuevo.
|
|
62
|
+
- El hub no acumula conocimiento propio: si querés explicar una idea, es una nota atómica (`/zettel`) linkeada desde acá.
|
|
63
|
+
- Nunca borrar entradas del historial: si algo dejó de ser cierto, se agrega la entrada nueva.
|
|
64
|
+
- Sin guiones largos.
|
|
65
|
+
|
|
66
|
+
## Handoff
|
|
67
|
+
|
|
68
|
+
Con el hub listo, el siguiente paso es `/zettel` para las ideas del tema que todavía no tienen nota propia, o volver a `/review-dump` si esto salió procesando el día. `/vault-audit` va a usar los hubs para distinguir una huérfana real de una nota que simplemente todavía no fue linkeada.
|