218 RECUERDA, que el abanico de notas en el que un sample puede tocarse, dependera de la frecuencia de su grabacion original. Si una nota es demasiado alta, AMOS no sera capaz de tocarla por com pleto. El rango aceptable varia de un sample a otro, pero es habi tual entre 10 y 50. SET ENVEL (crea un volumen envolvente) SET ENVEL wave,phase TO duration,volume Este comando cambia lentamente el volumen de una nota mientras, esta siendo tocada. En el mundo real, los sonidos no estan comple tamente preformados, sino que tienden a evolucionar dentro de un periodo de tiempo, que es conocido como VOLUMEN ENVOLVENTE. La forma de este envolvente varia dependiendo del tipo de instrumen- to que estes tocando. Un ejemplo tipico de uno de estos envolven- tes aparece en el siguiente diagrama: V | O | L | U | M | /\ E | / |\ N | / | \ | / | |------------------+\ | / | | | \ | / | | | \ +--------------------------------------- 1 2 3 4 TIEMPO 1.- Ataque 2.- Decaimiento 3.- Mantenimiento 4.- Relajacion El sonido se divide en las 4 fases arriba citadas. AMOS Basic te permite definir tus propios envolventes usando hasta 7 pasos separados. Cada paso representa un cambio constante en el volumen de la nota actual. "WAVE" es el numero de la forma de onda que sera afectada por esta instruccion. Es posible usar cualquier forma de onda que de- sees para este proposito, incluyendo los generadores prefabrica- dos NOISE y SINE. "PHASE" contiene el numero de la fase particular que va a ser definida, y va desde 0 a 6. "DURATION" especifica la longitud del paso actual en unidades de cincuentavos de segundo. Esto determi- nara la aparente velocidad del cambio de volumen generado en esta fase. Por ultimo, "VOLUME" especifica el volumen que se alcanzara al final de esta fase. Los niveles permitidos van de 0 a 63. Es importante, comprender que este volumen se relaciona con la intensidad que previamente has establecido con el comando VOLUME. Asi, incluso si la nota es tranquila, la forma del envolvente se- ra tambien del mismo modo. Ahora algunos ejemplos: 219 Set Envel 1,0 to 200,63: Rem establece el primer paso Play 40,0 Como podras oir, el volumen de tu sonido comienza de 0, y au- menta hasta la maxima intensidad durante la longitud de la nota. Ahora intenta definir algo mas compicado: Set Envel 1,0 to 15,60 Play 40,0: Wait Key Set Envel 1,1 to 1,50 Play 40,0: Wait Key Set Envel 1,2 to 10,50 Play 40,0: Wait Key Set Envel 1,3 to 50,0 Play 40,0 Finalmente, he aqui otro ejemplo de un envolvente de ruido: Noise to 15 Set Envel 0,0 to 1000,30 Play 40,0 Wait Key Music Off No confundas ondas con envolventes. Una onda establece los com ponentes de frecuencia de tus notas, mientras que un envolvente simplemente cambia su volumen de acuerdo a un patron definido. Lenguaje ======== Tu Amiga esta dotado con un poderoso sintetizador de voz huma- na que puedes encontrar en el disco Workbench. Con la ayuda de esta rutina, tus programas AMOS podran hablar. La voz es especial mente util para la educacion, puesto que la mayoria de los chicos jovenes, responden mejor a la palabra hablada que a la escrita. Una cosa a recordar; puesto que el paquete narrador es indepen diente de AMOS Basic, no podemos asegurar su fiabilidad por com- pleto. SAY (pronuncia una frase) SAY t$¡,mode¿ Este comando es increiblemente facil de usar. Introduce tu texto en ingles normal, concluyendo tu frase con un signo de puntuacion como un punto. SAY a continuacion traducira tus palabras a un for mato interno y las dira directamente por tu altavoz. Ejemplo: Say "AMOS Basic can really speak" 220 La primera vez que uses esta instruccion, el narrador sera car gado automaticamente desde el disco. Asi que es vital asegurarse de que el disco apropiado esta ubicado en la disquetera antes de usar el sistema, de otro modo aparecera un 'requester'. "MODE" opta entre dos separados modos de pronunciacion. Por defecto, tu programa durante la pronunciacion, de modo que toda musica o efecto sonoro sera suspendido temporalmente. Colocando "mode" en un valor de un sistema multitarea activo te permitira reproducir lenguaje en tanto continua el programa AMOS. Inevita- blemente, esto ralentizara considerablemente tus rutinas. Para regresar al modo normal de lenguaje (sin otro sonido acompañante) debes ponder "mode" a 0. Si el sistema narrador no puede comprender lo que estas inten tando hablar no aparecera ningun mensaje de error, pero la orden sera automaticamente cancelada. Tambien, date cuenta, que el na- rrador puede liarse a veces con palabras muy cortas. Puesto que restos de una frase previa se incluyen en la siguiente. Este pro blema se soluciona añadiendo espacios al final de tu texto. SET TALK (establece efectos de locucion) SET TALK sex, mode, pitch, rate Este comando te permite cambiar el tipo de voz que se usara con el comando SAY. "SEX" elige entre masculino (0) o femenino (1). Con toda honestidad, no existe una gran diferencia entre ambas. Mejores efectos se podran crear simplemente aumentando la frecuen cia de la voz usando el parametro "pitch". "MODE" añade un patron de ritmo a la voz. Este puede ser acti- vado colocandolo en 1. "PITCH" cambia la frecuencia de la voz. Su rango oscila desde 65 a 320. "RATE" especifica la velocidad, medida en palabras por minuto, va de 40 a 400. Cualquiera de los parametros anteriores puede ser omitido si se desea. Basta con que coloques comas en sus posiciones normales para que puedas variar las opciones independientement 221 Efectos de filtro LED (Activa un filtro de paso y ademas apagara el chivato de puesta en marcha) LED ON/OFF Este comando tiene dos acciones completamente separadas. No solo apaga/enciende el chivato de funcionamiento de la consola de tu Amiga (en las versiones KickStart 1.3 no se apaga sino que se po- ne un poco mas oscuro), sino que tambien controla un filtro espe cial de paso. Este filtro cambia los sonidos de alta frecuencia tratados por este sistema. Normalmente, esos sonidos se filtran para evitar el riesgo de aparicion de sonidos distorsionados. Por desgracia, este filtro ocasiona perdida del timbre de muchos instrumentos de percusion. Por ello desactivando el filtro, podras recuperar toda la calidad de sonido de muchos de esos instrumentos 222 18: E L T E C L A D O AMOS Basic incorpora docenas de utiles comandos de teclado que pueden usarse en cualquier programa de aventuras o de arcade. E incluso es posible escribir un completo procesador de textos por completo con AMOS Basic. = INKEY$ (funcion que obtiene una tecla pulsada) K$=INKEY$ Esta funcion comprueba si el usuario a pulsado una tecla, y de- vuelve su valor en la cadena K$. Observa que este comando no espera tu respuesta en ningun caso puesto que si el usuario no introduce ninguna letra, INKEY$ devol vera una simple cadena vacia "". INKEY$ solo es capaz de leer teclas que tengan un especifico caracter ASCII en el teclado. ASCII es un lenguaje estandard usa- do para representar todos los caracteres que pueden ser imprimi- dos o visualizados en pantalla. Es importante darse cuenta que algunas teclas, como el boton HELP o las teclas de funcion, tienen un formato distinto. Si este comando las detecta, devolvera un caracter con valor 0. Sin embar go podras encontrar la codificacion interna de estas teclas usan- do una funcion separada llamada SCAN CODE. = SCANCODE (obtiene la codificacion de la ultima tecla incluida en la cadena INKEY$) s=SCANCODE Esta funcion devuelve la codificacion interna de la tecla que acaba de introducirse mediante la funcion INKEY$. Esto te permiti ra comprobar la presencia de teclas que no se correspondan con una letra (HELP, ESC, Teclas de funcion) del teclado. Teclea el siguiente ejemplo: DO While K$="" K$=Inkey$ Wend If ASC(K$)=0 then Print "Has pulsado tecla sin codigo ASCII" Print "La codificacion interna es ";Scancode Loop 223 = KEY STATE (chequea si una tecla en concreto ha sido pulsada) t=KEY STATE(s) Chequea si una tecla especifica ha sido pulsada en el teclado del Amiga. "S" es la codificacion interna de la tecla que queremos chequear. Si la tecla esta actualmente pulsada el comando devolve ra un valor cierto (-1), en caso contrario resultara falso (0). = KEY SHIFT (devuelve el estado de las teclas SHIFT) Keys=KEY SHIFT Esta funcion devuelve el estado actual de varias teclas de con- trol. Dichas teclas (como SHIFT o ALT) no pueden detectarse usan do el sistema anterior de INKEY$ o SCANCODE. Pero tu puedes facil mente comprobar cualquier combinacion de teclas de control que se produzca con una simple llamada a esta funcion. "KEYS" es un Mapa -BIT con el siguiente formato: BIT Tecla chequeada Notas --- --------------- ----- 0 SHIFT izquierda 1 SHIFT derecha 2 Caps Lock Si esta ON/OFF 3 CTRL 4 ALT izquierda 5 ALT derecha 6 AMIGA izquierda 7 AMIGA derecha Tecla C= en algunos modelos Si algun BIT es puesto a 1, entonces el boton asociado debe ha ber sido pulsado por el usuario. INPUT$(n) (Funcion que introduce N caracteres en una cadena) x$=INPUT$(n) Esta funcion introduce N caracteres directamente desde el teclado por turnos, uno a uno. Como ocurria con INKEY$, esos caracteres no aparecen en la pantalla. "X$" es una variable de cadena que sera cargada con tus nuevos caracteres. "N" contiene el numero de caracteres que se introduci ran. Ejemplo: Clear Key: Print "Teclea 10 caracteres" C$= INPUT$(10): Print "Tu eleccion ha sido ";C$ Esta instruccion NO es la misma que el INPUT estandard. Ambos son completamente distintos. Tambien advierte que existe una ver- sion especial de INPUT$ que puede usarse para leer caracteres en el disco. 224 WAIT KEY (espera a que se pulse una tecla) WAIT KEY Espera a que se pulse una tecla. KEY SPEED (cambia la velocidad de repeticion de tecla) KEY SPEED lag,speed Este comando te permite adaptar la velocidad del teclado a tus pulsaciones particulares. La nueva velocidad sera usada en todas las partes del sistema AMOS, incluyendo el editor. "LAG" es el tiempo, en cincuentavos de segundo, que transcurri ra entre que se pulse una tecla y el comienzo de la secuencia de repeticion de dicha tecla. "SPEED" es el retraso entre cada sucesivo caracter. CLEAR KEY (inicializa el buffer del teclado) CLEAR KEY Cuando introduces un caracter desde el teclado, sus codigo ASCII es colocado en un area de memoria que se denomina "Buffer del Te clado". Es de este buffer donde se obtiene la muestra para la fun cion INKEY$. CLEAR KEY borra completamente dicho buffer y devuelve el tecla do a su estado original. Es especialmente util al comienzo de un programa, ya que el buffer puede estar repleto de informacion no deseada. Tambien podras usar este comando inmediatamente antes de un comando WAIT KEY para asegurarte de que el programa espera una respuesta mediante la pulsacion de una tecla. PUT KEY (coloca una cadena en el buffer del teclado) PUT KEY a$ Carga una cadena de caracteres directamente en el interior del buffer del teclado. Incluso puede incluirse un retorno de carro usando el caracter CHR$(13). El uso mas habitual de este comando es para la carga de mensa- jes por defecto en tus rutinas de INPUT. He aqui un ejemplo: Do Put Key "No" Input "Otro juego";a$ if A$="No" then Exit Loop 225 Entrada/Salida INPUT (carga un valor del usuario y lo asigna a una variable) INPUT Te permite una forma estandard de entrada de informacion en una o mas variables. Existen 2 formatos posibles para esta instruccion: INPUT vars¡;¿ Introduce una lista de variables directamente desde el teclado. "VAR" puede contener el juego de variables que desees, separadas por comas. Un signo de interrogacion se visualizara automaticamen te en lugar del cursor. INPUT "Prompt";variable list¡;¿ Imprime una cadena de "apunte" antes de la entrada de tu informa- cion. Ten en cuenta que debes colocar siempre un punto y coma en- tre tu texto y la lista de variables. NO estando permitido el uso de la coma para este proposito. Un punto y coma opcional (;), al final de la lista de varia- bles especifica que el cursor de texto no se afectara por la ins- truccion INPUT, y mantendra su posicion original despues de que las datas hayan entrado. Cuando ejecutas uno de esos comandos, Basic esperara a que in- troduzcas la informacion requerida desde el teclado. Cada varia- ble de tu lista debe emparejarse con un determinado valor del usu ario. Esos valores deben ser los originales y estar separados por comas. LINE INPUT (solicita una lista de variables separadas por un retorno de carro) LINE INPUT Es igual que el anterior, excepto por el hecho de que usa un re- torno de carro (RETURN) en lugar de una coma para separar cada va lor de los que introduces desde el teclado. 226 19: O T R O S C O M A N D O S PRINT / ? (imprime una lista de variables en pantalla) PRINT items Esta instruccion visualiza cualquier informacion en pantalla, co- menzando en la posicion del cursor. Cada elemento de tu lista debe estar separado por una coma o un punto y coma. Un punto y co ma, imprimira los datos inmediatamente uno detras de otro, mien- tras que la coma primero mueve el cursor hasta la proxima posi- cion de tabulacion de pantalla. Normalmente, el cursor avanzara una sola linea hacia abajo, despues de cada instruccion PRINT. Esto puede eliminarse añadien- do un punto y coma despues de dicha instruccion: Print 10,20*10,"Ho"; Print "la" USING (formateado de salida) PRINT USING format$;variable list El comando USING se usa conjuntamente con PRINT para conseguir un mejor control del formato de salida. "Format$" especifica una lista de caracteres que definen la forma en que tus variables se visualizaran en pantalla. Cualquier texto normal de esta cadena se imprimira directamente, pero si in cluyes uno de los caracteres -- ~ # + - . ; -- entonces se eje cutara un determinado tipo de formateo. (~) Formatea una variable de cadena. Cada ~ sera reemplazado por un caracter de tu cadena de salida, tomados de izquierda a derecha. PRINT USING "Esto es una ~~~~~ demostracion de USING";"Corta" (#) Cada uno de estos caracteres especifican un digito simple que va a imprimirse de tu variable. Cualquier digito no usado de esta variable sera automaticamente reemplazado por espacios. (+) Añade un signo mas a un numero si este es positivo, y un sig- no menos si fuera negativo. PRINT USING "+##";10: PRINT USING "+##";-10 (-) Solo incluye un signo si el numero es negativo. Los numeros positivos se preceden por un espacio. 227 (.) Coloca un punto decimal en el numero, centrandolo en pantalla (;) Centra el numero pero sin ponerle notacion decimal ( ) Imprime un numero en su formato exponencial PRINT USING "He aqui el numero ";12345.678 REM / ' (Comentario) REM comment Esta instruccion se usa para añadir comentarios a tus progra- mas Basic. Cualquier texto tecleado a continuacion de un REM sera completamente ignorado por AMOS Basic. REM this is a comment ' this is a comment Tambien, un apostrofe (') se puede utilizar, pero DEBERA colo- carse al principio de la linea. DATA (coloca una lista de datos para un programa Basic) Esta instruccion te permite incorporar completos listados de util informacion directamente dentro de un programa Basic. Estos datos pueden ser posteriormente cargados como una o mas variables mediante la instruccion READ. Cada variable de tu lista debera ir separada con una COMA. DATA 1,2,3,"Hola" A diferencia de la mayoria de Basics, la version AMOS de esta instruccion, tambien te permite incluir expresiones como parte de tus datas. Asi las siguientes lineas de programa serian igualmen- te aceptables: DATA $FF50,$890 DATA %111111111111,%1101010101 DATA A Label: DATA A+3/2.0-Sin(B) DATA "Hola"+" soy yo!" Es importante darse cuenta que "A" en la etiqueta Label debe ser el contenido de la variable A, y no la letra A. La expresion sera calculada automaticamente durante la operacion de lectura con READ, utilizandose los ultimos valores de A y B. Tambien es importante que cada instruccion DATA sea el unico comando de la linea. Cualquier comando posterior sera totalmente ignorado!! Las instrucciones DATAs se pueden colocar en cualquier parte de tu programa Basic. Sin embargo, los DATAs almacenados dentro de un procedimiento AMOS no seran accesibles desde el pro- grama principal. 228 READ (transfiere informacion desde las lineas DATA hasta una variable) READ list of variables Carga la informacion contenida en las lineas DATA dentro de una lista de variables. READ utiliza un puntero especial que determi- nara la situacion de la siguiente DATA a leer. Al comienzo de tu programa, el puntero o marcador se situa en el primer DATA. Y una vez que se ha leido este, pasa a apuntar al siguiente de la lista Como puedes imaginarte, las variables que leas deberan ser exacta mente del mismo tipo que los datas. Ejemplo: T=10 Read A$,B,C,D$ Print A$,B,C,D$ DATA "String",2,T*20+RND(100),"AMOS"+" Basic" RESTORE (situa el puntero de READ) RESTORE Label RESTORE LABEL$ Este comando cambia el puntero al que se RESTORE Line dirigira la siguiente operacion READ para RESTORE number encontrar la proxima instruccion DATA. Cada procedimiento de AMOS tiene su propio punte- ro de DATAS. Asi cualquier llamada a este comando solo afectara al procedimiento actual. "Label" es una etiqueta que especifica la posicion de la prime ra instruccion DATA a leer. El nombre de esta etiqueta puede cal- cularse como parte de la expresion, por lo que los siguientes co- mandos son legales: RESTORE L RESTORE "L"+"A"+"B"+"E"+"L" De forma parecida, "LINE" selecciona el numero de linea de la proxima instruccion DATA. Como "label", dicho numero puede intro- ducirse mediante una expresion: RESTORE TEST+2 Por lo que podras saltar a traves de las instrucciones DATA de tu programa, permitiendote elegir la informacion a seleccionar en funcion de la actuacion del usuario. Cada habitacion de una aven- tura, por ejemplo, podria tener su informacion almacenada en una lista de simples instrucciones DATA. Para leer esta descripcion, bastaria usar algo como: RESTORE Room*5+1000: Rem cada habitacion tiene 5 lineas DATA Read DESC$ : Print DESC$ : : : 229 Obviamente, si una instruccion DATA no existe en la linea espe cificada por RESTORE, se generara un apropiado mensaje de error. Ten cuidado al usar este comando dentro de un procedimiento. Al objeto de asegurar su funcionamiento, tus instrucciones DATA debe ran encontrarse dentro de dicho procedimiento. WAIT (demora en cincuentavos de segundo) WAIT n Suspende la ejecucion de un programa AMOS Basic durante "N" cin- cuentavos de segundo. Cualquier funcion que utilice interrupcio- nes, como MOVE y MUSIC, continuaran funcionando normalmente duran te este periodo. = TIMER = (contador) v=TIMER TIMER=v TIMER es una variable reservada que se incrementa en 1 cada cin- cuentavo de segundo. Es habitualmente utilizada para establecer la semilla del generador de numeros aleatorios, como sigue: Randomize TIMER NOT (operacion logica NOT) v=NOT(d) Esta funcion cambia cada digito binario en un numero de 1 a 0 y viceversa. Suponiendo que cierto es -1 (binario %1111111111111) y falso es 0, NOT(cierto)=Falso. Ejemplo: Print BIN$(Not(%1010),4) (Resultado: 0101) If NOT (True)=False then Print "False" TRUE (operacion logica TRUE --cierto--) v=TRUE Cuando se realiza un Test del tipo X>10, se produce un valor. Si esa condicion es cierta entonces este numero se pone a -1, de otro modo sera 0. If -1 then Print "Menos 1 es CIERTO" If TRUE then Print "y TRUE es ";TRUE 230 FALSE (operacion logica FALSE) v=FALSE Devuelve un valor 0. Se usa por todas las operaciones condiciona- les como IF...THEN y REPEAT...UNTIL para representar el FALSO. Print FALSE (Resultado: 0)