Versión HTML por Nacho Cabanes
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 veréis. 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 recordáis 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 sólo 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, éstos se corresponden con la situación del speaker, encendido (5v) o apagado (0v).
También mencioné en dicha lección que el sonido se produce debido a vibraciones, luego si nosotros nos limitásemos 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 sabréis cuanto 'más juntas' estén 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 tímer
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 practiquéis vuestro solfeo. ;))
Si después de este rollo os digo que esto no vale para nada me diréis 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 imagináis 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é él 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 decrementándose 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 quién 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, podéis ejecutarlo para ver los resultados.
Pulsa F2 para ejecutar el programa SONIDO. - Posibilidad no disponible en la versión HTML-
Acabo este artículo exponiendo la prometida tabla de frecuencias musicales, quién 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