El cluster C10 de fqmpeg es la caja de pedales del kit — nueve verbos que colorean el audio en lugar de arreglarlo. Dos son ecos basados en tiempo (reverb, echo-effect). Cinco son efectos de modulación LFO (chorus, phaser, flanger, tremolo, vibrato). Dos son trucos de campo estéreo (audio-karaoke, audio-stereo-widen).
Comparado con los verbos de dinámica/EQ de C9, C10 es pequeño y las implementaciones son cortas — pero cada uno envuelve un filtro de FFmpeg multiparamétrico detrás de una superficie de 2 o 3 opciones. Esta guía recorre cada verbo contra src/commands/ de fqmpeg 3.0.3 y es honesta sobre qué está hardcodeado y por qué. Algunos hardcodings son sensatos — ocultan coeficientes DSP que solo invitarían a meter la pata. Otros son limitaciones que conviene conocer antes de exportar un render.
Qué obtienes de esta guía
- Una matriz de decisión para los 9 verbos por efecto sonoro (tiempo / modulación / estéreo)
- La invocación exacta de FFmpeg que cada verbo genera (salida
--dry-runverificada) - Defaults, unidades, nombres de archivo de salida — y los coeficientes de filtro que fqmpeg fija por ti
- Tres recetas — calentar voz, guitarra lo-fi, diálogo estilo radio AM — y las puertas de escape cuando la superficie simplificada no alcanza
Los 9 verbos de un vistazo
Los nueve verbos preservan video con -c:v copy — pasa un archivo de video y obtienes el mismo video con el audio procesado.
| Grupo | Verbos | Qué hacen |
|---|---|---|
| Basado en tiempo | reverb, echo-effect | Simulación de retardo/reflexión vía aecho |
| Modulación | chorus, phaser, flanger, tremolo, vibrato | Modulación LFO de tono / tiempo / amplitud |
| Estéreo | audio-karaoke, audio-stereo-widen | Eliminación de canal central, ensanchado tipo Haas |
Cinco cosas que saber antes de seguir:
reverbno es una reverb real. Es un filtroaechode un solo tap conin_gain=0.8yout_gain=0.88hardcodeados. La reverb real (convolución de respuesta al impulso o red Schroeder) necesitaafiro el filtrofreeverb— para eso, bajá a FFmpeg crudo.reverbacá es "un toque de habitación", no una catedral.chorusincluye un preset de 3 voces que no es configurable. Las voces tienen delays50|60|70ms y decays0.4|0.32|0.28hardcodeados. Solo se exponen profundidad y velocidad de modulación. Razón: un chorus bien afinado necesita intuición sobre el espaciado de voces, y exponer los 6 parámetros en un CLI invitaría a configuraciones que suenan rotas. Si necesitás un arreglo multi-voz personalizado, ejecutá el filtrochorusde FFmpeg directamente (acepta hasta 32 voces).flanger --mixse remapea internamente awidth. El filtroflangerde FFmpeg usawidth=0-100para la mezcla wet/dry, nomix=0-1. fqmpeg acepta la convención más común--mix 0.0-1.0y multiplica por 100 antes de pasarlo. Así--mix 0.7se convierte enwidth=70. (Fue un bugfix de B7 — fqmpeg antes pasabamix=directo, que el filtro ignoraba silenciosamente.)tremoloyvibratotienen superficies de opciones idénticas pero efectos completamente diferentes. Tremolo modula volumen (un LFO multiplica la amplitud). Vibrato modula tono (un LFO desplaza la frecuencia). Mismos--freq/--depth, mismos defaults (5 Hz, 0.5), mismos rangos — pero no son intercambiables.audio-karaokesolo funciona con voces dead-center y secas. El filtro es el clásico truco de cancelación de fasepan=stereo|c0=c0-c1|c1=c1-c0. Asume que la voz está paneada idéntica en ambos canales sin ensanchado estéreo, reverb ni chorus en el bus vocal. Las mezclas pop modernas rompen las tres suposiciones. Esperá residuos audibles.
Basado en tiempo: Reverb y Echo
Ambos verbos usan el mismo filtro de FFmpeg (aecho) — la diferencia es la configuración. reverb es un tap corto (típicamente 40 ms) usado como ambiente. echo-effect es una cadena de repeticiones decrecientes usadas como efecto musical distinto.
reverb — Añadir ambiente tipo reverb al audio
Un eco de un solo tap disfrazado de reverb. Bueno para agregar un toque de espacio, no para emular una sala.
- Fuente:
src/commands/reverb.js - Filtro:
aecho=0.8:0.88:<delay>:<decay> - Salida:
<input-stem>-reverb.<ext>
| Opción | Default | Notas |
|---|---|---|
--delay <ms> | 40 | Retardo entre dry y wet |
--decay <n> | 0.5 | Factor de decaimiento (0.0-1.0) |
-o, --output <path> | <input-stem>-reverb.<ext> | — |
$ npx fqmpeg reverb input.mp4 --dry-run
ffmpeg -i input.mp4 -af aecho=0.8:0.88:40:0.5 -c:v copy input-reverb.mp4
Qué está hardcodeado y por qué: in_gain=0.8 y out_gain=0.88 están fijos en el string del filtro aecho. Son atenuación dry/wet — no cambian el carácter del eco, solo su volumen relativo a la fuente. La elección de fqmpeg es una mezcla media segura que no clipea en entradas típicas.
Cuando esto se te queda corto: la reverb real son múltiples líneas de retardo descorrelacionadas (red Schroeder) o convolución de respuesta al impulso. Para un sonido creíble de hall/plate, cambiá a freeverb (si tu build de FFmpeg lo trae) o afir con un WAV de respuesta al impulso:
ffmpeg -i input.mp4 -i hall_ir.wav -filter_complex "[0:a][1:a]afir=dry=10:wet=10[a]" \
-map 0:v -map "[a]" -c:v copy hall-reverb.mp4
echo-effect — Añadir efecto echo / delay con múltiples taps
Genera una cadena geométrica de ecos: delay, 2×delay, 3×delay, ..., cada uno más bajo que el anterior por un factor de decay^i.
- Fuente:
src/commands/echo-effect.js - Filtro:
aecho=0.8:0.88:<d>|<2d>|<3d>...:<c>|<c²>|<c³>... - Salida:
<input-stem>-echo.<ext>
| Opción | Default | Notas |
|---|---|---|
--delay <ms> | 500 | Retardo base; los taps siguientes son 2×, 3×, ... |
--decay <n> | 0.3 | Factor de decay; los taps siguientes decaen geométricamente |
--repeats <n> | 3 | Número de taps |
-o, --output <path> | <input-stem>-echo.<ext> | — |
$ npx fqmpeg echo-effect input.mp4 --dry-run
ffmpeg -i input.mp4 -af aecho=0.8:0.88:500|1000|1500:0.300|0.090|0.027 -c:v copy input-echo.mp4
Qué está hardcodeado y por qué: como en reverb, los in_gain/out_gain están fijos en 0.8:0.88. El decaimiento geométrico (decay^i para el tap i) no está "hardcodeado" en sentido peligroso — es el modelo físico natural para una sola superficie reflectante que pierde energía en cada rebote. Exponer delays/decays por tap permitiría construir filtros de peine patológicos, así que fqmpeg los ata juntos.
Cuando esto se te queda corto: si querés espaciado irregular de taps (un slapback que vira a una cola larga, o ping-pong estéreo), bajá directo a aecho con listas separadas por |, o usá adelay para un offset estéreo en milisegundos exactos:
ffmpeg -i input.mp3 -af "aecho=0.8:0.9:60|300|800:0.5|0.3|0.15" out.mp3
Efectos de modulación
Los cinco verbos de modulación están impulsados por un oscilador de baja frecuencia (LFO) que varía alguna propiedad de la señal con el tiempo. El modelo mental compartido: elegir una velocidad (qué tan rápido cicla el LFO, en Hz) y una profundidad (cuánto varía).
chorus — Añadir efecto chorus / espesado
Apila 3 copias ligeramente desafinadas y retardadas sobre la señal seca. Suena como varios músicos tocando la misma línea.
- Fuente:
src/commands/chorus.js - Filtro:
chorus=0.5:0.9:50|60|70:0.4|0.32|0.28:<depth>|<depth>|<depth>:<speed>|<speed>|<speed> - Salida:
<input-stem>-chorus.<ext>
| Opción | Default | Notas |
|---|---|---|
--depth <ms> | 2 | Profundidad de modulación (aplicada a las 3 voces) |
--speed <Hz> | 0.5 | Velocidad de modulación (aplicada a las 3 voces) |
-o, --output <path> | <input-stem>-chorus.<ext> | — |
$ npx fqmpeg chorus input.mp4 --dry-run
ffmpeg -i input.mp4 -af chorus=0.5:0.9:50|60|70:0.4|0.32|0.28:2|2|2:0.5|0.5|0.5 -c:v copy input-chorus.mp4
Qué está hardcodeado y por qué: bastante. La configuración de 3 voces está fija: delays por voz 50|60|70 ms, decays por voz 0.4|0.32|0.28, in/out gain 0.5:0.9. Solo --depth y --speed se exponen, y ambos se aplican uniformemente a las tres voces.
Es una decisión deliberada de preset. Un chorus bien afinado depende del espaciado entre voces — si las tres tienen el mismo delay, obtenés un solo eco más grueso, no chorus. Si los delays están muy cerca (ej. 50|51|52), suena como un filtro de peine. El preset de fqmpeg (50|60|70 ms con decays descendentes) es un "chorus pop cálido" que funciona en voces, guitarra eléctrica y pads de sintetizador. No va a darte pads etéreos con dispersión estéreo amplia — eso necesita otro espaciado de voces y otras tasas de modulación por voz.
Cuando esto se te queda corto: invocá el filtro chorus directamente. Acepta cuentas arbitrarias de voces vía listas separadas por |:
ffmpeg -i input.wav -af "chorus=0.6:0.9:30|45|60|80:0.3|0.25|0.2|0.15:1.5|2|2.5|3:0.3|0.4|0.5|0.6" wide-chorus.wav
phaser — Aplicar efecto phaser de barrido
Combina la señal con una copia de sí misma con fase desplazada, produciendo el clásico barrido "whoosh".
- Fuente:
src/commands/phaser.js - Filtro:
aphaser=speed=<speed>:decay=<decay> - Salida:
<input-stem>-phaser.<ext>
| Opción | Default | Notas |
|---|---|---|
--speed <Hz> | 0.5 | Velocidad del LFO |
--decay <n> | 0.4 | Factor de decay (0.0-1.0); controla la intensidad de retroalimentación |
-o, --output <path> | <input-stem>-phaser.<ext> | — |
$ npx fqmpeg phaser input.mp4 --dry-run
ffmpeg -i input.mp4 -af aphaser=speed=0.5:decay=0.4 -c:v copy input-phaser.mp4
El filtro aphaser de FFmpeg tiene parámetros adicionales (in_gain, out_gain, delay, type para LFO sinusoidal vs triangular) que fqmpeg deja en los defaults del filtro — pasalos directo a aphaser=... crudo si querés barrido triangular u otro número de etapas.
flanger — Aplicar efecto flanger
Como phaser pero con un delay mucho más corto y modulado — da el barrido metálico de "motor a reacción" familiar del rock de fines de los 70.
- Fuente:
src/commands/flanger.js - Filtro:
flanger=speed=<speed>:depth=<depth>:width=<mix×100> - Salida:
<input-stem>-flanger.<ext>
| Opción | Default | Notas |
|---|---|---|
--speed <Hz> | 0.5 | Velocidad del LFO |
--depth <ms> | 2 | Profundidad de modulación |
--mix <n> | 0.7 | Mezcla dry/wet (0.0-1.0) — fqmpeg multiplica por 100 internamente |
-o, --output <path> | <input-stem>-flanger.<ext> | — |
$ npx fqmpeg flanger input.mp4 --dry-run
ffmpeg -i input.mp4 -af flanger=speed=0.5:depth=2:width=70 -c:v copy input-flanger.mp4
El mapeo --mix → width: el filtro flanger de FFmpeg llama a su parámetro wet/dry width y acepta 0-100. fqmpeg usa la convención más común --mix 0.0-1.0 y multiplica por 100 silenciosamente. Fue un bugfix de 3.0 — fqmpeg antes pasaba mix=0.7 directo al filtro, que lo ignoraba y corría con su default (100% wet — muchísimo). Corré con --dry-run para confirmar que --mix 0.7 produce width=70.
tremolo — Aplicar tremolo (oscilación de volumen)
Modula el volumen de salida con un LFO. Efecto clásico de amplificador de guitarra surf rock.
- Fuente:
src/commands/tremolo.js - Filtro:
tremolo=f=<freq>:d=<depth> - Salida:
<input-stem>-tremolo.<ext>
| Opción | Default | Notas |
|---|---|---|
--freq <Hz> | 5 | Frecuencia del LFO |
--depth <n> | 0.5 | Profundidad (0-1); más alta = oscilación de volumen más marcada |
-o, --output <path> | <input-stem>-tremolo.<ext> | — |
$ npx fqmpeg tremolo input.mp4 --dry-run
ffmpeg -i input.mp4 -af tremolo=f=5:d=0.5 -c:v copy input-tremolo.mp4
vibrato — Aplicar vibrato (oscilación de tono)
Modula el tono (no el volumen) con un LFO. Misma superficie de opciones que tremolo — no confundir.
- Fuente:
src/commands/vibrato.js - Filtro:
vibrato=f=<freq>:d=<depth> - Salida:
<input-stem>-vibrato.<ext>
| Opción | Default | Notas |
|---|---|---|
--freq <Hz> | 5 | Frecuencia del LFO |
--depth <n> | 0.5 | Profundidad (0-1); más alta = oscilación de tono más amplia |
-o, --output <path> | <input-stem>-vibrato.<ext> | — |
$ npx fqmpeg vibrato input.mp4 --dry-run
ffmpeg -i input.mp4 -af vibrato=f=5:d=0.5 -c:v copy input-vibrato.mp4
Tremolo vs vibrato: CLI idéntico, efecto opuesto. Si corriste tremolo y el resultado suena como si la fuente se marease (tono tambaleando) en vez de oscilar de volumen (sube y baja), llamaste accidentalmente a vibrato. Test rápido: con --depth 1.0 --freq 0.5, tremolo cicla entre silencio y volumen máximo cada 2 segundos; vibrato cicla entre tono bajo y alto.
Manipulación estéreo
audio-karaoke — Eliminar voces paneadas al centro
Resta el canal derecho del izquierdo y viceversa, cancelando todo lo que esté paneado idénticamente en ambos canales. Truco clásico de karaoke.
- Fuente:
src/commands/audio-karaoke.js - Filtro:
pan=stereo|c0=c0-c1|c1=c1-c0 - Opciones: ninguna — solo entrada y
-oopcional - Salida:
<input-stem>-karaoke.<ext>
$ npx fqmpeg audio-karaoke song.mp3 --dry-run
ffmpeg -i song.mp3 -af pan=stereo|c0=c0-c1|c1=c1-c0 -c:v copy song-karaoke.mp3
Las limitaciones honestas:
- Solo funciona con voces dead-center y secas. Si la voz tiene reverb, doubler, chorus o cualquier ensanchado estéreo en su propio bus, esos componentes wet sobreviven a la resta.
- Mata cualquier cosa paneada al centro, incluyendo bombo, bajo y caja. La mayoría de las mezclas pop panean los cuatro al centro, así que perdés la sección rítmica junto con la voz.
- Los masters modernos de streaming están muy procesados, y la suposición de "canal central" se rompe — típicamente vas a oír voz residual a -10 a -15 dB en vez de eliminación completa.
Para aislar/eliminar voces de forma creíble en pistas modernas, el único enfoque confiable es la separación de fuentes basada en ML (Spleeter, Demucs) — eso está fuera del alcance de FFmpeg.
audio-stereo-widen — Ensanchar la imagen estéreo
Añade un retardo corto tipo Haas entre canales para empujar el ancho percibido más allá de los parlantes.
- Fuente:
src/commands/audio-stereo-widen.js - Filtro:
stereowiden=delay=<delay> - Salida:
<input-stem>-wide.<ext>
| Opción | Default | Notas |
|---|---|---|
--delay <ms> | 20 | Retardo intercanal; más alto = más ancho pero más fase |
-o, --output <path> | <input-stem>-wide.<ext> | — |
$ npx fqmpeg audio-stereo-widen input.mp4 --dry-run
ffmpeg -i input.mp4 -af stereowiden=delay=20 -c:v copy input-wide.mp4
Advertencia de suma a mono: el truco de Haas depende de pequeños retardos intercanal, lo que significa que si tu salida se suma a mono (transmisión de radio, parlante de teléfono, auricular Bluetooth en modo mono), el retardo se vuelve un filtro de peine y el audio suena delgado y hueco. Verificá compatibilidad mono — usá una previsualización de downmix: ffmpeg -i input-wide.mp4 -ac 1 -t 10 -f null - y escuchá. Si el ensanchado es para un video online y no te importa la reproducción mono, ignoralo.
Recetas del mundo real
Calentar voz: levantar una pista de voz seca
Una grabación de voz seca suena clínica. Un toque de reverb y un muy ligero chorus agrega el pulido típico de intros de podcast y voces en off de YouTube — sin sonar procesado.
# Paso 1: chorus sutil para cuerpo (depth/speed muy ligeros)
npx fqmpeg chorus voice.wav --depth 1.5 --speed 0.3 -o voice-chorus.wav
# Paso 2: cola corta de reverb para sensación de habitación
npx fqmpeg reverb voice-chorus.wav --delay 60 --decay 0.3 -o voice-ready.wav
Por qué este orden: chorus primero engrosa la fuente, luego reverb coloca el resultado engrosado en una habitación pequeña. Al revés, cada voz del chorus tiene su propia cola de reverb — más turbio.
Capa de guitarra lo-fi: phaser + tremolo
Para un fondo de guitarra chillhop, capa el barrido de phaser sobre un pulso de tremolo:
# Barrido lento de phaser (ciclo largo)
npx fqmpeg phaser guitar.wav --speed 0.2 --decay 0.5 -o guitar-phaser.wav
# Pulso lento de tremolo encima (1 ciclo por segundo)
npx fqmpeg tremolo guitar-phaser.wav --freq 1 --depth 0.4 -o guitar-lofi.wav
El phaser provee el movimiento textural; el tremolo provee el pulso rítmico. Ambos a tasas lentas — la modulación rápida empuja esto de "lo-fi" a "cassette roto".
Efecto de diálogo radio AM
El clásico efecto de "voz por teléfono" necesita filtrado bandpass (en C9, no acá) más distorsión o eco. Combinar audio-bandpass con echo-effect es una aproximación rápida y creíble:
# Paso 1: filtro de banda telefónica (300-3400 Hz) — verbo de C9
npx fqmpeg audio-bandpass voice.wav --low 300 --high 3400 -o voice-band.wav
# Paso 2: eco corto y metálico
npx fqmpeg echo-effect voice-band.wav --delay 60 --decay 0.5 --repeats 2 -o voice-radio.wav
El diálogo de radio AM real también agrega clipeo de amplitud y ruido — para eso, irías a acrusher y anoisesrc de FFmpeg crudo. fqmpeg actualmente no expone ninguno.
Preguntas frecuentes
¿Por qué reverb es tan diferente de un plugin de reverb de un DAW real?
Porque internamente es un filtro aecho de un solo tap, no una reverb de respuesta al impulso ni una red Schroeder. Con --delay 40 --decay 0.5 obtenés una reflexión discreta a 40 ms, atenuada al 50% — suficiente para sugerir "habitación pequeña" si mezclás liviano, pero le falta el cluster denso de reflexiones tempranas y la cola difusa que define un espacio real. Para reverb creíble, cambiá a ffmpeg ... -af freeverb=... (si tu build lo trae) o convolución vía afir con un WAV de respuesta al impulso.
¿Puedo afinar chorus para que suene menos "cálido" y más "etéreo"?
No vía fqmpeg — la configuración de 3 voces (delays 50|60|70 ms, decays 0.4|0.32|0.28) está hardcodeada. Podés cambiar solo la profundidad y velocidad del LFO, que controla cuánto oscilan las 3 voces existentes, no cómo están espaciadas. Para un chorus etéreo/ancho (ej. 8 voces distribuidas 20-200 ms con bajo decay), llamá al filtro chorus de FFmpeg directamente con listas personalizadas separadas por |. Usá npx fqmpeg chorus input --dry-run para ver el formato, después editá las listas en una invocación manual de FFmpeg.
flanger --mix 0.7 parece producir width=70 — ¿es un bug?
No, es el comportamiento intencional. El filtro flanger subyacente de FFmpeg espera width=0-100 para wet/dry, pero la convención CLI común para "mix" es 0-1. fqmpeg acepta el formato 0-1 y multiplica por 100. Las versiones anteriores (pre-v3.0) pasaban mix=0.7 directo al filtro, que lo ignoraba silenciosamente y corría con su default (100% wet). La multiplicación es la corrección.
¿Cómo es vibrato diferente de audio-pitch (en C9)?
audio-pitch desplaza el tono por un número fijo de semitonos, aplicado uniformemente a toda la pista. vibrato oscila el tono arriba y abajo alrededor del original a una tasa elegida — el tono promedio no cambia. Usá audio-pitch para transponer una melodía a otra tonalidad; usá vibrato para hacer que una nota sostenida "brille".
¿Por qué audio-karaoke deja la voz parcialmente audible?
Asume que las voces están paneadas idénticamente en ambos canales estéreo (lo que las hace cancelar cuando restás uno del otro). La producción pop moderna rompe esta suposición: las voces a menudo tienen ensanchado estéreo, doublers, reverb y chorus en un bus estéreo — ninguno cancela. La batería, el bajo y otros elementos paneados al centro también se cancelan, así que lo que queda es un instrumental delgado + voz fantasma. Para eliminación de voz real, usá herramientas de separación de fuentes basadas en ML (Spleeter, Demucs, Moises) fuera de FFmpeg.
¿audio-stereo-widen se rompe en reproducción mono?
Sí, ese es su riesgo principal. El retardo intercanal tipo Haas (default 20 ms) crea relaciones de fase que sumadas a mono se vuelven un filtro de peine — el audio suena hueco y con muescas. Si tu salida final podría reproducirse en un solo parlante (parlantes inteligentes, altavoz de teléfono, Bluetooth mono, simulcast de radio AM), probá el downmix mono primero: ffmpeg -i input-wide.mp4 -ac 1 -t 10 mono-test.mp3. Si suena significativamente peor que la fuente, bajá --delay (probá 8-12 ms) o salteá el ensanchado para esa entrega.
¿Puedo encadenar múltiples verbos C10 en un solo pase de FFmpeg para evitar pérdida de generación?
No vía fqmpeg directamente — cada verbo produce su propia salida y reencoda. Para intermedios sin pérdida entre verbos, pasar -c:a copy no ayuda porque el filtro tiene que reencodear audio; en su lugar, encodea cada paso a un formato sin pérdida como FLAC o WAV con FFmpeg crudo, o copiá los strings de filtro de cada --dry-run y combinalos en una invocación de FFmpeg:
# Combinar chorus + reverb en un solo pase (filtros de --dry-run)
ffmpeg -i voice.wav -af "chorus=0.5:0.9:50|60|70:0.4|0.32|0.28:1.5|1.5|1.5:0.3|0.3|0.3,aecho=0.8:0.88:60:0.3" voice-warm.wav
Tremolo y vibrato tienen los mismos flags — ¿cómo recuerdo cuál es cuál?
Una mnemotécnica: tremolo modula volumen (pensá en "tembla la sonoridad" — una nota sostenida que pulsa); vibrato modula tono (pensá en "vibra la cuerda" — una nota sostenida que ondula en tono). Mismos --freq y --depth, sensación musical opuesta.
Cierre
Los nueve verbos de C10 cubren las operaciones de efecto creativo más comunes a las que recurrirías entre EQ/dinámica (C9) y entrega final:
reverb,echo-effectpara profundidad basada en tiempo (la reverb de un tap es honesta sobre ser unaechode 1 tap; el decaimiento geométrico de echo es el modelo físico natural)chorus,phaser,flanger,tremolo,vibratopara modulación LFO (chorus tiene la maquinaria más oculta — el preset de 3 voces es hardcodeado e intencional; tremolo y vibrato comparten superficie de opciones pero hacen cosas completamente diferentes)audio-karaoke,audio-stereo-widenpara trucos de campo estéreo (karaoke solo funciona con voces secas paneadas al centro; widen se rompe en reproducción mono)
Cada verbo imprime su invocación FFmpeg subyacente con --dry-run, así que cuando la superficie simplificada no alcanza (chorus de 8 voces personalizado, ecos estéreo ping-pong, barrido triangular de phaser), copiá el filtro, editá los parámetros y llamá a FFmpeg directamente. Para el mapa completo de fqmpeg, ver la fqmpeg complete guide.