|
|||||
LOS SECRETOS
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Uno de los aspectos por los que destaca el Amiga es por su capacidad como "máquina de sonido", desde ejecutar melodías a cuatro voces hasta obtener los mejores sonidos digitalizados. |
|---|
Realmente, para hacer sonidos no hace falta ni siquiera saber programas. Pero vayamos por partes. Primero, hay que recordar cómo se genera un sonido en un ordenador. En el C-64, por ejemplo. En nuestro familiar ordenador, los sonidos se activan diciéndole al SID (el chip de sonido) el tipo de sonido a ejecutar, la frecuencia de éste y sus parámetros de envolvente, lo que se conoce como ADSR.
El SID toma esos datos y genera una señal que es enviada al altavoz, que es el que vibraba. Y nosotros oímos ese sonido. Admito que así se pueden hacer sonidos muy interesantes, pero es bastante limitado. En su día empezaron a hacer su aparición los "magos de los filtros", que conseguían interpretar impresionantes melodías con el ahora primitivo chip SID.
Hasta que alguien se dio cuenta de algo que iba a revolucionar el mundo de los sonidos. Esa costumbre del chip SID de hacer un "click" cuando se activa el volumen. Recuerda que ese "click" es simplemente una anulación de tensión en uno de los pines del chip, que hace que quede liberada la señal que va hacia el modulador y no a masa. Al anular esa tensión lo que estás haciendo es tirar un instante del altavoz: eso produce el "click". Y surge la idea. ¿No son los sonidos provenientes de un altavoz sino continuas vibraciones (vaivenes) del altavoz? ¿No podríamos controlar esos vaivenes con cierta precisión empleando ese "click" del chip SID? Claro. Así surgió el sonido digitalizado, que es algo más glotón aún que la alta resolución en cuanto a necesidades de memoria se refiere.
Normalmente, lo que se hace es leer la memoria a gran velocidad, e ir introduciendo esos valores en el registro de volumen del SID, para provocar una corriente continua de "clicks" a distintas intensidades. Esto produce un sonido digitalizado. Como el nivel de volumen del C-64 varia de cero a quince, se pueden modificar cuatro bits de volumen. Esto se llama "sampling" o muestreo a cuatro bits. Evidentemente, cuantos más bits tenga un sampling, tanto más perfecta es la reproducción. Para que lo veas en la práctica, esta conocida rutina hace sampling de un bit desde el cassette.
LOOP LDA $DC0D
ROR A
STA $D418
JMP LOOP
Pruébalo en tu C-64. En teoría todos esos bits leídos del cassette y luego reproducirlos a la misma velocidad. Así conseguiría ejecutar el sonido. De hecho, éste era el sistema utilizado en el programa del artículo "Hablando se entiende la gente", publicado en el número 27 página 28 de COMMODORE WORLD.
Eso sería un sonido digitalizado. Y esto es lo que se hace en el Amiga: aquí no hay un registro de sonido al que podamos decirle las características del sonido y que él se encargue de ejecutarlo. En el AMiga hay que definir UNO POR UNO los movimientos del altavoz. Admito que visto así impresiona bastante. Pero en la práctica es tan sencillo como cinco POKEs (¡cómo no!).
El Amiga, para que nadie se queje, tiene unos circuitos especiales, llamados DMA (Direct Memory Access), que sirven para efectuar operaciones rutinarias con memoria, a gran velocidad. Y atención: lo hacen de forma totalmente independiente de la CPU, por lo que una vez el sonido lanzado, no hay que preocuparse de nada, excepto de pararlo cuando quieras.
El DMA tiene cuatro de sus dieciocho canales asignados a sonido. A ellos no hace falta nada más que decirles donde está el sonido, cuánto ocupa y a qué velocidad debe reproducirse. El se encarga del resto. En cuanto a la definición del sonido, no hay problema. Fíjate en la figura. El primer cuadro muestra una onda de sonido real. Lo que se hace en el ordenador, y sobre todo en los digitalizadores de sonido, es tomar, muy rápidamente, la altura del sonido, y almacenarlo en memoria, en bytes consecutivos.
Como los niveles originales son analógicos, hace falta convertirlos previamente a formato digital, es decir, a una escala de valores determinada. Por ejemplo, si el valor del sonido de volumen máximo se le da un valor de 100, al resto de los muestreos hay que darles valores entre 0 y 100. En la figura 2, el mismo sonido ha sido almacenado en memoria. SI te fijas, se pierden muchos valores del sonido original. Por eso hay que utilizar cuantos más niveles de bits mejor, para poder representarlo de la forma mas fiel posible. En la figura 3 se han cuadruplicado los niveles de muestreo, dando una onda mucho más parecida a la original. De todas formas, te recuerdo que los bytes se toman a razón de 20.000 por segundo.
En el Amiga se dispone de canales digitales de ocho bits, o sea, un rango de 256 valores. En principio hay, pues, una gran calidad de reproducción. Ahora, pasemos a la práctica:
|
|---|
Los registros que controlan los canales DMA están colocados en una posición bastante alta de la memoria, fuera del rango de ampliación de la RAM. La posición exacta del chip en $DFF000, en decimal 13701120 (chicos de 64, ¡no lo intentéis!) y los registros que interesan están ubicados a partir del registro $96; por tanto, la dirección será la $DFF096. Este registro se llama (atención al nombre) DMACON, que viene de "DMA control". Este controla la activación de cada canal DMA. En particular, los bits encargados del sonido son los bits 0, 1, 2 y 3. Después van tres "campos" de 16 bytes cada uno, cada cual encargado de un canal de sonido, del 0 al 3. Todos tienen la misma arquitectura, y sólo nos interesan, de momento, los primeros 10 bytes de cada uno. En este cuadro lo verás mejor.
| CONTENIDO | DIRECCIONES DE MEMORIA | |||
|---|---|---|---|---|
| Posición en memoria | $DDF0A0 | $DFF0B0 | $DFF0C0 | $DFF0D0 |
| Longitud | $DFF0A4 | $DFF0B4 | $DFF0C4 | $DFF0D4 |
| Velocidad de muestreo | $DFF0A6 | $DFF0B6 | $DFF0C6 | $DFF0D6 |
| Volumen | $DFF0A8 | $DFF0B8 | $DFF0C8 | $DFF0D8 |
Veamos. La "posición en memoria" indica, como es lógico, dónde está ubicado el sonido en memoria. Son cuatro bytes que indican la posición absoluta dentro de la memoria del Amiga. Lo único que hay que tener en cuenta es que debe estar "alineado", esto es, debe empezar en una posición PAR de memoria. Si intentas colocarlo en una posición impar, el chip DMA se encargará de anular el bit cero. Con eso, ¡seguro que será par!
La "longitud" es la longitud del sonido pero, atención: viene dada en palabras de 16 bits. Es decir, que si el sonido ocupa $8000 (32768 bytes), serán $4000 palabras (1 palabra = 2 bytes). La "velocidad de muestreo" indica cuántos bytes se leerán cada centésima de segundo. Los valores más normales suelen estar entre trescientos y quinientos, pero el tope del chip es 65535 bytes por centésima de segundo: francamente, ni un compact disc es capaz de hacerlo mejor...
Y finalmente el "volumen" puede variar entre 0 y 63. Todavía no me explico por qué le asignan 16 bits a un valor que ocupa seis, pero, vaya, ¡que se le va a hacer!
Hasta ahora sólo has informado al chip Paula (así se llama), dónde se encuentra el sonido, cuánto dura, etc. ¡Pero tienes que decirle que lo interprete! Esto es tan sencillo como otro POKE. Este POKE se hace en el registro DMACON, indicando qué voces quieres que suenen, y poniendo el MSB a uno para que sepa que lo que quieres hacer es encender el DMA. Los bits de los canales son:
| CANAL | BIT | |
|---|---|---|
| Canal 0 | $01 | %0001 |
| Canal 1 | $02 | %0010 |
| Canal 2 | $04 | %0100 |
| Canal 3 | $08 | %1000 |
| Bit de On/Off | $8000 | %10000000 00000000 |
Por ejemplo, para activar las voces 0 y 3, tendrías que hacer un POKE a DMACON con el siguiente valor
Canal 0 + Canal 3 + Bit On/Off. $01 + $08 + $8000 = $8009 = decimal 32777.
Fácil, ¿no? Bien, ahora el sonido está ejecutándose y puedes oírlo por el altavoz. Cuando llegue al final, volverá a comenzar por el principio, y así indefinidamente. Y mientras suena puedes cambiarle la altura, el volumen, etc., con total libertad. Para apagarlo, lo único que tienes que hacer es dejar el bit de on/off a cero, por lo que tendrías que hacer un POKE con el valor:
Canal 0 + Canal 3 + Bit On/Off $01 + $08 + $0000 = $0009 = decimal 9.
|
|---|
Ya sabes que el comando WAVE del Basic (que se supone que hace lo que hemos visto hasta ahora) es francamente desgraciado, ya que sólo permite sonidos de 255 bytes de largo, lo cual no da ni para empezar. Con el pequeño utilitario que tienes en el listado que va a continuación dejo en el aire cómo se programan sonidos en el Amiga. Ninguna llamada al sistema operativo. Nada de punteros peligrosos. Sólo cinco inocentes POKES.
El sonido se carga en una variable alfanumérica, lo cual asegura que quedará continuo en memoria. La dirección de memoria se calcula con la función SADD, con el famoso SADD (cadena$). Y la longitud la de la función LEN. Acto seguido se ajustan los valores a posiciones pares (créeme, hay que tener muy buen oído para notar un byte que falte al principio del sonido..), y luego el programa pregunta la velocidad y el volumen. Después se hacen los POKEs y se sale al intérprete, con el sonido activado. Para desactivarlo, puedes hacerlo de dos modos, según las ganas de teclear que tengas: bien POKEW CUSTOM + DMACON,1 o bien con el comando BEEP, que desconecta todas las voces.
Bueno, no es tan fiero el león como lo pintan. En el Amiga lo difícil se hace fácil, y lo imposible solo es un poquitín más complicado.
|
|||
| Envía esta página web a un amigo: Esta opción está desactivada temporalmente, rogamos disculpen las molestias |
|