Título: solicitando vuestra ayuda ( PT3+ayFX ) Publicado por: phsoft en 30 de Agosto de 2011, 04:17:41 pm buenos tardes,
estoy intentando hacer funcionar el replayer de sapphire para PT3+ayFX descargado desde su blog http://z80st.auic.es/blog.php?page=p/codigo-code.html (http://z80st.auic.es/blog.php?page=p/codigo-code.html) lo cierto es que intento hacer sonar unos efectos de sonido creados con el ayFX (todavía no he probado a meterle tracks del vortex) y aunque en algunas pruebas he logrado escucharlos, en realidad no comprendo la forma de utilizar este replayer. en este momento el tema de cómo funciona el replayer me interesa menos que el hecho de ponerlo en marcha (para así poder integrarlo en un juego que intento sacar adelante y cuyos detalles están en el foro general en castellano de MRC). entonces la cuestión es, abusando de vuestra amabilidad, si podrías poner unos ejemplos básicos en los que se muestre solo replayer ayFX a) cómo hacer sonar un efecto de sonido (en un banco de efectos) del ayFX b) cómo hacer sonar varios efectos de sonido (en un banco de efectos) del ayFX, consecutivamente (es por si hubiera algún detalle a tener en cuenta respecto al ejemplo anterior) replayer PT3 con y sin ayFX a) cómo hacer sonar un track de vortex sin efectos de sonido b) cómo hacer sonar un track de vortex con efectos de sonido entiendo que ambos replayers, aunque se integren, también pueden funcionar por separado en el zip que sigue cuelgo el replayer de sapphire y un módulo rp.asm donde estuve intentando hacer sonar aquellos efectos (ya digo que sin musica... lo que quizá sea el problema) http://www.vecindiario.es/phoenix/ftp/play.zip (http://www.vecindiario.es/phoenix/ftp/play.zip) un saludo a todos, - paco Título: Re: solicitando vuestra ayuda ( PT3+ayFX ) Publicado por: SapphiRe_MSX en 30 de Agosto de 2011, 05:22:02 pm Hola. Acabo de volver del pueblo donde no tenia internet decente. A ver si me pongo al dia y te preparo unos ejemplos. Si quieres puedes contactar conmigo a través del correo que hay en el blog.
Título: Re: solicitando vuestra ayuda ( PT3+ayFX ) Publicado por: phsoft en 30 de Agosto de 2011, 06:19:27 pm buenas, pichorra :malaika:
ando confuso con el asunto de si ayFX requiere de PT3 para funcionar o no. pienso que no, que son o pueden ser independientes. de hecho pienso que ayFX con PT3_ROUT (con su AR_Mixer) y poco o nada más ya debería escupir ruidos por alguna parte. ya digo que en algún ejemplo me tiraba. entonces la secuencia de llamada sería ayFX_SETUP ... ayFX_INIT ... ayFX_ROUT -> [ rutina PT3_ROUT ] ayFX_PLAY? ... ayFX_END? todo va de memoria, ojo pero claro imagino que lo de publicar los replayers integrados (o con idea de integrarlos si o si) es porque no has considerado que una máquina de reproducir ruidos, sin más (sin integración con otra de tocar melodías) pudiera ser demasiado útil... con razón, por cierto en el ejemplo que viene con el PT3, el example.asm, creo, o falta o yo no encuentro por ninguna parte el fichero music.100. estaría bien añadirlo para que el ejemplo sea 100% heavy metal. es un incbin supongo que de un PT3 del vortex. tu piensa, pichorra, que yo ayer a estas horas no había oído hablar en mi vida del vortex raiders ::) en mi cof cof ejemplo, por cierto, no he subido el incbin con los sonidos del ayFX de que dispongo porque no tengo el permiso del autor para hacerlo (que tampoco se lo he pedido para no entretenerme; no penséis mal). haré algún sonido con ayFX y actualizaré el play.zip añadiendo sonidos.afb más tarde gracias por tu pronta respuesta y la oferta del email saludos, - paco Título: Re: solicitando vuestra ayuda ( PT3+ayFX ) Publicado por: nenefranz en 31 de Agosto de 2011, 10:24:40 am El código que pones es correcto:
call PT3_ROUT ; copia AYREGS a los registros del PSG call PT3_PLAY ; hace sonar un frame de la musica call ayFX_PLAY ; hace sonar los efectos de sonido El problema es que con estas llamadas sólo reproduces un "frame" del efecto de sonido y música. Para poder reproducirlos por completo necesitas ejecutar estas instrucciones por cada uno de los pasos que dura estos efectos de sonido o músicas. Si estás pensando en poner estas llamadas en un bucle y que en cada vuelta se ejecute este código ... no es una buena idea. Se ejecutaría tan rápido que no reconocerías el efecto o música, o simplemente no funcionaría bien!! La solución pasa por ejecutar estas tres llamadas de manera periódica y síncrona ... y para ello lo que hay que hacer es interceptar una interrupción que se ejecute de manera regular, y hacer estas tres llamadas en ese momento. He cogido tu código de ejemplo (rp.asm) y lo he modificado un poco: - he añadido dos nuevas rutinas TIMER_ON y TIMER_UPDATE. - TIMER_ON se encarga de "parchear" el sistema para que durante la interrupción de retrazo vertical se llame a nuestra otra rutina TIMER_UPDATE - TIMER_UPDATE ejecuta las tres llamadas que necesitamos para la reproducción del sonido y música. - El código de TIMER_ON no es mío, y si no recuerdo mal está sacado de algún snippet de los foros de karoshi o de MRC. Realmente lo poco que conozco de programación MSX, la he aprendido de ejemplos publicados por los asiduos a estos foros. Código: ; probando el replayer para PT3+ayFX de Sapphire ; con el banco de sonidos de prueba de paulbrk ; --------------------------------------- ROM AREA .bios .page 1 ; pag 1, 0x4000 .rom ; cartucho rom .size 16 ; tamaño 16kb .start MAIN ; inicio del programa .dw 0,0,0,0,0,0 ; cabecera cartucho MAIN: di ld hl,pt3BANK ; -100 call PT3_INIT ld hl, ayBANK ; establece el banco call ayFX_SETUP ; de sonidos ayFX a utilizar ei halt halt di ld a,2 ld c,4 call ayFX_INIT ; inicializa un sonido halt ei ; inicializar call TIMER_ON buc: jr buc pt3MSC: .include "PT3-ROM.asm" ayFX: .include "ayFX-ROM.asm" ayBANK: .incbin "sonidos.afb" pt3BANK: dw 0,0,0,0,0,0,0,0 dw 0,0,0,0,0,0,0,0 dw 0,0,0,0,0,0,0,0 dw 0,0,0,0,0,0,0,0 dw 0,0,0,0,0,0,0,0 dw 0,0,0,0,0,0,0,0 TIMI equ $fd9f ; Timer interrupt hook ASMCODE_JP equ $C3 ASMCODE_RET equ $C9 ; TIMER_ON ; hook our TIMER event ; ---------------------------------------------------------------- TIMER_ON: ld a, ASMCODE_JP di ld [TIMI], a ld hl, TIMER_UPDATE ld [TIMI+1], hl ei ret ; TIMER_UPDATE ; This routine is called 50 or 60 times / sec ; ---------------------------------------------------------------- TIMER_UPDATE: di push af call PT3_ROUT ; copia AYREGS a los registros del PSG call PT3_PLAY ; hace sonar un frame de la musica call ayFX_PLAY ; hace sonar los efectos de sonido ; EXIT TIMERUPDATE TIMERUPDATE_EXIT: pop af ei ret ;pt3BANK: .incbin "musica.bs1" ; --------------------------------------- RAM AREA .page 3 ; 0xc000 .include "PT3-RAM.asm" .include "ayFX-RAM.asm" Creo que con esto tu ejemplo debería funcionar y deberías oir el efecto de sonido y la música. Espero que te sirva de ayuda, y que tengas en cuenta que no soy ningún experto. Seguramente la explicación que he dado no es muy académica o precisa, pero seguro que algún gurú de la programación MSX del foro puede corregirlo y aclararlo. Saludos, Título: Re: solicitando vuestra ayuda ( PT3+ayFX ) Publicado por: phsoft en 31 de Agosto de 2011, 03:03:49 pm gracias por la explicación, neng, y las molestias. este novato te agradece también el texto plano y directo. entiendo la idea que me comentas pero siento decirte que tu modificación compila pero no funciona. no obstante en las pruebas que logré hacer sonar, el código estaba en un bucle infinito y sonaba una sola vez, lo que no comprendí en su momento (ahora creo entenderlo mejor: ejecutaba todas las "frames" del sonido una vez), o bien sucedía como dices, sonaba tan rápido o distorsionado que no se parecía al efecto original. montaré un ejemplo solo ayFX con la idea del temporizador. sobre el mismo tema de tu post (con gancho a interrupción incluido), copio y pego código antidiluviano -que será adaptación de alguna revista, supongo- por si le pudiera aprovechar a alguien. es para asMSX
Código: ; ############################################ ; rolex de oro auténtico, MSX - v2.1 ; pa haberse matáo; ejecutar en screen 0 ; ############################################ .org 0xe000 .basic ; gancho int 0x38 di ld hl, 0xfd9a ld [hl], 0xc3 inc hl ld [hl], 0x10 inc hl ld [hl], 0xe0 ret ; inicio .org 0xe010 di push af ld a, [INTCT] cp 50 jr z, RELOJ inc a ld [INTCT], a pop af ret ; RELOJ: push bc push de push hl ld a, [0xfcaf] cp 0 jr nz, NOSCR ld de, SEGCT ld hl, 727 ; pos vram cifras call PRTNUM ld de, MINCT ld hl, 724 call PRTNUM ld de, HORCT ld hl, 721 call PRTNUM NOSCR: ld de, INTCT call SUBCT ld de, SEGCT call SUBCT ld de, MINCT call SUBCT sub a ld b, 4 ld de, INTCT BUC: ld [de], a djnz BUC jr BAS ; ; subrutinas ; SUBCT: sub a ld [de], a inc de ld a, [de] cp 59 ret z inc a ld [de], a pop hl BAS: pop hl pop de pop bc pop af ret ; PRTNUM: ld bc, 0x063c BUC2: ld a, [de] cp c jr nc, CONT and a ld a, c sbc a, 10 ld c, a djnz BUC2 ld a, [de] jr CONT2 CONT: add a, 6 djnz CONT CONT2: ld c, a call VPONM dec hl ld a, c rrca rrca rrca rrca call VPONM ld a, 58 ; separador cifras -> ":" ld hl, 725 call VPOKE ; pos vram cifras ld hl, 722 call VPOKE ret ; desensamblador rulezzz! VPONM: and 0xf add a, 48 VPOKE: push af ld a, l di out [0x99], a ld a, h and 0x3f or 0x40 out [0x99], a ex [sp], hl ex [sp], hl pop af out [0x98], a ret ; ; contadores ; INTCT: defb 0 SEGCT: defb 0 MINCT: defb 0 HORCT: defb 0 en fin, a ver si el monstruo de zafiro tiene un hueco, regresa y nos pone las pilas ;D mientras seguiré cacharreando el replayer saludos, - paco Título: Re: solicitando vuestra ayuda ( PT3+ayFX ) Publicado por: nenefranz en 31 de Agosto de 2011, 04:02:18 pm Cuando has compilado el ejemplo modificado que he posteado ...
veo que el banco de sonido que has incluido con el ejemplo tienes dos efectos de sonido ... por tanto indices 0 o 1 ... pero el indice que utilizas es 2!!! ... no deberías utilizar como indices 0 o 1?? ¿porque no pruebas con esto? ... donde ponía "ld a,2" poner "ld a,1": Código: ld a,1 ; indice efecto sonido ld c,4 ; prioridad call ayFX_INIT ; inicializa un sonido ¿la etiqueta pt3BANK apunta al include binario del track o a los dw 0? si apunto a los dw está claro que tampoco sonará nada ... aunque creo que querías probar sólo utilizar el efecto de sonido, verdad? ... Título: Re: solicitando vuestra ayuda ( PT3+ayFX ) Publicado por: phsoft en 31 de Agosto de 2011, 05:21:29 pm buenas, neng.. lo que comentas sobre el indice es correcto con el banco de sonidos que he posteado, como bien dices, no con el que manejo internamente y que consta de más de cuatro sonidos.. de todas formas he bajado el que posteé y lo he probado con los índices 0 y 1 y el tío sigue sin soltar ni mu...
Citar aunque creo que querías probar sólo utilizar el efecto de sonido, verdad?... en efecto la parte del PT3 quizá complica el asunto, pienso, de hacer sonar los efectos del ayFX. por eso he preparado este segundo ejemplo que utiliza el timer y solo el ayFX... pero que tampoco suena, de momento... http://phsoft.vecindiario.es/ftp/play_ay.zip (http://phsoft.vecindiario.es/ftp/play_ay.zip) nótese la velocidad de las pruebas por si hay orejas de burro ;D saludos, - paco Título: Re: solicitando vuestra ayuda ( PT3+ayFX ) Publicado por: SapphiRe_MSX en 31 de Agosto de 2011, 08:24:28 pm en fin, a ver si el monstruo de zafiro tiene un hueco, regresa y nos pone las pilas ;D mientras seguiré cacharreando el replayer ¡¡¡GROOOOARGGGHHH!!! ;D ;D ;D Vamos a ver. Lo primero que veo es que es una rom... ¡vaya! ¡He descubierto américa! No, a ver si me explico. Haces un call a TIMER_ON y luego ejecutas un RET... volviendo a la BIOS y de ahí al BASIC, que seguramente reescriba el gancho y por eso no suena. Además en caso de que no lo reescriba, lo que es seguro es que la ROM desaparece de donde está porque ahí va a estar el BASIC... Déjame adivinar, ¿se cuelga? En resumen, el RET tras el CALL TIMER_ON es lo que está estropeándolo todo. Puedes poner algo como: AQUI: JR AQUI Segundo error: parcheas el gancho con las interrupciones activadas... ¡¡ERROR GORDO!! Corres el riesgo de que salte una interrupción justo entre que pones el C3 y la dirección de salto. Es mejor hacerlo al revés y, mucho más seguro, con las interrupciones desactivadas. Una vez arregles eso, escucharás el sonido y dirás ¡SUENA MAL! Pues sí. Suena mal. El problema es que el replayer, tal y como está pensado, asume que el pt3 (o cualquier otro replayer psg) ha modificado AYREGS de forma adecuada. Eso significa que hay que modificar AYREGS adecuadamente con una llamada al replayer. ¿Cómo? ¿No quieres replayer? Pues nada, habrá que simular que no hay música... Es decir, hay que intercalar algo entre las llamadas a ayFX_ROUT y ayFX_PLAY. Entre ambas llamadas hay que resetear AYREGS. Yo normalmente lo hago con un CALL PT3_MUTE, que pone a 0 los volúmenes de los tres canales. Con eso basta. Espero que con esto ya lo consigas hacer sonar. Digo espero, porque lo he mirado de cabeza y no he compilado nada. Si tienes más dudas con el replayer, ya vas comentando por aquí. Título: Re: solicitando vuestra ayuda ( PT3+ayFX ) Publicado por: phsoft en 31 de Agosto de 2011, 11:19:21 pm buenas, pichorra
Citar No, a ver si me explico. Haces un call a TIMER_ON y luego ejecutas un RET... volviendo a la BIOS y de ahí al BASIC, que seguramente reescriba el gancho y por eso no suena. Además en caso de que no lo reescriba, lo que es seguro es que la ROM desaparece de donde está porque ahí va a estar el BASIC... Déjame adivinar, ¿se cuelga? en efecto, y esto que voy a decir ahora va a sonar rarillo cof.. "pero que tampoco importa que se cuelgue!" :griel: cof cof siempre y cuando suene antes, que no suena.. en serio: no comprendo a qué código te refieres, supongo que al segundo (play_ay.zip?). en la modificación que enviaba el neng no hay un ret tras el timer_on, hay un buc: jr buc, como dices, y tampoco el time_on parchea con las interrupciones activas, hay un di primero. igual que en el ejemplo del reloj para screen 0 que puse y que compila y funciona sin problemas. así que a menos que te refieras al ei posterior al parcheo del gancho de interrupcion pues no te entiendo esta parte... Citar Una vez arregles eso, escucharás el sonido y dirás ¡SUENA MAL! Pues sí. Suena mal. pues si, esto me ha pasado con otros ejemplos que no logro reproducir. de hecho era lo primero que me pasaba. sonaba mal y se colgaba (pero seguía sonando, eh! ;D ) o se quedaba en el bucle infinito que comentamos Citar el replayer, tal y como está pensado, asume que el pt3 (o cualquier otro replayer psg) ha modificado AYREGS de forma adecuada. Eso significa que hay que modificar AYREGS adecuadamente con una llamada al replayer. ¿Cómo? ¿No quieres replayer? SI QUE LO QUIERO, SI! LO QUIERO! LO QUIERO! ... MAMAAAAA!!! X...-DD no, hombre, serio: esto solo son pruebas para entender la lógica de los bichos éstos. claro que es mucho mejor pt3+ay que ay solo o pt3 solo. la combinación es lo utilizable, claro. mejor el tocadiscos integrado con la máquina de los efectos especiales Citar Pues nada, habrá que simular que no hay música... Es decir, hay que intercalar algo entre las llamadas a ayFX_ROUT y ayFX_PLAY. Entre ambas llamadas hay que resetear AYREGS. aaaa migo, ya empiezo a ver la luz. claro. creo que yo hacía un ayFX_END en los ejemplos que funcionaron. lo voy a mirar y regreso luego con tus sugerencia (aunque en parte no entiendo, como te digo arriba, algunas de las cosas que comentas) Citar Si tienes más dudas con el replayer, ya vas comentando por aquí. uuuf, seguro. yo cuando me pongo becerro... muuuuuu gracias por la respuesta saludos, - paco pd: me fui a mirarlo y, bueno, sin un track para el pt3 no hubo manera pero con un track la cosa funciona perfecto aunque me plantea nuevas dudas. mañana más http://phsoft.vecindiario.es/ftp/play_all.zip Título: Re: solicitando vuestra ayuda ( PT3+ayFX ) Publicado por: phsoft en 01 de Septiembre de 2011, 03:20:54 pm buenas,
luego de realizar algunas pruebas (con PT3_MUTE, por ejemplo; añadiendo las tres pistas y probando a cambiar en caliente :joe: ), las dudas esenciales que se me presentan (a partir del último ejemplo) son: a) cómo hacer sonar un efecto de sonido cuando no suena un track. siempre con pt3+ay integrados b) métodos canónicos para detener y-o (re)iniciar un track (ya sea el mismo u otro distinto) para el caso a) se me ocurre que igual se podría disponer de un track mínimo "de silencio" (sonido no audible o sin sonido, si tal cosa se puede reproducir). igual estoy diciendo otra tontá :) y con esto pues siempre habría un track rulando, y solucionado el tema de hacer sonar efectos cuando "no hay track" en el caso b) se trataría de ver cómo realizar bien los métodos pause, start y stop con un track o cambiando de track (caso de start y stop). hablo siempre de pruebas sobre el código del último ejemplo a menos que se aporte otro código que funcione, quiéo disir :P saludos, - paco Título: Re: solicitando vuestra ayuda ( PT3+ayFX ) Publicado por: nenefranz en 01 de Septiembre de 2011, 04:57:08 pm La opción A) de usar un track SILENCIO funciona!!! :P ... pero es poco elegante!! XD ...
ya puestos mejor la opción B) que te da la posibilidad de pausar, reanudar y empezar una nueva pista!! pongo de nuevo tu último "rp.asm" en el que he incluido una nueva variable "MUSIC_STATE" y tres funciones: - MUSIC_PLAY: sirve para iniciar una nueva pista, hay que poner en HL la dirección del binario con la música. - MUSIC_STOP: pues eso, parar la reproducción. - MUSIC_RESUME: reanudar la reproducción desde el punto en el que se pausó. ahora ya sólo hace falta hacer la prueba que dices "en caliente", de mientras suenan los efectos de sonido pausar la música, o cambiar a una nueva. El código que pongo no lo hace, sólo añade las funciones y modifica el TIMER_UPDATE para que calcule el nuevo "frame" de la música (si está sonando) o llame al PT3_MUTE en el caso de que no suene la música. Código: ; ------------------------------------------------ ; replayer PT3+ayFX por Sapphire ; demo para asMSX, codigo Sapphire y nenefrank ; tracks de vortex incluidas con el programa ; --------------------------------------- CONST AREA TIMI equ $fd9f ; Timer interrupt hook ; --------------------------------------- ROM AREA .bios .page 1 ; pag 1, 0x4000 .rom ; cartucho rom .start MAIN ; inicio del programa .dw 0,0,0,0,0,0 ; cabecera cartucho MAIN: ; track a reproducir ld hl, pt3BANK-99 call MUSIC_PLAY ld hl, ayBANK ; establece el banco call ayFX_SETUP ; de sonidos ayFX a utilizar ld a,0 ld c,6 call ayFX_INIT ; inicializa un sonido call TIMER_ON ; activa temporizador buc: ; comprueba contador para llamada a otro fx ld hl,[contador] ld de,150 call DCOMPR ; comprar hl y de call z,otravez jr buc otravez: ; hace sonar otro fx di ; desactiva interrupciones ld de,0 ld [contador],de ; resetea contador ld a,0 ld c,4 call ayFX_INIT ei ret pt3MSC: .include "PT3-ROM.asm" ayFX: .include "ayFX-ROM.asm" ayBANK: .incbin "sonidos.afb" pt3BANK: .incbin "lena.100" ;pt3BANK: .incbin "try.100" ;pt3BANK: .incbin "nopower.100" ; ----------------------------------- ; TIMER_ON, hook our TIMER event ; ----------------------------------- TIMER_ON: di ld hl, TIMER_UPDATE ld [TIMI+1], hl ld a,0xC3 ld [TIMI], a ei ret ; ----------------------------------- ; TIMER_UPDATE; called 50 or 60 times/sec ; ----------------------------------- TIMER_UPDATE: di push af ; ************************************************************************************** call PT3_ROUT ; copia AYREGS a los registros del PSG ; musica en funcionamiento?? ld a, [MUSIC_STATE] or a ; = cp 0 jr z, TIMER_UPDATE_NOMUSIC ; suena música call PT3_PLAY ; hace sonar un frame de la musica jp TIMER_UPDATE_PLAYFX ; no suena música TIMER_UPDATE_NOMUSIC: ; lo lógico sería hacer un "call PT3_MUTE", pero al final se vuelve a copiar AYREGS al PSG ; (y machacaríamos el último frame subido hace un momento) ; haremos lo mismo pero sin volver a subir los valores a los registros del PSG ; (las siguientes 5 líneas son el mismo código del PT3_MUTE) XOR A LD H,A LD L,A LD [AYREGS+AR_AmplA],A LD [AYREGS+AR_AmplB],HL TIMER_UPDATE_PLAYFX: call ayFX_PLAY ; hace sonar un frame de los efectos ; ************************************************************************************** ld de,[contador] inc de ld [contador],de ; EXIT TIMERUPDATE TIMERUPDATE_EXIT: pop af ei ret ; ************************************************************************************** ; --------------------------------------- ; MUSIC_STOP: detiene la reproduccion de la música MUSIC_STOP: xor a ld [MUSIC_STATE], a ret ; --------------------------------------- ; MUSIC_PLAY: inicia la reproduccion de una nueva pista de música ; hl = direccion track MUSIC_PLAY: di ; es necesario deshabilitar interrupciones? call PT3_INIT ei ; --------------------------------------- ; MUSIC_RESUME: continua con la reproduccion de la musica, si estuviera parada. MUSIC_RESUME: ld a, 1 ld [MUSIC_STATE], a ret ; ************************************************************************************** ; --------------------------------------- RAM AREA .page 3 ; 0xc000 ; ************************************************************************************** MUSIC_STATE: .byte ; 0= STOP, 1= PLAY ; ************************************************************************************** .include "VAR-RAM.asm" .include "PT3-RAM.asm" .include "ayFX-RAM.asm" Título: Re: solicitando vuestra ayuda ( PT3+ayFX ) Publicado por: SapphiRe_MSX en 01 de Septiembre de 2011, 07:49:02 pm La opción A) de usar un track SILENCIO funciona!!! :P ... pero es poco elegante!! XD ... Cierto. Lo ideal es hacer lo que has hecho después: encapsular el reproductor en una rutina mayor. Si hay que tocar música, se llama a PT3_PLAY, si no hay que tocarla, se llama a PT3_MUTE. De hecho, es lo que hago en el QBIQS ;) ;) ;) Título: Re: solicitando vuestra ayuda ( PT3+ayFX ) Publicado por: phsoft en 01 de Septiembre de 2011, 08:36:24 pm muchas gracias, neng, por el código
es gracioso que a mediodía empecé el stop-resume, en el rato de la comida, y fíjate que me pasó lo que comentas en TIMER_UPDATE_NOMUSIC Citar ; lo lógico sería hacer un "call PT3_MUTE", pero al final se vuelve a copiar AYREGS al PSG ... "coño", me dije, "esto me pasa por hacer lo lógico.." :o en fin, lo probaré bien el fin de semana y te cuento (mañana estaré out) saludos, - paco Título: Re: solicitando vuestra ayuda ( PT3+ayFX ) Publicado por: nenefranz en 01 de Septiembre de 2011, 08:51:29 pm Hola Phsoft!! Espero que aunque no sea exactamente lo que buscas si te ayuda a encontra tu solución. El código no está probado así que seguramente necesitarás retocarlo!! :) una pregunta SapphiRe ;) ... que quizá Phsoft no se ha planteado todavía, pero que seguro lo acabará haciendo. Si se diseña una música o efecto sonoro pensando en máquinas de 50Hz (msx español por ejemplo) ... tal como está puesto el código funcionará bien!! pero a la que se ponga en una máquina de 60Hz (msx japonés por ejemplo) ... la reproducción ya no será correcta, se escuchará más rápido!! Solución bruta: guardar otra pista diseñada para máquinas de 60Hz!! Con tan pocos recursos disponibles (de memoria) es un malgasto!!! Mejor buscar otra solución. Lo primero que me viene a la cabeza es hacer algún tipo de interpolación para que de las 50 muestras/segundo sacar las 60 que serán necesarias para la reproduzcción en un msx japonés. Pero como esto me parece costoso, y quizá complejo, he pensado en otra solución más simple ... repetir algunas muestras!! [modo diarrea mental ON] de 50 muestras tengo que sacar 60!! ... me tengo que "sacar de la manga" 10 muestras ... ??? si divido las 50 muestras originales en 10 partes, tengo paquetes de 5 ... O sea, de cada paquete de 5 tengo que inventarme una muestra!!! ... bueno en vez de inventarme lo que hago es repetir una de las 5 muestras. :o 5_muestras_paquete_original + 1_inventada = 6_muestras_paquete_final)*10_paquetes = 60_muestras_final!!! ... yuuuuuuhuuuuuuuuuuuuu!! :laugh: Para que no se note demasiado, la muestra a repetir debería ser la tercera!!! ... pero me conformo con repetir la última!! :P [modo diarrea mental OFF] Resumiendo toda esta patraña mental ... cuando detecto que estoy en una máquina de 60Hz reproduzco de manera normal 5 "frames" de la música/efecto en el momento que tendría que calcular el 6 "frame" ... no lo hago!!! ... simplemente repito esa muestra!! y vuelvo a empezar ... reproduzco 5 muestras, repito la última muestra, y vuelta a empezar ... etc. etc. lo que digo es una locura (o un sacrilegio, porque las cosas no suenan como deben)??? ... o no es tan mala idea??? ... supongo que lo de interpolar y demás debe ser más elegante, pero también más complicado!! tú que haces en el QBIQS??? ;D (que poco sutil soy :P) Título: Re: solicitando vuestra ayuda ( PT3+ayFX ) Publicado por: SapphiRe_MSX en 02 de Septiembre de 2011, 08:18:18 am tú que haces en el QBIQS??? ;D (que poco sutil soy :P) Lo que dices no es una locura (salvo un poco lo de replicar la tercera muestra del paquete de 5), ni un sacrilegio. Es más o menos lo que yo hago en el QBIQS (y podéis escucharlo para ver si notáis alguna diferencia entre los 50hz y los 60hz). Para resumir y ser claros, hago (exactamente) lo siguiente: Código: SETMUSIC: ; --- INICIALIZA LA MUSICA QUE HAYA EN EL REGISTRO A --- ; --- SI NO SE QUIERE LOOP, PONER EL BIT 7 A 1 --- push af ; Guardamos información de loop and 127 ; Nos quedamos con el número de la música cp 127 ; El 127 indica que no se usa música jr z,@@NOMUSIC ; Vamos a @@NOMUSIC add a,a ; a:=a*2 ld e,a ; e:=a*2 ld d,0 ; de:=a*2 ld IY,MUSICDATA ; Puntero a los datos de la musica add IY,de ; Puntero a los datos de la cancion concreta ld l,[IY+0] ; Direccion baja ld h,[IY+1] ; Direccion alta ; --- Descomprimimos la música elegida --- ld de,MUSICBUFFER ; Buffer para descomprimir las musicas call BITBUSTERDEPACK ; Descomprimimos al buffer de musica ld hl,MUSICBUFFER-99 ; Direccion para inicializar el player de musica call PT3_INIT ; Inicializamos el player pop de ; Recuperamos información de loop en d ; --- Actualizamos el registro SETUP del PT3 --- ld a,[PT3_SETUP] ; Registro de Set-Up del PT3 rrca ; Rotamos a la derecha para ignorar el bit bajo rl d ; Bit alto de d al carry rla ; Rotamos a, metiendo el carry en su bit bajo ld [PT3_SETUP],a ; Actualizado registro de Set-Up del PT3 ld a,255 ; a:=255 ld [PT3_ON],a ; Activamos la reproducción del PT3 ; --- Inicializamos el contador PT3_60_50 si el VDP va a 60 Hz --- ld a,[IDBYTE1] ; Byte 1 de identificación del MSX and 128 ; Comprobamos la frecuencia del VDP ret nz ; Si es 50Hz volvemos ld a,6 ; a:=6 ld [PT3_60_50],a ; Inicializamos el contador ret ; Volvemos @@NOMUSIC: ; --- Desactivamos la reproducción del PT3 --- xor a ; a:=0 ld [PT3_ON],a ; Apagamos el replayer del PT3 pop af ; Desapilamos lo que habíamos apilado ret ; Volvemos PLAYMUSIC: ; --- RUTINA QUE TOCA LA MUSICA YA INICIALIZADA A LA MISMA VELOCIDAD EN PAL O NTSC --- ld a,[PT3_ON] ; Comprobamos si hay que usar el PT3 o no or a ; Si es igual a cero... jp z,PT3_MUTE ; ...silenciamos los canales ld a,[IDBYTE1] ; Byte 1 de identificación del MSX and 128 ; Comprobamos la frecuencia del VDP jp nz,@@PLAY ; Si es PAL vamos a @@PLAY ; --- Si llegamos aqui el VDP está a 60Hz --- ld a,[PT3_60_50] ; Contador de frames dec a ; Decrementamos el contador ld [PT3_60_50],a ; Actualizamos el contador jp z,@@RESTORECOPY ; Si es cero vamos a @@RESTORECOPY @@PLAY: ; --- Si llegamos aqui generamos el siguiente frame sonoro y copiamos los registros --- call PT3_PLAY ; Generamos los valores de la música del siguiente frame ld hl,AYREGS ; Valores de los registros del PSG generados por el PT3 ld de,AYREGS_BAK ; Copia de los registros del PSG generados por el PT3 ld bc,14 ; Tamaño ldir ; Copiamos ret ; Volvemos @@RESTORECOPY: ; --- Si llegamos aqui es que tenemos que reinicializar el contador y restaurar la copia de los registros --- ld a,6 ; a:=6 ld [PT3_60_50],a ; Reinicializamos el contador ld hl,AYREGS_BAK ; Registros del PSG generados por el PT3 en el frame anterior ld de,AYREGS ; Valores normales de los registros del PSG ld bc,14 ; Tamaño ldir ; Copiamos ret ; Volvemos Es decir, la rutina de inicialización de la música mira si estamos a 50 o 60 hz, activando una serie de variables en RAM. Luego, la rutina de playeo lo primero que mira es si está activo el pt3 o no. Si no lo está, llama al mute y vuelve. Si lo está, dependiendo de si estamos a 50hz o 60hz ya actúa. A 50hz genera todos los frames, pero a 60hz genera 5 frames y si llega el sexto, copia el contenido del quinto (para poder sobreescribir los valores después con el ayFX). Básicamente es lo que comenté en el blog hace dos años: http://z80st.auic.es/blog.php?page=2009/09/pt3-60hz.html Por cierto, si probáis la demo del protracker que he puesto en el blog, veréis que suena igual también a 50hz y a 60hz. Utilizo una rutina similar para la inicialización y la reproducción. Así que lo aquí expuesto puede extrapolarse a otros chips de sonido que no sean el PSG (en la demo podéis probar el fm-pac, music-module y moonsound): http://z80st.auic.es/blog.php?page=2011/08/demo-del-protracker.html En cuanto al ayFX, como son sonidos bastante cortitos (de entre 1 y 4 frames, aunque el más largo es la explosión y dura 41 frames) los reproduzco sin tener en cuenta la frecuencia. No se nota. Título: Re: solicitando vuestra ayuda ( PT3+ayFX ) Publicado por: Metalbrain en 02 de Septiembre de 2011, 08:47:46 am Yo directamente a 60Hz no hago nada el sexto frame, ni copio ni envío valores al chip de sonido ni nada... creo que el mismo chip recuerda perfectamente lo del frame anterior. ;)
Título: Re: solicitando vuestra ayuda ( PT3+ayFX ) Publicado por: SapphiRe_MSX en 02 de Septiembre de 2011, 09:45:46 am Yo directamente a 60Hz no hago nada el sexto frame, ni copio ni envío valores al chip de sonido ni nada... creo que el mismo chip recuerda perfectamente lo del frame anterior. ;) Cierto, pero el problema es que si usas el ayFX, que sobreescribe los valores generados por el PT3, entonces sí que tienes que restaurar los valores del quinto frame. Si no se hace así y se está reproduciendo un fx justo en ese momento, se pierde no sólo el canal que toque, sino el canal anterior, ya que habría sido modificado por el ayFX en el frame anterior. Otra cosa es que también pases de generar el frame del ayFX en el sexto frame, lo cual es perfectamente válido. Título: Re: solicitando vuestra ayuda ( PT3+ayFX ) Publicado por: Iggy Rock en 02 de Septiembre de 2011, 11:41:16 am ... Exacto. Para evitar cortes debidos a SFX (50/60Hz) yo veo más fácil usar un buffer de registros secundarios. En el primario escribe el PT3 player, en el secundario se copian estos registros y se sobreescriben los del ayFX. El registro secundario se vuelca al PSG por la rutina R_OUT que es lo que parece que hace SapphiRe en el código que ha pegado.
Título: Re: solicitando vuestra ayuda ( PT3+ayFX ) Publicado por: e_sedes en 02 de Septiembre de 2011, 11:51:38 am Repetir el 5º campo es el metodo habitual de conversion de video de PAL a NTSC, así que algo de correcto tendrá.
Título: Re: solicitando vuestra ayuda ( PT3+ayFX ) Publicado por: SapphiRe_MSX en 02 de Septiembre de 2011, 12:07:22 pm ... Exacto. Para evitar cortes debidos a SFX (50/60Hz) yo veo más fácil usar un buffer de registros secundarios. En el primario escribe el PT3 player, en el secundario se copian estos registros y se sobreescriben los del ayFX. El registro secundario se vuelca al PSG por la rutina R_OUT que es lo que parece que hace SapphiRe en el código que ha pegado. Básicamente... lo que hago es (en NTSC) guardar una copia de los registros producidos por el pt3 y en lugar de generar el sexto frame, restauro el quinto para que el ayFX los guarrindonguee si así considera. Por cierto, me gusta tu tagline xDDD Repetir el 5º campo es el metodo habitual de conversion de video de PAL a NTSC, así que algo de correcto tendrá. Desde luego no hemos descubierto la rueda, no... :P Título: Re: solicitando vuestra ayuda ( PT3+ayFX ) Publicado por: nenefranz en 02 de Septiembre de 2011, 12:41:53 pm Citar Es decir, la rutina de inicialización de la música mira si estamos a 50 o 60 hz, activando una serie de variables en RAM. Luego, la rutina de playeo lo primero que mira es si está activo el pt3 o no. Si no lo está, llama al mute y vuelve. Si lo está, dependiendo de si estamos a 50hz o 60hz ya actúa. A 50hz genera todos los frames, pero a 60hz genera 5 frames y si llega el sexto, copia el contenido del quinto (para poder sobreescribir los valores después con el ayFX). Ups llego dos años tarde!!! :P .. no sabía que este tema ya estaba explicado!!!Básicamente es lo que comenté en el blog hace dos años: http://z80st.auic.es/blog.php?page=2009/09/pt3-60hz.html Muy interesante todo ... en resumen: el sexto frame es igual al quinto (en caso de maquina 60Hz). Maneras de proceder: - en el sexto frame no enviar datos al PSG (esto sólo será válido si tanto el PT3 como ayFX se intentan sincronizar a 50/60Hz) - en el quinto frame hace copia de los valores de los registros y durante el sexto frame "escupir" estos datos (esta versión servirá aunque el ayFX no se intente sincronizar) Citar Cita de: e_sedes en Hoy a las 12:51:38 pues debía ser yo el único que no sabía lo de la conversión PAL->NTSC!!! :PCitar Repetir el 5º campo es el metodo habitual de conversion de video de PAL a NTSC, así que algo de correcto tendrá. Desde luego no hemos descubierto la rueda, no... Título: Re: solicitando vuestra ayuda ( PT3+ayFX ) Publicado por: phsoft en 03 de Septiembre de 2011, 01:40:02 pm buenas, neng, ya está de vuelta vuestra peor pesadilla :griel:
he subido un ejemplo funcional que es tu código mezclado con el de sapphire -en su blog- para que pt3 reproduzca a 50-60mhz detectando la velocidad con el bios id (ya que es codigo para msx1). con diferentes máquinas de bluemsx la cosa parece funcionar que es una puñetera y rotunda maravilla ;D http://phsoft.vecindiario.es/ftp/play_50_60.zip (http://phsoft.vecindiario.es/ftp/play_50_60.zip) luego vuelvo con alguna última cuestión sobre el tema, pichorras, que hay que comer también!!! saludos, - paco bueno, diría que esta es la última edición de pruebas (por mi parte) a falta de refinamientos vip o delicatessens, como que metalbrain se dejara caer un unpack de su msx-o-mizer para asMSX :joe: o que alguien añadiese soporte al PT3 para un apagado suave de la musica (en varias frames, reduciendo el volumen paulatinamente, pej). menudencias así :griel: y nada, esta prueba solo añade tracks comprimidas en rom (con bitbuster 1.2) que se corren desde ram previa la descompresion, claro, con el unpack que dejó pitpan en los snippets.. y bueno, idem para el banco de ayFX, un stop cachoburro para el timer y no sé si algo más, no creo http://phsoft.vecindiario.es/ftp/play_50_60_packed.zip (http://phsoft.vecindiario.es/ftp/play_50_60_packed.zip) el modulo inicial es demo_replayer.asm saludos y gracias a todos, pichorras - paco Título: Re: solicitando vuestra ayuda ( PT3+ayFX ) Publicado por: SapphiRe_MSX en 03 de Septiembre de 2011, 11:31:02 pm o que alguien añadiese soporte al PT3 para un apagado suave de la musica (en varias frames, reduciendo el volumen paulatinamente, pej) El tema es que eso ya lo tengo yo hecho, que alguien me lo pidió hace tiempo. El problema es que plantea un problema gordo cuando hay envolventes por hardware. El volumen de los canales se puede controlar si no hay envolventes por hardware, pero con éstas, es imposible controlarlo y no funciona el fade de la música. No obstante, si no vas a usar PT3 con envolventes, me lo dices, busco el código y lo pongo por aquí. Título: Re: solicitando vuestra ayuda ( PT3+ayFX ) Publicado por: phsoft en 04 de Septiembre de 2011, 11:49:08 am cof cof.. esto es un poco embarasing cof.. no sé cómo decirlo...
pero hombre, qué demonios es una envolvente?!.. y por hardware!?... tu que me quieres matar de un susto? :P en serio: si no es mucha molestia y das con él, pues pon el enlace. por mi parte me comprometo a subir alguna prueba funcional (siempre que logre hacerlo funcionar, se entiende) de la gramola con este añadido. desconozco si el músico usará ese tipo de efectos o no. pienso que lo haga o no siempre agradecerá, supongo, el disponer de múltiples opciones en fin, que gracias por el tiempo y la info en cualquier caso, pichorra saludos, - paco Título: Re: solicitando vuestra ayuda ( PT3+ayFX ) Publicado por: pitpan en 04 de Septiembre de 2011, 12:42:29 pm Las envolventes por hardware son una de las características de nuestro PSG: el propio procesador puede modular la amplitud de un canal con una serie de patrones predefinidos y de acuerdo con una frecuencia que se le indique. Si en el registro de volumen de un canal pones el valor 16, por ejemplo, el volumen de ese canal se controlará por la envolvente por hardware establecida por el PSG. El problema es siempre el mismo: la envolvente es única, no puedes tener distintas envolventes en distintos canales.
El problema que apunta Sap es que la frecuencia de las envolventes se establece de forma absoluta, y evidentemente, no hay más opciones que recalcularla si quieres que te suene igual a 50 y 60Hz, tarea bastante desagradable en un Z80, ya que tienes que multiplicar y/o dividir enteros y esperar que el error sea poco y todo encaje. En la práctica NO se hace. Por eso precisamente en mi obscenamente obsoleto Karoshi's Caruso no se da soporte a envolventes por hardware: para que todo funcione igual a 50 o 60 Hz. Échale un vistazo al MSX RED BOOK y te explicarán eso de las envolventes, aunque debería estar en cualquier manual de MSX-BASIC. Son los registros 11, 12 y 13 del PSG los que controlan frecuencia y forma. Título: Re: solicitando vuestra ayuda ( PT3+ayFX ) Publicado por: SapphiRe_MSX en 04 de Septiembre de 2011, 05:59:02 pm El problema que apunta Sap es que la frecuencia de las envolventes se establece de forma absoluta, y evidentemente, no hay más opciones que recalcularla si quieres que te suene igual a 50 y 60Hz, tarea bastante desagradable en un Z80, ya que tienes que multiplicar y/o dividir enteros y esperar que el error sea poco y todo encaje. En la práctica NO se hace. No. Lo que yo digo es que el volumen máximo de la envolvente es, precisamente, el volumen máximo del PSG. Es decir, que no se puede limitar el volumen de una envolvente por hardware. El tema de las envolventes a 50hz y 60hz, al replicar el quinto frame musical como el sexto en NTSC apenas si se nota. De hecho, la mayor parte de las músicas del QBIQS (creo que todas salvo la de los créditos) usan envolventes por hard y no se nota si se reproducen a 60hz. Título: Re: solicitando vuestra ayuda ( PT3+ayFX ) Publicado por: pitpan en 05 de Septiembre de 2011, 07:14:47 am Explicado queda. Efectivamente, con envolventes por hardware difícilmente se puede hacer un fade-in o un fade-out.
Título: Re: solicitando vuestra ayuda ( PT3+ayFX ) Publicado por: phsoft en 12 de Septiembre de 2011, 03:13:10 pm gracias por las explicaciones, ñores
en realidad mis preocupaciones en el uso del ayFX+PT3 son bastante más simples que esto de las envolventes. en cuanto pueda subiré un ejemplo pero os pongo en situación con este escenario (que correría sobre el player que hemos subido en los ejemplos anteriores), - pantalla de inicio del juego con su press space to play - music_timer_on rulando con banco de efectos ayFX cargado - al pulsar espacio al tumtum se reproduce -unas frames sobre otras- el efecto de sonido indicado con "unas frames sobre otras" quiero decir que se pisan una reproducción y otra de(l mismo) sonido ya que, en principio, el ejemplo está hecho en basto y no hay retardo en la pulsación de dos space keys. para evitar esto lo que vengo haciendo es chequear ayFX_PRIORITY hasta que marque 255, que es, entiendo, cuando ha terminado un efecto de sonido (se reprodujeron todas sus frames), lo que de hecho funciona en el escenario indicado. ahora bien, es correcto? cómo lo veis? opciones?... pensemos, pej, que forzar un gran retardo en la pulsación de la tecla puede servir para este escenario pero ni parece muy elegante ni servirá para otros escenarios el tema podría ser cómo determinar si ha terminado por completo un efecto de sonido (reproducido con ayFX), cómo detener en seco el efecto de sonido que se está reproduciendo, lanzar otro y esperar a que termine por completo (el segundo) para continuar (con el anterior), etc. pensad por ejemplo en el caso del juego que estoy realizando, donde un psj se desplaza por las pantallas con música de fondo (tracks de PT3) y sonido de pasos (efecto de ayFX) y que, en determinadas circunstancias, debe "cortar de raiz" el efecto de los pasos para reproducir (y por completo, una sola vez) otro efecto de sonido, por ejemplo el de la recogida o uso de un determinado item y nada, que éste es el tipo de dudas que me surgen, como os decía, en mis pruebas para integrar el player de los ejemplos con el código del juego que vengo realizando saludos, - paco ejemplo del escenario 1 http://phsoft.vecindiario.es/ftp/ayfx_ejemplo1.zip Título: Re: solicitando vuestra ayuda ( PT3+ayFX ) Publicado por: SapphiRe_MSX en 13 de Septiembre de 2011, 11:33:26 am el tema podría ser cómo determinar si ha terminado por completo un efecto de sonido (reproducido con ayFX), cómo detener en seco el efecto de sonido que se está reproduciendo, lanzar otro y esperar a que termine por completo (el segundo) para continuar (con el anterior), etc. pensad por ejemplo en el caso del juego que estoy realizando, donde un psj se desplaza por las pantallas con música de fondo (tracks de PT3) y sonido de pasos (efecto de ayFX) y que, en determinadas circunstancias, debe "cortar de raiz" el efecto de los pasos para reproducir (y por completo, una sola vez) otro efecto de sonido, por ejemplo el de la recogida o uso de un determinado item Para eso están las prioridades. Si lanzas un efecto con menor prioridad, no suena, pero si lo lanzas con mayor prioridad si. Así pues, los pasos deberían tener poca prioridad y de esa forma cualquier otro efecto sonaría antes que ellos. Supongo que lo de saber si se ha terminado un efecto es para poner un paso detrás de otro, ¿verdad? Puedes consultar la variable ayFX_PRIORITY, que si tiene el bit 7 a 1 significa que no hay un efecto reproduciéndose. Pero si inicias un efecto con la misma prioridad que otro que ya se esté reproduciendo, lo machacará... ;) Lo mejor es que los efectos de pasos se lancen a intervalos regulares un poco mayores que su propia duración, de esa forma no tendrás ningún problema. Título: Re: solicitando vuestra ayuda ( PT3+ayFX ) Publicado por: phsoft en 13 de Septiembre de 2011, 04:26:03 pm ok, entendido lo de las prioridades. menor valor en c = mayor prioridad:
- coger ferrari, c=3, alta prioridad! urgentísimo! - ir caminando.. nooooo... c=8, baja prioridad lo estaba haciendo justo al séver :) ayFX_PRIORITY.. bue, esto lo estaba chequeando a saco con un 255 como un sol, que creo viene en el ayFX_END. se agradece lo del bit 7 Citar Lo mejor es que los efectos de pasos se lancen a intervalos entendido.. señor, sí, señor! caminaremos a intervalos regulares, señor! cómo no se me habrá ocurrido antes! X...-DDD fuera coñas ya funciona bte bien sincronizado aunque sea en plan compadre, y teniendo en cuenta que el queco va atodalahooostia (que parece un usain bold al que le han robado la cartera), ya que no están todas las rutinas de detección/recogida de bichos, la música, el coro de bailaoras, etc. claro, conforme se añadan cosas pues surgirán nuevas peguillas y habrá que hacerlo como bien dices. ok, gracias, campeón saludos, - paco |