cdp-playground · parte 2

Cambiar la unidad

La parte 1 rompió la soldadura entre tono y tiempo saliendo del dominio temporal. No hacía falta. Alcanzaba con dejar de trabajar sobre la muestra y elegir una unidad más grande. Esta parte lo rompe tres veces más sin usar una sola FFT — y después muestra que una única operación se come dos de los cuatro mecanismos.

Duración
3 horas
Requisito
La parte 1, o al menos sus módulos 2, 3 y 5
Herramientas
CDP 7.1, ffmpeg, un editor de texto
Te llevás
Una reverb que escribiste vos, en un archivo que podés mirar
Tres espectrogramas a la misma escala de tiempo: arriba cuatro pulsos apretados en el primer octavo del ancho, en el medio los mismos cuatro ocupando un tercio, abajo los mismos cuatro ocupando todo el ancho, con las bandas de frecuencia a la misma altura en las tres calles
Un mismo sonido, tres duraciones: 0,498 s · 2,000 s · 5,985 s. Las tres calles están dibujadas a la misma escala de tiempo y las bandas de frecuencia están a la misma altura: el tono no se movió ni un semitono. Ninguna de las tres operaciones toca la FFT. distort telescope arriba, la fuente en el medio, distort interpolate abajo.

01 La idea

En la parte 1 el módulo 2 dejó una frustración plantada a propósito: en el dominio del tiempo, la velocidad y el tono son un par soldado. Leer las muestras a otro ritmo mueve las dos cosas en proporción exacta, y no hay flag que las separe. El módulo 6 pagó esa deuda saliendo del dominio del tiempo: análisis, estirar frames espectrales, resíntesis.

Esa solución funciona y es la que usa todo el software moderno. Pero la conclusión que la mayoría se lleva de ahí es falsa. La conclusión no es "hay que ir al dominio de la frecuencia". Es esta:

Y hay un segundo movimiento, que llega en el módulo 3 y es el más grande de las dos partes. Los mecanismos 2 y 3 de la parte 1 — desplazar una copia en el tiempo, seleccionar frecuencias — parecían independientes. No lo son: los dos son la misma operación con distinto argumento, y ese argumento es un archivo de audio que podés dibujar, mirar y escribir a mano. Cuando eso encaja, la parte 1 se reorganiza sola.

02 Preparación

La instalación es la de la parte 1 y no cambió: bajar el release de SoundThread, destarear el cdprogs_linux.tar.gz que viene adentro, exportar el PATH. Está en la sección 02 de la parte 1.

Dos fuentes, no una

Esta parte necesita dos sonidos, y que sean lo más distintos posible en dos cosas concretas: la envolvente y el tono. El módulo 4 interpola esas dos cosas por separado, y si las fuentes se parecen no se ve nada.

# A: percusivo, 330 Hz, cuatro golpes con decaimiento
ffmpeg -f lavfi -i "aevalsrc='0.6*exp(-9*mod(t,0.5))*(sin(2*PI*330*t)\
+0.5*sin(2*PI*660*t)+0.25*sin(2*PI*990*t))':d=2:s=44100" \
  -ac 1 -c:a pcm_s16le a.wav

# B: sostenido, 165 Hz, cuatro parciales, amplitud constante
ffmpeg -f lavfi -i "aevalsrc='0.45*(sin(2*PI*165*t)+0.6*sin(2*PI*330*t)\
+0.4*sin(2*PI*495*t)+0.25*sin(2*PI*660*t))':d=2:s=44100" \
  -af "afade=t=in:d=0.02,afade=t=out:st=1.98:d=0.02" \
  -ac 1 -c:a pcm_s16le b.wav
  1. A percusivo · 330 Hz RMS −15,8 dB
  2. B sostenido · 165 Hz una octava abajo

Si el grupo trae material propio, la regla es la misma: uno con ataque y otro sostenido. Y ojo con una restricción nueva: casi todo distort exige mono y lo dice en el uso. Si tu fuente es estéreo, channelx separa los canales.

El footgun nuevo: nada de puntos en los directorios

Este merece su propio subtítulo porque cuesta media hora encontrarlo. Varios programas de CDP — modify brassage entre ellos — trabajan con archivos intermedios, y construyen el nombre del temporal insertando _cdptemp1 antes del primer punto de la ruta completa. No del nombre del archivo: de la ruta entera.

T="$(mktemp -d)"          # crea algo como /tmp/tmp.qolFSC
modify brassage 5 "$T/a.wav" "$T/g.wav" 0.5
ERROR: INVALID DATA
ERROR: Cannot open output file /tmp/con_cdptemp1.qolFSC/g.wav

El error habla de un directorio que nunca escribiste y que no existe. Y lo peor: mktemp -d genera por defecto una plantilla con punto, tmp.XXXXXXXX, así que la forma estándar de hacer un directorio temporal en un script es exactamente la que rompe CDP. Puntos en el nombre del archivo no molestan; en los directorios sí.

T="$(mktemp -d /tmp/cdpXXXXXX)"   # sin punto, funciona

03 Las cinco escalas

El mapa de esta parte no son mecanismos, son tamaños de unidad. Todo lo que sigue es elegir uno y aplicarle los mismos cuatro verbos de siempre: tirar, repetir, reordenar, promediar.

UnidadTamaño¿Tiene tono?En CDP
Muestra0,023 msNomodify speed, modify loudness
Ciclo waveset1 a 10 msSí, es el tonodistort
Grano10 a 100 msSí, y timbremodify brassage
Evento0,1 a 2 sSí, y articulaciónsubmix, sfedit
TexturasegundosSí, y armoníatexture

La columna del medio es la que importa. Una muestra sola no tiene tono: es un número. El tono aparece recién cuando hay un patrón que se repite, o sea a partir del ciclo. Por eso operar sobre muestras no puede separar tono de tiempo — no hay ninguna entidad en el modelo que sepa qué es el tono. Subí un escalón y la separación es gratis.

Los cuatro verbos, en cualquier escala

  • Tirar unidades → distort omit, densidad de grano baja
  • Repetir unidades → distort interpolate, timestretch granular
  • Reordenar unidades → distort shuffle, brassage scramble
  • Promediar unidades → distort average, blur blur en la parte 1

Cómo ubicar un efecto que no conocés

  • ¿Suena metálico, robótico, con zumbido? Escala del ciclo. Los artefactos del waveset tienen un tono propio
  • ¿Suena nublado, texturado, como una nube de partículas? Escala del grano
  • ¿Suena como el mismo sonido en otro lugar? Convolución, y el lugar está en un archivo
  • ¿Suena como dos cosas que se volvieron una? Dos fuentes, y hay que elegir en qué escala mezclarlas

04 El taller

Siete módulos, 3 horas. Igual que en la parte 1: cada módulo tiene una escala, algo que hacés, y el momento en que encaja. Los números de este sitio salen todos de correr los comandos.

HoraMinMóduloProgramaEscala
0:00150 · Contar la unidaddistort cyclecntciclo
0:15301 · La escala del ciclodistort ×5ciclo
0:45302 · La escala del granomodify brassagegrano
1:1510pausa
1:25353 · Convoluciónfastconvtodas
2:00254 · Dos fuentes, dos escalasdistort interact, morphciclo y espectro
2:25155 · El parámetro como funciónbreakpoint files
2:40206 · Compartir

Módulo 0

Contar la unidad

15 min

Escala El ciclo, y cómo se define

Un programa que no hace nada y enseña todo. Solo cuenta:

distort cyclecnt a.wav
distort cyclecnt b.wav
659 cycles found.        ← a.wav, 330 Hz, 2 s
329 cycles found.        ← b.wav, 165 Hz, 2 s

Antes de explicar nada, que el grupo mire esos dos números al lado de las dos frecuencias. 330 × 2 = 660. 165 × 2 = 330. Los conteos son 659 y 329.

O sea: lo que CDP llama «waveset» es el período. Un waveset es el tramo entre dos cruces por cero en la misma dirección, y en un sonido periódico eso es exactamente un ciclo de la fundamental. cyclecnt es, sin proponérselo, un medidor de tono: contás y dividís por la duración.

El momento La unidad no se la inventó nadie: está en la señal. Los cruces por cero ya estaban ahí, gratis, sin FFT y sin ventana de análisis. Todo el módulo que sigue se apoya en eso, y también todos sus artefactos: cuando el sonido no es periódico — ruido, un acorde, una consonante — los cruces por cero dejan de coincidir con nada musical, y ahí es donde distort se vuelve raro. Eso no es un bug, es el mapa de cuándo la herramienta aplica.

Módulo 1

La escala del ciclo

30 min

Escala 1 a 10 ms · la familia distort

Los mismos verbos de siempre, aplicados a ciclos en vez de a archivos. Tirar uno de cada dos, dar vuelta grupos de ocho:

distort omit    a.wav omit.wav  1 2      # tirar 1 de cada 2 ciclos
distort reverse a.wav rev.wav   8        # dar vuelta grupos de 8 ciclos
Dos formas de onda apiladas: arriba cuatro pulsos suaves, abajo los mismos cuatro pulsos con el contorno aserrado y menor amplitud
distort omit 1 2: la mitad de los ciclos reemplazados por silencio. El contorno queda aserrado y el nivel baja de −15,8 a −18,8 dB, o sea 3 dB — exactamente la mitad de la energía. Pero la duración no se movió y el tono tampoco: sigue en 329,7 Hz. Tiraste la mitad del archivo y el sonido sigue afinado.

Ahí ya hay algo raro que conviene señalar. Sacar la mitad de las muestras alternadas por ciclo no cambia el tono, porque el patrón de repetición sigue estando cada 3,03 ms. Sacar la mitad de las muestras de cualquier otra forma sí lo cambiaría. La unidad protege la frecuencia.

Y ahora la deuda del módulo 2 de la parte 1

distort telescope   a.wav corto.wav 4    # 4 ciclos colapsan en 1
distort interpolate a.wav largo.wav 3    # cada ciclo se repite 3 veces
SalidaDuraciónPicoDuración ×Tono ×
a.wav2,000 s329,7 Hz1,0001,000
corto.wav0,498 s329,1 Hz0,2490,998
largo.wav5,985 s329,7 Hz2,9921,000
Tres espectrogramas a la misma escala de tiempo con anchos crecientes de uno a doce, y las bandas de frecuencia a la misma altura en las tres
Las tres duraciones a una sola escala de tiempo: anchos en relación 1 : 4 : 12, bandas de frecuencia a la misma altura. El reproductor toca la versión corta, 0,498 s. Comparalo con la figura del módulo 6 de la parte 1: es el mismo resultado, y acá no hay ni análisis ni resíntesis.

Comparalo con el módulo 6 de la parte 1, que para estirar ×4 necesitó pvoc anal, stretch time, pvoc synth, un archivo intermedio 16 veces más grande y 0,12 s de cómputo. Acá es un comando, un entero, sin archivo intermedio, y va en las dos direcciones.

La contra es real y hay que decirla: esto suena distinto. stretch time conserva el timbre y suena "suave"; interpolate repite ciclos idénticos y por eso se vuelve estático y un poco metálico, porque un ciclo repetido tres veces es, literalmente, una onda perfectamente periódica. La parte 1 gastó 16× de disco comprando naturalidad.

Un lenguaje diminuto

distort shuffle a.wav shuf.wav abcd-adbc -c2

Ese abcd-adbc es el parámetro entero, y es un lenguaje. A la izquierda del guion, un dominio: cuatro grupos consecutivos de ciclos, llamados a, b, c, d. A la derecha, la imagen: el orden en que salen. Podés reordenar (abcd-adbc), duplicar (abcd-aabbccdd) u omitir (abcd-ac). -c2 dice que cada letra son 2 ciclos.

  1. abcd-adbc permutación 1,988 s · 329,7 Hz

    Reordenar ciclos no cambia ni la duración ni el tono. Cambia el timbre.

  2. grupos de 8 reverse por ciclo RMS idéntico

    distort reverse 8: mismo RMS que la fuente, −15,8 dB. No se agregó ni se quitó nada.

Que alguien note en voz alta lo que es ese parámetro: una notación para escribir permutaciones, metida dentro de un argumento de línea de comandos. No es un número ni una bandera. Es sintaxis, con un dominio y una imagen — el vocabulario exacto con el que se define una función en matemática.

El momento Tirar, repetir y reordenar la unidad correcta hace, sin FFT y sin ventanas, casi todo lo que en la parte 1 costó cambiar de representación. El dominio espectral no era el requisito: era una opción, con su propio precio en disco y su propio color. Y el criterio para elegir entre las dos deja de ser "cuál es la buena" y pasa a ser "qué artefacto quiero".

Módulo 2

La escala del grano

30 min

Escala 10 a 100 ms · modify brassage

Un escalón más arriba. Un grano son decenas de milisegundos: ya no es un ciclo, es un pedacito de sonido con timbre propio y ataque propio. modify brassage corta la fuente en granos y los vuelve a pegar, y sus siete modos son siete formas de pegarlos.

modify brassage 5 a.wav gran.wav  0.5     # GRANULATE: densidad
modify brassage 2 a.wav lento.wav 0.25    # TIMESTRETCH: velocidad
modify brassage 1 a.wav agudo.wav 7       # PITCHSHIFT: semitonos
SalidaDuraciónPicoDuración ×Tono ×
a.wav2,000 s329,7 Hz1,0001,000
gran.wav1,873 s324,3 Hz0,9370,984
lento.wav7,604 s335,1 Hz3,8021,016
agudo.wav1,928 s507,4 Hz0,9641,539

Las dos filas resaltadas son el par espejo, y conviene ponerlas una al lado de la otra en el pizarrón. lento.wav dura casi cuatro veces más con el tono quieto. agudo.wav sube 7 semitonos — factor 1,539, y 27/12 = 1,498 — con la duración quieta. Las dos direcciones del desacoplamiento, con el mismo programa, en el dominio del tiempo.

Fijate en el detalle del parámetro del modo 2: no se llama timestretch, se llama velocity, y es la velocidad de avance en el archivo de entrada relativa a la salida. Es el inverso del estiramiento. Esa elección de unidad no es un capricho:

modify brassage 6 a.wav congelado.wav 0 2 60 0 1 0.5 5 5 -l6

Velocidad de avance: 0

Entrada: 2,000 s → salida: 6,275 s

Estiramiento: infinito

Con velocidad cero el programa no avanza nunca en la entrada: sigue tomando granos del mismo instante para siempre. Eso es el freeze, y es la razón por la que el parámetro es velocidad y no factor de estiramiento — un factor de estiramiento infinito no se puede escribir, una velocidad de cero sí. Por eso también -l pasa a ser obligatorio: sin avance no hay final del archivo, y alguien tiene que decidir cuándo parar. Sin ese flag el programa aborta.

Tres espectrogramas a la misma escala: arriba cuatro pulsos en el primer tercio, en el medio los mismos pulsos deshechos en vetas verticales finas con silencios, abajo una textura continua que ocupa todo el ancho
Arriba la fuente, 2,000 s. En el medio brassage 5 con densidad 0,5: los pulsos deshechos en granos, con silencio entre grano y grano — densidad menor a 1 deja huecos. Abajo el congelado: 6,275 s de material continuo sacados de 2 segundos, y podrían haber sido 600.
  1. densidad 0,5 granulado RMS −17,7 dB
  2. velocity 0,25 estirado ×3,8 tono ×1,016
  3. +7 st transpuesto duración ×0,964

El momento Ese 0.5 de densidad es el mismo tipo de perilla que el delay del módulo 3 de la parte 1: una sola escala de tiempo que, barrida, produce efectos con nombres distintos. Granos de 5 ms es distorsión; de 50 ms, textura granular; de 200 ms, un eco rítmico; de 2 s, un collage. Y con densidad mayor a 1 los granos se superponen y aparece la reverb. Los catálogos de plugins venden esas cinco cosas en cinco cajas separadas. Son un parámetro.

Módulo 3

Convolución

35 min — el módulo central

Concepto Una operación se come dos mecanismos

Cambio de tema aparente. fastconv toma dos archivos: una señal y una respuesta al impulso. Vamos a construir la respuesta al impulso a mano, con ffmpeg, y a mirarla.

Empezamos por el caso más tonto posible: un impulso de una sola muestra en 1,0.

ffmpeg -f lavfi -i "aevalsrc='lt(t,1/44100)':d=0.01:s=44100" \
  -ac 1 -c:a pcm_s16le imp_id.wav

fastconv a.wav imp_id.wav salida.wav

Correlación entre la salida y la fuente: 0,999997

Error máximo, normalizado: 0,00137

Un impulso de una muestra es la identidad

Guardá eso, porque significa que la operación tiene un elemento neutro y por lo tanto vale la pena preguntarse qué hacen los demás. Ahora tres impulsos más, todos escritos a mano:

S=44100
# dos picos separados 100 ms
ffmpeg -f lavfi -i "aevalsrc='lt(t,1/$S)+0.6*between(t,0.1,0.1+1/$S)':d=0.12:s=$S" \
  -ac 1 -c:a pcm_s16le imp_delay.wav

# 64 muestras iguales que suman 1
ffmpeg -f lavfi -i "aevalsrc='(1/64)*lt(t,64/$S)':d=0.01:s=$S" \
  -ac 1 -c:a pcm_s16le imp_lopass.wav

# 600 ms de ruido que decae
ffmpeg -f lavfi -i "anoisesrc=c=white:d=0.6:r=$S:a=0.9" \
  -af "afade=t=out:st=0:d=0.6:curve=exp" -ac 1 -c:a pcm_s16le imp_reverb.wav
Tres formas de onda apiladas: arriba un solo pico vertical a la izquierda, en el medio dos picos separados con el segundo más bajo, abajo un bloque macizo corto a la izquierda
Tres respuestas al impulso, ventana de 150 ms en las tres. Arriba: un pico. En el medio: dos picos separados 100 ms. Abajo: 64 muestras seguidas, o sea 1,45 ms — apenas un bloquecito. Los picos dibujados están ensanchados a 40 muestras y llevados a amplitud plena para que se vean; el impulso que se convoluciona es de una muestra y suma 1.
Una forma de onda: una ráfaga de ruido que empieza fuerte a la izquierda y decae hasta apagarse hacia la derecha
Y esta es la cuarta: 600 ms de ruido que decae. Eso es una reverb. No la representa ni la modela: es la reverb, y la acabás de escribir con una línea de ffmpeg.

Ahora convolucioná la fuente con cada una y mirá qué apareció:

ImpulsoDuraciónCentroide>2 kHzSe llama
la fuente2,000 s772 Hz4,6 %
1 muestra2,010 sidentidad
2 picos a 100 ms2,120 sdelay
8 muestras de 1/82,010 s587 Hz2,0 %lopass
64 muestras de 1/642,010 s420 Hz0,9 %lopass más bajo
600 ms de ruido2,600 s806 Hz5,1 %reverb
b.wav4,000 scross-síntesis
Cuatro espectrogramas apilados: el primero con pulsos brillantes hasta arriba, el segundo más apagado arriba, el tercero mucho más apagado y concentrado abajo, el cuarto con pulsos que arrastran cola hacia la derecha
La fuente, después con 8 muestras, después con 64, después con el ruido. El centroide baja 772 → 587 → 420 Hz y la energía arriba de 2 kHz cae de 4,6 % a 0,9 %: el rectángulo más largo filtra más. La última calle tiene cola donde las otras tienen silencio. Un filtro y una reverb, mismo comando, distinto segundo archivo.
  1. 1 muestra = identidad correlación 0,999997

    El elemento neutro. Es la fuente, y eso es exactamente lo interesante.

  2. 2 picos = delay 2,120 s

    Compará con el módulo 3 de la parte 1. Mismo efecto, y acá no hay ningún programa de delay.

  3. 8 muestras = lopass suave centroide 587 Hz
  4. 64 muestras = lopass fuerte centroide 420 Hz

    Ocho contra sesenta y cuatro: el rectángulo más largo corta más abajo. Compará con el módulo 4 de la parte 1 — ningún programa de filtro tampoco.

  5. b.wav = cross-síntesis 4,000 s

    Con un sonido entero como impulso: A tocado a través de B. La duración es la suma, 2 + 2.

La regla de la suma 1

El impulso del lopass tiene 64 muestras de valor 1/64, no de valor 1, y eso no es un detalle de estilo. La primera versión de esta figura usaba 64 muestras de 0,9: la suma daba 57,6, la salida se pasó de escala y quedó recortada. Y el recorte es una distorsión, o sea que inventa armónicos justo arriba, donde el filtro los acababa de sacar. El resultado medía un centroide de 788 Hz — más alto que la fuente. Un lopass que sube los agudos.

impulso sin normalizar (suma 57,6):  centroide 788 Hz,  RMS −9,7 dB,  recortado
impulso normalizado  (suma 1,0):     centroide 420 Hz,  RMS −34,8 dB, limpio

La suma de la respuesta al impulso es la ganancia del sistema en continua. Si querés que el filtro no cambie el nivel, tiene que sumar 1. Y como después queda bajo de nivel, para eso está -aX.

La discusión — acá se reordena la parte 1

Dos mecanismos eran uno

La parte 1 presentó cuatro mecanismos como independientes. El 2 (desplazar una copia en el tiempo) y el 3 (seleccionar frecuencias) no lo son: los dos son convolución, y lo único que cambia es el impulso. Un delay es un impulso con dos picos. Un filtro es un impulso corto. Una reverb es un impulso largo y ruidoso. Cuatro mecanismos eran tres.

Y el filtro peine se explica solo

En la parte 1 quedó sin explicar por qué un delay de 0,5 ms es un filtro. Ahora es aritmética: un delay es un impulso de dos picos, un filtro es un impulso corto, y un delay de 0,5 ms es un impulso de dos picos separados 22 muestras — o sea un impulso corto. Es las dos cosas porque la distinción nunca existió, solo la escala de tiempo del mismo argumento.

Por qué se llama respuesta al impulso

El nombre dice el método de medición: metele a un sistema un impulso — un click, un globo que explota — y grabá lo que sale. Eso que sale contiene todo lo que el sistema le hace a cualquier señal. Por eso se pueden vender reverbs de catedrales reales: alguien fue con un micrófono, hizo un ruido seco, y el archivo resultante es la catedral.

El momento El que aparece cuando alguien pregunta "¿entonces cualquier sonido es un efecto?" y la respuesta es sí, literalmente, probalo. Un sistema lineal está completamente descrito por su respuesta a un click, y esa descripción es un archivo de audio como cualquier otro: lo podés mirar, editar, invertir, convolucionar con otro. Los efectos dejaron de ser programas y pasaron a ser datos.

Módulo 4

Dos fuentes, dos escalas

25 min

Escala El ciclo y el espectro, con dos entradas

Hasta acá, una fuente. Con dos entra una pregunta nueva: ¿en qué escala se combinan? Porque la respuesta cambia todo. Primero, en la escala del ciclo:

distort interact 1 a.wav b.wav alternado.wav   # alternar ciclos de A y B
distort interact 2 a.wav b.wav impuesto.wav    # los ciclos de A sobre B
distort interact 2 b.wav a.wav impuesto2.wav   # y al revés
SalidaDuraciónPicoQué pasó
a.wav2,000 s329,7 Hz
b.wav2,000 s165,6 Hz
alternado.wav3,000 s107 Hzla alternancia es un período nuevo
impuesto.wav0,997 s328 Hztimbre de B, tono de A
impuesto2.wav1,994 s166 Hztimbre de A, tono de B

Las dos filas resaltadas son cross-síntesis, y sin una sola FFT. El modo 2 impone los largos de ciclo del primer archivo sobre las formas de onda del segundo: el contenido es de B y la frecuencia es de A. Eso es lo que hace un vocoder, y acá sale de contar cruces por cero. Fijate también en la duración: impuesto.wav dura la mitad, porque los ciclos de A son la mitad de largos que los de B y los 329 ciclos de B tuvieron que entrar en el molde de A.

  1. interact 2 A sobre B 0,997 s · 328 Hz
  2. interact 1 ciclos alternados 3,000 s · 107 Hz

    Alternar ciclos crea un período que no está en ninguna de las dos fuentes: 107 Hz, un subarmónico de la alternancia misma.

Y ahora en el espectro, donde hay dos campos

Acá vuelve el hallazgo del módulo 7 de la parte 1. Un frame espectral tiene dos números por bin: amplitud y frecuencia. En la parte 1 los rompimos por separado para descubrir que uno es local y el otro es estado. Ahora los vamos a interpolar por separado, que es la versión constructiva de lo mismo.

pvoc anal 1 a.wav aa.ana -c1024 -o3
pvoc anal 1 b.wav bb.ana -c1024 -o3

# morph morph modo A B salida  as ae fs fe expa expf
morph morph 1 aa.ana bb.ana juntos.ana    0.2 1.8  0.2 1.8  1 1
morph morph 1 aa.ana bb.ana desfasado.ana 0.1 0.6  1.3 1.9  1 1

pvoc synth juntos.ana    juntos.wav
pvoc synth desfasado.ana desfasado.wav

as y ae son cuándo empieza y termina la interpolación de amplitud. fs y fe, la de frecuencia. Son cuatro tiempos independientes, y ahí está todo el módulo: podés cruzar la envolvente en el primer medio segundo y las frecuencias recién al final.

Archivoa los ~1,0 s
energía 165/330 Hzplanitud
a.wav percusivo, 3300,000,20
b.wav sostenido, 1651,671,00
juntos.wav0,090,64
desfasado.wav0,010,95

Leé la última fila despacio, porque es un sonido que no existe en ninguna de las dos fuentes. A un segundo del comienzo, desfasado.wav tiene la envolvente de B — planitud 0,95, o sea sostenido, cuando A vale 0,20 — y a la vez las frecuencias de A: la razón 165/330 vale 0,01, igual que A, contra 1,67 de B. Sostenido como B, afinado como A.

  1. juntos amplitud y frecuencia a la vez 0,2 → 1,8 s

    Una sola transición. Se parece a un crossfade largo, y de hecho es lo más cerca que esto llega a un crossfade.

  2. desfasado envolvente primero amp 0,1→0,6 · frq 1,3→1,9

    Escuchalos uno atrás del otro. En el medio del segundo hay un sonido sostenido como B pero afinado como A, que no existe en ninguna de las dos fuentes.

Cuatro espectrogramas apilados: pulsos discretos separados, una banda continua, una transición que se va llenando de a poco, y una que se llena mucho antes
A, B, el morph simultáneo y el desfasado. Mirá cuándo se llenan los huecos entre pulsos: en la tercera calle, de a poco a lo largo de todo el ancho; en la cuarta, casi en el primer cuarto, porque la interpolación de amplitud terminó en 0,6 s. La envolvente ya cruzó y las frecuencias todavía no.

El momento Un morph no es un crossfade. Un crossfade tiene una perilla; esto tiene dos, y se pueden mover en momentos distintos, porque la representación tiene dos campos separados. Y son exactamente los dos campos que en la parte 1 rompimos a martillazos para descubrir cuál era estado. El mismo hecho sobre el formato explica un bug y habilita un efecto: eso es lo que significa entender una representación.

Módulo 5

El parámetro como función

15 min

Concepto De comando a programa

Último movimiento, y es chico de escribir y grande de consecuencias. Casi todos los parámetros de CDP aceptan, en lugar de un número, un archivo de texto de dos columnas: tiempo y valor.

printf '0 0.1\n1 1.0\n2 0.1\n' > env.txt
modify loudness 11 a.wav env.wav env.txt

Tres líneas de texto y la ganancia ya no es un número: es una función del tiempo. Las reglas de interpolación no están documentadas con precisión, así que las medimos. La ganancia efectiva, comparando la salida contra la fuente:

tGanancia medidaLineal esperada
0,00 s0,1000,100
0,25 s0,3260,325
0,50 s0,5500,550
0,75 s0,7760,775
1,00 s1,0001,000
1,25 s0,7740,775
1,50 s0,5500,550
1,75 s0,3240,325

Coincide con la recta a la tercera decimal, en las dos direcciones. La interpolación es lineal entre puntos, sin curvas y sin sorpresas. Y de ahí sale la regla práctica: si querés un escalón, poné dos puntos muy cerca.

printf '0 0.1\n0.999 0.1\n1.0 1.0\n2 1.0\n' > escalon.txt
Dos formas de onda apiladas: arriba cuatro pulsos de igual altura, abajo los mismos cuatro con alturas creciente y decreciente formando un triángulo
Cuatro pulsos iguales, y los mismos cuatro con ganancias 0,101 · 0,559 · 0,975 · 0,559. El triángulo del archivo de texto, dibujado por los pulsos.

El momento Con un número, un comando de CDP es una operación. Con un archivo de breakpoints, es un programa con una línea de tiempo. Y como la salida de un comando es la entrada del siguiente, y como los parámetros son archivos de texto que otro programa puede generar, tenés un sistema entero: datos, control y composición, en tres formatos de archivo que se leen con cat. Eso es lo que CDP es en realidad, y por eso sobrevivió cuarenta años.

Módulo 6

Compartir

20 min

Concepto Cierre y evaluación

Cada uno arma una cadena de al menos tres pasos en dos escalas distintas, exporta 20 segundos, y dice una frase: en qué escala trabaja cada paso.

ffmpeg -i mi_cadena.wav -t 20 -c:a libmp3lame -b:a 128k entrega.mp3

El pedido extra de esta parte: que cada uno entregue también su respuesta al impulso, el archivo. Es de dos líneas de ffmpeg y es la prueba de que el módulo 3 aterrizó — un efecto que se entrega como dato y no como receta.

El momento El que aparece cuando alguien escucha una cadena ajena y dice "eso está granulado, no filtrado". Escuchar la escala en vez del efecto es la habilidad completa que las dos partes de este taller intentan enseñar.

05 Lo que queda afuera

Entre las dos partes usamos unos 15 de los 220 programas. Lo que sigue afuera, y por qué:

AfueraPor qué
Texturas (texture, 13 modos)Necesita archivos de datos de notas. Es la escala del evento y es una parte 3
Mezcla por archivo (submix, 25 modos)Un mixfile es un lenguaje entero. Merece sesión propia
La familia envel (17 modos)Extraer, imponer y reescribir envolventes. Se solapa con el módulo 5
Edición (sfedit)Es edición, no efectos
morph glide y morph bridgeVariantes del módulo 4 una vez que se entendió
Los otros modos de distortQuedan 15. Con el módulo 1 se predicen casi todos
brassage modo 7 full monty16 parámetros. Es el modo 6 con rangos, después de dominar el 6
Multicanal y espacializaciónNecesita monitoreo que un taller portátil no tiene

06 Para seguir

  1. Convolucionar un sonido con sí mismo, y otra vez

    La autoconvolución al cuadrado, al cubo, a la cuarta. La duración crece como la suma y el espectro se concentra: cada pasada multiplica el espectro por sí mismo, así que lo fuerte se hace más fuerte y lo débil desaparece. Después de cuatro pasadas cualquier sonido se convierte en una campana. Mirá la duración en cada paso y explicá por qué crece así.

    cp a.wav x0.wav
    for i in 1 2 3 4; do fastconv -a2.0 x$((i-1)).wav a.wav x$i.wav; done
    for f in x*.wav; do sndinfo props $f | grep -i samples; done
  2. Reportar el bug de los impulsos en texto

    Ejercicio real de ingeniería: aislá el problema al mínimo caso reproducible (un impulso de un valor), documentá qué esperabas y qué pasó, probá si el mismo impulso como WAV funciona para descartar todo lo demás, y escribilo. El repo de CDP está en GitHub. Un reporte con reproducción mínima vale más que cualquier ejercicio inventado.

  3. Medir dónde deja de servir el waveset

    Corré distort cyclecnt sobre material cada vez menos periódico: un seno, una guitarra, una voz, un acorde, ruido rosa. Anotá el conteo y compará con el tono real. Encontrá el punto donde el número deja de significar algo. Ese punto es el borde de aplicabilidad de toda la familia distort, y saber dónde está una herramienta vale tanto como saber usarla.

  4. Barrer el tamaño de grano de 2 ms a 2 s

    Con modify brassage 6, fijá todo menos grainsize y barré cinco órdenes de magnitud. Ponéle nombre a cada zona de oído, igual que con el delay en la parte 1. Es el mismo ejercicio, una escala más arriba, y cierra el arco de las dos partes.

    for g in 2 10 50 200 1000; do
      modify brassage 6 a.wav g$g.wav 0.5 2 $g 0 1 0.5 1 1
    done
  5. Un impulso invertido en el tiempo

    Convolucioná con una reverb dada vuelta (modify radical 1 sobre el impulso). Sale el efecto de reverb inversa, el que en los 80 se hacía con cinta al revés. Es un impulso más, y llegar a él razonando en vez de buscando un preset es la prueba de que el módulo 3 quedó.

07 Glosario

Términos nuevos de esta parte. Los de la parte 1 están en su propio glosario.

Waveset
El tramo entre dos cruces por cero en la misma dirección. En un sonido periódico es un ciclo de la fundamental.
Cruce por cero zero crossing
Donde la señal cambia de signo. Es la forma más barata que existe de encontrar estructura en el audio: no cuesta nada y no necesita FFT.
Grano grain
Un fragmento de sonido de decenas de milisegundos, con su propio ataque y caída. La unidad de la síntesis granular.
Densidad density
Cuánto se superponen los granos. Menor a 1 deja silencio entre grano y grano; mayor a 1 los apila.
Splice
El fundido de entrada o salida de cada grano, en milisegundos. Sin splice, cada grano empieza con un click.
Velocity
En brassage, la velocidad de avance en la entrada relativa a la salida. Es el inverso del estiramiento, y por eso admite el cero.
Brassage
Del francés brassage, remover o mezclar. El nombre de CDP para la reconstitución granular.
Convolución convolution
Reemplazar cada muestra de una señal por una copia entera de otra, escalada, y sumar todo. Delay, filtro y reverb son casos particulares.
Respuesta al impulso impulse response, IR
Lo que sale de un sistema cuando le entra un click. Describe al sistema por completo, y es un archivo de audio común.
FIR
Finite impulse response. Un filtro definido enteramente por una lista de coeficientes, que es su respuesta al impulso.
Ganancia en continua DC gain
La suma de la respuesta al impulso. Si no vale 1, el sistema cambia el nivel.
Cross-síntesis cross synthesis
Usar una característica de un sonido sobre otro: el tono de uno con el timbre del otro.
Morphing
Interpolar entre dos espectros. En CDP, amplitud y frecuencia se interpolan con horarios independientes.
Planitud de envolvente
Cuán parejo es el nivel a lo largo del tiempo. Cerca de 1 es sostenido; cerca de 0, percusivo. La medida que usamos para ver el morph.
Centroide espectral spectral centroid
El promedio de las frecuencias pesado por su energía. Sube y baja con lo que se percibe como brillo.
Breakpoint file
Texto plano, dos columnas de tiempo y valor, punto y coma para comentarios. Convierte cualquier parámetro en una función del tiempo. Interpola lineal.