Revistas en papel
 Commodore World Nº50
Anterior
Menú
Logotipo

AMIGA WORLD

LOS SECRETOS
DEL SONIDO DIGITALIZADO

Por Fernando Marcos

Cuando me compré mi flamante Amiga (hace algo más de un año) me sorprendí al llegar a casa al darme cuenta de que la máquina que tenía entre manos, además de ser rápida, tener mucha memoria y, sobre todo, unos gráficos increíbles, hacía además unos sonidos poco menos que asombrosos. Es cierto, pero casi no lo mencionan en la publicidad: gráficos, sintetizador de voz, animación tridimensional... pero de cuatro canales de sonido digitales nada. Así que me picó la curiosidad y empecé a recoger toda la información que pude sobre el sonido en el Amiga.

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:

Sampling: Muestreo digital de sonido. Cómo lo hace el Amiga - 94 Kb


ACTIVANDO LOS CANALES DE SONIDO

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.      


PROGRAMA PARA HACER SONAR AL BASIC

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.

Programa: SOUND MAKER
 
'Sound Maker                                          .557
'F.Marcos 1988                                        .112
'    Hola QE2, KB!!!                                  .815
'    Si esto funciona, sere un verdadero GENIO!!!     .443
 
INPUT "Nombre del instrumento:";in$                   .403
 
OPEN in$ FOR INPUT AS 1                               . 39
Wav$=INPUT$(LOF(1),1)                                 .386
CLOSE 1                                               . 56
 
IF LEFT$(Wav$m4)="FORM" THEN                          .375
Wav$=MID$(Wav$,INSTR(Wav$,"BODY")+8)                  .624
PRINT "El fichero era IFF."                           .883
ELSE                                                  .483
PRINT "El fichero no es IFF."                         .404
END IF                                                .654
 
Lenght = LEN(Wav$)                                    . 78
IF Lenght AND 1=1 THEN Lenght=Lenght+1                .133
 
MemPos = SADD(Wav$)                                   .140
IF MemPos AND 1=1 THEN MemPos=MemPos+1                .610
 
INPUT "Nota:";nt                                      .945
INPUT "Volumen:";vol                                  .364
 
Music:                                                .133
CUSTOM = 13701120&   'Registros                       .523
DMACON  = &H96     'Activacion de DMA                 .468
Ch0Pos = &HA0      'Posicion de datos                 .230
cH0Len = &HA4      'Longitud (en palabras de 16 bit)  .816
cH0Per = &HA6      'Velocidad de muestreo             . 65
Ch0Vol = &HA8      'VOLUMEN (0-64)                    .332
 
POKEL Ch0Pos + CUSTOM,MemPos                          .136
POKEW Ch0Len + CUSTOM,Lenght\2                        .584
POKEW Ch0Per + CUSTOM,nt                              .870
POKEW Ch0Vol + CUSTOM,vol                             .283
 
'Hemos colocado parametros del                        .240
'sonido. Ahora lo activamos...                        .203
 
POKEW DMACON + CUSTOM,32768&+1                        .453
 
'Voz sonando!!!                                       . 97
 
Numero de lineas: 35

Envía esta página web a un amigo:
Esta opción está desactivada temporalmente, rogamos disculpen las molestias

Volver a la página anterior

Al menú principal