Confirmada la presentación de OpenPipe en las VII Jornadas sobre Software Libre

Logo GPULDicho y hecho. Aquí se irán mostrando las charlas, junto a una breve descripción, a medida que los participantes vayan confirmando su asistencia (por temas de día y hora). Aquí os dejo un enlace al cartel, que me ha recordado al mítico puzzle ayudante del Office (el que se puede escoger en lugar de clippo :p).

Muchas gracias a GPUL por la oportunidad que me han ofrecido, un año más. Y, sobre todo, a su presidente (Emilio J. Padrón) por su dedicación y paciencia conmigo 🙂

Deja un comentario

Archivado bajo Información Interesante

Presentación “en sociedad” de OpenPipe

Logo GPULA finales del presente mes de Abril, se celebrarán las VII Jornadas sobre Software Libre en la Facultad de Informática de la Universidade da Coruña. Ya en las anteriores jornadas participé con una charla sobre “Nuevos Modelos de Negocio basados en Software Libre” (transparencias y video disponible), en el que realicé una pequeña incursión sobre lo que son las bases del modelo de negocio que plantea actualmente el Software Libre, un negocio centrado principalmente en el servicio y no en el producto, además de comentar las diversas ventajas (directas e indirectas) que aporta a las pequeñas y medianas empresas el uso de éste tipo de software.

La verdad es que la experiencia fue todo un éxito personal, pues hubo bastante asistencia que luego participó en un improvisado debate. Éste año repetiré, pero ahora para presentar el proyecto OpenPipe de forma oficial, ante la gente de mi facultad. Será como una especie de resumen de todo lo comentado en el blog y en los artículos, orientado sobre todo a que la gente profundice en el conocimiento del MIDI y a que se cree un interés alrededor de lo que puede aportar a la música tradicional un proyecto libre como OpenPipe.

Aunque todavía no he podido implementar nada en hardware, describiré formalmente (pero de forma amena) las bases de su funcionamiento a nivel conceptual, para lo que se introducirá a los asistentes en las bases del protocolo MIDI, a nivel usuario y a nivel de programación. De ser posible, se construirá un pequeño modelo en software (utilizando probablemente Java) para que la gente pueda observar que lo comentado, efectivamente, es viable.

Respecto a la parte de síntesis de audio, se describirán los objetivos ya alcanzados en la “síntesis por tabla de ondas”, y se mostrarán unos cuantos midis de ejemplo, para que la gente pueda escuchar instrumentos midi creados con las sf2tools, demostrando que la creación de un banco de sonidos es algo sencillo gracias a dichas herramientas (y a otras relacionadas, como es timidity).

A poder ser, se intentará explicar el funcionamiento básico de la “síntesis FM”, más que nada para que la gente adquiera mayor conocimiento al respecto, pues la verdad es que es un tema bastante bonito. Es una de esas cosas que, siendo cotidianas, esconde secretos que jamás se te hubieran ocurrido. Sin embargo, probablemente éste punto quedará descartado, pues quizá es de menor importancia que los anteriores. A fin de cuentas, no vamos a utilizar síntesis FM en ningún momento. Más que nada, es curiosidad.

Me encantaría, si quedase tiempo, comentar otros proyectos de Software Libre relacionados con la música. Principalmente, editores de partituras, sintetizadores software, proyectos de recopilación de partituras, etc.

El proyecto OpenPipe (no me gusta decir “mi” proyecto, pues sería incongruente hablar de un proyecto de Software Libre y y referirse a él de forma posesiva) está orientado principalmente a un público quizás no tan técnico como un grupo de estudiantes de ingeniería, sino a personas que estén metidas en el mundo de la música. En concreto, he recibido varios correos de gaiteiros, que seguramente serán los que más uso le puedan dar.

A todos vosotros os iré contestando personalmente a medida en que mi escaso tiempo lo permita (perdonad si me retraso unos días). De todas formas, comentaros que la orientación del proyecto será principalmente práctica. En el sentido de que, por encima de todo, el objetivo será que obtengamos un instrumento que a todos os pueda resultar útil para tocar. Algunos me comentábais que ciertas implementaciones comerciales no os agradaban por algunos aspectos. Aquí intentaremos, en la medida de lo posible, subsanar esas deficiencias. Pero siempre hay que tener en cuenta que los recursos son limitados, lo que no quiere decir que algún día OpenPipe no pueda llegar a ser, algún día, un proyecto muy bueno, como ha sucedido con otros proyectos de Software Libre.

Una cosa que le extrañará a mucha gente es: ¿Puedo construírme yo un controlador MIDI siguiendo las especificaciones de OpenPipe? Por supuesto, no hay ningún problema. De hecho, si necesitáis algún tipo de programación especial con el microcontrolador, os intentaría echar una mano.

Sin embargo, como soy consciente de que no todo el mundo tiene paciencia para andar construyendo un aparato así, intentaría (en la medida de lo posible) enviaros uno ya construído. Lo único que tendríais que abonar es el coste de cada una de las piezas, más el coste de la mano de obra de quien se encargue de ensamblarlo. Si alguien se toma la molestia de construírme las piezas y luego montar las partes, creo que es justo que reciba una cantidad por el tiempo que se ha dedicado.

OpenPipe no tiene ánimo de lucro. Lo que no quiere decir que en algún momento haya movimiento de dinero, para subsanar los gastos producidos por su distribución.

Otra cosa. La gente suele ser bastante impaciente, quiere obtener resultados en poco tiempo. Sin embargo, es habitual que los proyectos se retrasen, por una razón u otra. Aunque todavía no haya construído nada, durante varios meses hubo una labor muy intensa relativa a investigación. Realmente desde que tienes una primera idea hasta que empiezas a plasmarla en un diseño hay un camino muy largo. De hecho, incluso me matriculé en la asignatura Periféricos e Interfaces para tener una base con el tema de los microcontroladores. Además, por otro lado está el mantenimiento del blog, la difusión de las ideas, la publicación del código, de los diseños, la presentación, etc. ¡Y mis cinco asignaturas!… ¡Ah! Y bueno, hace un mes y algo me concedieron una beca en la biblioteca. Menos tiempo, menos tiempo…

Simplemente os pido un poquito de paciencia. Las cosas empezarán a salir poco a poco. Y tengo la confianza de que todo saldrá adelante. Seguro.

¡Un saludo muy grande a todos los que apoyáis el proyecto! Y recordad que vosotros también formáis parte del proyecto. Intentaré que todo el mundo sea tenido en cuenta…

Deja un comentario

Archivado bajo Personal

Sobre los comentarios

Ahora que la cosa está un poco más tranquila, estoy contestando a todos los comentarios y correos que me quedaron pendientes por responder. Si alguien tiene interés en comentar algo que no esté relacionado con el proyecto, pero que esté dentro del tema del MIDI y la música por ordenador, no tengo ningún inconveniente en aportar mi punto de vista.

Es más, me encanta que haya preguntas tan dispares. Eso quiere decir que lo que he escrito en éste blog ha despertado la curiosidad de unas cuantas personas, lo cual es una satisfacción personal muy grande. La idea es que el Software Libre no es sólo Software, sino una gran cantidad de gente que aporta una gran cantidad de cosas en torno a un interés o una necesidad en común.

He recibido varios correos de gente muy entusiasmada por el proyecto. Algunos incluso me han comentado que estaban muy interesados en que les enviase un aparato a casa, ¡todavía no he empezado a construírlo! Pero la cosa va por buen camino. Hace una semana y poco he adquirido una tarjeta MCB9000 para programar una variante del 8051 de Philips, el modelo 89PLC935.

Si no tuviera que hacer cosas de clase, el proyecto evolucionaría mucho más rápido de lo que lo hace. Mis intenciones iniciales fueron muy ambiciosas, pero aún yendo con algo de retraso respecto a lo que tenía previsto, estoy muy contento por haber llegado hasta aquí. Ya se empiezan a ver cosas interesantes, como por ejemplo que es posible crear instrumentos musicales MIDI de forma sencilla, o el esbozo de lo que es el diseño de toda la circuitería.

Como seguramente habrá gente interesada en probarlo, estaba pensando en alguna forma de construír el diseño y mandarlo por correo. Sin embargo, hay algunos problemas que me gustaría solventar:

  • En primer lugar, aunque sea un diseño Open Source, en caso de que la gente quisiera tener un aparato construido para uso personal, los gastos relativos a los materiales, construcción y envío correrían por su cuenta.
  • Aunque haya dinero de por medio, eso no significa que haya interés lucrativo de por medio. Si consiguiese que alguien montase el aparato y lo enviase por correo, creo que sería justo que esa persona que dedica su tiempo a montarlo recibiera una cantidad, en concepto de mano de obra.
  • El problema es que cuando hay tema monetario de por medio, se puede entrar en conflicto con proyectos similares a OpenPipe que, supuestamente, estarían en posesión de algún tipo de patente, puesto que alguien podría afirmar que hay un beneficio personal. Nada más lejos de la realidad, puesto que para implementar el diseño físicamente, es necesario un coste. Y ese coste está asociado a la implementación de un diseño, como si es cualquier otro.

¿Qué opináis? Es un debate interesante.

Deja un comentario

Archivado bajo Información Interesante, Seguimiento del Proyecto

Parser con Flex y Bison

Durante el desarrollo de sf2maker, tuve que escribir un parser. Os dejo aquí el borrador de un post que escribí por aquel entonces para dar una guía práctica sobre el uso de flex y bison:

Con tantas herramientas, compiladores, lenguajes y demás… es habitual perder unas cuantas horas en repasar algo que sabías hacer hasta no hace mucho (un par de meses, o unas semanas, quizá).

Hoy he perdido unas cuantas horas en escribir un parser con flex y bison (lo necesito para hacer una de las partes del proyecto) ¡Al fin lo he conseguido! Por si a alguien le saca de un aprieto, haré aquí un pequeño esquema mental.

Necesitamos crear dos ficheros:

  1. programa.l, que nos servirá para crear el lexer (analizador léxico) con flex.
  2. programa.y, que nos servirá para crear el parser (analizador sintáctico) con bison.

¿Por qué necesitamos crear dos analizadores? Porque el análisis se realiza a dos niveles. El nivel más bajo lo hace el lexer, que divide una cadena de caracteres en unidades elementales llamadas tokens. Una vez reconocidos los tokens, el parser hace un análisis a más alto nivel. Aquí es donde tendremos una gramática; es decir, una serie de reglas que definen cómo se pueden combinar correctamente los tokens.

Creo que lo más sencillo es definir primero programa.y:

%{
#include <stdio.h>
%}
%union {
int num;
char *cad;
}
%token NEWLINE CMD1 CMD2 CMD3 NUMBER STRING
%type <num> NUMBER
%type <cad> STRING
%%
input:
| input line
;

line: NEWLINE
| CMD1 NEWLINE { printf(“cmd1\n”);}
| CMD2 NUMBER NEWLINE { printf(“cmd2 %d\n”, $2); }
| CMD3 STRING NEWLINE { printf(“cmd3 %s\n”, $2); }
;
%%

int yyerror(char *s)
{
printf(“%s\n”, s);
return(0);
}

int main()
{
yyparse();
exit(0);
}

Es un sencillo parser que acepta tres comandos: cmd1, cmd2 <numero> y cmd3 <string>. Con %token podemos definir cada uno de los terminales, los cuales los obtendremos posteriormente con flex. El token NUMBER representa un número cualquiera, por lo que tiene un valor asociado, el número en cuestión. Algo parecido pasa con el token STRING, pero aquí con una cadena de caracteres.

Como tenemos dos tokens que tienen dos valores asociados de distinto tipo, necesitamos que la variable yylval pueda contener valores de ambos tipos. Recordemos que la comunicación entre el lexer y el parser se realiza, entre otras, con variables como yylval. De ahí que se haya utilizado %union.

Por otra parte, tenemos que indicar que tanto NUMBER como STRING tienen un tipo asociado. Para eso sirven las dos declaraciones %type. Creo que es sencillo de entender el por qué: más adelante, cuando recuperemos el valor asociado a un determinado token NUMBER (por ejemplo), es necesario saber su tipo para poder recuperarlo correctamente de la estructura yylval.

Después, indicar que la gramática tiene varias reglas, agrupadas en dos. La primera indica que la entrada (input) puede ser nada (el vacío; es decir, ninguna línea), o una entrada y una línea. Lo que es una línea se define en la siguiente regla: puede ser un salto de línea (en cuyo caso no se hace nada), bien cmd1 seguido de un salto de línea, bien cmd2 con un número y un salto de línea, o también cmd3 con una cadena de caracteres y un salto de línea. Los tres comandos que habíamos comentado.

Las acciones semánticas asociadas a cada una de las reglas son más o menos las que cabría esperar en un programa de prueba. Notar que tanto la regla de cmd2 como la regla de cmd3 utilizan el valor semántico del segundo token (que en el primer caso es un entero, y en el segundo una cadena de caracteres), indicado por $2. Por eso era necesario que los tokens tuviesen definido su tipo.

Ahora definiremos los tokens en el fichero programa.l. Antes de nada, comentaros que cuando bison genere el parser anterior, existe la opción de que genere un fichero de cabecera .h con las definiciones de cada uno de los tokens. Ese fichero lo incluiremos dentro de programa.l:

%{
#include “y.tab.h”
%}
%%
cmd1 { return CMD1; }
cmd2 { return CMD2; }
cmd3 { return CMD3; }
[0-9]+ {yylval.num = atoi(yytext); return NUMBER; }
[a-zA-Z]+ {yylval.cad = (char *)malloc(255 * sizeof(char)); strcpy(yylval.cad, yytext); return STRING; }
\n { return NEWLINE; }
. { /* nothing to do */}

%%

Para compilar, realizaremos los siguientes pasos:

$ flex programa.l
$ bison -d programa.y -o y.tab.c
$ gcc -c lex.yy.c y.tab.c
$ gcc -o programa lex.yy.o y.tab.o -lfl

Espero que os resulte útil 🙂

16 comentarios

Archivado bajo Curiosidades y Anécdotas, Información Interesante

Aclaraciones sobre los bancos de sonidos

Hablando con algunas personas sobre la utilidad de las sf2tools, me he encontrado que hay una dificultad generalizada para comprender qué es un banco de sonido. Así que intentaré explicarlo de la forma más práctica posible: Con ejemplos.

En éste enlace hay un archivo zip con dos tipos de ficheros. Por una parte están los ficheros midi, que son melodías tocadas por varios instrumentos MIDI. Por cada fichero MIDI hay un fichero mp3 que es el resultado de la ejecución de esos mismos ficheros MIDI, pero cambiando algunos instrumentos por las flautas. Esas flautas son las que están definidas en los bancos de sonidos de ejemplo que se han incluído en el paquete sf2tools.

Con esos bancos de sonidos se puede interpretar cualquier melodía con la flauta. Basta con tener el fichero MIDI correspondiente, y configurar de forma adecuada timidity.

¿Me he explicado mejor?  :p

Comprendo que es difícil de comprender para todas aquellas personas que no están familiarizadas con la música y el MIDI.

Deja un comentario

Archivado bajo Información Interesante, Organización, Fuentes y Recursos, Seguimiento del Proyecto

Diseño Conceptual de OpenPipe

He liberado la parte correspondiente al diseño conceptual. Se puede descargar desde aquí.

Deja un comentario

Archivado bajo Seguimiento del Proyecto

Síntesis de Audio

Existe mucha teoría en torno a la síntesis de audio. Intentaré introducir conceptos generales, que nos sirvan para entender el funcionamiento de un sintetizador, y el papel que desempeña dentro del proyecto.

En primer lugar, decir que se comentarán dos tipos de síntesis:

  1. Síntesis de Audio Modulada en Frecuencia (FM synthesis).
  2. Síntesis de Audio por Tabla de Ondas (wavetable synthesis).

1.- Síntesis de Audio Modulada en Frecuencia

Como bien dice [1]: “La síntesis FM es un método que permite la manipulación de un timbre para obtener sonidos reales y naturales”. Más adelante, se comenta que “con velocidades por encima de la capacidad humana y frecuencias con una rapidez similar a las frecuencias de audio, comienzan a aparecer componentes armónicos proporcionales a más o menos la frecuencia portadora del tono que se está haciendo vibrar”.

Os lo explicaré de forma sencilla. El sonido es como cualquier otra onda física, y por tanto, tiene una serie de propiedades cuantificables. Por ejemplo, la frecuencia (inversa de la longitud de onda, lambda). Sonidos de baja frecuencia (alta longitud de onda) son sonidos graves, mientras que sonidos de alta frecuencia (baja longitud de onda) son sonidos agudos. Otra propiedad del sonido es su intensidad, concepto al que estamos muy familiarizados, y del que sobran explicaciones.

Sin embargo, todavía podemos hablar de una propiedad más. ¿Cómo es posible que nuestro oído sea capaz de distinguir dos sonidos con la misma intensidad (mismo volumen), y la misma frecuencia (la misma nota) que provienen de dos instrumentos distintos? Los sonidos también tienen un timbre. ¿De dónde proviene esa cualidad del sonido?

La explicación es sencilla. Casi ningún instrumento genera ondas simples, sino varias ondas que se superponen y generan un sonido como resultado de toda esa superposición simultánea en el tiempo. En otras palabras, cuando escuchamos una nota de un instrumento, ¡en realidad estamos escuchando varias! ¿Cómo es ésto posible?

Os contaré un secreto: no todas las ondas que estamos escuchando en un sonido suenan con la misma intensidad. Digamos que existe una nota central, que es la que destaca, y luego una serie de notas que también suenan, pero con una intensidad considerablemente menor a la nota central.

Ahora bien, ¿qué notas suenan, además de la nota central? ¿Y con qué intensidad, en relación a la nota central? Muy sencillo: depende. Depende de las características físicas del instrumento. Eso incluye las medidas usadas en su construcción, el tipo de material usado, y un largo etcétera.

Os contaré un segundo secreto: las notas que suenan simultáneamente con la nota central no son notas cualesquiera. Son notas que tienen una relación muy especial con la nota central. Matemáticamente hablando, son notas cuya frecuencia son múltiplos de la frecuencia de la nota central. Musicalmente hablando, son notas armónicas, probablemente construídas con intervalos justos.

Cuando escuchamos varios sonidos simultáneamente, pueden provocarnos varias sensaciones. Sin ser demasiado técnico, pueden ser agradables (consonancias), y otros desagradables (disonancias). Dentro de los sonidos consonantes, que suenan agradables al oído (aún sin ser un experto musical) están los intervalos justos: 4ª J, 5ª J y 8ª J. Curiosamente, las frecuencias de los sonidos que forman parte de éstos intervalos tan agradables al oído, son múltiplos uno del otro.

Como véis, existe una estrecha relación entre las matemáticas y la armonía.

Si conocemos cada una de las partes que compone un sonido, ¿acaso no podemos construir nuestros propios sonidos artificialmente? Esa es la idea de la síntesis FM: a partir de un modelo matemático que explique el comportamiento del sonido (basado en los modelos físicos utilizados para describir el comportamiento de ondas), somos capaces de construir un circuito electrónico que genere sonidos bastante parecidos a los sonidos reales de cualquier instrumento.

El parámetro más complicado de generar es, sin duda, el timbre. Cambiar la frecuencia de una onda, o su amplitud, no es más que un simple cálculo matemático, por lo que no es para nada complicado. Sin embargo, como ya habíamos comentado, el timbre se consigue a base de superponer armónicos con menor intensidad a la nota principal.

Modelo matemático de la Síntesis FM

A modo de curiosidad, en [1] se afirma: “En FM, la frecuencia instantánea de una onda portadora es variada de acuerdo a una onda moduladora, de tal forma que los cambios en la portadora se convierten en la frecuencia de la onda moduladora o frecuencia moduladora.”

Se consideran dos ondas: una onda portadora, y una onda moduladora. La frecuencia de la onda portadora se calcula a partir de la onda moduladora (a partir de una ecuación con funciones trigonométricas). De ahí que se diga que la síntesis es Modulada en Frecuencia.

El desarrollo matemático escapa al objetivo de éste post. Aquí podréis encontrar más sobre la teoría matemática que sustenta éste modelo, la Teoría de FM. Como última curiosidad, indicar que para calcular los armónicos de la nota principal, parece que se utilizan las Funciones de Bessel, utilizadas en muchos otros campos.

Un sonido puro y sin armónicos

Anteriormente mencionamos que casi ningún instrumento generaba una onda simple (refiriéndome a un sonido sin armónicos). Efectivamente, existe un instrumento que sí, y es el diapasón.

Según la wikipedia: “Normalmente se utiliza para afinar instrumentos musicales de acuerdo a una nota concreta; sin el diapasón sería muy difícil lograr que distintos instrumentos se pudieran afinar independientemente de forma concreta y armónica”.

El sonido generado por un diapasón es lo que más se parece en la práctica a un sonido sin armónicos. Su forma de onda es senoidal. Otra forma de obtener un sonido puro sería generando una onda senoidal en un ordenador.

2.- Síntesis de Audio por Tablas de Ondas

De todas formas, aunque con la síntesis FM se conseguían resultados más que aceptables, se notaba que los sonidos eran generados por un computador. Con el objetivo de obtener un resultado más realista, se diseñó la síntesis de audio que vamos a presentar a continuación.

La idea es bastante intuitiva: ahora disponemos de una tabla con sonidos muestreados de cada uno de los instrumentos, almacenados de forma digitalizada en una ROM (por hardware) o en disco (por software). La tabla nos proporciona sonidos reales de cada uno de esos instrumentos (muestras, en inglés samples), un sonido base a partir del cual podemos modificar algunos parámetros básicos, para obtener el sonido final.

Por ejemplo, a partir de un sonido base, y modificando la frecuencia, podemos obtener todos los sonidos de la escala. Sin embargo, cuanta mayor sea la diferencia entre la nota real y la nota que queremos obtener, el resultado será de peor calidad. En otras palabras, con un LA podemos obtener un LA bemol o un LA sostenido de bastante calidad, pues son notas que están razonablemente cerca. Pero si intentamos obtener un DO a partir de un LA, se notará claramente que es un sonido construido de forma artificial.

En consecuencia: “Cuanto mayor sea la cercanía (cuantificada en tonos y semitonos) entre la nota sintetizada y la nota muestreada, mayor será el realismo del sonido resultante”.

El caso extremo sería tener una muestra de cada una de las notas que puede generar el instrumento. Pero aquí tendríamos el inconveniente de que, al tener tantas muestras, la tabla de ondas sería demasiado grande (con más razón si estamos contemplando la posibilidad de almacenar la tabla en una ROM). También hay que pensar que, probablemente, querremos tener sampleado más de un instrumento. Lo cual convierte al tamaño de la tabla en un parámetro a tener en cuenta.

Una característica interesante de muchas tarjetas de sonido (sobre todo, las profesionales), es que incorporan una cierta cantidad de memoria RAM interna. En ese caso, es posible almacenar la tabla de ondas en la RAM, de forma que el acceso a las muestras de la tabla se realizaría con mayor eficiencia, con el aumento de prestaciones que ello conlleva.

En caso de no disponer una tarjeta tan buena, siempre queda la posibilidad de almacenar la tabla en la memoria principal, a coste de tener un menor rendimiento. De todas formas, ahora no es un problema demasiado grave, puesto que tanto la tecnología de computadores como la tecnología de memorias han mejorado mucho sus prestaciones en éstos últimos años (capacidad de procesamiento en el primer caso, y cantidad de memoria y latencia, en el segundo).

También es posible una estrategia mixta, en caso de que la tabla de ondas sea de un tamaño superior a la RAM disponible en la tarjeta de sonido.

Posteriormente, para generar el sonido, se utiliza un oscilador con diversos componentes que permiten modificar la onda de salida.

Fuentes interesantes:

[1] Fundamentos de Síntesis de Audio con Frecuencia Modulada, por Juan Reyes

Wavetable synthesis, artículo en la Wikipedia

Wavetable Synthesis 101. A Fundamental Perspective, por Robert Bristow-Johnson (para profundizar)

4 comentarios

Archivado bajo Curiosidades y Anécdotas, Información Interesante, Organización, Fuentes y Recursos