Saltearse al contenido

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

  1. 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.
  2. Dominar la física del Comb Filter (Filtro Peine): Deducir por qué una cancelación de fase periódica a intervalos Δt\Delta t produce una serie armónica de muescas infinitas espaciadas por f=1Δtf = \frac{1}{\Delta t}.
  3. Desentrañar la modulación temporal continua:
    • Flanger: Tiempos ultracortos (0.1 ms…10 ms0.1\text{ ms} \dots 10\text{ ms}) con realimentación intensa (feedback).
    • Chorus: Tiempos intermedios (10 ms…35 ms10\text{ ms} \dots 35\text{ ms}) con múltiples líneas de retardo desfasadas.
    • Echo / Delay Estándar: Tiempos rítmicos perceptibles (>50 ms> 50\text{ ms}).
  4. 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 dτdt\frac{d\tau}{dt}.

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 O(N)\mathcal{O}(N) 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:

index_read=(index_write−D)(modN)\text{index\_read} = (\text{index\_write} - D) \pmod N

donde NN es la capacidad máxima del buffer en muestras y DD es el retardo deseado en muestras:

D=τms1000⋅fsD = \frac{\tau_{\text{ms}}}{1000} \cdot f_s

FIG 3.8 · Arquitectura de Memoria Temporal: Buffer Circular (Ring Buffer)


2. La Ecuación Matemática del Comb Filter (Filtro Peine)

A. Filtro Peine Feedforward (FIR)

y[n]=x[n]+b⋅x[n−D]y[n] = x[n] + b \cdot x[n - D]

  • Si b=1b = 1, se producen cancelaciones completas (muescas) en: fnotch=(2k+1)2Δt=fs2D,3fs2D,5fs2D,…f_{\text{notch}} = \frac{(2k + 1)}{2 \Delta t} = \frac{f_s}{2D}, \frac{3f_s}{2D}, \frac{5f_s}{2D}, \dots

B. Filtro Peine Feedback (IIR)

y[n]=x[n]+g⋅y[n−D]y[n] = x[n] + g \cdot y[n - D]

  • Produce resonancias agudas (peaks) en frecuencias múltiplos enteros exactos: fres=kΔt=k⋅fsDf_{\text{res}} = \frac{k}{\Delta t} = \frac{k \cdot f_s}{D}
  • Condición Estricta de Estabilidad: El coeficiente de realimentación debe cumplir estrictamente ∣g∣<1.0|g| < 1.0. Si ∣g∣≥1.0|g| \ge 1.0, 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

EfectoRango de Retardo (τ\tau)Feedback (gg)Modulación LFOFenómeno Acústico
Flanger0.5 ms…10 ms0.5\text{ ms} \dots 10\text{ ms}Alto (0.7…0.950.7 \dots 0.95)LFO senoidal 0.1…1 Hz0.1 \dots 1\text{ Hz}Efecto “jet plane”, barrido armónico resonante
Chorus10 ms…35 ms10\text{ ms} \dots 35\text{ ms}Moderado / Nulo (0…0.30 \dots 0.3)LFO multi-fase 1…3 Hz1 \dots 3\text{ Hz}Desdoblamiento de voces, desafinación natural
Delay / Echo>50 ms> 50\text{ ms}Variable (0…0.80 \dots 0.8)Generalmente estático o wow/flutterRepeticiones rítmicas discretas separadas del sonido directo

El Efecto Doppler y la Interpolación Hermite en tapout~

Cuando el tiempo de retardo τ(t)\tau(t) cambia dinámicamente:

  • Si τ\tau se acorta (dτdt<0\frac{d\tau}{dt} < 0), las muestras se leen más rápido de lo que entran   ⟹  \implies el tono sube.
  • Si τ\tau se alarga (dτdt>0\frac{d\tau}{dt} > 0), las muestras se leen más despacio   ⟹  \implies 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ón
typedef 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;
}


4. Reverberación Algorítmica: Filtros Todo-Paso (Allpass) y Redes FDN

(Basado en Manfred Schroeder, Julius O. Smith y Curtis Roads, The Computer Music Tutorial)

Cuando intentamos simular la acústica de una sala real interconectando simples líneas de retardo con retroalimentación ([comb~]), el sonido adquiere rápidamente una coloración metálica y estridente. Esto se debe a que un filtro de peine posee picos resonantes equidistantes (comb modes) que refuerzan ciertas frecuencias y anulan otras.

4.1. El Filtro Todo-Paso (Allpass Filter) de Schroeder

Para crear densidad de ecos y difusión espacial sin alterar el equilibrio tonal del sonido original, Manfred Schroeder diseñó el filtro todo-paso (Allpass): H(z)=−g+z−D1−g⋅z−DH(z) = \frac{-g + z^{-D}}{1 - g \cdot z^{-D}}

FIG 3.8B · Topología del Filtro Todo-Paso (Allpass) en Celosía

Propiedad Psicoacústica Fundamental:

La respuesta en frecuencia en magnitud de un filtro Allpass es rigurosamente plana para todo el espectro audible: ∣H(ejω)∣=1.0∀ω|H(e^{j\omega})| = 1.0 \quad \forall \omega No añade ecualización ni colorea el timbre, pero dispersa las fases relativas de los armónicos a lo largo del tiempo. En Max se implementa con el objeto nativo [allpass~]. Encadenar 3 o 4 filtros Allpass con tiempos de retardo primos relativos (ej. 5 ms, 1.7 ms, 0.6 ms) transforma un transitorio percusivo filoso en una ráfaga difusa de micro-reflexiones.

4.2. Redes de Retardo con Retroalimentación (Feedback Delay Networks - FDN)

Para construir reverberaciones de sala hiper-densas sin modos estacionarios, el estándar moderno (desarrollado por Jean-Marc Jot en el IRCAM y Julius O. Smith en CCRMA) consiste en una FDN:

  1. Un banco de NN líneas de retardo paralelas (N=4,8,16N = 4, 8, 16) con tiempos de retardo mutuamente primos para prevenir colisiones periódicas.
  2. Cada salida pasa por un filtro paso-bajos de absorción de aire ([onepole~]) para modelar la amortiguación natural de altas frecuencias con la distancia.
  3. Las NN señales de realimentación se multiplican por una matriz unitaria de rotación (Hadamard / Householder) antes de reinyectarse en las entradas, garantizando recirculación infinita de energía con preservación del headroom y difusión tridimensional estéreo.

5. Escenarios Reales de Producción y Modelado Acústico

  1. Ping-Pong Delay Estéreo: Dos líneas de tapin~ cruzadas con retroalimentación alternada de canal izquierdo a derecho para ensanchamiento psicoacústico.
  2. 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).
  3. Flanger Thru-Zero (Modelado de Jean-Michel Réveillac): Retrasar la señal directa por un tiempo estático τ0=5 ms\tau_0 = 5\text{ ms} mientras la línea modulada oscila entre 0 ms0\text{ ms} y 10 ms10\text{ ms}. Cuando ambos retardos coinciden exactamente en τ(t)=τ0\tau(t) = \tau_0, la resta de señales en contrafase produce una cancelación destructiva absoluta en todas las frecuencias (y[n]=x[n−τ0]−x[n−τ0]≡0y[n] = x[n - \tau_0] - x[n - \tau_0] \equiv 0). Este “paso por el cero absoluto” es la firma acústica inimitable del flanger de cinta analógico clásico de Abbey Road.
  4. 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: faparente=f0⋅(cc±vrotor)f_{aparente} = f_0 \cdot \left( \frac{c}{c \pm v_{rotor}} \right) 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 90∘90^\circ respecto al modulador de retardo.
  5. Resonador Karplus-Strong Básico: Un tapin~ de 5 ms excitado con una ráfaga de 5 ms de noise~ y realimentado con g=0.98g = 0.98 produce una cuerda pulsada acústica convincente.
  6. Líneas Todo-Paso Moduladas Estocásticamente (Drunk Schroeder): En reverberadores canónicos de Schroeder, los filtros Allpass pueden generar timbres metálicos estáticos si los tiempos de retardo son fijos. Aplicar una caminata aleatoria continua (random walk) a la longitud del retardo —como ejemplifica or.drunkSchroeder de Oscar Recarte— dispersa los modos resonantes, introduce micro-desplazamientos de frecuencia Doppler y ensancha el panorama estéreo de forma orgánica sin perder la respuesta plana en magnitud.

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 1.21.2, 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 0.5 Hz0.5\text{ Hz} con un desfase de 90∘90^\circ y 180∘180^\circ 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 T=1000f0 msT = \frac{1000}{f_0}\text{ ms} y colocá un filtro paso-bajo de un polo (y[n]=0.5x[n]+0.5x[n−1]y[n] = 0.5 x[n] + 0.5 x[n-1]) 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.