Página 1 de 1

Hacer sonar el AY desde BASIC

Publicado: Mié, 19 May 2010, 16:04
por na_th_an
Esto os va a venir muy bien para los que queráis participar en el concurso de Radastan. Esto que os pongo aquí funciona tanto para BASIC interpretado a pelo, como para BASIC compilado desde un compilador nativo (HiSoft, Colt, MCoder III...) o cruzado (ZX Basic).

Se trata de leer 14 datos y enviarlos al AY mediante una pareja de OUTs. Lo que estamos haciendo es escribir 14 valores en 14 de los 16 registros (los numeroados de 0 a 13) del chip AY. El primer OUT selecciona qué registro vamos a tocar, y el segundo OUT le escribe el valor. Así de fácil.

La versión en Sinclair BASIC es muy sencilla. El programa de ejemplo viene con cinco sonidos de prueba. Jugueteando encontrarás los tuyos:

$this->bbcode_second_pass_code('', '10 INPUT "SFX Number (0-4)?";n
20 RESTORE 1000+10*n: FOR i=0 TO 13: READ a: OUT 65533,i: OUT 49149,a: NEXT i
30 GO TO 10
1000 DATA 100,50,0,0,0,0,4,216,31,0,0,10,10,0
1010 DATA 250,250,0,0,0,0,15,248,31,0,0,10,10,0
1020 DATA 10,10,0,0,0,0,29,216,31,0,0,4,4,0
1030 DATA 10,100,0,0,0,0,15,248,31,0,0,50,50,0
1040 DATA 15,1,0,0,0,0,15,248,31,0,0,50,50,0')

Para la versión en ZX Basic podemos ser un poco más virgueros:

$this->bbcode_second_pass_code('', 'Dim sonidos (4, 13) As Byte => {_
{100,50,0,0,0,0,4,216,31,0,0,10,10,0}, _
{250,250,0,0,0,0,15,248,31,0,0,10,10,0}, _
{10,10,0,0,0,0,29,216,31,0,0,4,4,0}, _
{10,100,0,0,0,0,15,248,31,0,0,50,50,0}, _
{15,1,0,0,0,0,15,248,31,0,0,50,50,0} _
}
Dim n As Byte

Cls
For n = 0 To 4 ' Vamos a tocar 4 pitos
Print "SFX #"; n ' Imprimimos cuál
ayPlaySound (n) ' Tocamos el sonido i
Pause 100 ' Esperamos dos segundos
Next n

Sub ayPlaySound (sonido As Byte)
' Este Sub toca el sonido que se le indica como parámetro
' Los sonidos se definen en la tabla "sonidos", definida
' globalmente.

Dim i As Byte

For i = 0 To 13
Out 65533, i ' Seleccionamos registro AY
Out 49149, sonidos (sonido, i) ' Escribimos un valor en él
Next i
End Sub
')

Los registros del AY son estos:

$this->bbcode_second_pass_code('', 'AY REGISTERS

00 Channel A fine pitch 8-bit (0-255)
01 Channel A course pitch 4-bit (0-15)
02 Channel B fine pitch 8-bit (0-255)
03 Channel B course pitch 4-bit (0-15)
04 Channel C fine pitch 8-bit (0-255)
05 Channel C course pitch 4-bit (0-15)
06 Noise pitch 5-bit (0-31)
07 Mixer 8-bit (see below)
08 Channel A volume 4-bit (0-15, see below)
09 Channel B volume 4-bit (0-15, see below)
10 Channel C volume 4-bit (0-15, see below)
11 Envelope fine duration 8-bit (0-255)
12 Envelope course duration 8-bit (0-255)
13 Envelope shape 4-bit (0-15)
14 I/O port A 8-bit (0-255)
15 I/O port B 8-bit (0-255)

Bit:
7 6 5 4 3 2 1 0
_ _
I/O I/O Noise Noise Noise Tone Tone Tone
B A C B A C B A')

Comentarios, ruegos y preguntas -como siempre- bienvenidos.

Re: Hacer sonar el AY desde BASIC

Publicado: Mié, 02 Feb 2011, 11:49
por Beyker
Weeeeeee!!! el coco ha vuelto!!!
Hola zumbaos, creiais que habia cambiado de hobby eh?...bueno, la verdad esque lo de la pesca del berberecho en cautividad no se me da mal, pero siendo sincero, prefiero quedarme lelo programando jejeje.
Pos eso (o se dice poseido?) ,que ya he vuelto despues de un año tormentoso. He perdido todo el material que tenia en el antiguo ordenador, asi que voy a empezar desde 0 otra vez. Lo cierto es que mola porque ha sido como hacer un reset en mi vida personal y Spectrumal.
Me pican los dedillos...neseito programar algo y ya tengo un par de locuras en mi cabeza...(no mañico, no es el box Mega Ultra Reloaded jajaja), ya vereis ya.
Bueno, que me alegro mucho de volver a veros.
Nathomasa, veo que tus neuronas van empeorando dia a dia, sigue asi y no caigas en la lucidez de esa otra gente que todo lo sabe y que se creen dioses. Es mucho mejor una sonrisa que un ladritocho megapsicologico post cada X tiempo.
Ahora al tema...no me toques los AY que grito AY! jeje.
Seria posible mutear el canal A desde Basic OUTeando el registro 08 mientras suena un player? o por el contrario, en cada interrupcion del player,volveria a ponerse el volumen a su estado normal?.
Ya sabe porque lo digo. Si reproduzco un tema desde Basic con el VT y quiero silenciar un canal, podria hacerlo desde el Basic o tengo que desensamblar el player y pokear las direcciones correctas para anular dicho canal.
Gracias.
P.D.Nos seguiremos viendo por aqui, ya lo creo que si. :D

Re: Hacer sonar el AY desde BASIC

Publicado: Mié, 02 Feb 2011, 13:38
por na_th_an
:D Tranqui, no me dejo mosquear tan rápido como antes. Ahora más me río de janeiro con estas cosas ;)

Lo que dices es peliagudo. Lo mismito lo mismito me pasaba a mí cuando estaba haciendo el Infinity y tenía de fondo el player de WYZ versión antediluviana. Me parece que no tiene solución. El problema no está en la rutina esta (a fin de cuentas, con esta puedes modificar sólo los registros que quieras y dejar los demás tan tranquilos), sino en el player, que cada vez que se ejecuta sobrescribe TODOS los registros. Así que no queda otra que desensamblar el player y hacer que no toque el registro que necesites.

De todos modos, si lo necesitaras, te podría hacer un apaño con el player de WYZ para usarlo desde el BASIC, efectos de sonido incluidos... Creo que no debería ser demasiado complicado, y con arte se pueden hacer maravillas (bueno, ¿a quién le estoy contando esto? si eres el crack musical).

Y yastá. Ya sabes que estamos aquí para lo que te haga falta :)

Un saludo, y rebienvenido, compañero.

Re: Hacer sonar el AY desde BASIC

Publicado: Jue, 28 Abr 2011, 09:48
por na_th_an
Pequeña ampliación de conocimiento.

El puerto "AUX" de los Spectrum 128K está conectado al puerto 14 de la AY, por lo que para leerlo o escribir en él lo haremos de la forma habitual (primero OUT 65533, 14 para seleccionarlo, y luego un IN 65533 para leerlo o un OUT 49149, X para escribir).

Esto es interesante porque la pistola del Action Pack (la que venía con algunos modelos de +2A y unos cuantos juegos adaptados) se conecta precisamente ahí. De este modo, leyendo el puerto 14 de la AY, tendremos en el bit 4 del valor devuelto la información sobre lo que capta el sensor, y en el bit 5 el estado del gatillo.

Programar un juego para pistola es sencillo: Se mueven los sprites mientras se lee a intervalos el puerto 14 de la AY. En cuanto se active el bit 5, recorremos la lista de "posibles objetivos" y, para cada uno, borramos la pantalla y pintamos un cuadro blanco del tamaño adecuado en su posición, tras lo que leemos el bit 4 del puerto 14 de la AY. Si está activo, es que hemos acertado a "ese" sprite, y actuamos en consecuencia. Si no, pasamos al siguiente sprite.

Re: Hacer sonar el AY desde BASIC

Publicado: Jue, 28 Abr 2011, 10:49
por juanfran
Ottia! pues ya estas tardando en hacer un phantomas donde se dispare con la pistola! :D

Re: Hacer sonar el AY desde BASIC

Publicado: Jue, 28 Abr 2011, 11:01
por na_th_an
O uno que salga una mujer encuera sartando en la corchoneta de sartar.

Re: Hacer sonar el AY desde BASIC

Publicado: Jue, 28 Abr 2011, 11:38
por angel
Molaría uno tipo bestial warrior en el que el bicho avanza y tienes que cargarte a los malotes :D