Sonido y melodías con en el Sinclair QL

En este post hablaré un poco de las funcionalidades de sonido que posee el Sinclair QL, tema con en el que he estado “jugando” últimamente. Mis pretensiones no van más allá de la mera producción de melodías sencillas con SuperBASIC y la simple curiosidad por el uso de las (limitadas) capacidades sonoras del QL. Sin buscar demasiado, he encontrado dos fuentes útiles: a) el libro ‘QL SuperBASIC Definitive Handbook’ de Jan Jones y b) un artículo de la revista QL-Today que he encontrado en el sitio de Dilwyn Jones donde se habla este tema y que he tomado como guía para este post.

Empecemos …

Las facilidades el QL para producir sonidos son bastante básicas, un sólo comando BEEP que en su forma más simple puede tener duración y tono. Pero, incluso con algo tan simple, podemos crear melodías sencillas y, posiblemente, escribir un programa corto para componer y tocar melodías con la información correcta.

El comando BEEP del QL usa valores en sus parámetros que no son tan obvios, además el manual del QL no explica realmente mucho. Por suerte, el libro ‘QL SuperBASIC Definitive Handbook’ de Jan Jones es más explícito.

La sintaxis básica del comando BEEP es:

BEEP duración, tono 

La duración se expresa como la longitud del sonido en unidades de 72 microsegundos, el rango de valores permitidos es de 0 a 32767. Así, para un segundo de duración de un determinado sonido, el valor del parámetro duración debe ser 13.889 (unidades de tono). La duración 0 no es particularmente útil, sólo indica que la nota debe estar sonando permanentemente (hasta que otro comando BEEP si parámetros cancele la señal). Puede ser útil en determinados casos en los que queramos que un sonido continúe hasta que ocurra algo para detenerlo.

Hay un aspecto importante en el manejo del sonido en el QL. Concretamente en lo referente a que no hay facilidades para manejar una cola de notas musicales o tonos de duraciones determinadas. En su lugar se debe hacer una pausa para luego interrumpir el sonido con otro comando BEEP en blanco.

Por ejemplo, una forma de manejar la reproducción de sonidos debe tener la siguiente forma:

BEEP duración, tono 
PAUSE longitud
BEEP

También puede manejarse de la siguiente manera, donde definimos un bucle que se repite hasta que el tono especificado ha dejado de sonar:

BEEP duracion, tono 
REPeat loop: IF NOT BEEPING THEN EXIT loop

El tono es más difícil de ajustar. Puede tomar valores del rango 0 a 255, lo cuales no están directamente relacionados con las notas musicales. La aproximación más cercana que podemos encontrar en la documentación es el siguiente cuadro publicado en un boletín de Sinclair. En este cuadro se relaciona el valor del tono con la notación musical:

a    41
a#   38
b    36
c    33 (DO cetral)
c#   31
d    28
d#   26
e    24
f    22
f#   20
g    19
g#   17
a    15
a#   14
b    12
c    11
c#   10
d    9
d#   8
e    7
f    6
f#   5
g    4
g#   3

En términos de la clave de sol, esto equivale a lo siguiente:

En cuanto a la duración de las notas, si vas calcular la duración de una redonda, blanca, negra, corchea y todas las demás figuras del lenguaje musical, debes tener en cuenta que éstas se basan en la mitad o el doble de tiempo unas de otras. Se trata entonces de calcular la duración relativa de todas las figuras del lenguaje musical. La siguiente tabla muestra dicha duración relativa.

redonda        = 4 * negra
blanca         = 2 * negra
negra          = 1 *
corchea        = 0.5 * negra  (1/2)
semi-corchea   = 0.25 * negra (1/4)
fusa           = 0.125 * negra (1/8)
semifusa       = 0.0625 * negra (1/16)

Lo rápido o lento que debe ser tocada una melodía depende del tiempo o “tempo” especificado para ella en el lenguaje musical (Allegro, Andante, Presto, …. ).De cara a ajustar este tiempo con SuperBASIC debemos utilizar el retardo adecuado con la orden PAUSE para esperar un cierto número de unidades de tiempo, N/50 de segundo. Tendremos entonces que ajustarnos para aproximarnos al número de latidos por minuto, según lo requerido por la melodía o la música en cuestión.

Para poner a prueba lo que nos dice la teoría, he escrito un pequeño programa en SuperBASIC para tocar una simple melodía, el archiconocido “cumpleaños feliz” (aprovechando que estamos en el 25 aniversario del Sinclair QL – MGE).

Como veréis en el programa, no toda la teoría se cumple de forma exacta a lo que he descrito en este post. Concretamente hay tres cambios que he tenido que introducir:
1) En mi QL con Gold Card he tenido que poner un PAUSE 1, para que todo funcione (tal vez debido al incremente de velocidad aportado por la Gold Card).
2) Para que la melodía salga mínimamente afinada he cambiado los valores de las notas LA (A) y DO (C) a los valores 15.5 y 10.5 (en lugar de los valores 15 y 11 que propone la tabla propuesta en el boletín de Sinclair.
3) Por comodidad, en la duración de las notas musicales yo he tomado la unidad 1 para representar a la semicorchea, 2 para la corcha, 4 para la negra. Luego multiplico por 3000 para conseguir que la melodía se reproduzca a un tiempo “Andante” del lenguaje musical (unas 100 pulsaciones por segundo).

100 REMark ---------------------------------
110 REMark --- Toca cumpleaños feliz.
120 REMark ---------------------------------
130 :
140 RESTORE 
150 CLS
160 :
170 notas% = 25
180 DIM Tonos(notas%)
190 DIM Duracion(notas%)
200 :
210 Lee Tonos, notas%
220 Lee Duracion, notas%
230 :
240 Toca Tonos, Duracion, notas%
250 :
260 STOP
270 :
280 :
290 REMark --- Datos -----------------------
300 :
310 REMark --- Tonos
320 DATA 19,19,15.5,19,10.5,12
330 DATA 19,19,15.5,19,9,10.5
340 DATA 19,19,4,7,10.5,12,15
350 DATA 6,6,7,10.5,9,10.5
360 :
370 REMark --- Tiempos
380 DATA 3,1,4,4,4,8
390 DATA 3,1,4,4,4,8
400 DATA 3,1,4,4,4,4,8
410 DATA 3,1,4,4,4,8
420 :
430 :
440 REMark --- Procedimientos --------------
450 :
460 DEFine PROCedure TocaSonido (Dur, Ton)
470   BEEP Dur*3000,Ton
480   PAUSE 1
490   REPeat loop
500     IF NOT BEEPING THEN EXIT loop
510   END REPeat loop
520 END DEFine 
530 :
540 DEFine PROCedure Lee (array, n%)
550   LOCal i
560   FOR i = 1 TO n%
570     READ array(i)
580   END FOR i
590 END DEFine 
600 :
610 DEFine PROCedure Toca (Ton, Dur, n%)
620   LOCal i
630   FOR i = 1 TO n%
640     PRINT i, Dur(i),Ton(i)
660     TocaSonido Dur(i),Ton(i)
670   END FOR i
680 END DEFine 

Como vemos, las funcionalidad del QL para reproducir sonidos y melodías son por un lado, muy elementales y simples, pero por otro lado son de fácil uso y suficientes para la generación de sonidos y melodías sencillas para acompañar a nuestros programas.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s