Cómo diseñé un oscilador DSP con modulaciones no lineales, timbres ricos, y que cabe en 3.5 KB.
Cuando sostenés una nota en un sintetizador, la mayoría de los osciladores te dan un timbre estático. La forma de onda se repite fielmente, ciclo tras ciclo. Si querés movimiento, recurrís a un LFO, a la envolvente del filtro (EG) o al mod wheel. ¿Pero qué pasaría si el oscilador mismo estuviera vivo — una textura que deriva, respira y evoluciona sin modulación externa?. Este es el planteo de la sintesis generativa, mi objetivo fue aprovechar las capacidades que ofrece el logue-SDK para introducir lógica generativa a nivel oscilador digital, en un sintetizador
que es fundamentalmente analogico no modular, para generar mas alternativas timbricas.
Este artículo recorre el proceso de diseño, las restricciones de ingeniería y las decisiones que definieron el resultado.
El hardware: sus capacidades y restricciones

El minilogue xd es un sintetizador híbrido analógico/digital. Su MULTI ENGINE es un DSP Cortex-M4 que ejecuta osciladores digitales y efectos cargados por el usuario, compilados en C/C++ con GNU ARM Embedded Toolchain.
Escribís cinco hooks — OSC_INIT, OSC_CYCLE, OSC_NOTEON, OSC_NOTEOFF, OSC_PARAM —, y subís vía SysEx por USB-MIDI con logue-cli.
Las restricciones:
- ~3.5 KB de payload maximo por unidad de oscilador. Este es un limite practico encontrado, luego del cual se recibe un timeout en la fase de upload al firmware.
- Cero asignación dinámica. Un único
structestático contiene todo el estado. - Sin excepciones FPU. El Cortex-M4 atrapa división por cero y NaN; los
fastsinf/fastsinfullfdel SDK se expanden inline. Cada llamada cuesta ciclos de CPU y espacio de código en el binario. - Estado compartido entre voces. La API provee una única instancia
staticcompartida por todas las voces polifónicas — no hay ID de voz.
Wavetables: simplicidad y eficiencia en un entorno embebido
deiosc está construido sobre tablas de onda precomputadas (wavetables) almacenadas en flash, que se leen en tiempo real mediante interpolación lineal (read_q15). Esta elección arquitectónica responde a un criterio de simplicidad, eficiencia y adecuación al hardware, más que a una imposición técnica.
El logue-sdk permite implementar generación de forma de onda en tiempo real, con la posibilidad de modular cada muestra de forma arbitraria. Sin embargo, esta flexibilidad tiene un coste: mayor tamaño del payload binario y un consumo significativo de ciclos de CPU por muestra. En un entorno embebido como el del minilogue xd, donde el espacio de código está limitado a ~3.5 KB y la carga de la FPU debe controlarse, estos factores condicionan fuertemente las decisiones de diseño.
El uso de wavetables libera recursos computacionales que pueden destinarse a otras operaciones necesarias para el diseño sonoro: moduladores lentos, rotación de fase, mezcla de voces y filtrado. La forma de onda queda fijada a un conjunto precomputado de muestras, lo que introduce una rigidez en el timbre base, pero esta limitación puede compensarse mediante técnicas de modulación —crossfade entre tablas, rotación de fase, modulación por LFOs internos— que aportan riqueza y movimiento al sonido.
La exploración de la generación de formas de onda en tiempo real con logue-sdk, con sus posibilidades y limitaciones, es un tema que excede el alcance de este proyecto y merece un tratamiento aparte.
El objetivo: un oscilador que se sienta vivo
El oscilador se construyo buscando ser elemento constitutivo de un pad ambiental, que no solo sostiene, sino que evoluciona.
El timbre debe vagar, la textura nunca debe enclavarse en un ciclo evidente, y la base debe sentirse cálida sin saturación agresiva.
Los ejes de diseño:
- Suavidad con calidez – Forma de onda sin como base, con leve saturación para darle calidez.
- Batido – Para romper la monotonia de la onda base, un leve batido.
- Transformación — el timbre morfea perpetuamente entre la onda base y una segunda forma de onda mas coloreada.
- Respiración – La mutación se da gradualmente, de forma que en la medida que aparece el timbre que colorea, el batido se reduce en amplitud y frecuencia.
Estos son los 4 ejes de comportamiento del oscilador. Se trabajó iterativamente, refinando la sonoridad sobre cada uno de ellos.
1. Suavidad con calidez
La elección natural para una base suave es la función senoidal. Un seno puro, sin embargo, suena limpio pero vacío.
En caso de querer experimentar con diferentes formas de ondas básicas, existe una herramienta online Audio Waveform Generator, que permite la escucha y visualización.

Para darle un toque de calidéz, se optó por una saturación mediante un escalado por un factor k, y la aplicación de tangente hiperbolica para normalizar en [-1,1], quedando la forma de onda final .

2. Batido
El batido es un fenómeno de interferencia: cuando dos ondas de frecuencia ligeramente diferente se superponen, la amplitud de la señal resultante oscila periódicamente a una frecuencia igual a la diferencia entre ambas. Ese «pulso» o «latido» es el batido.
Batido por desafinación de frecuencia
El enfoque clásico consiste en desajustar dos osciladores en unos pocos cents. La suma de ambos produce una onda cuya frecuencia es el promedio de las dos, modulada en amplitud por una envolvente que oscila a la frecuencia diferencia.
Batido por rotación de fase
El enfoque adoptado en deiosc para generar batido se basa en la rotación de fase de lectura de tabla, un método documentado en la literatura de síntesis digital que aprovecha la naturaleza del oscilador basado en wavetable.
En lugar de modificar la frecuencia de una de las voces (aproximación por detune), se mantienen ambas frecuencias idénticas y se introduce un offset acumulativo en la fase de lectura de la tabla Warm para la segunda voz. Este desplazamiento, denominado s_beat, avanza a una tasa beatHz.
El mecanismo es sencillo: dado que el oscilador lee su forma de onda desde una tabla indexada por fase, desplazar el índice de lectura de una de las voces equivale a rotar su fase de forma continua. Cuando ambas voces leen la misma posición de tabla (s_beat = 0), están en fase y la suma es máxima. Cuando la lectura está desfasada media tabla (s_beat = 0.5), las señales se cancelan parcialmente, reduciendo la amplitud. El avance continuo de s_beat produce una oscilación periódica de la amplitud: el batido.
El período de este batido es estrictamente 1/beatHz y no depende de la frecuencia fundamental de la nota, lo que garantiza un movimiento temporal uniforme en todo el registro del teclado. Esta propiedad es difícil de lograr con detune sin gestionar el desajuste de cada voz de forma individualizada.
La rotación de fase se aplica exclusivamente a la tabla Warm, que constituye la base armónica del sonido. La tabla Golden se lee sin el desplazamiento, manteniéndose estable y contribuyendo a la densidad espectral sin interferir en el batido.
El uso de tablas hace que esta operación sea trivial y eficiente: sumar un offset al índice de lectura requiere una única operación aritmética y no modifica la frecuencia del oscilador. El código resultante es compacto, predecible y se ajusta a las restricciones de memoria y tiempo real del minilogue xd.
3. Transformación
La forma de onda Warm proporciona una base solida, el batido añade cierto movimiento, Pero la variación tímbrica resulta limitada y el oído se adapta rápidamente. Para generar una evolución más rica y menos predecible, se necesita un segundo polo que ofrezca un espectro cualitativamente diferente: menos armónico, más abierto, que no se superponga simplemente a la tabla Warm sino que la complemente. De esta necesidad surge la forma de onda Golden.
La forma de onda Golden: un espectro inarmónico como extremo del morph
La forma de onda Golden se construye a partir de cuatro parciales sinusoidales cuyas frecuencias son potencias de la razón áurea . Las parciales se obtienen multiplicando la frecuencia base por cada factor.
A diferencia de la serie armónica, donde las frecuencias son múltiplos enteros de la fundamental (1, 2, 3, 4…), estos valores son inconmensurables: ningún cociente entre ellos es un número racional. Esto produce un espectro que no se alinea con los armónicos tradicionales, generando una textura densa y abierta.
La amplitud de cada parcial decrece según , lo que produce una caída suave que evita la aspereza en los agudos. El resultado es una forma de onda que no se percibe como «desafinada» ni metálica, sino como una nube espectral que envuelve el sonido sin imponerse. Su densidad espectral, al no organizarse en armónicos predecibles, contribuye a la sensación de movimiento y textura que caracteriza a deiosc.
Los cuatro parciales de la tabla Golden son:
| Parcial | Factor (φⁿ) | Frecuencia (relativa a f₀) | Amplitud |
|---|---|---|---|
| 1 | φ⁰ = 1.0000 | f₀ | 2.0 |
| 2 | φ¹ = 1.6180 | 1.618·f₀ | 0.3536 |
| 3 | φ² = 2.6180 | 2.618·f₀ | 0.1924 |
| 4 | φ³ = 4.2361 | 4.236·f₀ | 0.1250 |

La respiración: acoplamiento entre presencia del Golden y batido
En deiosc, la respiración es un fenómeno estructural: un único modulador interno de baja frecuencia afecta simultáneamente al crossfade entre las formas de onda Warm y Golden, y al comportamiento del batido.
Fuente de modulación
Un acumulador de fase s1 avanza a una tasa rate1 que se actualiza continuamente. Su valor inicial es de 0.0233 Hz, pero se auto-modula según la señal de salida w1:
donde:
kW0S1 = 0.0233 * k_samplerate_recipf(expresado como incremento de fase por muestra)-
w1es la lectura de la tabla Warm en la posición des1, que oscila entre -1 y 1.
Esta auto-modulación introduce una variación no lineal en el período de la respiración, evitando que el ciclo se estabilice en una cadencia fija.
Presencia del Golden
La señal w1 contribuye al crossfade entre Warm y Golden. El parámetro morph (0..1) se define como:
donde:
- SHAPE es un parámetro del usuario en el rango [0, 1].
- w1 es la salida del modulador interno (wander), que oscila entre -1 y 1.
Esta fórmula garantiza que morph esté siempre en el rango [0, 1] sin necesidad de saturación, ya que w1 ∈ [-1, 1] y SHAPE ∈ [0, 1].
La profundidad de la modulación (es decir, la amplitud con la que el wander mueve el crossfade) escala con SHAPE:
- Con
SHAPEbajo, el Golden fluctúa en un rango estrecho. - Con
SHAPEalto, el Golden varía en un rango amplio, llegando a ausente o pleno según el valor dew1.
Profundidad del batido
La profundidad del batido está determinada por el balance entre las dos voces:
mix = 0.80 + 0.10 · morph
La voz A siempre domina la mezcla (80–90%), mientras que la voz B aporta el resto (10–20%). El batido audible es la interferencia entre la copia fija de la tabla Warm (voz A) y la copia con fase rotatoria (voz B). Cuanto más equilibradas estén las voces, más pronunciada será la cancelación en antifase y más profundo el batido.
morph = 0(Golden ausente):mix = 0.80. La cancelación en antifase es moderada y el batido es claramente audible.morph = 1(Golden al máximo):mix = 0.90. La voz A domina fuertemente, la cancelación es menor y el batido se vuelve sutil.
Dado que morph depende de SHAPE y del wander, la profundidad del batido varía en el tiempo de forma acoplada al timbre: cuando el Golden aparece, el batido se atenúa; cuando se retira, el batido gana presencia.
Frecuencia del batido
La frecuencia del batido se define como:
beatHz = SHIFT+SHAPE · ( 0.62 + (1 - morph) · 0.13 )
El parámetro SHIFT+SHAPE actúa como un control global del período: en 0, el batido desaparece por completo; en 1, se obtiene el rango máximo de frecuencias.
El término 0.62 + (1 - morph) · 0.13 define el techo de frecuencia que se alcanza cuando SHIFT+SHAPE = 1. Este techo depende de morph:
morph = 0(Golden ausente): techo = 0.62 + 0.13 = 0.75 Hz → período ≈ 1.3 s.morph = 1(Golden al máximo): techo = 0.62 Hz → período ≈ 1.6 s.
Cuando el Golden está ausente, el batido puede alcanzar su frecuencia máxima. Cuando el Golden aparece, (1 - morph) se reduce y la frecuencia del batido disminuye, ralentizándose. Este acople es secundario: el control principal del período sigue siendo SHIFT+SHAPE, y la influencia del Golden es una modulación adicional.
Acoplamiento
La misma señal w1 (el wander) que controla la presencia del Golden a través de morph, también controla la profundidad (mix) y la frecuencia (beatHz) del batido a través de morph. Esto crea un sistema integrado donde:
- El timbre se mueve entre Warm y Golden.
- La profundidad del batido se atenúa cuando el Golden está presente.
- La frecuencia del batido se ralentiza cuando el Golden está presente.
Este acoplamiento hace que la respiración del oscilador sea un fenómeno unificado, gobernado por una única fuente de modulación interna, sin necesidad de controles adicionales.
Resumen de variables
| Parámetro | Rango | Efecto |
|---|---|---|
SHAPE | [0, 1] | Controla la cantidad máxima de Golden en el morph |
SHIFT+SHAPE | [0, 1] | Controla el período del batido: 0 = sin batido, 1 = ~1.3 s |
w1 | [-1, 1] | Fuente de modulación interna (wander): modula presencia del Golden, profundidad y frecuencia del batido |
morph | [0, 1] | Crossfade efectivo entre Warm y Golden |
beatHz | [0, ~0.75] | Frecuencia del batido en Hz; período = 1/beatHz |
mix | [0.70, 0.90] | Balance entre voces A y B; determina la profundidad del batido |
Resumen del oscilador
deiosc es un oscilador para pads ambientales que genera movimiento tímbrico autónomo mediante la combinación de dos formas de onda (una cálida y saturada, otra inarmónica construida con potencias de la razón áurea) y un batido por rotación de fase con período independiente de la nota. Un único modulador interno de baja frecuencia controla simultáneamente la presencia del Golden, la profundidad del batido y su frecuencia, creando una respiración integrada donde la evolución del timbre y el batido están acoplados sin necesidad de LFO externo. El oscilador se controla mediante tres parámetros (SHAPE, SHIFT+SHAPE y Sub) y cabe en aproximadamente 3.5 KB, operando de forma estable y eficiente en el Cortex-M4 del minilogue xd.
Recursos
El codigo del proyecto se encuentra en https://github.com/dei-eng/deiosc.

Deja un comentario