Karoshi MSX Community
06 de Julio de 2021, 12:23:32 am *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias:
 
   Inicio   Ayuda Buscar Ingresar Registrarse  
Páginas: [1] 2
  Imprimir  
Autor Tema: solicitando vuestra ayuda ( PT3+ayFX )  (Leído 12002 veces)
0 Usuarios y 1 Visitante están viendo este tema.
phsoft
Karoshi Fan
**
Mensajes: 68



WWW
« : 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.zip

un 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
Karoshi Fan
**
Mensajes: 68



WWW
« Respuesta #2 : 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  Roll Eyes

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.


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,





« Última modificación: 31 de Agosto de 2011, 10:37:13 am por nenefranz » En línea
phsoft
Karoshi Fan
**
Mensajes: 68



WWW
« 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

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 Grin 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":

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? ...


« Última modificación: 31 de Agosto de 2011, 04:37:08 pm por nenefranz » En línea
phsoft
Karoshi Fan
**
Mensajes: 68



WWW
« 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...

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
nótese la velocidad de las pruebas por si hay orejas de burro Grin

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 Grin mientras seguiré cacharreando el replayer

¡¡¡GROOOOARGGGHHH!!! Grin Grin Grin

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
Karoshi Fan
**
Mensajes: 68



WWW
« Respuesta #8 : 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! Grin ) 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
En línea
phsoft
Karoshi Fan
**
Mensajes: 68



WWW
« 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 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á Smiley 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 Tongue

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!!! Tongue ... 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"



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!!! Tongue ... 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 Wink Wink Wink
En línea
phsoft
Karoshi Fan
**
Mensajes: 68



WWW
« 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

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.." Shocked
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!! Smiley

una pregunta SapphiRe Wink ... 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 ...  Huh
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.  Shocked
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!!   Tongue
[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)Huh ...
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???  Grin  (que poco sutil soy Tongue)


En línea
SapphiRe_MSX
Visitante
« Respuesta #14 : 02 de Septiembre de 2011, 08:18:18 am »

tú que haces en el QBIQS???  Grin  (que poco sutil soy Tongue)

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.
En línea
Páginas: [1] 2
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.21 | SMF © 2013, Simple Machines XHTML 1.0 válido! CSS válido!