Hacer sonar el AY desde BASIC

Soporte técnico sobre los lanzamientos de MojonTwins y comentarios sobre los güegos. Ofrecemos soporte técnico con Fourspriter, te ayudamos con ZX Basic o Z88DK, te damos pistas some cómo saltarse un bicho y cosas así.

Moderador: na_th_an

Avatar de Usuario
na_th_an
Mensajes: 26413
Registrado: Vie, 09 Ene 2009, 12:18

Hacer sonar el AY desde BASIC

Mensajepor na_th_an » Mié, 19 May 2010, 16:04

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.
Como diría Rorshach: "Urm..."
Beyker
Mensajes: 2
Registrado: Mié, 02 Feb 2011, 11:10

Re: Hacer sonar el AY desde BASIC

Mensajepor Beyker » Mié, 02 Feb 2011, 11:49

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
Avatar de Usuario
na_th_an
Mensajes: 26413
Registrado: Vie, 09 Ene 2009, 12:18

Re: Hacer sonar el AY desde BASIC

Mensajepor na_th_an » Mié, 02 Feb 2011, 13:38

: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.
Como diría Rorshach: "Urm..."
Avatar de Usuario
na_th_an
Mensajes: 26413
Registrado: Vie, 09 Ene 2009, 12:18

Re: Hacer sonar el AY desde BASIC

Mensajepor na_th_an » Jue, 28 Abr 2011, 09:48

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.
Como diría Rorshach: "Urm..."
Avatar de Usuario
juanfran
Mensajes: 5345
Registrado: Vie, 09 Ene 2009, 13:00

Re: Hacer sonar el AY desde BASIC

Mensajepor juanfran » Jue, 28 Abr 2011, 10:49

Ottia! pues ya estas tardando en hacer un phantomas donde se dispare con la pistola! :D
Alcalde gilipollas
Avatar de Usuario
na_th_an
Mensajes: 26413
Registrado: Vie, 09 Ene 2009, 12:18

Re: Hacer sonar el AY desde BASIC

Mensajepor na_th_an » Jue, 28 Abr 2011, 11:01

O uno que salga una mujer encuera sartando en la corchoneta de sartar.
Como diría Rorshach: "Urm..."
Avatar de Usuario
angel
Mensajes: 23213
Registrado: Vie, 09 Ene 2009, 13:04
Ubicación: Torreznolandia
Contactar:

Re: Hacer sonar el AY desde BASIC

Mensajepor angel » Jue, 28 Abr 2011, 11:38

Molaría uno tipo bestial warrior en el que el bicho avanza y tienes que cargarte a los malotes :D
(_\_) (_|_) (_/_) (_|_) ILLO KE HEHEHEHEHEHEEEHEHEHEH!

¡Activa tu rainbow pechónico!

Volver a “Ayuda”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 18 invitados