Archivo de la categoría: Joanillo Productions

50 ways… #6. Editores de partituras: Lilypond

En el anterior post creamos un soundfont para acordeón diatónico, castagnari.sf2, y con sus sonidos tocamos mi canción preferida: Una Plata d’Enciam, dentro del proyecto 50 ways to play Una Plata d’Enciam. Vamos a ver ahora cómo con el editor de partituras Lilypond podemos crear una partitura muy correcta, que responda a los retos que nos plantea la notación para el acordeón. Lo que haremos en este post no es nada del otro mundo. En el blog amigo Scores of Beauty, http://lilypondblog.org/, se lleva al extremo las posibilidades de lilypond.

Básicamente lo que queremos es visualizar correctamente la melodía, los acordes, y cómo se han de tocar los bajos/acordes de la mano izquierda (es decir, el acompañamiento). La idea es crear unas partituras didácticas que ayuden a mi hija a poner los dedos de la mano izquierda.

Lo primero que haremos es crear la melodía, pondremos encima de las notas los acordes en la forma habitual, y mostraremos cuándo se ha de tocar un bajo (b) o un acorde (a) con la mano izquierda. Esto último lo haremos con \\lyrics, como si fuese la letra de una canción.

\\version «2.12.1»
\\header {
title = «Una Plata d’Enciam»
composer = «tradicional catalana»
}

baixosnotacio = \\chordmode {
c4 c f c f g g c c c f c f g g c
c4 c f c f g g c c c f c f g g c
}

partitura = \\relative c’
<<
\ew ChordNames {
\t\\set chordChanges = ##t
\t\\baixosnotacio
}

\ew Staff = «veu 1»
{
\\clef treble
\\key c \\major
\\time 2/4
\\tempo 4=80

\te8 f g g a a g4 \\times 2/3 { a8 a g } f f \\times 2/3 { f f f } g e e f g g a a g4 \\times 2/3 { a8 a g } f f f g e4
\te8 f g g a a g4 \\times 2/3 { a8 a g } f f \\times 2/3 { f f f } g e e f g g a a g4 \\times 2/3 { a8 a g } f e f g e4
}
\\addlyrics {
\tb _ a _ b _ a b _ _ a _ b _ _ a _ b _ a _
\tb _ a _ b _ a b _ _ a _ b _ _ a _ b _ a _
\tb _ a _ b _ a b _ _ a _ b _ _ a _ b _ a _
\tb _ a _ b _ a b _ _ a _ b _ _ a _ b _ a _
}

>>

\\score {
\\partitura
\\layout { }
\\midi { }
}

Ahora vamos a poner los bajos. Si lo hacemos en la forma habitual funciona, pero queda una partitura que no és útil para su lectura. Además, no es correcta, pues como se ha explicado en el anterior post la asociación entre los acordes CM, DM,… y las notas midi 24, 26,… fue una decisión arbitria. Quedaría de la siguiente manera:

\\version «2.12.1»
\\header {
title = «Una Plata d’Enciam»
composer = «tradicional catalana»
}

baixosnotacio = \\chordmode {
c4 c f c f g g c c c f c f g g c
c4 c f c f g g c c c f c f g g c
}

partitura =
<<
\ew ChordNames {
\t\\set chordChanges = ##t
\t\\baixosnotacio
}

\\relative c’
\ew Staff = «veu 1»
{
\\clef treble
\\key c \\major
\\time 2/4
\\tempo 4=80
\t%notes amb valors relatius
\te8 f g g a a g4 \\times 2/3 { a8 a g } f f \\times 2/3 { f f f } g e e f g g a a g4 \\times 2/3 { a8 a g } f f f g e4
\te8 f g g a a g4 \\times 2/3 { a8 a g } f f \\times 2/3 { f f f } g e e f g g a a g4 \\times 2/3 { a8 a g } f e f g e4
}
\\addlyrics {
\tb _ a _ b _ a b _ _ a _ b _ _ a _ b _ a _
\tb _ a _ b _ a b _ _ a _ b _ _ a _ b _ a _
\tb _ a _ b _ a b _ _ a _ b _ _ a _ b _ a _
\tb _ a _ b _ a b _ _ a _ b _ _ a _ b _ a _
}

\ew Staff = «baixosnotes»
{
\\key c \\major
\t%notes amb valors absoluts
\tc,8. r16 c,,8 r f,8. r16 c,,8 r f,8. r16 g,,8 r g,8. r16 c,,8 r
\tc,8. r16 c,,8 r f’8. r16 c,,8 r f,8. r16 g,,8 r g,8. r16 c,,8 r
\tc,8. r16 c,,8 r f,8. r16 c,,8 r f,8. r16 g,,8 r g,8. r16 c,,8 r
\tc,8. r16 c,,8 r f,8. r16 c,,8 r f,8. r16 g,,8 r g,8. r16 c,,8 r
}
>>

\\score {
\\partitura
\\layout { }
\\midi { }
}

Aquí es importante remarcar que se ha utilizado la notación relativa para la melodía, y la notación absoluta para los bajos, que simplifica mucho escribir la alternancia entre bajos y acordes. Esta partitura no es correcta para su impresión, pero el fichero midi que produce sí que es correcto. ¿Hay una manera de solucionarlo? Sí. Se puede definir un \\score para ser impreso, y otro \\score para generar el fichero midi. El resultado queda de la siguiente manera: la partitura para imprimir es correcta (no aparecen las notas de los bajos, sólo las posiciones donde hemos de poner los dedos de la mano izquierda); y el fichero midi resultante también es correcto:

\\version «2.12.1»
\\header {
title = «Una Plata d’Enciam»
composer = «tradicional catalana»
}

baixosnotacio = \\chordmode {
c4 c f c f g g c c c f c f g g c
c4 c f c f g g c c c f c f g g c
}

partitura = \\relative c’
<<
\ew ChordNames {
\t\\set chordChanges = ##t
\t\\baixosnotacio
}

\ew Staff = «veu 1»
{
\\clef treble
\\key c \\major
\\time 2/4
\\tempo 4=80
\te8 f g g a a g4 \\times 2/3 { a8 a g } f f \\times 2/3 { f f f } g e e f g g a a g4 \\times 2/3 { a8 a g } f f f g e4
\te8 f g g a a g4 \\times 2/3 { a8 a g } f f \\times 2/3 { f f f } g e e f g g a a g4 \\times 2/3 { a8 a g } f e f g e4
}
\\addlyrics {
\tb _ a _ b _ a b _ _ a _ b _ _ a _ b _ a _
\tb _ a _ b _ a b _ _ a _ b _ _ a _ b _ a _
\tb _ a _ b _ a b _ _ a _ b _ _ a _ b _ a _
\tb _ a _ b _ a b _ _ a _ b _ _ a _ b _ a _
}
>>

fitxermidi =
<<
\\relative c’
\ew Staff = «veu 1»
{
\\clef treble
\\key c \\major
\\time 2/4
\\tempo 4=80
\t%notes amb valors relatius
\te8 f g g a a g4 \\times 2/3 { a8 a g } f f \\times 2/3 { f f f } g e e f g g a a g4 \\times 2/3 { a8 a g } f f f g e4
\te8 f g g a a g4 \\times 2/3 { a8 a g } f f \\times 2/3 { f f f } g e e f g g a a g4 \\times 2/3 { a8 a g } f e f g e4
}

\ew Staff = «baixosnotes»
{
\\key c \\major
\t%notes amb valors absoluts
\tc,8. r16 c,,8 r f,8. r16 c,,8 r f,8. r16 g,,8 r g,8. r16 c,,8 r
\tc,8. r16 c,,8 r f’8. r16 c,,8 r f,8. r16 g,,8 r g,8. r16 c,,8 r
\tc,8. r16 c,,8 r f,8. r16 c,,8 r f,8. r16 g,,8 r g,8. r16 c,,8 r
\tc,8. r16 c,,8 r f,8. r16 c,,8 r f,8. r16 g,,8 r g,8. r16 c,,8 r
}
>>

\\score {
\\partitura
\\layout { }
}

\\score {
\\fitxermidi
\\midi { }
}

Finalmente podemos escuchar la canción Una Plata d’Enciam tal como quedaría con un acordeón diatónico:

Una Plata d’Enciam by joanillo

Referencias:

50 ways… #5. Cómo hacer un soundfont para acordeón

Mi hija está aprendiendo a tocar el acordeón diatónico. Se trata de un acordeón de botones de la marca Castagnari, modelo Studio, con dos hileras de botones en la mano derecha (afinadas en Sol y en Do), y los 8 botones de la mano izquierda son los bajos, divididos en 4 bajos y 4 acordes. Este es el tipo de acordeones que sonaban en les fiestas mayores de los pequeños pueblos del Pirineo. Cuando todavía no había carreteras para llegar a estos pueblos, en el siglo XIX y hasta entrado el siglo XX, los músicos habían de subir a los pueblos a pie o en mula. Por tanto era necesario acarrear instrumentos transportables. Muchas veces un acordeón y un violín animaban el baile en la plaza del pueblo.

En esta ocasión, ya que dispongo de un instrumento nuevo para mi, quiero hacer la práctica de crear un soundfont desde cero, y de esta manera podré utilizar el sonido de este instrument en diferents proyectos. Evidentmente, se ha de empezar mostreando todas las notas. Para hacerlo se utilizará un micrófono de una calidad óptima, intentando que no haya ruidos de fondo. Se grabará a un volumen adecuado, notas largas, y sin producir saturación, en un solo canal. Las muestras se van grabando de forma ordenada y utilizando un nombre de fichero adecuado de manera que no hi haya confusión posible. Para grabar las muestras he utilizado un Ubuntu 12.04 32 bits, interfície Edirol UA-25EX y un micrófono Beyerdynamic TG I5d2d. Se ha utilizado el siguiente comando:

arecord -r 44100 -f cd -t wav -D plughw:UA25EX accordion_C4.wav

Deberemos tener cuidado al samplear los bajos y los acordes, que son botones especiales. Una vez tengamos todas las muestras, con el Audacity editamos los ficheros de onda. Cogemos una parte significativa de la muestra sampleada, intentando que la envolvente sea periódica, y evidentmente no coger los extremos del fichero de onda. Nos aseguramos de que la muestra no tenga saturación, y amplificamos la muestra a un nivel razonable, de manera que todas las muestras tengan un volumen similar. El resultado de las muestras es el siguiente:

Samples Accordion Castagnari Studio by joanillo

Samples Accordion Castagnari Studio (Bass and chords) by joanillo

Entonces ya podemos empezar a utilizar el Polyphone, que será el entorno gráfico que utilizaremos para construir el soundfont. Lo primero que haremos es importar todas las muestras, y diremos cuál es la nota raíz de cada nota, de manera que ya le estamos asignando una frecuencia. Entonces creamos un instrument nuevo (por ejemplo Accordion), que será el único instrumento que contendrá este soundfont. Ahora es cuando tenemos que asociar cada muestra a una nota midi del instrumento que estamos editando. Por ejemplo, para la muestra accordion_C4.wav pondremos:

    \t

  • root key = 60
  • \t

  • key range = 60-60
  • \t

  • attack = 0,2s
  • \t

  • release = 0,2 s

Las notas de los bajos que se hacen con la mano izquierda se corresponden con las siguientes notas midi:

    \t

  • Bajo C = 36 (C2)
  • \t

  • Bajo D = 38 (D2)
  • \t

  • Bajo E = 40 (E2)
  • \t

  • Bajo F = 41 (F2)
  • \t

  • Bajo G = 43 (G2)
  • \t

  • Bajo A = 45 (A2)

Y un caso especial son los acordes que se hacen con la mano izquierda, que se asocian por convenio a las siguientes notas midi.

    \t

  • Acorde CM = 24 (C1)
  • \t

  • Acorde DM = 26 (D1)
  • \t

  • Acorde EM = 28 (E1)
  • \t

  • Acorde FM = 29 (F1)
  • \t

  • Acorde GM = 31 (G1)
  • \t

  • Acorde Am = 33 (A1)

Y es importante recalcar que esta asociación es un convenio. Cuando toque la nota midi 24 se disparará el sonido sampleado que corresponde al acorde CM.

Para los bajos y acordes se ha fijado los valores de attack y release a 0,6s.

Para acabar de definir el soundfont hemos de crear un nuevo preset asociado a este instrumento, de manera que el sonido de acordeón lo tendremos en el banco=0 y canal=0 (000:000). Finalmente ya puedo guardar el soundfont, castagnari.sf2, y ya lo puedo testear, en este caso con fluidsynth, haciendo sonar mi canción preferida: Una Plata d’Enciam, tocada a la manera cómo se hace con el diatónico: la melodía con la mano derecha, y alternando los bajos y los acordes con la mano izquierda.

/usr/bin/fluidsynth -s -l -j -a jack -m jack ./accordion_castagnari_studio.sf2 ./una_plata_denciam.midi

Una Plata d’Enciam by joanillo

En el siguiente post explicaremos cómo se ha generado el fichero midi que acabamos de tocar a partir del editor de partituras lilypond. Tenía ganas de hacer un post sobre lilypond, y concretament ahora que mi hija esta aprendiendo el diatónico, cómo se puede utilizar lilypond para la notación de acordeón.

Referencias:

Solución portátil para un saxo electrónico: Raspberry PI + soft o hard sinte

EWI-USB and Raspberry Pi

EWI-USB and Raspberry Pi

Para tocar el controlador de viento EWI-USB normalmente me conecto al portátil. Ejecuto el fluidsynth o cualquier otro soft sinte. Por tanto, la solución para practicar es EWI-USB + portátil + auriculares. Existe una solución más portable y autónoma? Definitivamente sí utilizando la Raspberry Pi, buscando una solución puramente consola y totalment desatendida: enchufar y tocar. En esta ocasión no utilizo JACK, es una solución purament ALSA. Se trata de instalar fluidsynth, algún soundfont que suene bien y que no pese demasiado, configurar el usuario pi con prioridad realtime, desinstalar cualquier servicio que no tenga que utilizar.

Con un script en /etc/udev/rules.d/ewiusb.rules conseguimos que en el momento que conecto el EWI-USB por el puerto USB se ejecuten los comandos que me permitirán tocar automáticamente: ejecutar fluidsynth y conectar la salida midi del EWI-USB a la entrada midi del fluidsynth. He tenido bastantes problemas con la letencia, pero el script que se muestra más abajo a mi em funciona bien sin latencia.

Además, con un poco de electrónica simple y utilizando los pins GPIO se podría cambiar fácilmente el programa midi y poder escoger entre diferentes instrumentos: saxo, midi, flauta,…

Otra posibilidad, como se ve en la fotografía, es utilizar un sinte hardware com el Roland JV-1010. Como la entrada del JV-1010 es puramente midi se necesita un cable conversor USB2MIDI (por ej, http://www.amazon.com/dp/B0017H4EBG), que muestra sus puertos a ALSA. Con esta solución no has de temer por la latencia, es una magnífica experiencia de usuario, y podemos escoger entre centenares de sonidos.

/etc/udev/rules.d/ewiusb.rules

#/etc/udev/rules.d/ewiusb.rules
ACTION==»add», SUBSYSTEMS==»usb», ATTRS{product}==»EWI-USB», RUN+=»/home/pi/ewiscript.sh»

/home/pi/ewiscript.sh

#!/bin/sh
#/home/pi/ewiscript.sh
#script que s’ha d’executar quan connectem el EWI-USB. Dos casos: a) synth hardware (roland); b) synth software (fluidsynth)

#mirem si tenim connectat el cable usb-midi
if [ -z `/usr/bin/aconnect -iol | grep USB2.0-MIDI | awk ‘/client/{print $1}’` ]; then

#no està connectat: b) synth software (fluidsynth)
if [ -z `pidof -s fluidsynth` ]; then
screen -d -m -S fluidsynth -t «fluidsynth» /usr/bin/fluidsynth -a alsa -m alsa_seq -g 1 -c 4 -z 256 -r 48000 /home/pi/Natural_Oboe.sf2
/bin/sleep 3
/usr/bin/amixer set Master 40%+ > /dev/null
/bin/sleep 2
FLUIDSYNTH=$(/usr/bin/aconnect -o -l | awk ‘/FLUID/{print $2.»0″}’)
/bin/sleep 2
#echo $FLUIDSYNTH
EWIUSB=$(/usr/bin/aconnect -o -l | awk ‘/client/’ | awk ‘/EWI-USB/{print $2.»0″}’)
/bin/sleep 2
/usr/bin/aconnect $EWIUSB $FLUIDSYNTH
/bin/sleep 2
fi
else
#a) synth hardware (roland)
USBMIDI=$(/usr/bin/aconnect -o -l | awk ‘/client/’ | awk ‘/USB2.0/{print $2.»0″}’)
/usr/bin/aconnect EWI-USB:0 $USBMIDI
/bin/sleep 2
fi

Más información, aunque en catalán, en la wiki

RPIJERS: Raspberry Pi Internet Jazz European Radio Stations


Quieres escuchar jazz todo el santo día? En Internet tienes bastante para escoger, por ejemplo, http://www.listenlive.eu/jazz.html. En este proyecto hemos indexado todas estas estaciones de radio para escucharlas de una forma simple y con una interfaz mínima. Y esto lo hemos conseguido con la Blackberry Pi. Sólo necesitamos alimentarla, enchufarla a un cable de red, conectarla a un amplificador, y un botón que nos sirve para arrancar el servicio mpd (Music Player Daemon) y para seleccionar hasta 40 canales.

Puedes descargarte de la wiki (http://wiki.joanillo.org/index.php/Raspberry_Pi:_Internet_Ràdio) el bash script i el fichero con la lista de todas las emisoras. Si quieres que el sistema funcione de forma totalmente desatendida tienes que hacer que el script arranque en el inicio del sistema. La electrónica necesaria es mínima, creo que en el video quedan claras las conexiones, y si no en la wiki hay más información (aunque en catalán).

Os deseo un feliz 2013 y mucho jazz! Aquí va el vídeo:

Interficie Wii Rockband drumset

El otro día compré en el Cash Converter, por 18e, una batería Wii de segunda mano, con la idea de hacerla sonar en mi Ubuntu. Estas baterías salieron al mercado en 2007, hace ya cinco años. Evidentemente hay gente que ha llevado estas consolas al entorno Linux, y me he beneficiado del código que he encontrado por aquí y por allá. Sin embargo, el codi que he encontrado no era para mi modelo (también existen versiones para PS2, PS3 y X360), así que he tenido que averiguar los códigos que envía el drumset (con la dificultad que cuando tocas las dos baquetas a la vez, o las dos baquetas y el bombo, se envían otros códigos). No tenía experiencia previa en la programación de la librería libusb. Utilizando esta librería ha estado la única forma posible de detectar la fuerza con que golpeo la baqueta, y por tanto hacer un poco de control de volumen, aunque con poca resolución.

Para hacer sonar la batería se necesita generar mensajes MIDI y enviarlos a un sintetizador. He utilizado Hydrogen como sintetizador de sonidos de batería. He programado cuatro presets diferentes que se acceden con los botones de la consola (los típicos botones 1, 2, A y B de la Wii). Se han hecho dos versiones del código, una que utiliza ALSA de forma nativa, y otra para el servidor de audio JACK. Puedes descargarte el código del proyecto:
jrbdrum project

Stop motion: puzzle de 1000 piezas

Només hi ha una època en la vida on fer puzzles és interessant: quan ets nen. Com el Pere, que disfruta fent el puzzle de pirates de 40 peces. Quan ets adult fer puzzles és una autèntica pèdua de temps. Dit això, jo tenia l’espina clavada doncs en el seu dia no vaig poder acabar un puzzle que corria per casa de 750 peces. M’ho devia. Així que un dia que vaig entrar al Cash&Converter vaig agafar un puzzle per 5 euros (no vaig poder triar la foto, però m’era ben bé igual), i em vaig posar a fer el puzzle a estones, igual que un nen.

Stop motion. Quantes fotos s’han de fer a mida que desmunto el puzzle? Quantes peces trec entre foto i foto? Anem a fer el petit càlcul. Si el puzzle és de 1000 peces i trec dues peces entre foto i foto són 500 fotos, que seran 500 frames del video. Si vull muntar un video a 20 fps (20 frames cada segon), sortirà un vídeo de 500f/20fps = 25 segons.

Amb un script es pot muntar el video. Primer de tot es renombren les fotos de manera que la primera passi a ser la última, i la última la primera. De manera que la última és la foto que es diu 99999.JPG. Després es tornen a renombrar de manera que la primera passi a ser la 00000.JPG, etc. I seguidament es munta el video concatenant totes les fotos. Finalment, amb l’editor de video Open Shot es posa la portada, la contraportada, la música i es fan les foses.

#!/bin/bash
#rename files in reverse
START=99999 #allows for an hour of jpegs
i=$START
for f in *.JPG
do
mv $f $i.JPG
i=$(($i -1))
echo $i
done

c=0;
for i in *.JPG;
do mv «$i» «`printf %05d $c`.JPG»;
c=$((c+1));
done

ffmpeg -r 20 -sameq -i %05d.JPG output.mp4

El resultat final:

Jugando con la FFT

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: grabar la señal del micro a un fichero wav

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:

jplay-sndfile: una aplicación educativa para Procesamiento Digital del Señal

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

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

\tExamples:
\t./jplay_sndfile samples/hellosine.wav
\t./jplay_sndfile 0.65 samples/hellosine.wav
\t./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)
{

\tjack_default_audio_sample_t buf ;
\tunsigned int i;
\touts = (jack_default_audio_sample_t *)jack_port_get_buffer (output_port, nframes) ;

\tinfo_t *info = (info_t *) arg;
\t
\tmemcpy (outs_original, buffer2 + frames_counter_original, sizeof (jack_default_audio_sample_t) * nframes * DOUBLE_SAMPLES * 2);

\tint k=0;
\tfloat k2;
\tk2 = nframes/info->shift_pitch;
\tfloat var, var2 = 0;
\tint part_entera = 0;
\tvar = 1/info->shift_pitch – 1;

\tfor (i = 0 ; i < nframes ; i++)
\t{\t

\t\tif (info->shift_pitch < 1) {
\t\t\tif (frames_counter + i >= info->numFrames / shift_pitch_equivalent) { // shift_pitch_equivalent = info.shift_pitch quan no faig un escombrat
\t\t\tinfo->play_done=1;
\t\t\treturn 0;
\t\t\t}
\t\t} else { // >= 1
\t\t\tif (frames_counter_original + i >= info->numFrames * DOUBLE_SAMPLES) {
\t\t\tinfo->play_done=1;
\t\t\treturn 0;
\t\t\t}
\t\t}
\t\t
\t\tif (info->shift_pitch > 1) {
\t\t\tk=(int)(i*DOUBLE_SAMPLES*info->shift_pitch + .5);
\t\t\touts[i] = outs_original[k];\t
\t\t} else if (info->shift_pitch <= 1) {
\t\t\touts[k] = outs_original[i*DOUBLE_SAMPLES];
\t\t\tif ((int)var2 != part_entera) {
\t\t\t\touts[k+1] = outs_original[i*DOUBLE_SAMPLES+1];
\t\tpart_entera = int(var2);
\t\tk++;
\t\t\t}
\t\t\tvar2 = var2 + var;
\t\t\tk++;\t\t\t
\t\t}

\t}
\tframes_counter += nframes;
\tframes_counter_original += nframes * DOUBLE_SAMPLES * info->shift_pitch ;
\t
\treturn 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

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.