High Anxiety Cd Purchase Buy Lipitor Online In Canada Buy Clindamycin Phosphate Topical Gel Cialis Professional Increase Penies Size

Jugando con la FFT

02/03/2012

Hace ya mucho tiempo (realment mucho tiempo) que estudiaba la Transformada de Fourier (http://en.wikipedia.org/wiki/Fourier_transform) en la facultad, e incluso utilicé el algoritmo de la FFT (Fast Fourier Transform, http://en.wikipedia.org/wiki/Fast_Fourier_transform) en un aplicativo escrito en C para procesamiento digital de imágenes. Desde entonces no me había preocupado de la FFT y realmente lo tenía muy olvidado.

Estos días he vuelto a la carga con la FFT pues, con la idea de aprender las técnicas de programación de aplicaciones de audio, quería programar un afinador o un analizador de la potencia espectral de una señal, que fuese compatible con JACK.

Antes que nada hay que mirar qué algoritmo de FFT se podría utilizar, con licencia GPL, y rápidamente he visto que la elección sería FFTW (http://www.fftw.org/):

FFTW is a C subroutine library for computing the discrete Fourier transform (DFT) in one or more dimensions, of arbitrary input size, and of both real and complex data (as well as of even/odd data, i.e. the discrete cosine/sine transforms or DCT/DST). We believe that FFTW, which is free software, should become the FFT library of choice for most applications.

Me he puesto a compilar unos cuantos ejemplos y a familiarizarme con los cálculos. En definitiva yo lo que quiero es calcular la potencia espectral de una señal de audio, por tanto el señal de entrada serán unas muestras reales (una sola dimensión). La salida de la FFT serán unos valores complejos, y he de tener en cuenta tanto la parte real como la parte imaginaria para hacer los cálculos de la potencia espectral.

fftPlan = fftwf_plan_dft_r2c_1d(fftSize, fftIn, fftOut, FFTW_MEASURE); //r2c_1d: real to complex, one dimension

Mirando si hay algún afinador de código libre, que trabaje en modo consola, y compatible con JACK, me he encontrado estos dos proyectos, que precisamente utilizan la librería FFTW:

y también me ha sido últil para mi propio código en este proyecto capture_client:

He dividido el problema en dos partes:

  • Primero de todo capturo la señal que proviene del micrófono, y como resultado obtengo dos ficheros: el fichero de sonido wav y un fichero de texto donde pongo un número suficiente de muestas.
  • Segundo: abro el fichero de muestras, aplico una ventana de Hanning a les muestras como es habitual, calculo la FFT, calculo la potencia espectral de la señal, y obtengo un fichero de salida para ser procesado con la utilidad de creación de gráficos gnuplot (http://www.gnuplot.info/).

No había trabajado nunca con gnuplot, que sería el equivalente a Matlab para el mundo Linux. Viendo la demo de gnuplot que se distribuye con el código fuente, y que muestra de forma rápida todas las posibilidades de gnuplot, me he quedado realmente sorprendido. En mi caso dibujar el gráfico es muy fácil:

$ gnuplot
gnuplot> plot “data_440_trumpet_output.txt”

La prueba que presento se ha grabado con un mini teclado Casio SK-8, un mini-teclado de los años 80, escogiendo el sonido de trompeta, y obtengo el siguiente resultado.

Casio SK-8 440Hz (A) trumpet, 44100 fps by joanillo

Ahora quiero comparar el resultado de mis cálculos con los obtenidos con Audacity y Ardour, para comprobar que los cálculos son correctos:

Mis cálculos y Gnuplot Audacity Ardour

Perfecto! Lo he clavado!

jcapture es un pequeño programa desarrollado en C++ que capta la señal del micrófono y escribe un fichero de audio en format wav. Básicament es un cliente de JACK que se conecta automáticamente a system:capture_1, que es el puerto físico que representa la entrada del micro de la tarjeta de sonido, y mediante la librería libsndfile va escribiendo los datos del micro en el buffer del fichero de audio.

Además, muestra el nivel del señal de entrada de forma gráfica en la consola (pues es un programa que funciona por la consola, no tiene interficie gráfica). Si te interesa la programación de la API de JACK puedes descargar jcapture:

Hoy es el 155 aniversario del nacimiento de Heinrich Rudolf Hertz (155 no es un número para nada significativo, ¿no tenían nada mejor que contar la gente de Google). Para ilustrarlo han hecho una animación de una onda senoidal bastante desastrosa. Todo el mundo sabe que la derivada del seno es el coseno, y que por tanto la pendiente del seno en el origen vale 1,

sin’(0) = cos(0) = 1

Si los ejes x e y tienen la misma escala quiere decir que la pendiente cuando la función seno cruza el eje horizontal tiene que ser una recta de 45º. Como la función coseno toma valores entre -1 i 1, la pendiente en cualquiera de los puntos no puede ser una recta vertical!!

Vaya, que hay gente que para dibujar ondas senoidales se dedica a enlazar semicírculos… un poco de cultura matemática por favor…

jplay-sndfile es una aplicación que he estado programando la última semana y que tiene un carácter didáctico. Básicamente es un reproductor de ficheros de audio que además puede aplicar un cambio de frecuencia, y también puede hacer un barrido continuo de frecuencias sobre la muestra de audio. Es un cliente de JACK (el servidor de audio de Linux), y está basado, como punto de partida, en sndfile-jackplay que se encuentra dentro de las utilidades de la librería libsndfile (http://www.mega-nerd.com/libsndfile/tools/#jackplay).

Todo el mundo saber que cuando se reproduce un fichero de audio al doble de la frecuencia original dura la mitad de tiempo. Sería equivalente a coger una muestra de cada dos, y reproducirlas a la misma frecuencia de muestreo original.

Ahora vamos a hacer el caso contrario, queremos dividir la frecuencia por dos, y el tiempo que durará la reproducción tendría que ser el doble. Para hacerlo, lo más fácil es doblar cada muestra en dos, y reproducirlo a la frecuencia de muestreo original.

Estos dos casos especiales, multiplicar por dos y dividir por dos, son los casos fáciles y más evidentes. Un análisis de estos casos y estudiar el código fuente proporcionado puede aclarar muchos conceptos a losestudiantes de Procesamiento Digital del Señal. Ahora bien, más difícil es hacer frecuencias intermedias entre 0.5 y 2; y más difícil todavía es hacer un barrido continuo de frecuencias en un rango determinado. Todo esto es lo que se puede ver y se puede estudiar en esta aplicación que tiene un carácter didáctico.

La salida de la ayuda del programa proporciona la siguiente información:

$ jplay-sndfile -h

jplay-sndfile 1.00
Created by Joan Quintana Compte (joanillo)
joanqc arroba gmail.com – www.joanillo.org
Licensed under GPL v.3

jplay-sndfile is a JACK client intended for playing audio files (wav) and pitch shifting, written basically for learning, testing and educational purposes, and the first stage for future developments. A part of playing an audio file, you can change the pitch (between *0.5 and *2) of your audio file, you can play the audio file combing the pitch between two ranges. For testing is useful a sine wave, but remember that you can use any mono (one channel) audio files.
This Jack Audio client connects automatically to system:playback_1 and system:playback_2

usage: jplay-sndfile [-h] [[pitch-shift] | [pitch-shift-start pitch-shift-end]] wav-file

-h –help: this usage information
[pitch-shift] (0.5,2): shifting pitch
[pitch-shift-start] (0.5,2): shifting pitch start range
[pitch-shift-end] (0.5,2): shifting pitch end range
wav file: mono channel audio file

Examples:
./jplay_sndfile samples/hellosine.wav
./jplay_sndfile 0.65 samples/hellosine.wav
./jplay_sndfile 0.5 2 samples/hellosine.wav

La muestra de audio que se presenta quiere ser un compendio de qué puede hacer jplay-sndfile, y contempla los siguientes casos:

  • ./jplay_sndfile samples/test_44100.wav
  • ./jplay_sndfile .5 samples/test_44100.wav
  • ./jplay_sndfile .8 samples/test_44100.wav
  • ./jplay_sndfile 1.4 samples/test_44100.wav
  • ./jplay_sndfile 2 samples/test_44100.wav
  • ./jplay_sndfile .5 2 samples/test_44100x3.wav
  • ./jplay_sndfile samples/sine_440_44100.wav
  • ./jplay_sndfile .5 1 samples/square_440_44100.wav
  • ./jplay_sndfile 1 2 samples/saw_440_44100.wav
  • ./jplay_sndfile .5 samples/waves.wav
  • ./jplay_sndfile 2 samples/waves.wav

jplay-sndfile-examples by joanillo

Una de les cosas más interesants es estudiar la función callback de la API de JACK, que ha quedado bastante escueta, y donde está el meollo del asunto. Básicamente la función callback() es llamada por el servidor de audio cada vez que la interfície de audio (la tarjeta de sonido hardware) necesita llenar su buffer con más datos.

static int process (jack_nframes_t nframes, void * arg)
{

jack_default_audio_sample_t buf ;
unsigned int i;
outs = (jack_default_audio_sample_t *)jack_port_get_buffer (output_port, nframes) ;

info_t *info = (info_t *) arg;

memcpy (outs_original, buffer2 + frames_counter_original, sizeof (jack_default_audio_sample_t) * nframes * DOUBLE_SAMPLES * 2);

int k=0;
float k2;
k2 = nframes/info->shift_pitch;
float var, var2 = 0;
int part_entera = 0;
var = 1/info->shift_pitch – 1;

for (i = 0 ; i < nframes ; i++)
{

if (info->shift_pitch < 1) {
if (frames_counter + i >= info->numFrames / shift_pitch_equivalent) { // shift_pitch_equivalent = info.shift_pitch quan no faig un escombrat
info->play_done=1;
return 0;
}
} else { // >= 1
if (frames_counter_original + i >= info->numFrames * DOUBLE_SAMPLES) {
info->play_done=1;
return 0;
}
}

if (info->shift_pitch > 1) {
k=(int)(i*DOUBLE_SAMPLES*info->shift_pitch + .5);
outs[i] = outs_original[k];
} else if (info->shift_pitch <= 1) {
outs[k] = outs_original[i*DOUBLE_SAMPLES];
if ((int)var2 != part_entera) {
outs[k+1] = outs_original[i*DOUBLE_SAMPLES+1];
part_entera = int(var2);
k++;
}
var2 = var2 + var;
k++;
}

}
frames_counter += nframes;
frames_counter_original += nframes * DOUBLE_SAMPLES * info->shift_pitch ;

return 0 ;
} /* process */

¿Y para qué sirve todo esto? Como hemos dicho es una aplicación didáctica, sirve sobre todo para aprender:

  • para aprender: teoría del Procesamiento Digital del Señal
  • para aprender: API de libsndfile
  • para aprender API de JACK, ejemplo de cómo funciona la función de callback

pero a parte de aprender, se ha desarrollado con una idea en mente, que ha de ser el siguiente proyecto a realizar: utilizar una tableta gráfica Wacom, de las que utilizan los diseñadores gráficos, para producir sonidos realísticos, sensibles al movimiento y a la presión del lápiz, pero esto es otro proyecto: Reconocimiento real de gestos con la wacom y Síntesis de audio

Wacom Theremin

09/02/2012

El Theremin es un instrumento inventado por Léon Theremin en 1918 que tiene la particularidad de que se toca con los gestos de las manos. Está considerado uno de los primeros instrumentos electrónicos, y su sonido sintético y característico se ha utilizado muchas veces para películas de ciencia ficción y efectos especiales.

En este proyecto se implementa la manera de tocar y el sonido de un theremin con un controlador poco convencional: una tableta gráfica Wacom de las que utilizan los diseñadores gráficos. Si sabes cómo se toca un theremin la implementación es evidente:  con el eje x cambias el tono (Pitch Bend en terminología MIDI; con el eje y cambias el volumen; y claro: apretar el lápiz produce el sonido de la nota (mensaje MIDI NoteOn) y levantar el lápiz apaga la nota (NoteOff). Además de la posición XY, la tecnología wacom proporciona otros sensores que dan información como es la presión y la inclinación. Aunque no se ha hecho en este proyecto, se podría haber asociado la presión y la inclinación a otros mensajes MIDI CC (Continuous Controller) com pueden ser la modulación (efecto de vibrato).

Se ha utilizado un sintetizador Roland JV-2080 para producir un sonido de Theremin, aunque no estoy muy contento con el resultado obtenido. Lo bueno del JV-2080 es que tiene un espacio de memoria para guardar los patch de usuari y muchos parámetros, osciladores y efectos para poder ir jugando si tienes suficiente tiempo. Y lo que es mejor del JV-2080 es que puedes configurar el pitch bend (variación del tono) con una amplitud muy grande, también configurable, cosa que normalmente no pasa en otros sintes (sobretodo los sintes software).

Una de las cosas que me ha gustado más del proyecto es la integración de la aplicación desarrollada en lenguaje C (hay un enlace para descargar el código más abajo) con Gimp (el editor de imágenes y fotos de referencia en el mundo Linux). Esto da pie a múltiples posibilidades y ideas para hacer proyectos que combinen Gimp con efectos sonoros y interactivos.

Evidentmente, la idea no es nueva, hay otra gente que ha hecho Theremins con wacom’s y otros controladores como la Wii, pero en el proyecto 50 Ways to Play Una Plata d’Enciam no podía faltar un Wacom Theremin hecho exclusivamente con herramientas de Código Libre.


jplayfine (http://wiki.joanillo.org/index.php/Jplayfine) es un proyecto musical que estoy desarrollando, que consiste en poder hacer un play-along sobre un fichero midi (fichero SMF), y que puedas obtener una nota relacionada con la similitud entre lo que has tocado y lo que se supone que has de tocar. Para hacerlo, el programa ha de saber en qué canal está la melodía en el fichero midi, y por qué canal
toca el controlador midi. jplayfine es un cliente JACK que convive bien dentro del ecosistema de las aplicaciones de audio y midi para Linux. Bien, hablaré de jplayfine en otra ocasión.

Aunque jplayfine utiliza un secuenciador externo per hacer sonar el fichero midi (las pruebas las estoy haciendo con jack-smf-player), el tema es que desarrollando el proyecto jplayfine me he encontrado con la necesidad de parsear el fichero midi que contiene la melodía y el acompañamiento. Podia utilizar la librería smf.h que utiliza jack-smf-player. La verdad es que, con los objetivos de buscar la simplicidad, tener el máximo control del código, y entender con
profundidad el formato MIDI, me he embarcado en hacer un parseador de SMF con C++. Aquí va la versión 1.01, por si alguien se lo quiere mirar. Por una parte hay una aplicación standalone; y por otra hay la librería y una aplicación de test que muestra como utilizar la librería. También hay una carpeta midi/ con los midifiles que se han utilizado para testear. Para utilizar la librería necesitas un ompilador C++ para Linux (g++).

Enlace del proyecto: http://wiki.joanillo.org/index.php/Fitxers_MIDI_(SMF)._Format#smf_parser
Información sobre el protocolo MIDI: http://www.sonicspot.com/guide/midifiles.html
Descargar smf_parser1.01


Una composición del mi padre: un Ave María, estamos hablando de música religiosa tocada con un órgano de iglesia. La partitura se ha transcrito en lilypond, se ha tocado con fluidsynth buscando un sonido de órgano que esté bien, y se ha grabado en Ardour. Más adelante convenceré a Rita para que cante encima, pues tiene letra (en latín, como tiene que ser). Puedes descargarte el zip, donde puedes encontrar todo el material, incluido el fichero lilypond y así se puede ver cómo es este formato de transcripción musical:

Descargar Ave Maria (mp3, lilypond, midi, pdf)

La parte melódica de la melodía tiene esta pinta en lilypond:

melodia = \relative c” {
\set Staff.midiInstrument = #”church organ”
\clef treble
r2 r r r r r r r r r r r r \mBreak
bes2 g4. g8 c2 bes ees4 d8 c bes4( g) bes2 c4 bes8 aes g4( ees) g2 bes4 aes8 g f2 g4 r ees’ d8 c \mBreak
bes4( g) bes2 c4 bes8 aes g4( ees) g2 bes4 aes8 g f2 ees \bar “||” g4.\f g8 a4 f bes2 a4 a8 a bes4 a d2 d4. d8 \mBreak
d4 cis c8 c c c c bes bes4 bes bes8 bes bes4 a~ a gis16( a bes) a e’4~ e16 cis a g g8( f) f4~ f e16 g bes( g) e2~ e4 cis’16( d e d) \mBreak
cis2~ cis4 r \bar “||” r2 r r r r r r r r r \mBreak
r2 r r \bar “||” bes2\mf g4. g8 c2 bes ees4( d8) c bes4( g) bes2 c4( bes8) aes g4( ees) g2 bes4 aes8 g f2 \mBreak
g4 r ees’4( d8) c bes4( g) bes2 c4 bes8 aes g4( ees) g2 bes4( aes8) g f2 ees ges4 ges8 ges f4 f ges4. ges8 \mBreak
f8. f16 f4 g aes8 bes c4 c a( bes8) c d4 d ees bes8 g c4 bes \mBreak
aes4( g8) f aes4 g g( f8 ees) f2 f4( ees8 d) ees2~ ees4 r \bar “|.”
}

Ave maria by joanillo

Estos días estoy cantando a Pere y a María una canción de cuna que tiene un significado muy especial. Es una canción de cuna que le cantaba mi abuela Montserrat a mi padre, y es realmente muy original, no es para nada conocida. Mi abuela nació en una masía en La Guàrdia, en la subcomarca del Lluçanès (Cataluña), una zona con entidad propia entre Puigreig y Vic. Precisamente, todo el folklore de la zona lo documentó , allá por los años 40 del s. XX, que era precisamente primo de mi abuela, además de colega del folklorista Joan Amades. Hizo una obra de referencia para estudiar las canciones de la comarca <: Folklore del Lluçanès, y esta canción de cuna, sin título, precisamente no está.

Es una canción muy sencilla y dulce, como han de ser las canciones para hacer dormir a los niños. Mi padre la ha arreglado para piano, plasmando esta dulzura y simplicidad armónica. Yo sólo la he transcrito con lilypond y la he grabado con un buen sonido de piano. Así pues, mi reconocimiento para mi abuela (al cielo esté), a mi padre, y a todo el patrimonio inmaterial que representa el folklore de las tierras catalanas. La letra (traducción del catalán):

El ángel del sueño tiene las alas blancas,
tiene el cabello dorado y el vestido de plata.
El ángel del sueño que del cielo desciende.

El ángel del sueño al niño acompaña,
le mece en la cuna y los ojitos les cierra.
El ángel del sueño le besa y le canta.

Lilypond es un sistema de edición musical muy completo y que produce unas partituras de gran calidad. Eso sí, es un poco complicado de utilizar, aunque hay mucha información disponible. Yo sou un firme partidario. He transcrito la partitura manuscrita a lilypond, y aquí puedes ver el resultado:

Cançó de Bressol (descarga)

Lilypond, además de salida pdf, también produce la salida midi. Este fichero midi lo he hecho sonar con el sinte fluidsynth, que puede funcionar en línea de comandos, y que he cargado con un buen sonido de piano. Así de simple:

$ fluidsynth -l -a jack -m alsa_seq -g 1 /var/soundfonts/Musica_Theoria_v2_GM.sf2 /home/joan/lilypond/canco_bressol_v3.midi

El sonido que produce el fluidsynth se ha grabado en Ardour (el DAW de referencia en el mundo Linux), y sin más, sin añadir ningún efecto, lo he convertido a wav (y a mp3 con lame). Aquí puedes ver el resultado.
Cançó de bressol by joanillo

Espero que en un futuro esta canción se pueda ir transmitiendo de generación en generación y que quede com un bien preciado en mi familia.

Encontré por Internet la partitura del Toc de Castells. No sé exactamente de qué colla es, pues veo que cada colla toca el Toc de Castells de una forma un poco diferente. No tengo una gralla (sería equivalente a la dulzaina, en casa no me dejan tener una), pero sí que conseguí un flabiol de gralla, que tiene sonido de flauta dulce pero la digitación es la misma que la de la gralla. De esta forma puedes practicar com si fuese la gralla pero sin molestar a los vecinos. En algunas escuelas utilizan el flabiol de gralla en vez de la flauta dulce.

Esta pequeña grabación me ha servido para practicar algunos temas que tenía pendientes: la caja y los redobles están hechos con Hydrogen (me costó encontrar información de cómo hacer los redobles, pero al final lo conseguí). La secuencia de Hydrogen está grabada directamente en Ardour (escogiendo una buena librería de sonidos de batería), y he tenido que aclararme con el tema del Transporte (Ardour hace de Time Master, y JACK e Hydrogen le siguen). Todo está grabado con Ardour, con cuatro pistas: caja, redoble, flabiol 1 y flabiol 2. También he aprendido a hacer diferentes tomas (takes, playlists) en Ardour, para así poder escoger la que queda mejor; y hacer un punch en alguna zona concreta si se cree que se puede mejorar. Por otra parte, me he olvidado por fin de hacer las conexions en el QJackCtl y he hecho todas las conexions en Ardour, mucho más práctico y rápido.

Como efectos hay un reverb y compresión, que dan profundidad a la grabación y creo que la mejoran (y de paso disimulan alguna imperfección en la interpretación). En definitiva, otra grabación hecha con herramientas libres (JACK, Hydrogen, Ardour, GNU/Linux). El software libre al servicio de la música tradicional.

Hay una entrada de los Castells en la wikipedia en español, pero no en inglés. Podría ser interesante que alguien del mundillo casteller hiciese una entrada en la wikipedia en inglés.

Toc de Castells by joanillo

Pere tiene ahora 2 años y tres meses. Aprovechando la inercia de La Castañada y Todos los Santos he grabado de forma improvisada cómo canta La Castanyera.

Estamos muy acostumbrados a archivar las fotos, y también los videos, y a tenerlos más o menos clasificados. Con las fotos podemos ver cómo crecen los niños (Y cómo crecen!). Podría ser una buena idea coleccionar, archivar y clasificar ficheros de audio. También tienen un valor documental, aunque damos más importancia a las fotos y a los videos.

Por ejemplo, me he dedicado 5 minutos a buscar por el fondo sonoro de la Biblioteca Nacional de Catalunya y he encontrado esta grabación de los años 50 de la Cobla de Barcelona, la coral Sant Jordi y el director Oriol Martorell: Vacaciones en la Costa Brava [archivo sonoro]

Aquí va La Castanyera cantada por Pere, con 2 años y tres meses:

gravació Pere, 2 anys i tres mesos by joanillo

Page 17 of 20« First...«1516171819»...Last »