Lección 3.7: Delays, Buffers Circulares y Modulación Temporal: tapin~, tapout~, Comb Filters, Flanger y Chorus
“El tiempo en audio no es una constante inmutable; es una cinta elástica. Si retrasás una señal unos pocos milisegundos y la sumás consigo misma, obtenés un filtro peine. Si modulás ese tiempo con un LFO, hacés cantar a la física mediante el efecto Doppler.”
— Curtis Roads, The Computer Music Tutorial
Objetivos Pedagógicos y de Ingeniería
- Comprender la arquitectura de memoria de un Ring Buffer Circular: Explicar los punteros de lectura y escritura (
write_ptr,read_ptr), el operador módulo () y por qué no se reasigna memoria en tiempo real durante la ejecución de audio. - Dominar la física del Comb Filter (Filtro Peine): Deducir por qué una cancelación de fase periódica a intervalos produce una serie armónica de muescas infinitas espaciadas por .
- Desentrañar la modulación temporal continua:
- Flanger: Tiempos ultracortos () con realimentación intensa (feedback).
- Chorus: Tiempos intermedios () con múltiples líneas de retardo desfasadas.
- Echo / Delay Estándar: Tiempos rítmicos perceptibles ().
- Dominar la interpolación no entera y el Efecto Doppler: Explicar por qué modular el tiempo de retardo en
[tapout~]produce variaciones de afinación proporcionales a la derivada temporal .
1. Fundamentos Teóricos: El Buffer Circular (Ring Buffer)
En DSP en tiempo real, almacenar audio para retrasarlo no puede hacerse desplazando todo un arreglo de memoria (lo cual tendría un costo por muestra y destruiría la caché de la CPU). En su lugar, se reserva un bloque fijo de memoria contigua en RAM y se emplean punteros rotativos:
donde es la capacidad máxima del buffer en muestras y es el retardo deseado en muestras:
[ Buffer Circular en RAM (N muestras) ] .--- [0] ---. / \ [N-1] [1] <-- Write Pointer (Avanza a fs) | | [N-2] [2] \ / <-- Read Pointer (D muestras detrás) '--- [...] -'2. La Ecuación Matemática del Comb Filter (Filtro Peine)
A. Filtro Peine Feedforward (FIR)
- Si , se producen cancelaciones completas (muescas) en:
B. Filtro Peine Feedback (IIR)
- Produce resonancias agudas (peaks) en frecuencias múltiplos enteros exactos:
- Condición Estricta de Estabilidad: El coeficiente de realimentación debe cumplir estrictamente . Si , el buffer acumula energía infinita en cada ciclo, colapsando el sistema en saturación permanente.
3. La Tríada Temporal: Flanger, Chorus y Echo
| Efecto | Rango de Retardo () | Feedback () | Modulación LFO | Fenómeno Acústico |
|---|---|---|---|---|
| Flanger | Alto () | LFO senoidal | Efecto “jet plane”, barrido armónico resonante | |
| Chorus | Moderado / Nulo () | LFO multi-fase | Desdoblamiento de voces, desafinación natural | |
| Delay / Echo | Variable () | Generalmente estático o wow/flutter | Repeticiones rítmicas discretas separadas del sonido directo |
El Efecto Doppler y la Interpolación Hermite en tapout~
Cuando el tiempo de retardo cambia dinámicamente:
- Si se acorta (), las muestras se leen más rápido de lo que entran el tono sube.
- Si se alarga (), las muestras se leen más despacio el tono baja.
[tapout~] realiza internamente una interpolación polinómica de 4 puntos (cúbica/Hermite) entre muestras discretas para permitir valores no enteros de retardo sin generar distorsión granular de redondeo.
4. Bajo el Capó: Análisis en C del Par tapin~ y tapout~
En el SDK de Max (ext_obex.h y z_dsp.h), tapin~ actúa como el dueño del bloque de memoria (t_delayline), mientras que múltiples tapout~ se enlazan como lectores concurrentes de ese mismo puntero de memoria compartida:
// Modelo conceptual de cómo tapout~ lee de tapin~ con interpolacióntypedef struct _delayline { double *buffer; long size; // Tamaño máximo en muestras long write_ptr; // Puntero de escritura global} t_delayline;
double read_tapout(t_delayline *dl, double delay_samples) { long w = dl->write_ptr; double r = (double)w - delay_samples; while (r < 0.0) r += dl->size;
long r_int = (long)r; double frac = r - (double)r_int;
// Interpolación lineal básica (tapout~ usa cúbica para fidelidad de 64 bits) long idx1 = r_int % dl->size; long idx2 = (idx1 + 1) % dl->size;
return dl->buffer[idx1] * (1.0 - frac) + dl->buffer[idx2] * frac;}5. Escenarios Reales de Producción y Modelado Acústico
- Ping-Pong Delay Estéreo: Dos líneas de
tapin~cruzadas con retroalimentación alternada de canal izquierdo a derecho para ensanchamiento psicoacústico. - Emulador de Cinta Analógica (Tape Delay): Un delay con un filtro paso-bajo (
lores~ 2500.) en la rama de realimentación y una micro-modulación aleatoria (noise~pasado por filtro lento) para simular el estiramiento mecánico de la cinta (wow & flutter). - Flanger Thru-Zero (Modelado de Jean-Michel Réveillac): Retrasar la señal directa por un tiempo estático mientras la línea modulada oscila entre y . Cuando ambos retardos coinciden exactamente en , la resta de señales en contrafase produce una cancelación destructiva absoluta en todas las frecuencias (). Este “paso por el cero absoluto” es la firma acústica inimitable del flanger de cinta analógico clásico de Abbey Road.
- Simulación Física del Altavoz Rotativo Leslie (Efecto Doppler + Difracción AM):
Como detalla Réveillac en Musical Sound Effects, un altavoz Leslie no es un simple vibrato:
- Modulación de Frecuencia (FM por Efecto Doppler): El giro de la bocina respecto al oyente provoca un corrimiento de frecuencia continuo:
Esto se modela en Max modulando el tiempo de retardo de un
[tapout~]mediante un oscilador senoidal[cycle~]. - Modulación de Amplitud (Tremolo por Difracción): Simultáneamente, el patrón de radiación direccional del rotor atenúa la señal cuando la bocina apunta hacia la parte trasera del gabinete. En Max se multiplica la señal por un segundo
[cycle~]desfasado respecto al modulador de retardo.
- Modulación de Frecuencia (FM por Efecto Doppler): El giro de la bocina respecto al oyente provoca un corrimiento de frecuencia continuo:
Esto se modela en Max modulando el tiempo de retardo de un
- Resonador Karplus-Strong Básico: Un
tapin~de 5 ms excitado con una ráfaga de 5 ms denoise~y realimentado con produce una cuerda pulsada acústica convincente.
6. Desafíos de Ingeniería
Desafío 1: El Limitador de Seguridad Anti-Explosión
Diseñá una subpatch en la ruta de realimentación de [tapout~] que utilice [clip~ -0.99 0.99] o [tanh~] para garantizar que, incluso si el usuario sube el deslizador de feedback a , el sistema jamás sature al punto de mandar valores infinitos a los parlantes.
Desafío 2: Chorus Estéreo Cuádruple con LFO en Cuadratura
Construí un procesador de Chorus con 4 [tapout~] conectados a un único [tapin~], modulados por dos LFOs de con un desfase de y para lograr una imagen estéreo ultradensa sin cancelaciones de fase al colapsar a mono.
Desafío 3: Karplus-Strong con Damping de Cerdas
Implementá el algoritmo Karplus-Strong afinado con un tapout~ de tiempo y colocá un filtro paso-bajo de un polo () en el lazo para simular el decaimiento natural más rápido de los armónicos agudos respecto a los graves.
7. Laboratorio Práctico: laboratorio_13_delays.maxpat
Abrí el parche interactivo para explorar:
- Matriz completa de retardo conmutable en tiempo real: Comb Filter Resonante, Flanger con modulación LFO senoidal y Stereo Tape Delay con feedback filtrado.
- Visualización en osciloscopio dual de señal seca vs señal procesada modulada.
- Control de seguridad con headroom protegido para evitar explosiones acústicas.