⚠ Estado del contrato: el oficio está actualizado, el código no lo está
El framework de salida de este stack es Remotion + React (
/hyperframes-core). El oficio de animación aquí sigue siendo aplicable: temporización, elecciones de easing, la forma de un movimiento, las reglas con nombre y los blueprints. El código no lo está: los ejemplos y adaptadores están escritos para el runtime retirado de HTML + línea de tiempo de GSAP en pausa.Traduciendo mientras lees:
Aquí En Remotion gsap.fromTo(el, {x:-40}, {x:0, duration:0.5})interpolate(frame, [0, SEC(0.5)], [-40, 0], {…"clamp"})ease: "back.out(1.7)"spring({frame, fps, config:{damping}}), ajustado a ojouna línea de tiempo en pausa en window.__timelines[id]nada; cada valor es una función de useCurrentFrame()data-start/data-durationen un clip<Sequence from>/durationInFrames, en framesun keyframe o transición CSS styleen línea derivado de frames (la animación CSS no se renderiza)Nunca pegues un ejemplo de este skill en un proyecto de Remotion sin modificar.
Audio de HyperFrames
Una mezcla es un conjunto de relaciones, no una pila de procesadores. Dos pistas que suenan bien por separado pueden ser inescuchables juntas, y la solución casi nunca es "bajar una" — es encontrar por qué están peleando y dárselo a quien lo necesite. Cada herramienta aquí existe para expresar una de esas relaciones.
Los efectos viven en el elemento como data-fx-chain, y la vista previa y el renderizado usan el
mismo grafo de Web Audio — el estudio en un contexto en vivo, el motor en uno fuera de línea
dentro del navegador que ya maneja. Hay una implementación de cada efecto,
así que lo que escuchas mientras desplazas es lo que se escribe. Nunca ajustas dos veces.
La sincronización de clips sigue siendo /hyperframes-core: los recortes de audio/video y los rangos de fuente usan
data-start, data-duration y data-media-start, y los fundidos cruzados superponen
clips en diferentes pistas. Este skill posee fundido de entrada/salida de pista colocada,
envolventes de fundido cruzado, ganancia/volumen de pista, automatización de volumen y efectos,
ducker/tallado de voz y la cadena de efectos. /media-use posee la obtención, generación y preprocesamiento.
La constante data-playback-rate (0.1..5) es segura para renderizar en imagen y
sonido con preservación de tono cuando los elementos de audio/video coincidentes usan la misma temporización,
desplazamiento de fuente y velocidad. No se admiten rampas de velocidad de fuente porque
no hay envolvente de velocidad; preprocesa un activo sincronizado derivado. HyperFrames no
proporciona sincronización automática de forma de onda ni corrección de deriva.
Para recetas copiables de corte/fundido cruzado/re-temporización, usa /hyperframes-core → references/editing-recipes.md.
Tres atributos lo llevan todo, todos en el elemento de audio/video:
| Atributo | Contiene |
|---|---|
data-fx-chain | los efectos, en orden de señal |
data-automation | envolventes en el volumen de esta pista o en sus parámetros de efecto |
data-fx-carve | la configuración del tallado, para que pueda re-derivarse |
Las familias de efectos incluidas son ganancia, EQ (pasa altos, pasa bajos, pico, estantes), compresor, limitador, puerta, saturar, delay, reverberación, coro, phaser y bitcrush.
El JSON exacto para cada uno, y las reglas que un carril debe cumplir: references/attributes.md.
Cada efecto con sus parámetros, rangos y unidades: references/fx-registry.md.
Cómo descubrir qué está mal en un archivo que no puedes escuchar:
references/diagnosis.md.
Presets, trabajos con nombre y perfiles de un solo mando, más una tabla de síntoma a solución:
references/presets.md — léelo antes de construir una cadena manualmente, porque uno
de los presets o trabajos con nombre suele nombrar el problema.
Cómo encaja todo
Dos superficies de autoría escriben esos atributos; dos tiempos de ejecución los leen a través de los mismos constructores. Eso compartido en el medio es por lo que la vista previa predice el renderizado.
flowchart TB
voice["pista de voz<br/>archivo de medios"]
bed["cama musical<br/>archivo de medios"]
subgraph AUTOR["Autoría — las únicas cosas que escriben atributos"]
panel["Estudio<br/>Control de tallado de voz"]
script["scripts/carve.mjs<br/>detecta el par, dinámico por defecto"]
analysis["core/audioCarve.ts<br/>carveProfile · analyseCarveBands<br/>analyseCarveDuck · analyseCarveDynamics"]
panel --> analysis
script --> analysis
end
voice --> analysis
bed --> analysis
subgraph ATTRS["Escritos en el elemento de la cama"]
carveAttr["data-fx-carve<br/>fuente · fuerza · dinámico"]
chainAttr["data-fx-chain<br/>pico xN + ganancia, etiquetado fromCarve"]
autoAttr["data-automation<br/>un carril por parámetro tallado"]
end
analysis --> carveAttr
analysis --> chainAttr
analysis --> autoAttr
subgraph COMPARTIDO["Una implementación, leída por ambos"]
build["audioFxGraph.ts · buildFxChain"]
sched["audioFxAutomation.ts · scheduleChainAutomation"]
end
chainAttr --> build
autoAttr --> sched
build --> preview["Vista previa<br/>AudioContext en vivo<br/>attachElementFxChain"]
sched --> preview
build --> render["Renderizado<br/>OfflineAudioContext en el navegador sin cabeza<br/>applyAudioFxChain"]
sched --> render
preview --> heard["lo que escuchas mientras desplazas"]
render --> wav["WAV procesado<br/>+ chainTailSeconds para que la mezcla deje pasar la cola"]
wav --> mix["motor · audioMixer<br/>el carril de volumen horneado en este PCM, no en el grafo"]
mix --> out["la mezcla renderizada"]
edit["editar el atributo durante la reproducción"] -.->|MutationObserver| preview
La configuración del tallado nunca se lee durante la reproducción — la cadena y los carriles que
produjo son lo que se reproduce. data-fx-carve existe para que se pueda cambiar la fuerza en un
tallado existente en lugar de adivinarla de nuevo a partir de los filtros.
Dentro de una cama tallada, la señal pasa primero por los cortes, luego por el ajuste de nivel, luego por cualquier cosa que hayas construido tú mismo — razón por la cual un limitador que agregas sigue actuando como el último techo:
flowchart LR
src["cama decodificada"] --> p1["pico<br/>400 Hz"]
p1 --> p2["pico<br/>1 kHz"]
p2 --> p3["pico<br/>1.6 kHz"]
p3 --> g["ganancia<br/>ajuste de nivel"]
g --> hand["tus propios efectos<br/>p. ej. limitador"]
hand --> dest["ganancia de pista, luego salida"]
l1["carril fx.n1.gain"] -.->|"envolvente del<br/>nivel de la voz en esa banda"| p1
l4["carril fx.n4.gain"] -.->|"cuánto<br/>ducka la cama en general"| g
Un tallado estático es el mismo grafo con valores fijos y sin carriles.
Primero, descubre qué está mal
La tabla a continuación comienza desde "suena retumbante" — lo que presupone que alguien ya escuchó y lo dijo. Si te dan un archivo y "arregla esto", no tienes tal frase y no puedes escuchar, así que tienes que medir. Una regla lo gobierna todo:
El espectro absoluto de una sola voz desconocida no puede ser diagnosticado. Los formantes son ±10 dB, los fundamentales recorren 85–255 Hz y las oraciones disminuyen 5–6 dB al final. Cada uno de esos se lee como un defecto por sí mismo, y cada uno de ellos es el hablante.
Así que compara, y compara contra algo dentro del mismo archivo: el original limpio si existe, de lo contrario las pausas — lo que sea audible en un silencio es aditivo, y el espectro del silencio es el canal en lugar de la voz. Comparar contra un espectro promedio publicado o una voz de control sintetizada no funciona: dos hablantes difieren más que la mayoría de los defectos, y ambas respuestas erróneas en la evaluación detrás de esta guía provinieron exactamente de eso.
Cuando no hay original ni silencio utilizable, un defecto tonal estático está legítimamente subdeterminado. Dilo y ofrece las lecturas que encajen, en lugar de elegir una y construir una cadena basada en ella.
Comandos, trampas y recetas comprobadas: references/diagnosis.md. Léelo
antes de diagnosticar un archivo que nadie ha descrito.
Comienza por el síntoma
Una vez que conoces la banda y el tipo, nombra qué está mal con el audio. La mayoría del audio malo es uno o dos de estos, y cada uno tiene una respuesta ya incluida:
| Suena como | Recurre a |
|---|---|
| Zumbido o golpeteo debajo | rumble-cut, o un highpass a 80 Hz |
| Retumbante, pectoral | Tame Boominess trabajo (200 Hz) |
| Apagado, detrás de cartón | Reduce Mud trabajo (250 Hz) |
| Palabras difíciles de entender | Add Clarity trabajo (3 kHz), o talla la cama |
| Áspero y cansado | Soften Harshness trabajo (3.2 kHz) |
| Algunas palabras mucho más fuertes que otras | Evenness en un compresor, o Even Out Levels |
| Sonido de ambiente entre frases | room-gate |
| Voz y música peleando | Tallado de voz — no un EQ en ninguna |
| Seco, grabado en ninguna parte | room-tight o room-natural |
| Simplemente "amateur" | voice-clean, que son cuatro de los anteriores en orden |
Catálogo completo, qué contiene cada preset, el vocabulario de bandas y qué está
deliberadamente NO cubierto (de-essing, eliminación de ruido, coincidencia de tono):
references/presets.md.
Resta antes de sumar, nivela después de filtrar, relaciones después del nivel, carácter y techo al final. Cada paso cambia lo que el siguiente escucha — un compresor configurado antes de un pasa altos pasa su tiempo persiguiendo retumbos.
Recurre a una familia por el problema, no por el nombre
Filtros (highpass, lowpass, peaking, lowshelf, highshelf) deciden
qué frecuencias puede ocupar una pista. Esta es la primera herramienta para dos
fuentes que chocan, porque los choques ocurren en bandas: una cama y una voz ambas
quieren 1–3 kHz, y quitar eso de la cama le cuesta a la cama mucho menos que bajar
todo el volumen le cuesta a la mezcla. Un pasa altos en una voz es la solución estándar
para el retumbo; un pasa bajos oscurece o amortigua deliberadamente.
Dinámicos (gain, compressor, limiter, gate) deciden cómo se comporta el nivel
de una pista a lo largo del tiempo. La compresión reduce la distancia entre lo fuerte y lo suave
para que las partes suaves puedan subir. Un limitador es un techo — no moldea nada, garantiza
que nada pase. Una puerta elimina lo que está por debajo de un umbral, que es
cómo silencias el sonido de ambiente entre frases. gain es una etapa de nivel simple,
y es lo que monta un carril de automatización cuando una pista tiene que apartarse.
No lineales (saturate, bitcrush) cambian la forma de la onda, lo que agrega
armónicos que no estaban allí. Recurre a ello cuando una pista necesita carácter o
asperezan más que corrección — y recuerda que es generativo: hace que una fuente
delgada sea más densa, no más limpia.
Tiempo (delay, reverb, chorus, phaser) pone una pista en un espacio o le da
amplitud. Estos son los que más fácilmente arruinan una mezcla, porque una cola o una
copia desafinada ocupa el mismo espacio que necesita una voz. Úsalos en la cosa que
debería sentarse detrás de otra cosa, y mantén la cantidad de efecto húmedo más baja de lo que
suena bien de forma aislada.
La cadena es serial: cada efecto procesa lo que el anterior produjo. Así que el filtrado correctivo va temprano, el carácter en el medio, y un limitador al final donde pueda actuar realmente como un techo.
Tallado de voz
El problema que resuelve. Una cama musical debajo de una voz hace que la voz sea difícil de seguir. El reflejo es duckear toda la cama, lo que funciona pero le cuesta a la cama toda su presencia — la música se vuelve débil durante toda la voz en off. Pero la voz no necesita todo el espectro. Necesita las pocas bandas que realmente ocupa. El tallado toma solo esas, y la cama conserva su extremo bajo y su tope, así que sigue siendo música mientras la voz sigue siendo inteligible.
Es una relación, no un efecto. La configuración vive en la cama — la pista que se procesa — y nombran las voces a las que escuchar, exactamente como lo hace un compresor de cadena lateral: seleccionas la pista que se vuelve más baja y eliges qué la hace más baja. Nunca pongas un tallado en una pista de voz. Una voz tallada contra sí misma es un error, no una elección sutil de mezcla.
Cada voz, no una de ellas. sources es una lista, porque una cama suele correr
debajo de una secuencia completa — un narrador, una respuesta de entrevista, un segundo presentador. Son
sumadas en el propio reloj de la cama antes de que se mida nada (mixCarveSources),
así que un análisis cubre todas: las bandas provienen de todo el discurso que hay, y las
envolventes suben dondequiera que alguno de ellos esté ocurriendo. Las voces que nunca suenan mientras la
cama lo hace se excluyen; no pueden enmascararla.
Un mando. strength es 0..1 y deriva todo: qué tan profundo cortar, cuántas
bandas, qué tan anchas, hasta qué punto favorecer la inteligibilidad sobre la energía vocal bruta,
hasta dónde puede caer el nivel, hasta dónde debajo de la voz apuntar. Esos seis se mueven
juntos en cualquier mezcla real — un tallado suave es un corte superficial en pocas bandas
con poco ducking, uno fuerte es más profundo en más bandas con más — así que son
una relación escrita una vez, en carveProfile. El valor predeterminado es 0.25 — un corte de 6 dB en
tres bandas con 6 dB de margen de nivel, audible sin sonar como un agujero. A
0.5 el corte alcanza 10 dB, que es donde un tallado comienza a escucharse como un
efecto en lugar de como espacio para la voz; por encima de eso es territorio deliberado para
una cama fuerte debajo de una voz suave. 0 es solo espectral — una banda, sin ajuste de nivel.
Tallado por defecto. Una cama que suena debajo de una narración quiere un tallado; no es un paso de pulido al que llegar si hay tiempo. Coloca ambas pistas, ejecuta el comando a continuación, escucha. Sáltalo solo cuando no haya narración para que la música se siente debajo — un video musical, una tarjeta de título, un montaje cortado a la pista.
Siempre sigue a la voz. No hay modo estático: una profundidad fija adelgaza la cama a través de cada pausa, y una vez que has escuchado ambas, no hay razón para dudar...