[Regresar Anterior]                            [Principal]
El Pc-speaker 

        Bueno amigos, ahora me toca explicaros algo sobre un viejo conocido
llamado "speaker". Todos habréis oído a este personaje zumbar cuando 'arrancamos'
el ordenador, ante un error, al imprimir el carácter '07' o, mira por donde,
en la mayoría de juegos de ordenador.
        Su importancia radica en el hecho de que es el único elemento de
sonido que el ordenador incluye de serie, lo que quiere decir que todo aquel
que tenga un PC, tendrá  un PC-speaker.
        En realidad este elemento del hardware es uno de los mas patateros
como a continuaci¢n vereis. Esto es debido a que los ordenadores, en principio,
no estaban destinados al tratamiento del sonido, y es por ello, que si queremos
hacer algo que merezca la pena en cuanto a sonido, tendremos que utilizar
alguna de las numerosas tarjetas que ahora existen el mercado. Pero bueno,
vamos a lo nuestro, que si no nos desviamos del tema...
        En primer lugar vamos a ver 'lo que es' el PC-speaker. El chisme en
cuestión, no es más que un altavoz conectado mediante unos circuitos
intermedios a la placa base de nuestro ordenador. La estructura va de la
siguiente manera:
 
                                            DIRECCION 61H         ALTAVOZ

                       ------------            /|  / 
                       | CIRCUITO |         --/ | - 
           CPU ------> | INTER.   | ------> --\ | - 
                       |          |            \|  \ 
                       ------------ 

          Si recordais en el artículo referente a la naturaleza del sonido, ya
vimos que el sonido era en realidad una onda que se desplazaba por el medio en
el que estuviéramos (en nuestro caso, el aire, salvo que haya alguien por ahí
que esté buceando en la bañera), pues bien, nuestro amigo el Speaker es capaz
de producir una serie de sonidos, pero el problema est  en que al solo tener
dos posiciones (encendido y apagado) estos 'ruidos' serán siempre de la
siguiente forma:
 

    |                             |
5v  |  ----  ----  ----  ----     |       --------      --------
    |  |  |  |  |  |  |  |  |     |       |      |      |
0v  |---  ----  ----  ----  ----  | -------      -------- 
    -----------------------------   ------------------------------
           Sonido Agudo                     Sonido Grave

 Este tipo de ondas se conocen como ondas cuadradas y se caracterizan
por tener únicamente dos valores, estos se corresponden con la situación del
speaker, encendido (5v) o apagado (0v). 
También menciono en dicha lección que el sonido se produce debido a 
vibraciones, luego si nosotros nos limitasemos a encender una ver el speaker 
provocaríamos que la membrana del mismo se pusiese en posición extendida pero 
con eso sólo conseguiríamos un clic, el 'truco' esta en apagar y encender
rápidamente esa membrana para producir la perturbación = sonido. 
Del tiempo que mantengamos encendido y apagado el speaker depender 
la frecuencia del sonido generado. Como ya sabreis cuanto 'mas juntas' estan 
las ondas mayor ser su frecuencia. El jugar con la frecuencia ser la única 
herramienta que dispongamos para generar sonidos ya que como os habreis dado
cuenta no podemos controlar la amplitud (volumen) de la onda.
Pasemos a programar el Pc-speaker las operaciones que podemos hacer
con este dispositivo son bien pocas. Para controlarlo £nicamente disponemos
de un puerto, el 61h, que pertenece a ese circuito intermedio mencionado 
antes, que en el caso de los AT es el 8042 también dedicado a controlar el 
teclado, esta multifunci¢n se ve plasmada en el propio puerto ya que para 
manejar el speaker solo podremos utilizar los dos bits de menor peso, el
resto se utilizan para otras tareas y si nos ponemos a juguetear con ellos 
con toda seguridad la cagaremos y Murphy volver a tener razón. :)
El formato del puerto para nosotros ser :

         Bit 7 6 5 4 3 2 1 0    El bit 0 se utiliza para indicar quién
              ? ? ? ? ? ? X 0    controla el teclado. Si est  a 0 lo controlar 
                               el usuario, si est  a 1 lo controlar  el timer
                               2 que veremos más adelante.
            Si bit 0 = 0               Bit 1 = 0 Speaker apagado                                        Bit 1 = 1 Speaker encendido
        Sabiendo esto os muestro, por fin, una rutina que genera un sonido:
var i:integer;
    valor:byte;
      .....
        Valor:=port[$61];        (*Leemos primero el valor del puerto para*)
                                 (* dejar los 6 bits que no utilicemos con *)
                                 
(* con los mismos valores*)
        Valor:=Valor and $FC; (*Ponemos a 0 los dos bit que utilizamos*)
                             (*Esto hace que nosotros controlemos el*)
                             (*speaker y que permanezca apagado*)


    for i:=1 to 100 do           (*Duraci¢n del sonido*)
    begin
    port[$61]:=Valor or 2;       (*Ponemos el Bit 1 a 1 luego encendemos el *)
    delay(5);                    (* speaker. Durante 5 milisegundos*)
    port[$61]:=Valor;            (*Apagamos el speaker*)
    delay(5);                    (*Durante 5 mseg. tambi‚n*)
    end;

    Veamos que hemos hecho con todo esto;

On   | -----   -----                  -----   -----
     |     |   |   |                      |   |
     |     |   |   |                      |   |     <-- 100 veces
     |     -----   -----   ..........     -----
Off  |-----------------------------------------------
     <-5-><-5->                                     tiempo en mseg.
          <---10--->

Como veis hemos generado 100 veces una onda de período 10 mseg, luego 
por ahora ya sabemos que sea lo que sea esto dura 1 segundo, además, según lo 
que os conté en el primer capítulo la frecuencia es la inversa del período por 
lo tanto f= 1/10 mseg = 100 Hz. ­­Yupi Yei!! hemos generado un sonido de 100 Hz
durante un segundo, como veis es sencillo meter ruido. Al final del capítulo os 
proporcionaré una tabla con la equivalencia entre las frecuencias y las notas 
musicales para que practiqueis vuestro solfeo. ;))
Si después de este rollo os digo que esto no vale para nada me dirais
de todo, hasta ya huelo mal... ;) Lo siento pero es la cruda realidad, si 
utiliz semos este método para meter bulla, tendríamos dos problemas, primero 
un delay no es un retardo constante, al producirse interrupciones en el 
ordenador, se alargaría su duración y se distorsionaría el sonido, además, las 
instrucciones tipo delay son las más odiadas por los programadores de video-
juegos ya que mientras ellas se ejecutan, no se puede hacer nada más. Para 
evitar estos problemas se opta por otra técnica, cuya base es hacer que el 
ordenador se encargue de generar automáticamente la onda cuadrada con la 
frecuencia que nosotros le indiquemos.
Para ello utilizamos una cucaracha llamada 8253 o PIT, más conocida 
en la jerga como tímer. Un tímer consta básicamente de un contador, que una
vez cargado con un valor inicial, se va decrementando hasta el valor 0 y en
ese momento el tímer genera una señal, todo este proceso se realizar con
independencia de la C.P.U. luego ya os imaginais su utilidad. El PIT contiene 
3 timers independientes, cada uno con una misión especifica:

-Tímer 0. Genera una señal de reloj 18,2 veces por segundo, se utiliza
para actualizar el reloj del sistema.
-Tímer 1. Se encarga de refrescar la DRAM. No podemos utilizarlo.
-Tímer 2. Puede ser conectado al speaker. Es nuestro objetivo.

Estos timers tienen varios modos de funcionamiento. Por ahora s¢lo os
explicaré el que vamos a utilizar, en la próxima lección estudiaremos el PIT
con más detalle. El modo en cuestión es el 3 - generador de onda cuadrada, en
esta configuración el tímer, pondrá su salida a estado alto durante la mitad
de la cuenta y cambiar a estado bajo durante la otra mitad, una vez el 
contador llegue a 0 se repetir el proceso. El valor inicial de ese contador 
definir por tanto la frecuencia de la onda cuadrada generada, la formula para 
calcular estos valores es la siguiente:
1193180 -> 1234DDh ->frecuencia base del PIT en Hz.
frecuencia= -------
contador

Sólo hay que sustituir valores y utilizar la calculadora de las magdalenas.
Los puertos del PIT que nos interesan para generar sonidos son:
43h Puerto de control. Se encarga de identificar el tímer y el modo de
funcionamiento, que deseamos. Para programar el tímer 2 con el modo 3 tendremos 
que poner en este puerto el valor B6h. Por ahora creeros todo lo que os 
digamos, en la próxima lección vendrán las demostraciones. ;)
42h Se encarga de recibir el valor inicial para el contador, como este 
valor es de tipo word y el puerto maneja bytes, necesitamos hacer la carga en 
dos pasos, primero indicaremos el byte bajo (menos significativo) y después 
el byte alto. Una vez introducido el segundo byte comenzar la cuenta 
automáticamente. En este instante tendremos al tímer decrementandose y 
generando la onda cuadrada solicitada, pero su salida no excita a ning£n 
dispositivo, necesitamos programar el speaker para que se conecte al tímer 2.
Para esta funci¢n utilizaremos el ya mencionado Bit 1 del puerto 60h que 
indicaba quien maneja el speaker (0:nosotros 1:Timer 2), además en el caso
de que este bit este encendido, el bit 1 indicar por su parte si el speaker 
esta conectado o no.
En el siguiente programa de demostraci¢n os muestro cómo se lleva 
acabo la programaci¢n del tímer 2 en la práctica, podeis ejecutarlo para ver
los resultados.
Acabo este artículo exponiendo la prometida tabla de frecuencias 
musicales, quien entienda solfeo que la utilice, yo, seguiré haciendo mis 
pitidos de siempre.

 
  Octava 0 Octava 1 Octava 2 Octava 3 Octava 4 Octava 5 Octava 6  Octava 7
DO  16,35   32,70    65,41    130,81   261,63   523,25  1046,50   2093,00
DO# 17,32   34,65    69,30    138,59   277,18   554,37  1108,74   2217,46
RE  18,35   36,71    73,42    146,83   293,66   587,33  1174,66   2349,32
RE# 19,45   38,89    77,78    155,56   311,13   622,25  1244,51   2489,02
MI  20,60   41,20    82,41    164,81   329,63   659,26  1328,51   2637,02
FA  21,83   43,65    87,31    174,61   349,23   698,46  1396,91   2793,83
FA# 23,12   46,25    92,50    185,00   369,99   739,99  1479,98   2959,96
SOL 24,50   49,00    98,00    196,00   392,00   783,99  1567,98   3135,96
SOL#25,96   51,91   103,83    207,66   415,30   830,61  1661,22   3322,44
LA  27,50   55,00   110,00    220,00   440,00   880,00  1760,00   3520,00
LA# 29,14   58,27   116,54    233,08   466,16   923,33  1864,66   3729,31
SI  30,87   61,74   123,47    246,94   493,88   987,77  1975,53   3951,07