Categories
Music

Review: Hiromi Uehara – Valencia – 29/6/2007

El viernes pasado estuve en el concierto de Hiromi en los jardines del Palau de la Música de Valencia. Ya había leido algunas cosas sobre ella, pero ha superado mis expectativas más optimistas.

Me lo pasé en grande. La música genial, estuve todo el concierto sonriendo embobado escuchándoles tocar (y aún me dura). Aparte de eso, siempre me ha gustado ver a músicos pasándoselo bien y verla sobre el escenario con esa sonrisa juguetona mientras toca el piano no tiene precio. Ains, creo que me he enamorado…

Al final del concierto me quedé con ganas de gastarme el dinero y busqué el clásico tenderete con discos, pero solo había unos pocos de Martin Valihora, el baterí­a, y no lo conozco lo suficiente. Pero bueno, hoy he salido de compras y me he vuelto con un Time Control bajo el brazo :)

Esperemos que vuelva a tocar pronto por aquí cerca.

Categories
Code Demoscene Hacks Music

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:

Categories
Code Demoscene Hacks Music

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

2) Senos!!!

Después del ruido del capitulo anterior, vamos a pasar a algo ligeramente más interesante: la onda senoidal. Como podéis ver si seguís el enlace a la pagina sobre la onda senoidal en la wikipedia, junto con dibujitos y explicaciones interesantes, la formula es:

y = A·sin(w·t + fase)

donde A es la amplitud de la onda (la distancia entre una cresta y un valle), w es la frecuencia en radianes/segundo y t es el tiempo. Vamos a ignorar la fase porque no nos hace falta :)

Como nos gusta trabajar con frecuencias en hercios, multiplicamos por 2·pi. Además, tenemos que t = samples generados / frecuencia de muestreo. Por lo tanto en el código tendremos algo como:

y[i] = A*sin(2*pi*frecuencia*(i/sampling_rate))

para el sample i-ésimo desde el inicio del sonido. Vamos a ver el trozo de código correspondiente (lo que falta es, básicamente, la inicialización del capítulo anterior):

void play(void *userdata, Uint8 *stream, int len)
{
    int num_samples = len / 2;
    Sint16 *dst_buf = (Sint16*) stream;
    for (int i=0; i<num_samples ; ++i)
        buffer[i] = sin(2.0*M_PI*440.0f*(i+pos)/(float)SAMPLING_RATE);
    
    // Clipping y conversion a Sint16
    for (int i=0; i<num_samples; ++i)
    {
        float v = buffer[i];
        if (v > 1.0f)
            v = 1.0f;
        else if (v< -1.0f)
            v = -1.0f;

        dst_buf[i] = (Sint16)(32767.0f*v);
    }
    pos += num_samples;

}

Detalles destacables de esta función:

  • se trabaja con un buffer de floats y se convierte a entero al final. No mola ir perdiendo precisión por el camino, sobre todo cuando hagamos cosas mas complejas
  • hay clipping a [-1.0, 1.0]. Ahora mismo es completamente innecesario porque sin() devuelve valores en ese intervalo, pero cuando empecemos a mezclar varios sonidos vendrá bien :)
  • en la llamada a sin(), el 440.0f es la frecuencia de la nota que suena (un La4), y pos es una variable global que guarda el í­ndice del ultimo sample generado entre llamadas a play(). Es feo, pero para un ejemplo pequeño va bien.

En el próximo episodio (ahora es tarde y tengo sueño), veremos otros osciladores típicos y cosas interesantes que se pueden hacer con ellos.

EDIT: herotyc me ha enviado una versión stand-alone del ejemplo de este capítulo. ¡Muchas gracias! :)

Categories
Code Demoscene Hacks Music

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

Por petición popular (hola pplux) voy a hacer una pequeña introducción a la sí­ntesis de audio desde el punto de vista de un coder sin experiencia previa en DSP que pretende hacer un sintetizador para intros de 4k (yo). Por supuesto, incluirá ejemplos de código. C99 y SDL for teh win.

0) Disclaimer
Esto no tiene por qué ser la forma correcta de hacer las cosas. Hasta donde yo sé funciona, pero seguro que hay muchos fallos en muchos sitios. Son bienvenidos los comentarios, tanto para corregirme los fallos como para comentar cualquier otra cosa al respecto :). Y como se suele decir en estos casos, si alguno de los ejemplos de código rompe algo o deja sordo a alguien yo no me hago responsable.

1) Haciendo ruido

En primer lugar, el clásico trozo de codigo de inicialización que todo el mundo copia y pega y nadie lee:

#include "SDL.h"

#define BUFFER_SIZE 1024    // Longitud del buffer, en samples

// Este comentario esta extraido de SDL_audio.h, porque me ha molado
/* This function is called when the audio device needs more data.
 * 'stream' is a pointer to the audio data buffer
 * 'len' is the length of that buffer in bytes.
 * Once the callback returns, the buffer will no longer be valid.
 * Stereo samples are stored in a LRLRLR ordering.
 */
void play(void *userdata, Uint8 *stream, int len)
{
    int num_samples = len / 2;
    Sint16 *buf = (Sint16*) stream;
    for (int i = 0; i<num_samples ; ++i)
        buf[i] = rand()%65535-32768;
}

int main(int argc, char **argv)
{
    SDL_AudioSpec desired;
    desired.freq     = 44100;        // Frecuencia de muestreo                             
    desired.format   = AUDIO_S16SYS; // Formato de las muestras
    desired.channels = 1;            // Numero de canales
    desired.samples  = BUFFER_SIZE;  // Tamaño del buffer en samples
                                     // (potencia de 2)
    desired.callback = play;         // Callback
    desired.userdata = NULL;         // Puntero a datos
    
    SDL_Init(SDL_INIT_AUDIO);        
    SDL_OpenAudio(&desired, NULL);
    SDL_PauseAudio(0);
    getchar();
    SDL_PauseAudio(1);
    SDL_CloseAudio();
    SDL_Quit();
}

La parte importante esta en buf[i] = rand()%65535-32768; Como hemos elegido AUDIO_S16SYS significa que utilizamos muestras de 16 bits con signo [-32768, 32767], con endianismo dependiente del sistema (como accedemos al buffer con punteros a entero de 16 bits, el endianismo no será problema). Generamos numeros aleatorios en ese rango y ya tenemos ruido blanco saliendo de nuestros altavoces.

No se pierdan el proximo episodio.

EDIT: He cambiado el titulo, de “síntesis de audio” a “síntesis musical” porque lo primero era demasiado general :)

Categories
Demoscene Music

Night of the proms + Breakpoint

Por fin llegó el día de volver a ver a Mike Oldfield en España. Habia que aprovechar la ocasión y estuve en los conciertos de Valencia y Madrid.

El primer dia en Valencia estuve en la primera fila (fotos proximamente :D), y en el concierto de Madrid me vi relegado a la grada por comprar la entrada a ultima hora. Ambos estuvieron geniales, y me parece que el año que viene iré al NOTP toque quien toque.

Ahora solo falta que sea verdad lo que dijo el señor Oldfield de venir proximamente a dar algun concierto mas largo.

En otras noticias, estoy en la breakpoint. Shash y yo hemos presentado 4k, y la compo es dentro de 1:40h. Ahora que el partycoding ya ha pasado… FIESTA! \o/

Seguiremos informando.

Categories
Music

Night of the Proms 07 (OMFG!)

Este año Night of the Proms viene a España. Se trata de una gira internacional que combina la música clásica y el pop en la que participan un coro de 50 voces, una orquesta de 72 músicos y 5 solistas: 1 clásico, 3 de pop-rock internacional y uno nacional.

Solo con esto la cosa ya pinta bien, pero además resulta que se acaba de confirmar (via A Man and His Music) que los dos conciertos que habrá en España (en Valencia y Madrid) contarán con la presencia de ¡Mike Oldfield! :D

Por lo visto en el tracklist del CD promocional de la gira en Alemania, parece que tocará fragmentos de Ommadawn y Tubular Bells, asi como Shadow on the Wall. Se comenta que a estas 3 piezas se añadirán Moonlight Shadow y To France, con la colaboración de Miriam Stockley como vocalista.

El concierto de Valencia es el 30 de marzo y el de Madrid el 31. Las entradas salen a la venta el 1 de diciembre.

Ya tengo la excusa perfecta para pasarme a visitar a mis apigos madrileños ;D

Categories
Code Demoscene Music

BCNParty 110

Este último fin de semana he estado en la BCNParty.

El jueves por la noche llegué con stage7 a Barcelona, donde shash nos recogió y nos llevó a su casa. stage7 habí­a terminado durante el viaje su tema para la compo de streamed music, una versión de mi track jarresco para la syltia (coop 4k Bauknecht/Necrostudios) que me encanta como ha quedado :D. Como llovía nos quedamos en casa de shash haciendo cosillas de la intro y viendo grandes éxitos en YouTube.

El viernes nos levantamos tarde y llegamos a la party sobre las 16:00. Sesión de partycoding, partycomposing-con-el-vim, y por la noche descanso para degustar la super sangria of the death que yomizmo preparó. Fueron unas horas geniales en las que los miembros de TimeScratchers nos deleitaron con un montón de chistes, mientras otros traducian los chistes al inglés (como razonable éxito ;) para que los sceners extranjeros pudieran entender algo.

El sábado era el día clave para terminar la intro, es decir, el último :D. Terminé el track como buenamente pude, a pesar de la completa falta de inspiración, y nos pusimos a sincronizarlo todo. No tuvimos demasiados problemas para conseguir el tamaño correcto, aunque hubo un momento de pánico cuando casi me cargo el sinte intentando sustituir la rutina de los ADSRs por un decay exponencial que iba mas o menos bien en mi maquina (40% de consumo aproximado de CPU, eso si :P) pero hacía sufrir demasiado al PC cuando lo pasé a windows. Todaví­a seguimos buscando el porqué. Resultado final: Red trip by Collapse and Necrostudios.

Entregamos la intro 15 minutos antes de las proyecciones, nos hicimos unos pintxos en el bar de enfrente del partyplace *muy* rápido y después de ver las compos nos fuimos de fiesta toda la noche. Llegamos justo a tiempo para desayunar en la estación y despedir a stage7, que se iba a las 8:00. Después a dormir un rato, lo justo para llegar a la entrega de premios.

Al final quedamos segundos. Personalmente estoy bastante contento con la intro teniendo en cuenta la carencia de ideas en los dias previos. Ha quedado algo bastante potable y bien terminado. El nivel de las compos en general fue un poco menor de lo esperado, pero al menos ganó una demo española y escena.org vuelve a estar online ;)

En resumen, la party ha estado muy bien a pesar de la falta de prods (lástima) y me lo he pasado genial. ¡Gracias a todos!