Karoshi MSX Community

Desarrollo MSX => Desarrollo (Español/Spanish) => Mensaje iniciado por: phsoft en 30 de Agosto de 2011, 04:17:41 pm



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

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

Ups llego dos años tarde!!! :P .. no sabía que este tema ya estaba explicado!!!

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
   
Citar
   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...
pues debía ser yo el único que no sabía lo de la conversión PAL->NTSC!!! :P



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