Bubba Machine

El audio de Bubba Machine

Bubba Machine tiene un objetivo: la mejor calidad de audio que permite el FM-1. Esta página cuenta qué se cambió para llegar ahí en la 0.4.0-beta, cuánto cuesta cada cosa en el aparato y, con la misma franqueza, lo que todavía no está a la altura.

Todas las cifras de CPU se midieron en el FM-1 del autor con la consola del firmware (tools/fm1/traza.py). Los detalles de cada medición están en TRAZA_FM1.md y MOTORES.md.

El aparato

ProcesadorJieLi AC791N, dos núcleos a 360 MHz con FPU de precisión simple
Salidacodec externo por I2S, estéreo de 24 bits a 44 117.6 Hz (24 MHz / 544, fijo por hardware)
Memoria para sonidos grabados116 KiB de flash para las tomas del sampler

Lo que mejoró

1. Todo a 44.1 kHz

En la 0.3 los motores calculaban a 22 kHz y cada muestra se repetía dos veces para llegar a la salida. Eso corta todo arriba de 11 kHz y deja imágenes (agudos falsos) por encima.

Ahora los motores y la mezcla calculan a la frecuencia real del codec, 44 117.6 Hz, sin sobremuestreo. Los agudos llegan hasta 20 kHz y la afinación es exacta, porque se calcula con la frecuencia verdadera y no con 44 100.

2. Mezcla en coma flotante

0.30.4
Bus de mezclaentero, con una división por muestra y canalfloat, ganancias calculadas una vez por bloque
Canales en silenciose calculaban igualse saltan
Captura de los efectos en vivo (stutter, reversa, tape stop)μ-law de 8 bits16 bits
Delayμ-law de 8 bits16 bits con lectura interpolada
Costo de la mezcla con PLAY8.6 % de un núcleo7.3 %, calculando el doble de muestras

Medido en el aparato, la FPU es 1.5× más rápida que la aritmética entera de 64 bits que usaba la 0.3, así que pasar a float fue más rápido y además más limpio.

3. Sonidos calculados en vivo, sin grabaciones de baja resolución

La 0.3 tenía kits de batería grabados a 22 kHz en μ-law de 8 bits (nada arriba de 11 kHz) y tablas de onda de baja resolución. Se fueron todos. Ahora cada sonido se calcula en el momento con bibliotecas de síntesis probadas:

MotorQué usaLicencia
Batería modeladamodelos de bombo, caja y hi-hat de Plaits (Mutable Instruments), en float, más palmas, cencerro, resonador, ruido y percusión FM propiosMIT
ANALOGosciladores con polyBLEP (anti-aliasing), filtro LP 24/12, BP o HP con resonancia y drive, ADSR, LFO, sync y ringpropio y MIT (Plaits/stmlib)
FM de 6 operadoresmsfa, el motor de Dexed y la misma base del firmware de fábrica; los 32 algoritmos de la DX7Apache-2.0
ACIDfiltro escalera de 4 polos con resonancia, acento y slidepropio

El acento no solo sube el volumen: cambia el golpe, como en una caja de ritmos real.

4. Una salida sin clics ni escalones

5. El tiempo, exacto

El secuenciador cuenta a 96 PPQN desde el contador de muestras del audio: no hay un reloj aparte que pueda derivar, y cada nota cae en su muestra exacta dentro del bloque.

6. Rendimiento: lo que hace lugar a la calidad

Calcular el doble de muestras con motores mejores solo cabe si el código rinde. Lo que se midió y cambió:

CambioAntesDespués
Caché de datos (configuración del SDK)4 KiB efectivos32 KiB: lecturas al azar 6-10× más rápidas
Audio compilado para velocidad (-O2)demo con PLAY: 36.9 % de un núcleo27.7 %
FM, una voz (E.PIANO)6.6 %3.3 %
ANALOG, una voz1757 ns por muestra (10 %)654 ns (4.1 %): 7 voces caben sin bloques tarde

El programa quedó 148 KiB más chico y se liberaron 64 KiB de RAM al sacar los kits grabados y las tablas de onda.

Lo que todavía no está a la altura

Esto es una beta. Lo que hoy limita la calidad, sin adornos:

Lo que sigue

  1. Audio en los dos núcleos.
  2. Efectos de master: reverb y chorus de Mutable Instruments, delay de cinta, compresor y nivelador.
  3. ACID con Open303 en float.
  4. Un sampler de más calidad, dentro de lo que deja la flash.
  5. Medir la salida analógica con una interfaz de audio.

Ver también: motores de sonido · investigación de sonido · mediciones en el FM-1 · registro de cambios.

Esta página se genera desde docs/AUDIO.md. ¿Ves un error? Edita el archivo y manda un pull request.