4.27.2005

4k synth

Hace ya tiempo que estaba detrás de codear un synth para 4k. Para el que lea esto y no sepa de lo que estoy hablando, en pocas palabras le puedo decir que es una forma de crear música sintetizando y mezclando sonidos muy básicos.
Después del pequeño juego (4k, ojo, solo windows) que hice para el concurso de stratos, me picó la curiosidad y empecé a buscar recursos relacionados con las 4k. Entre los más destacados encontré esta recopilación, dentro de la cual hay códigos de algunas 4k's y un par de ellas con synth. Después de mirar los códigos, hablar con algunas personas (KILE, shash, slash) hacer prubecillas con matlab, etc he obtenido una serie de pasos que más o menos generan un sonido medianamente pasable.

Se puede decir que un sintetizador está compuesto por 3 elementos:
- oscilador
- filtro paso bajo
- generador de envolvente

El oscilador genera una señal, más o menos pura frecuencialmente, como un seno, señal cuadrada (square), triangular (saw) o, aunque al principio no daba crédito, ruido (un rand() de toda la vida, menudos platos que genera XD).

El filtro (yo uso uno de orden 2) es un paso bajo con frecuencia de corte y resonancia configurables, de esa esta forma podemos quitar los armónicos que queramos de señales como la square o la saw.

El generador de envolventes es un señal que "da forma" a la nota. En función de unos parámetros la nota suena de formas muy diferentes. En este caso es mucho mejor ver una foto:



El siguiente paso es generar una melodía. Para ello a partir de las notas (do,re, mi...) de toda la vida se calcula la frecuencia de oscilación. Con ella se hace vibrar a uno de los tipos de oscilador (el sonido depende mucho del tipo de oscilador) y después de pasar esa señal por el filtro (con los parámetros de frecuencia de corte y resonancia que queramos) se pasa por la envolvente. Esto lógicamente se hace por cada canal y finalmente se mezclan. Cada canal,normalmente, tiene diferentes parámetros en la envolvente y de frecuencia de corte del filtro.

El mayor problema de todo esto surge al generar señales no limitadas en banda. La señales square, noise y saw tienen un espectro infinito, aunque bien es cierto que desciende la potencia de los armónicos a medida que aumenta la frecuencia, muestreandolos a 41000 Hz sigue habiendo un aliasing notable (para el que no sepa que es aliasing, en pocas palabras es el solapamiento del espectro de la señal con réplicas de si mismo). Para solucionar este problema lo ideal es hacer oversampling (tomar más muestras por segundo de las necesarias) y después procesar en discreto, esto es, bajar la frecuencia con un diezmador previo paso por un filtro paso bajo que elimine las componentes no deseadas.

Ahora mismo estoy en fase de coding de una pequeña herramienta para la composión de música, una screen:


Unos links:
- [1] : un editor que se basa más o menos en lo explicado.
- [2] : página con un montón de recursos, sobretodo relacionados con procesado de señal
- [3] : código fuente de una 4k (participó en la breakpoint de este año) liberado hace poco.
- [4] página personal de kb, uno de los miembros de farbrausch. En ella explica conceptos del synth usado en muchas de sus producciones, todo a nivel teórico, nada de coding.

En otro orden de cosas he añadido los links de dos blog que frecuento, pertenecen a dos chavales de la asociación de software libre de la EUP. El blog a Aloriel y el de mario , a que estoy ayudando con su distribución de linux portándole unos scripts de Ruby a python con GTK. Espero que en poco tiempo además de portar creemos cosas interesantes, GTK es potente y simple, pero eso ya en otro post :)
-

un saludo, menuda chapa, ya pegaré el code cuando lo tenga completo.