Reproducir musica en xbasic-kunbasic

Por jorge.romero.9655

Master (147)

Imagen del jorge.romero.9655

26-07-2014, 20:34

Saludos gente.

Antes de ponerme mas en serio con la aventura grafica que tenia en mente, la semana pasada decidi probar a hacer un minijuego en xbasic para ir soltandome un poco. El tema es que ya esta casi terminado a falta de añadir algunos detalles. Uno de ellos es añadir musica ingame, pero en este tema ando bastante parado.

Probe a utilizar las pt3Tools, ya que me permitian reproducir canciones facilmente, pero solo funciona en basic normal. Las funciones tipo "play" tampoco funcionan en turbo basic... asi que solo me queda prenguntarios si se os ocurre alguna manera sencilla de o bien hacerlo rodar, o si conoceis algun replayer para reproducir musica que funcione en xbasic y como implementarlo en un juego.

Gracias de nuevo. Smile

Login sesión o register para postear comentarios

Por Josb

Master (204)

Imagen del Josb

28-07-2014, 12:00

Hola jorge.romero.9655,

Para meter musica o ruidos, o cualquier otra cosa sonora en kunbasic, tienes varias opciones:

La primera y mas sencilla es usar NestorBasic que ya incorpora un player musical, además de ser totalmente compatible con Xbasic (de hecho lo incluye segun konamiman, autor del engendro) .

Otra opción es hacerte un pequeño replayer en ensamblador a patir de alguno existente y colocarlo en memoria asegurandote que no va a ser pisado por datos del propio codigo XBasic (Mr. Hawaii, juego tipo shoot'em y mi juego favorito en BASIC, hace esto ultimo), o siquieres complicarte menos la vida puedes llamar a la función play del basic con un código en ensamblador parecido a este (que debería estar por algun sitio de este foro si mal no recuerdo y no puedo confirmarte si funciona o no pues no lo he probado):

init:		ld	bc,32768
		ld	hl,0
.call:		ld	a,$cd		; Search CALL H.PLAY
		cpir
		ld	a,$c5
		cpi
		jr	nz,.call
		ld	a,$ff
		cpi
		jr	nz,.call

play:		ld	(.parser),hl	; Default parser address in HL
		ld	hl,strings
.parser:	equ	$+1
		call	0
		ret
;
strings:	db	'"T120S1M9999O4L4CDEFGABO5CRR",'
		db	'"T120S1M9999O4L4RCDEFGABO5CR",'
		db	'"T120S1M9999O4L4RRCDEFGABO5C"',0

Otra forma es utilizar la llamada CALLBAS de la BIOS para invocar funciones basic a través de meter el siguiente codigo objeto, (que por cierto me remitió hace algunos años el virtuoso y desgraciadamente no activo usuario German Gomez Herrera), en el código fuente en Xbasic:

10 CALL TURBO ON
20 READ A$
30 P$=CHR$(34)+A$+CHR$(34)+CHR$(0)
40 '#I &H21,P$,&h23,&HDD,&H21,&HE5,&H73,&HCD,&H59,&H01
50 CALL TURBO OFF
100 DATA "CDEFG"

Y en modo multicanal

10 CALL TURBO ON
20 READ A$,B$,C$
30 P$=CHR$(34)+A$+CHR$(34)+","+CHR$(34)+B$+CHR$(34)+","+CHR$(34)+C$+CHR$(34)
40 '#I &H21,P$,&h23,&HDD,&H21,&HE5,&H73,&HCD,&H59,&H01
50 CALL TURBO OFF
100 DATA "CDEFG","DEFG","EFGA"

espero que te sirva de algo y compartas tu creación

Saludos
Jos'b

Por jorge.romero.9655

Master (147)

Imagen del jorge.romero.9655

29-07-2014, 08:15

Muchas gracias por la ayuda Jos'b!

El juego es bastante sencillo, pero está casi terminado y con la música espero poder redondearlo un poco. En cuanto lo termine lo voy mostrando por aquí. Smile

Por jorge.romero.9655

Master (147)

Imagen del jorge.romero.9655

30-07-2014, 16:55

Holas de nuevo, he estado haciendo pruebas con la ultima opcion... ¿sabeis como podria hacer para saber si la melodia se esta reproduciendo con este metodo? es para hacer que se repita solo cuando sea necesario durante el juego

Por Warchild

Paragon (1280)

Imagen del Warchild

30-07-2014, 20:18

He mirado un poquillo y veo que hay una rutina de la BIOS en 99h que comprueba si se está ejecutando el comando PLAY y en caso de que no lo esté, lo ejecuta. Solo tienes que hacer la llamada a esa dirección, a ver si te sirve.

Por jorge.romero.9655

Master (147)

Imagen del jorge.romero.9655

31-07-2014, 17:47

¿y eso como se hace Warchild? yo es que de ensamblador no tengo ni papa macho.

Por Warchild

Paragon (1280)

Imagen del Warchild

07-08-2014, 14:25

Bueno, en ensamblador no es que yo sea de mucha ayuda tampoco, pero se supone que sería un simple DEFUSR=&h99:Z=USR (0) pero seguro que no será tan fácil...

Quizá te sea más sencillo controlar la música con NestorBasic como te indicaba Josb, mírate la documentación en la página de Konamiman.

En Basic si no recuerdo mal había algo como IF PLAY (n) donde n es el número de canal y te puede dar valores de -1 o 0 segun esté o no reproduciendo sonido por ese canal. Supongo que sería necesario que estuviera fuera del Turbo-bloque así que no sé si te puede hacer el apaño.

¿Has ido haciendo más pruebas?

Por jorge.romero.9655

Master (147)

Imagen del jorge.romero.9655

17-08-2014, 17:27

Al final consegui meter algo de musica usando un par de trucos gracias a la ayuda de Josb y German (¡gracias de nuevo! Smile). Por lo visto, se puede saber que canal del chip de audio esta sonando en cada momento chequeando los valores de la posicion de memoria &HFB3F

Haces un peek y chequeas los tres ultimos bytes. Cada uno corresponde a uno de los canales del PSG. Si tienen un valor diferente de 0, es que estan activos. Esta opcion es perfecta para lo que pregunte, pero claro, despues de hacer la prueba me di cuenta de que realmente no me interesaba reproducir musica unicamente cuando el PSG se encuentra en silencio, porque al final lo que obtienes es una musica entrecortada, con breves pausas entre "estrofas".

Al final lo que hice fue usar la tecnica que comentaba Josb y a traves de un timer ir actualizando los tramos de audio para evitar que se saturase el Buffer... no creo que sea la solucion mas elegante (tiene mucho de ensayo y error: si te pasas, se entrecorta y si te quedas corto, te crea lag) pero funciona.

Echale un ojo al codigo si quieres aqui:

www.oniric-factor.com/temp/AlienPanic.rar

Ahi estan ambas opciones, el juego con y sin sonido. Tambien tiene hechas algunas mejoras.

Ahora estoy intentando aprender algo de codigo maquina. No creo que aprenda tanto como para hacer un juego desde cero en CM (al menos a corto plazo), pero espero poder obtener los suficientes conocimientos como para poder entender e implementar pequeñas rutinas utiles. A partir de ahi, espero poder ir aprendiendo lo suficiente como para hacerlos 100% en CM algun dia.

La aventura que tengo en mente probablemente utilice bastantes bloques en Basic o Nestor Basic. Aun estoy intrigado en como implementaban la musica los juegos de Kai Magazine. Creo que es un replayer SCC pero no conozco cual es ni como utilizarlo. :-?

Por Imanok

Paragon (1188)

Imagen del Imanok

18-08-2014, 15:16

Si no recuerdo mal, Kai usaba un replayer de Moonblaster (FM). Si usas Nestorbasic, ya lo lleva integrado.

Descárgate cualquier juego mío anterior al Traffic Jam desde mi web y podrás ver cómo se cargan y reproducen músicas Moonblaster desde Nestorbasic. Si miras Bubble Rain o Cat'n'Mouse, verás cómo cargar músicas FM o Moonsound.

Http://imanok.msxblue.com

Por jorge.romero.9655

Master (147)

Imagen del jorge.romero.9655

19-08-2014, 23:25

Gracias Imanok, le echare un ojo. Big smile