Síntesis musical para mí (o para torpes en general :) III

3) Más ondas básicas

No solo de senos vive el hombre (salvo que nos pongamos a hacer síntesis aditiva), así que vamos a ver unas cuantas ondas más que podemos utilizar como base para construir sonidos.

  • Onda cuadrada:

    Get the Flash Player to see this player.

    Se obtiene alternando dos valores (en nuestro caso +1 y -1) con la frecuencia deseada. Expresado en código, podría ser algo como esto:

    // Generacion del i-esimo sample de una onda cuadrada 
    // de frecuencia f
    float t = i/sampling_rate; // instante i en segundos
    float periodo = 1.0f / f; // periodo de la onda en segundos
    if (fmodf(t,periodo) < periodo/2.0f)
        y[i] = 1.0f;
    else
        y[i] = -1.0f;
    

    Onda cuadrada.

    Otra posibilidad es hacer que las zonas a +1 y -1 no tengan la misma longitud (pulse width modulation)

  • Onda de diente de sierra:

    Get the Flash Player to see this player.

    En cada periodo, aumenta linealmente desde -1 a 1, cayendo bruscamente a -1 en el comienzo del siguiente periodo. Dicho en C viene a ser:

    // Sample i-esimo, frecuencia f
    float t = i/sampling_rate;
    float periodo = 1.0f / f;
    y[i] = 2.0f*(fmodf(t, periodo)/periodo)-1.0f;
    

    Onda de diente de sierra.

  • Onda triangular:

    Get the Flash Player to see this player.

    Es parecida a la anterior, pero durante la mitad del periodo crece linealmente de -1 a 1, y durante la otra mitad decrece linealmente volviendo a -1, sin discontinuidad.

    // Sample i-esimo, frecuencia f
    float t = i/sampling_rate;
    float periodo = 1.0 / f;
    float semiperiodo = periodo/2.0f;
    if (fmodf(t,periodo) < periodo/2.0f)
        y[i] = 2.0f*(fmodf(t,semiperiodo)/semiperiodo)-1.0f;
    else
        y[i] = 1.0f-2.0f*fmod(t,semiperiodo)/semiperiodo;
    

    Onda triangular.

En el programa de ejemplo de este capítulo (ahora con un 100% más de Makefile) está todo esto en forma compilable para poder probarlo fácilmente. Por cierto, ninguno de los ejemplos está optimizado porque pretenden ser lo más claros posible, si alguien tiene sugerencias sobre como implementar mejor cualquier cosa nos lo podemos pasar muy bien comentándolas :)

En fin, esto es todo por hoy. En el próximo post, cosillas sobre espectros de frecuencias y aliasing (supongo que la pereza me obligará a dejarme los filtros para dentro de dos posts :)

EDIT: A peticion de pplux, ahi van los enlaces a los posts anteriores:

4 Comments

  1. pplux said,

    May 24, 2007 @ 15:38 pm

    CURRADISIMO!!!!!! grandisimo post.

    PD: Pon links a las noticias anteriores sobre este mismo tema, viene bien para quien entre por un feed o buscando. :)

    PD(2): Sí, ya se que las noticias anteriores son, literalmente, las anteriores XD

  2. slack said,

    May 24, 2007 @ 16:18 pm

    Hecho!

  3. sergeeo said,

    May 26, 2007 @ 12:20 pm

    ¡El diente de sierra me trae buenos recuerdos! Recuerdo haber estado parte de una BCN con gip calculando cómo poner la frecuencia de esta onda en función de la pendiente de la recta xddd

    Y no era así como hay que hacerlo obviamente. Pero pasó una hora y pico hasta que nos dimos cuenta xd

  4. tux said,

    May 28, 2007 @ 21:18 pm

    thumbs up!!

RSS feed for comments on this post