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;
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 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;
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: