Como no he sido capaz de encontrar las instrucciones de este programa, voy primero a dar unas nociones generales de su manejo. Tras eso, continuaré con un breve examen del uso del AY Player desde BASIC.
Si introducimos el disco del MUSIC MAESTRO en la disquetera y tecleamos el comando CAT en el editor del +3BASIC podremos ver el contenido: nada menos que 33 ficheros en la cara A y 4 en la cara B.
Los ficheros los podemos agrupar en varias categorías:
- Ficheros con extensión .MOB
Son ficheros .MUS compilados y listos para usar desde BASIC
- Ficheros con extensión .MUS
Son las composiciones que guardamos. Solo editables desde el MM.
Compilables a .MOB
- Ficheros del programa MUSIC MAESTRO:
Todos están en la CARA A:
DISK Cargador BASIC, carga MUSIC.SCN y MUSIC.PRG (copia de MUSIC)
INT Binario (usado por PLAY)
MUSIC Cargador BASIC, carga MUSIC.SCN y MUSIC.PRG
MUSIC.SCN Pantalla de presentación
MUSIC.PRG Binario principal del MM
PLAY Reproductor (BASIC)
SET_INT Binario (usado por PLAY)
Publicado y comercializado en 1988 por la compañía TORCHRAVEN LDT., podemos con él crear y escuchar melodías empleando tanto el altavoz simple (BEEPER) como el chip de sonido AY3-8912. El programa lo podemos encontrar en SpectrumComputing como un disco de 3" (dos caras, 173K libres por cara) para +3 y para mi sorpresa resulta completamente compatible con las ROMs +3e/+2e.Una característica importante de este editor de música es que incluye un AY Player manejable desde BASIC que símplemente inicia el fichero de música en RAM y vuelve a BASIC, mientras el AY Player lo reproduce de manera autónoma usando el sistema de interrupciones, y que permite tener música AY simultánea en tus programas BASIC, con algunas restricciones relativamente menores (las posibilidades de uso del disco RAM desde BASIC quedan severamente limitadas) si lo comparamos con el lujo de poder usar música AY simultánea desde BASIC.
Para arrancar el programa podemos simplemente seleccionar la opción “Cargador” en el menú principal (esto cargará el fichero en BASIC llamado "DISK") o desde el editor +3BASIC tecleando LOAD “MUSIC” o LOAD “DISK” (ambos de hecho son el mismo programa). En la pantalla principal que se presenta nada más arrancar el programa, tenemos un montón de información. Con las teclas 1-2-3 seleccionamos en cuál de los 3 canales disponibles vamos a insertar las notas. Aparte de estas 3 teclas, en la parte posterior de la pantalla podemos ver un área en azul que muestra que disponemos de las siguientes opciones: Una vez hayamos entrado en cualquiera de las opciones, con la tecla Q volvemos a esta pantalla principal.
Como puede verse, nada más arrancar el programa, la salida está dirigida al BEEPER, por lo que lo primero que tendremos que hacer es habilitar el chip de sonido AY. Para ello, desde la pantalla principal entramos en “OPTIONS” pulsando la tecla O.
Desde esta pantalla de opciones, pulsando de nuevo la tecla O llegamos a otra, la de “SOUND DEVICE”, en la que tenemos dos posibilidades, o emplear el BEEPER (pulsando B) o habilitar el chip AY, pulsando A.
Tras esto automáticamente volveremos a la pantalla principal, pero con una pequeña diferencia que se puede apreciar arriba a la izquierda. Ahí podemos ver cuatro columnas: el número de canal, si está activado o no (lo podemos desactivar), si está activado o desactivado como “tono”, y si está activado o desactivado como ruido blanco (“White-noise”). Antes estas dos últimas columnas estaban ocupadas por la palabra BEEP, y ahora no. También en la parte central superior aparece ahora un indicador referido a este último “White-noise” para el caso de que lo usemos. De momento del resto de opciones configurables desde la pantalla de “OPTIONS” nos olvidaremos. Con esto ya tenemos el MUSIC MAESTRO listo para empezar.
Para escribir nuestra composición haremos uso sobretodo de las opciones “INSERT”, “EDIT”, “DELETE” y “BLOCK” que encontramos en la pantalla principal: - Pulsemos “I”. Estando en la pantalla de “INSERT” podemos ver que la franja vertical amarilla cambia a color azul claro. Esa franja marca la posición de la nota con la que trabajamos. Vemos también que hay una nota en esa misma franja. Con las flechas arriba-abajo movemos la nota a través de la escala, con las flechas derecha-izquierda elegimos la duración de la nota (corcheas, semicorcheas, etc). Para insertar un silencio en vez de una nota pulsamos R (“REST”) y con las flechas derecha-izquierda elegimos entre los diferentes tipos posibles. Una vez elegida la nota o silencio para esa posición pulsamos INTRO para insertarla, con lo que, sin salir de la pantalla de “INSERT”, la franja de color se desplaza una posición hacia la derecha y podemos repetir el proceso. Insertemos varias notas para ver el efecto. Como siempre, con la tecla Q volvemos a la pantalla principal. Ahora, teniendo ya notas en la partitura, con las flechas derecha-izquierda podemos desplazarnos con la franja amarilla por las notas y oírlas. Si estando sobre una nota volvemos a insertar, las nuevas notas se sitúan justo a la izquierda de la nota sobre la que se encontrara la franja vertical, que se va desplazando hacia la derecha para hacer espacio a las nuevas notas.
Si queremos modificar o borrar una nota ya insertada, tenemos que pulsar E (“EDIT”) para modificar) o D (“DELETE”) para borrar. - La pantalla “EDIT” es idéntica a la pantalla “INSERT”. Trabaja con la nota que en ese momento estuviera bajo la franja vertical amarilla. Al pulsar INTRO almacena la nota actual y salta a la siguiente a su derecha sin salir de la pantalla “EDIT”. - La opción “DELETE”, pulsando la tecla D desde la pantalla principal, borra directamente la nota que haya bajo la franja vertical amarilla, corriendo una posición atrás todas las notas siguientes. - Recordemos además que con las teclas numéricas 1, 2 y 3 seleccionamos en qué canal sonarán esas notas.
- Por último, la opción “BLOCK” nos permite marcar el principio y final de un bloque y copiar ese bloque en otras posiciones. Aunque aparentemente sencillo, puede llegar a ser un poco enrevesado de usar. Yo recomiendo no usarla mucho. - Como se puede ver, solo podemos desplazarnos libremente por la partitura desde la pantalla principal. Desde allí saltamos a las opciones que (excepto “INSERT”) trabajan con la nota en ese momento bajo la barra vertical amarilla. A estas alturas ya tenemos el conocimiento de los controles básicos para crear un melodía sencilla. En la pantalla principal pulsemos N (“NEW”) para borrar lo que hubiéramos introducido previamente, volvamos a establecer la salida al chip AY y volvamos a irnos hasta “INSERT”. Pongamos ahora unas cuantas notas en los tres canales.
Para guardar nuestro trabajo, en la pantalla principal pulsamos F ("FILE")
Visto todo esto, vamos ahora a darle un vistado al manejo del AY Player desde BASIC. Reseteamos el ordenador y cargamos el fichero "PLAY" con LOAD "PLAY" (autoejecución con línea 9000). Esto nos permite ver el funcionamiento del programa: tras especificar el tipo de máquina, carga los ficheros de música y los reproduce mientras vuelve al BASIC, desde el que podemos parar la música con un POKE y un RANDOMIZE USR (también se puede usar simplemente un PLAY""). El código fuente es el siguiente:
---------------------------------------------------------------------------------
1 REM *********************** This is a silly test program so that you can see it works.
10 GO SUB 9700 20 LET selection=INT (RND*objects)+1 30 PAPER 7:
INK 0:
CLS :
PRINT "Press a key, and I will play"'"tune ";selection 40 LET a$=INKEY$:
IF a$="" THEN
GO TO 40 50 GO SUB 9800 60 LET a$="MUSIC MAESTRO":
GO SUB 1000:
GO TO 20
--------------------------------------------------------------------------------- 1000 LET a$=" "+a$+" " 1020 LET b$="":
FOR i=1 TO LEN a$:
LET b$=b$+" ":
NEXT i 1030 LET xm=32-LEN a$:
LET ym=19 1035 CLS 1040 FOR i=1 TO 30 1050 LET x=INT (RND*xm):
LET y=INT (RND*ym):
LET p=INT (RND*7) 1060 PAPER p:
INK 9:
PRINT AT y,x;b$;AT y+1,x;a$;AT y+2,x;b$:
NEXT i:
RETURN
--------------------------------------------------------------------------------- 9000 REM *********************** To use this routine, once initialised, you can use: GO SUB 9400 which brings up the list of tunes loaded and the user can then select one to play, or GO SUB 9700 which sets up the arrays, and then any time a tune is wanted to be played, LET selection=<tune_#> GO SUB 9800
9010 REM *********************** To turn of a tune: LET selection=-1 GO SUB 9800
9015 REM ***********************
9020 GO TO 9400
9030 REM *********************** Lower memory to store the tunes and the interupt routine
9032 CLEAR 48999
9038 REM *********************** Get type of machine, a 48K or one of the 128. The 128K machines need to do some extra things because of the way that thier memory is accessed.
9040 PAPER 7:
INK 0:
FLASH 0:
BRIGHT 0:
BORDER 7:
CLS 9050 PRINT AT 1,1;"Enter machine type:";
AT 3,3; FLASH 1;"4"; FLASH 0;"8K";
AT 5,3; FLASH 1;"1"; FLASH 0;"28K" 9060 LET a$=INKEY$ 9070 IF a$<>"1" AND a$<>"4" THEN
GO TO 9060
9075 REM *********************** Set up some variables according to the machine type: machine : Machine type ( 128 or 48 ) tape : If the machine has a tape device : Which sound device the machine has 0=BEEP
9080 IF a$="1" THEN
LET machine=128:
LET device=1 9090 IF a$="4" THEN
LET machine=48:
LET tape=1:
LET device=0
9100 REM *********************** Because 128 machines may have either a tape or disk ( 128/+2 or +3 ) we have to get if the machine has a tape or disk
9110 IF machine=48 THEN
GO TO 9180 9120 CLS 9130 PRINT AT 1,1;"Does you machine have a:";
AT 3,3; FLASH 1;"T"; FLASH 0;"ape or a";
AT 5,3; FLASH 1;"D"; FLASH 0;"isk" 9140 LET a$=INKEY$ 9150 IF a$<>"T" AND a$<>"t" AND a$<>"D" AND a$<>"d" THEN
GO TO 9140 9160 IF a$="T" OR a$="t" THEN
LET tape=1 9170 IF a$="D" OR a$="d" THEN
LET tape=0
9180 REM *********************** Now load the interrupt routine
9190 CLS 9200 IF tape=1 THEN
PRINT "Start the tape"'' 9210 LOAD "INT" CODE 62967,1900
9212 REM *********************** The following line is a patch for 48K machines.
9215 IF machine=48 THEN
POKE 63395,195:
POKE 63396,99:
POKE 63397,253:
POKE 64867,241:
POKE 64868,251:
POKE 64869,255:
POKE 64870,201
9220 REM *********************** Now, if this is a 128 machine, load the interrupt initialisation routine
9230 IF machine=128 THEN
LOAD "SET_INT" CODE 49000,149
9240 REM *********************** Now initialise the interrupts
9250 IF machine=128 THEN
RANDOMIZE USR 49000 9260 IF machine=48 THEN
RANDOMIZE USR 62967
9270 REM *********************** Now load the objects
9280 CLS 9285 PRINT "Loading objects"'' 9300 GO SUB 9700 9320 FOR i=1 TO objects 9330 IF a(i)<0 THEN
GO SUB 9650:
GO TO 9370 9340 PRINT n$(i) 9350 LOAD n$(i) CODE a(i),l(i) 9355 POKE a(i)+4,device 9370 NEXT i
9400 REM *********************** Now let the user select one of the tunes
9430 CLS 9440 GO SUB 9700 9450 FOR i=1 TO objects 9455 PRINT i;") "; 9460 IF a(i)<0 THEN
PRINT FLASH 1;" ";n$(i);" "; FLASH 0:
GO TO 9480 9470 PRINT n$(i) 9480 NEXT i 9530 INPUT FLASH 1;" SELECT "; FLASH 0;" > ";selection 9540 IF selection=0 OR selection>objects THEN
GO TO 9530 9542 IF selection>0 THEN IF a(selection)<0 THEN
GO TO 9530 9550 GO SUB 9800 9560 CLS 9570 PRINT "YOU ARE NOW IN BASIC"''
"Type 'RUN 9000' to select"'
"another tune or 'RUN' for a demo" 9580 STOP
--------------------------------------------------------------------------------- 9650 REM *********************** Display that this file can not be loaded because there is not enough memory.
9660 PRINT n$(i);" "; FLASH 1;" NOT ENOUGH MEMORY "; FLASH 0 9670 RETURN
--------------------------------------------------------------------------------- 9690 REM *********************** This routine sets up the name ( n$ ), address ( a ) and length ( l ) arrays for the tunes. If a tune will not fit in memory, then its address is set to -1 and it can nott be played.
9700 LET objects=4 9710 RESTORE 9900 9730 LET position=49000 9740 DIM n$(objects,12) 9750 DIM a(objects) 9752 DIM l(objects) 9760 FOR i=1 TO objects 9770 READ n$(i),l(i) 9772 IF position+l(i)>62966 THEN
LET a(i)=-1:
GO TO 9778 9774 LET a(i)=position 9776 LET position=position+l(i) 9778 NEXT i 9780 RETURN
9800 REM *********************** Play selected tune
9810 LET flag=63007 9812 LET pointer=63010 9814 IF selection<0 THEN
GO TO 9870 9820 POKE pointer,a(selection)-(256*INT (a(selection)/256)) 9830 POKE pointer,a(selection)-(256*INT (a(selection)/256)) 9840 POKE pointer+1,INT (a(selection)/256) 9850 POKE flag,1 9860 GO TO 9880 9870 POKE flag,0 9880 LET x=USR 63006 9890 RETURN
--------------------------------------------------------------------------------- 9900 DATA "ARABES.MOB",1379 9910 DATA "SONG.MOB",410 9920 DATA "TEST.MOB",230 9930 DATA "WAVE.MOB",455
---------------------------------------------------------------------------------
Este código fuente nos proporciona todas las instrucciones que necesitamos para poder usar el AY Player desde BASIC sin problemas.
Como se ve en el código fuente anterior, el programa está compuesto por los ficheros INT y SET_INT. El primero carga en 62967 y el segundo en 49000. Tras cargar ambos e inicializar el sistema con RAND USR 49000 se puede borrar SET_INT de la RAM sin más inconvenientes. El AY Player usa de la dirección 62967 en adelante, dejando algunos parches de memoria libre aparentemente sin uso.
Desde el momento en el que inicializamos con RAND USR 49000, las operaciones de lectura/escritura al disco normal se presentan por completo preservadas y no presentan ningún inconveniente. Sin embargo otro cantar es el disco RAM, la memoria paginada y el sistema de bufferes del +3DOS: las operaciones de SAVE"M:" corrompen el programa. No así otras operaciones como LOAD"M:" o CAT"M:". Si hemos salvado en M: un fichero antes de inicializar, lo podemos cargar mientras no supere un tamaño de 4K aprox., en caso contrario el AY Player lo corrompe en la operación.
A continuación seleccionamos D ("DISK FILE") y tenemos las opciones "LOAD", "SAVE", "OBJECT" y "CATALOG". Pulsando O pasamos a generar el fichero compilado usable desde el AY Player, se requiere que especifiquemos si el fichero suena una vez o en bucle y a continuación salva el fichero con extensión .MOB, tras proporcionarnos su tamaño en bytes (esto lo necesitamos posteriormente para usarlo con el AY Player). Lo bueno de todos estas opciones con los ficheros es que usan +3DOS de una manera que es totalmente compatible con las ROMs +3e/+2e, no requiriendo del uso del disquete en ningún momento: todo va dirigido a la unidad de disco actual desde la que se ejecuta el programa.