ALSA (Advanced Linux Sound Architecture) [II]

ALSA (Advanced Linux Sound Architecture) [II]

Si sois músicos, sabéis por experiencia que las especificaciones para la música, los instrumentos, y los programas,  son un poco “ad libitum”, en muchos casos, pero si además de músicos sois informáticos, o simplemente os habéis “peleado” alguna vez con la grabación de audio con software, sabéis (y si no lo sabéis ya os lo explico yo) que la latencia, es importante.

La latencia es lo que tarda el ordenador el reproducir el sonido, una vez que el evento ha sido enviado. Si no se queda bobo, suelen ser unos milisegundos, pero 500 milisegundos, son medio segundo, y medio segundo se nota muchísimo.

Así que si, por ejemplo, tocáis la guitarra, os encontráis con un retardo (que es lo que es la latencia) entre el pulso de guitarra, y el sonido que reproduce el ordenador, y eso es bastante molesto, porque es como escuchar sólo el eco, sin el sonido original.

Hay formas de disminuir ese retardo, o mandar señales relativamente desplazadas, de forma que todo suene acompasado.

Pero si sabéis programar, podéis aprovechar las características de vuestro hardware, y escribir pequeños programas, que ejecuten las instrucciones en menos tiempo que los programas “out-of-the-box”, que,  en general, al estar escritos para modelos de hardware de un consumo mayor, no suelen encajar con los ordenadores en particular que cada uno tiene, y además si añadís tarjeta externa (PCI, USB, Firewire…) la disparidad, y variedad es mucho mayor.

Me he bajado un Quick Reference (una chuleta) para el lenguaje de programación C++, que sirve para refrescar la memoria, pero sólo si ya conocéis el lenguaje y sabéis programar. Y me he encontrado unas cuantas cosillas que voy a comentar.

C++, es la versión dinámica del lenguaje C.

C++ es un lenguaje de programación orientada a objetos. Esto quiere decir varias cosas. Tanto uno como otro tienen una parte declarativa.

Cuando se escribe un programa, se importan las librerías que utiliza el lenguaje de programación que se está usando ( includes), en C, y C++ tienen generalmente la extensión (lo que va detrás del punto), “h”.

Por ejemplo stdio.h, o math.h, son archivos de librería o biblioteca, donde las instrucciones básicas del lenguaje utilizado están contenidas.

Es como si enseñásemos a hablar al ordenador con un campo semántico, que si desconoce, el ordenador no entiende, y el programa “casca” (en realidad ni empieza).

Por ejemplo, la palabra “moleteado”, no es una palabra que la gente conozca habitualmente, tenemos que tirar de diccionario para entender lo que es un moleteado (y no os lo voy a explicar, si tenéis curiosidad hay un enlace al diccionario de la RAE en la columna de widgets).

Eso es lo que hacen los archivos de biblioteca que le decimos al ordenador que incluya en su “vocabulario”.

Después de los includes, se declaran las variables, funciones, tipos y estructuras, y a continuación se empiezan a escribir las instrucciones.

Y el caso es, que si queréis bajar la latencia de vuestros equipos de composición y edición musical, y sabéis programar. Podéis diseñar completamente la apariencia de las interfaces gráficas, su comportamiento, y cuántas instrucciones tiene que manejar el procesador, y  en qué orden, y de que forma se ejecutan. De modo que al pulsar un interruptor, o mover un deslizador, o una ruedecilla, el procesador use las menos instrucciones posibles para calcular el resultado.

La diferencia principal (independientemente de la palabra clave (keyword) , que por ejemplo en C, ‘fprint’, hace lo mismo que en C++ ‘cout’), entre C, y C++, a la hora de la rapidez de respuesta, es que C, tarda más en arrancar, pero una vez que arranca, es más rápido. Y es más rápido porque es un lenguaje estático, y al ser estático, una vez que se ha instanciado el elemento que interviene en el programa, no se tiene que volver a instanciar, que es lo que ocurre cuando al iniciar un programa el cursor se convierte en un circulo que va dando vueltas.

En ese momento, el programa está arrancando y produciendo todas las variables y funciones que necesita para funcionar.

¿Y entonces por qué se ha desarrollado la programación orientada a objetos? , os diréis.

Porque se necesita muchísimo menos espacio de almacenamiento, cosa que en los dispositivos móviles es esencial.

Los lenguajes estáticos necesitan mucha más memoria (RAM, ROM, OPROM, Virtual, de paginación…), que los dinámicos, y en general, la memoria se suele quedar corta en el PC de un usuario doméstico.

Por ejemplo, al declarar (decirle al ordenador: psssst, voy a usar esta variable).

int  a [];  Se está diciendo que se va a usar un vector (array) de números enteros (INTeger) en inglés, pero no se está diciendo la dimensión que va a tener, no se sabe los bytes que va a ocupar, con lo que el programa no coge la memoria porque no se está inicializando: no se le da ningún valor.

El ordenador sólo sabe que cuando en el programa se nombre a ‘a’, nos estamos refiriendo a un array de enteros, pero no sabes a cuántos, lo mismo pueden ser ninguno, que nueve.

Si se asignase valor sería por ejemplo así:

int a[]={1,2,3,5,4,8}    (seis valores diferentes, todos enteros).

Si en lugar de eso, decimos int a[15]; le estamos diciendo al ordenador que cuando nombremos ‘a’ va a manejar un array de 15 números enteros, que no estamos inicializando. Al decirle eso, el ordenador reserva el espacio correspondiente a quince números enteros para que quepan en la memoria (y ese espacio está definido por las cualidades del tipo ‘int’ en el lenguaje usado, en este caso C, y C++).

Lo que ocurre en el primer caso, es que al nombrar ‘a’, se tiene que instanciar. Digamos que tenemos que coger una brocha y escribir una ‘a’, lo cual lleva tiempo. En cambio en el segundo caso, la ‘a’ ya la tenemos dibujada y sólo manejamos la ficha que la contiene, cosa que tarda menos que dibujarla.

La programación orientada a objetos lo que hace es tirar de fichas de variables que están en otra parte (en web, o en local). Requiere una mayor velocidad de procesador, porque está calculando y recalculando constantemente, pero requiere menos recursos (menos espacio de disco, menos memoria) porque… digamos que dibuja y borra para redibujar otra cosa encima (o va llamando variables y otros elementos “prefabricados”, constantemente).

Luego hay otras recomendaciones que se pueden seguir a la hora de programar.

Por ejemplo:

int x=1;

if (x)

{

instrucciones;

}

El ‘if’ analiza “si hay algo que no sea cero” escrito así (haría lo mismo con un ‘true’, ya que ‘true’ es no-cero).

Se entiende peor, pero es más corto, y más rápido que:

if (x!=0)

o

if (x==1)

Y se ejecuta antes.

Y esas cosas (entre otras muchas), intervienen en la rapidez de respuesta, también para los programas, y las tarjetas de sonido.

Así que, resumiendo, si vuestro ordenador es muy rápido, pero no tiene mucha memoria, es mejor un lenguaje dinámico, como C++.

Si vuestro ordenador es lento, pero tiene mucha memoria, es mejor un lenguaje estático, como C.

Csounds, o Qt, permiten diseñar vuestras propias aplicaciones de audio y MIDI (Musical Interface for Digital Instrument, es decir, interfaz musical para instrumentos digitales, en oposición a los instrumentos analógicos, como un piano, o una guitarra acústica, eléctrica, o electro-acústica, que no se pueden programar, y que necesitan un codec DAC, y un medio externo para introducir los datos enviados a la tarjeta de sonido), usando C, y C++.

Con Csounds, Qt, u otros entornos y utilidades, podéis añadir esa ruedecilla que falta, para después controlar, el pitch, o la velocidad (fuerza con que se pulsa la tecla) por ejemplo.

Os pego un pequeño programa de Qt.

Hello Qt
Let’s start with a very simple Qt program. We will first study it line by line,
then we will see how to compile and run it.

001 #include <QApplication>
002 #include <QLabel>
003 int main(int argc, char *argv[])
004 {
005 QApplication app(argc, argv);
006 QLabel *label = new QLabel(“Hello Qt!”);
007 label->show();
008 return app.exec();
009 }

Los números que aparecen a la izquierda, son los renglones del programa, son útiles, porque en mensajes de error, nos dicen “lin 003, col 7”, indicando que en la posición 7 de la tercera línea, el programa cascó (aunque el error puede estar antes).

Los #include, meten las librerías Qapplication, y Qlabel.

La tercera línea es la cabecera de una función que devuelve (o retorna) un entero, y además es la función ‘main’, principal, que después va tirando de todo el programa.

Las líneas 004, y 009, son los puntos de entrada [push], y salida [pop], de la función.

la línea 005 está declarando una aplicación de tipo (predefinido y contenido en la librería Qapplication), ‘Qapplication’. En este programa se llama ‘app’, pero podría llamarse ‘MiAplicación’, por ejemplo.

Esa aplicación toma dos argumentos, ‘argc’, y ‘argv’.

(Y lo dejo aquí, de momento, que tengo cosas que hacer).

Acerca de María Cristina Alonso Cuervo

I am a teacher of English who started to write this blog in May 2014. In the column on the right I included some useful links and widgets Italian is another section of my blog which I called 'Cornice Italiana'. There are various tags and categories you can pick from. I also paint, compose, and play music, I always liked science, nature, arts, language... and other subjects which you can come across while reading my posts. Best regards.
Esta entrada fue publicada en Computer Science, Music y etiquetada , , , , , . Guarda el enlace permanente.