Enero 12, 2007...21:13

MIDI en GNU/Linux (II)

Saltar a Comentarios

Espero que todo el mundo tenga claro el significado de la palabra síntesis, en contraposición a análisis:

  • Cuando realizamos un análisis, descomponemos un todo en sus partes. Probablemente con intención de estudiarlo con mayor profundidad, o para conocer su estructura. Ejemplo: análisis de sangre.
  • Por el contrario, cuando realizamos una síntesis, estamos construyendo un todo a partir sus partes. Ejemplo: sangre sintética (creada en un laboratorio).

En un post posterior hablaremos con mayor profundidad sobre la síntesis de sonido. De momento, nos basta con saber que existe, y más o menos para qué sirve.

Pequeña introducción a la síntesis de sonido

Hasta ahora, el mundo MIDI funciona bastante bien de forma teórica. Pero al llevarlo a la práctica, nos damos cuenta de que falta lo más esencial: el sonido. Sabemos cómo tenemos que tocar las notas (tenemos la partitura), pero no tenemos (hasta el momento) forma de hacer sonar esa información musical que existe dentro del MIDI.

De ello se encargará el sintetizador. ¿Qué ingredientes necesitamos? Un sonido de ejemplo (sample), a partir del cual, utilizando unos determinados cálculos matemáticos, obtendremos los demás sonidos de la escala. Obviamente, de ésta forma se obtendrá un instrumento con una calidad muy pobre, pero más adelante veremos cómo se puede mejorar ésto.

Pues bien, en resumen: un sintetizador es un software (o hardware, como siempre) que, a partir de un conjunto de muestras de sonido pregrabadas, es capaz de generar cualquier tono de la escala de ese instrumento.

Es interesante remarcar que no es necesario tener una muestra de sonido por cada nota. Alterando la frecuencia de la onda sonora, es posible obtener nuevas notas. En otras palabras, a partir de un DO es posible obtener un DO# (un semitono por encima). Mediante un sencillo cálculo matemático, podemos saber cuál sería la frecuencia de un DO# en relación a un DO, y modificar el sonido del DO consecuentemente con dicho cálculo.

Bancos de Sonidos

Los sintetizadores suelen trabajar con más de un sample por instrumento. También suelen trabajar con varios instrumentos: piano, flauta, violín. Incluso no es raro que se utilicen varios tipos del mismo instrumento: piano tipo A, piano tipo B, etc.

¿Consecuencia? Es preciso tener una forma de organizar todos esos samples. Y esa forma se llama banco de sonido. Aunque no existe un estándar oficial, existe algún que otro estándar de facto para los bancos de sonidos. Posteriormente también se profundizará sobre éste tema.

La mayoría de sintetizadores actuales pueden configurarse con varios bancos de sonidos. ¡Incluso es posible crear instrumentos personalizados!

Timidity

Timidity es un sintetizador software GPL, disponible en los repositorios de Ubuntu. Se puede utilizar de múltiples formas, bien como servidor independiente, bien como servidor integrado con ALSA, bien como aplicación cliente (para reproducir un archivo directamente, o para generar un archivo mp3, ogg, flac… con el resultado de la ejecución).

Sin duda, la opción más interesante es como servidor integrado con ALSA. De esa forma, podemos utilizar otras aplicaciones que hagan uso del MIDI (como por ejemplo, un editor de partituras llamado rosegarden).

La instalación de timidity es muy sencilla con aptitude:

$ sudo aptitude install timidity

Para utilizar las características relativas al MIDI, es preciso tener cargados ciertos módulos del kernel. Añadid las siguientes líneas al /etc/modules para que se carguen cada vez que se encienda la máquina:

frodo@hobbiton:~/Desktop$ tail /etc/modules
# Soporte MIDI para utilizar timidity
snd-seq-device
snd-seq-midi
snd-seq-oss
snd-seq-midi-event 

snd-seq

En /etc/init.d hay un script llamado timidity, que inicializa correctamente timidity para utilizarlo como servidor en ALSA. Para que se cargue correctamente al inicio de la máquina, crearemos un enlace en el directorio /etc/rcX.d, en el que X representa el nivel de ejecución actual (podéis verlo con el comando runlevel, probablemente sea el nivel 2):

frodo@hobbiton:/etc/rc2.d$ runlevel
N 2

Crearemos un enlace para iniciar timidity:

frodo@hobbiton:$ sudo ln -s /etc/init.d/timidity /etc/rc2.d/S99timidity

Y otro para detener timidity:

frodo@hobbiton:$ sudo ln -s /etc/init.d/timidity /etc/rc2.d/K99timidity

Ambos enlaces enlazan al mismo script, que será llamado con diferentes parámetros: start en el primer caso, y stop en el segundo. La nomenclatura es la usada tradicionalmente en sistemas Debian.

Ahora bastaría con reiniciar la máquina para empezar a usar timidity.

Usando timidity

Una vez reiniciada la máquina, comprobamos si timidity está en ejecución:

frodo@hobbiton:~$ ps -A | grep timidity
9694 pts/2    00:00:10 timidity

Ahora deberíamos tener los puertos disponibles para usarlos con pmidi:

frodo@hobbiton:~$ pmidi -l
Port     Client name                       Port name
62:0     Midi Through                      Midi Through Port-0 

128:0     TiMidity                          TiMidity port 0 

128:1     TiMidity                          TiMidity port 1 

128:2     TiMidity                          TiMidity port 2 

128:3     TiMidity                          TiMidity port 3

¡Correcto! Ahora si ejecutamos un archivo midi de la forma:

$ pmidi -p 128:0 archivomidi.mid

Deberíamos ser capaces de escucharlo.

Configuración de timidity

timidity posee multitud de opciones (ver página de manual). Aquí únicamente mencionaremos que podemos configurar el banco de sonidos en el archivo de configuración /etc/timidity/timidity.cfg:

frodo@hobbiton:~$ tail /etc/timidity/timidity.cfg 

#opt EFdelay=d          #disable delay 

#opt no-anti-alias
#dsdf
# Disabling some of the Midi Controls can help with the CPU usage a lot. 

# The same goes to the VLPF, sample anti-aliasing and effects such as 

# reverb and chorus 

# By default, try to use the instrument patches from freepats: 

source /etc/timidity/freepats.cfg

La última línea indica el banco de sonidos a usar. Por defecto se utiliza freepats, que es un banco de sonidos libre en formato GUS (Gravis Ultrasound). También se puede utilizar el formato SoundFont, escribiendo una línea como la siguiente:

soundfont /home/frodo/ejemploSF.sf2

Utilizando aplicaciones MIDI

Ahora que timidity está perfectamente integrado en el sistema, podemos ejecutar aplicaciones que internamente utilizan MIDI. Por ejemplo, GNU Solfege (existe versión para Windows, por si está alguien interesado).

$ aptitude install solfege

GNU solfege es una aplicación educativa muy interesante, que se autodefine como “free ear training software”. Consiste en una serie de ejercicios musicales, para entrenar nuestro oído musical: dictados melódicos y rítmicos, intervalos melódicos y armónicos con inversiones, distinguir diferentes tipos de escalas, etc.

Ésta aplicación utiliza MIDI para ejecutar cada uno de los ejemplos, por lo que aprovecha las ventajas de éste protocolo para proporcionar una mayor interactividad con el usuario.

Para más información, ver su página web: http://www.solfege.org.

9 comentarios

  • Hola
    Estupendos artículos, llevaba tiempo navegando y no encontraba nada serio hasta aquí.

    Leyendo este artículo me surge una duda: en los primeros tiempos de los sintetizadores se creaban todas los sonidos de manera eletrónica, pero ahora parece que usan sonidos pregrabados y a partir de ellos los modifican para conseguir diferentes tonos, ¿es así?, ¿los sintetizadores antes eran más sintetizadores que ahora?

    ¿Un clavinova tienes todas las notas pregrabadas o las sintetiza a partir de una muestra?

    Y otra duda, timidity cómo pasa de midi a wav, ¿reproduce los sonidos en la tarjeta y los graba para luego pasarlos a wav? en otras palabras, depende la calidad de la conversión del hardware ?

    Saludos

  • Hola Luis, ¿qué tal estás?

    Efectivamente, los primeros sintetizadores generaban los sonidos de manera “electrónica”. Su funcionamiento se basaba en la generación de funciones matemáticas periódicas cuya forma de onda se “asemejase” a la de un instrumento real.

    Para que te hagas una idea, es como si intentásemos generar una nota a partir de una función seno. Por ejemplo, para generar
    un La de frecuencia 440 Hz utilizaríamos la función f(x) = sin(440 * (2 * pi) * x), ya que dicha función tiene exactamente esa frecuencia.

    La síntesis utilizada por aquellos sistemas se denomina formalmente “Síntesis FM” (modulación por frecuencia). Actualmente se usa la “Síntesis por tabla de ondas” (wavetable synthesis) que, como indicas, es una serie de sonidos pregrabados que se modifican (mediante procesamiento de señal) para obtener todos los sonidos de la escala.

    ¿Eran los sintetizadores de antes “más sintetizadores” que los de ahora? Bueno, eso es una discusión filosófica. Hay gente que piensa que los “verdaderos” sintetizadores eran los sintetizadores FM, puesto que los sonidos se generaban desde cero (¿síntesis pura?), mientras que en la síntesis por tabla de ondas partes de un sonido ya pregrabado.

    De todas maneras, discusiones filosóficas al margen, la diferencia entre las calidades de sonido obtenidas, sinceramente, no tiene color. ¿Que la síntesis por tabla de ondas no es “exactamente” síntesis? Bueno, podemos considerarlo un abuso del lenguaje, como sucede muchas veces en nuestra vida cotidiana. ¿Alguien se ha preguntado porqué a los hombre se les llama “caballeros”? Hace mucho tiempo que la gente no anda a caballo, mas se sigue utilizando la misma palabra:)

    Los clavinova, por lo que parece, son unos teclados de gama media / alta de la compañía Yamaha. No tengo ni idea de cómo estará diseñado, ¿que cuántas muestras tendrá en su tabla de ondas?. No te puedo contestar. Pero en respuesta a tu pregunta, es imposible que la tabla tenga una única muestra. Te explico.

    Es cierto que modificando la frecuencia de una nota podemos obtener todos los sonidos de la escala, puesto que conocemos, matemáticamente, la frecuencia que le corresponde. Esa es la teoría, en la práctica se nota que es un sonido “manipulado”. Por tanto, la “modificación de frecuencia de una nota para obtener otras notas” es una técnica válida, pero que hay que aplicar con moderación.

    Además, ten en cuenta que en esa serie de pianos prima la calidad del sonido, por lo que seguro que no han escatimado muestras en hacer una buena tabla de ondas. En mi opinión, seguramente tendrá muestradas todas (o casi todas) las notas que puedes escuchar.

    En respuesta a tu pregunta sobre timidity: Timidity es un sintetizador *software*, lo que significa que es un programa que funciona independientemente de tu tarjeta. Internamente, timidity hace un procesamiento de señales (de hecho utiliza interpolación de funciones y cosas de esas que se dan en cálculo numérico :p) y obtiene una señal de salida.

    Ten en cuenta que con tener las muestras pregrabadas no haces nada. Detrás del proceso de síntesis hay una gran cantidad de procesamiento de las señales. Lo que aquí puedes leer (en éste blog) es casi anecdótico, comparado con la complejidad de un sintetizador actual.

    Por tanto, cuando timidity reproduce un archivo, genera una señal como salida. En el modo de funcionamiento normal, dicha señal de salida se envía directamente a la tarjeta de sonido, para que puedas escucharlo. Si utilizas timidity para generar un archivo wav, lo que haces es guardar esa misma señal en tu disco duro, para reproducirlo posteriormente. ¡Nota que la tarjeta de sonido no interviene para nada!

    Es más, te digo lo siguiente: Utilizando el mismo banco de sonidos, ejecutando timidity sobre el mismo fichero midi en dos máquinas completamente distintas deberían producir prácticamente el mismo resultado.

    De todas formas, si utilizas alguna tarjeta de sonido que tenga algún chip de síntesis por hardware, probablemente te interesará utilizar algún otro software que sea capaz de sacarle partido. Pero en todo caso, ese software tiene que estar preparado para ese hardware. Así que buscaría alguna otra alternativa.

    Espero haberte respondido con claridad a lo que me preguntabas. Muchas gracias por tu comentario, es muy gratificante que el trabajo de uno es interesante para otras personas :)

    Por cierto, al leer tu comentario me acabas de recordar que hay un artículo que tenía como borrador sobre lo que te acabo de decir, y que no he publicado. ¡Ahora mismo lo libero! Pues mira, queda dedicado a tí ¿Ok? :p

    ¡Cualquier otra cosa que necesites, ya sabes!

    Un saludo,

    Santi

  • Hola Santi, gracias por la contestación.

    Me gustaría aclarar un poco más los conceptos. O sea, que a partir de un fichero midi, ¿distintos sintetizadores pueden obtener diferentes calidades de sonido, dependiendo de su funcionamiento interno? Y de la misma manera timidity, al obtener el fichero wav, ¿la calidad de este fichero dependerá del algoritmo que use?

  • Hola de nuevo, Luis :-)

    Efectivamente, distintos sintetizadores obtendrán distintas calidades de sonido dependiendo de su funcionamiento interno (suponiendo que utilizamos el mismo banco de sonidos, claro).

    Piensa que un archivo MIDI es como una especie de “partitura” en la que están almacenada únicamente información musical. En una partituras tienes negras, corcheas, notas do, notas sol sostenido, etc. El archivo MIDI utiliza otra representación distinta; no simbólica, como la partitura, sino basada en la ocurrencia de eventos a lo largo del tiempo. Aún así, son dos representaciones diferentes de un mismo hecho: La información musical. Pero su funcionalidad viene siendo la misma, a grandes rasgos.

    Imagina que una partitura puede ser interpretada de muchas formas. Seguramente serás capaz de distinguir un buen músico de un mal músico, ¿verdad? Por ejemplo, la gente que toca instrumentos de viento pasan una buena parte de sus ensayos haciendo ejercicios de sonido.

    Obviamente, un músico que haga ejercicios a menudo de sonido, obtendrá una melodía más hermosa que uno que está tocando desde hace unos días. Sin embargo, la partitura es la misma para ambos.

    Piensa también que la síntesis de sonido es un proceso completamente artificial. Estás creando un modelo informático de un instrumento musical. Los modelos tienen sus limitaciones: Nunca llegaremos a imitar completamente a la realidad que tratamos de modelar. En éste caso, nunca alcanzaremos la perfección de sonido que puede llegar a conseguir un instrumento real. Sin embargo, eso no significa que no podamos conseguir que nuestro modelo sea cada vez más detallado. Al ser más detallado, tendrás en cuenta más factores que influyen en el sonido, por lo que la calidad aumentará. Por desgracia, tener en cuenta más factores suele significar mayor complejidad algorítmica, tanto a nivel espacial como temporal. La calidad tiene un coste.

    ¿La calidad del fichero obtenido dependerá del algoritmo que uses (en timidity)? Por supuesto. De hecho, si tu máquina es lenta o tiene muy poca memoria, existe la posibilidad de desactivar ciertas opciones para aumentar el rendimiento en dichas máquinas… ¡a costa de reducir algo la calidad!

    Respecto a los algoritmos, me suena de haber leído en la documentación que se podía escoger el método de interpolación utilizado por timidity. Splines, Lagrange. Si estudiaste Computación Numérica o Cálculo Numérico, seguramente te sonarán.

    Aquí tienes la página de manual de timidity: http://www.die.net/doc/linux/man/man1/timidity.1.html . Fíjate incluso que, con la opción “–module”, timidity puede simular (as much as possible xD) el funcionamiento del sintetizador seleccionado como parámetro.

    Un saludo,

    Santi

  • Muchas gracias por tus contestaciones, ya he aclarado mis dudas. He estado mirando el proyecto openpipe por encima y tiene muy buena pinta. Además, el que hayas liberado el código como gpl es encomiable por tu parte.

    Saludos

  • Yo utilizo en Guitar Pro 5 y si me suenan las partituras con Timidity, pero algunos instrumentos no. Como por ejemplo el Bass Drum, que es en el drumset el número 35 o 36 asi con los toms de la percusion. Podrias darme alguna ayuda.

  • Hola Didier,

    En principio Timidity no incorpora un banco de sonidos propio (es la impresión que tengo). Algunas distribuciones de dicho programa incluyen bancos de sonidos por defecto.

    El problema que tienes no es de Timidity, lo más probable es que el banco de sonidos que utilizas no tiene todos los instrumentos samples (lo cual no sería de extrañar).

    ¿Solución? Buscar otro banco de sonidos que tenga los instrumentos que necesitas. Luego tendrías que configurar Timidity para que utilice los instrumentos de un banco u otro.

    Recibe un saludo,

    Santi

  • [...] libre. Transforma las señales MIDI en sonido, creándolo a partir de un banco de sonidos. En esta entrada del blog del Proyecto OpenPipe lo explican todo muy [...]

  • [...] libre. Transforma las señales MIDI en sonido, creándolo a partir de un banco de sonidos. En esta entrada del blog del Proyecto OpenPipe lo explican todo muy [...]


Escribe un comentario