lunes, diciembre 14, 2009

Cómo hacer música con el parlante interno del PC y C++

Al pensar en el parlante o altavoz interno del PC, en inglés, PC speaker, se nos viene a la cabeza el bip, en inglés beep que suena como aviso.
Usando la consola en cualquier distribución basada en GNU/Linux se puede controlar el parlante, de modo de hacer frecuencias y duraciones a voluntad y poder hacer música. A diferencia del uso de GNU-Octave y Matlab para hacer música, noi se necesita construir la onda, solo se debe controlar la frecuencia y duración.
Tomando como referencia la entrada de notas usada para hacer música en Matlab, en la que se ingresan notas de forma parecida a como se hace en los programas compositores en los celulares Nokia, especificando la duración en el primer caracter, la nota en clave americana, y la octava tomando como octava central la 3ra, se puede hacer una función teniendo como entrada las notas en dicho formato y como salida las frecuencias y las duraciones de esas notas.
La salida de la función -las frecuencias y las duraciones pueden ser ingresadas a otros dispositivos, en el caso del Matlab era a otra función que creaba las ondas, a motores controlados electrónicamente, etcétera.

En este caso nos comunicamos con el parlante enviándole frecuencias y notas:

//  La Función que hace los sonidos
int suena(int freq,int len){
  
 int fd = open("/dev/console", O_WRONLY);
      ioctl(fd, KIOCSOUND, (int)(1193180/freq));
      //usleep(1000*len);

 usleep(1000*len);
      ioctl(fd, KIOCSOUND, 0);
      close(fd);
}


Esta parte puede hacerse de forma distinta instalando gnubeep. Con el que se puede escribir
gnubeep -f 2600 -l 1000000
y sonarán 600 [Hz] por 1 segundo.

El código

El código escrito en C++ funcionó en mi PC con Mandriva 2009.1, y probablemente funcione en cualquier distribución GNU/Linux.
Puede ser compilado para Windows descomentando las partes indicadas con //win .
Está a disposición de vustra merced en el enlace: musica.cpp.
Algunos ejemplos para ingresarle al programa:


Ejemplos


Usando dos computadores y sincronizando el instante en que empiezan las canciones se probaron los ejemplos anteriores.

Badinerie BWV 1067

Invención 13, BWV 784


Suite para Cello 1007


Comentario



Si quiere desactivar el pitido, escriba en la consola como superusuario:
# modprobe -r pcspkr


Francisco Roco