phsoft
|
|
« : 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 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.zipun saludo a todos, - paco
|
|
|
En línea
|
|
|
|
SapphiRe_MSX
Visitante
|
|
« Respuesta #1 : 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.
|
|
|
En línea
|
|
|
|
phsoft
|
|
« Respuesta #2 : 30 de Agosto de 2011, 06:19:27 pm » |
|
buenas, pichorra 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
|
|
|
En línea
|
|
|
|
nenefranz
Karoshi Fan
Mensajes: 67
|
|
« Respuesta #3 : 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. ; 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,
|
|
« Última modificación: 31 de Agosto de 2011, 10:37:13 am por nenefranz »
|
En línea
|
|
|
|
phsoft
|
|
« Respuesta #4 : 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 ; ############################################ ; 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 mientras seguiré cacharreando el replayer saludos, - paco
|
|
|
En línea
|
|
|
|
nenefranz
Karoshi Fan
Mensajes: 67
|
|
« Respuesta #5 : 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": 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? ...
|
|
« Última modificación: 31 de Agosto de 2011, 04:37:08 pm por nenefranz »
|
En línea
|
|
|
|
phsoft
|
|
« Respuesta #6 : 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... 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.zipnótese la velocidad de las pruebas por si hay orejas de burro saludos, - paco
|
|
|
En línea
|
|
|
|
SapphiRe_MSX
Visitante
|
|
« Respuesta #7 : 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 mientras seguiré cacharreando el replayer ¡¡¡GROOOOARGGGHHH!!! 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í.
|
|
|
En línea
|
|
|
|
phsoft
|
|
« Respuesta #8 : 31 de Agosto de 2011, 11:19:21 pm » |
|
buenas, pichorra 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!" 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... 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! ) o se quedaba en el bucle infinito que comentamos 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 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) 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
|
|
|
En línea
|
|
|
|
phsoft
|
|
« Respuesta #9 : 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 ), 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 saludos, - paco
|
|
|
En línea
|
|
|
|
nenefranz
Karoshi Fan
Mensajes: 67
|
|
« Respuesta #10 : 01 de Septiembre de 2011, 04:57:08 pm » |
|
La opción A) de usar un track SILENCIO funciona!!! ... 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. ; ------------------------------------------------ ; 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"
|
|
|
En línea
|
|
|
|
SapphiRe_MSX
Visitante
|
|
« Respuesta #11 : 01 de Septiembre de 2011, 07:49:02 pm » |
|
La opción A) de usar un track SILENCIO funciona!!! ... 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
|
|
|
En línea
|
|
|
|
phsoft
|
|
« Respuesta #12 : 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 ; 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.." en fin, lo probaré bien el fin de semana y te cuento (mañana estaré out) saludos, - paco
|
|
|
En línea
|
|
|
|
nenefranz
Karoshi Fan
Mensajes: 67
|
|
« Respuesta #13 : 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. 5_muestras_paquete_original + 1_inventada = 6_muestras_paquete_final)*10_paquetes = 60_muestras_final!!! ... yuuuuuuhuuuuuuuuuuuuu!! Para que no se note demasiado, la muestra a repetir debería ser la tercera!!! ... pero me conformo con repetir la última!! [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??? (que poco sutil soy )
|
|
|
En línea
|
|
|
|
SapphiRe_MSX
Visitante
|
|
« Respuesta #14 : 02 de Septiembre de 2011, 08:18:18 am » |
|
tú que haces en el QBIQS??? (que poco sutil soy ) 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: 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.htmlPor 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.htmlEn 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.
|
|
|
En línea
|
|
|
|
|