Karoshi MSX Community
05 de Julio de 2021, 07:29:41 pm *
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] 3 4 5
  Imprimir  
Autor Tema: Sintetizador de Voz para MSX  (Leído 31328 veces)
0 Usuarios y 1 Visitante están viendo este tema.
PAC
Karoshi Fan
**
Mensajes: 91


« Respuesta #15 : 17 de Febrero de 2012, 01:35:28 pm »

Lo comentaba principalmente porque de esta manera sería más sencillo seguir el texto. Cuando lo probé hubo momentos en los que no sabía qué parte de la frase estaba reproduciendo ya que no entendía correctamente la pronunciación.
« Última modificación: 17 de Febrero de 2012, 01:37:06 pm por PAC » En línea
pastbytes
Karoshi Fan
**
Mensajes: 66


Email
« Respuesta #16 : 17 de Febrero de 2012, 01:45:33 pm »

Bueno eso pasa con todos los sintetizadores de voz para 8 bits que conozco, pero al poder usarse desde BASIC, el mismo usuario puede imprimir cada palabra antes de llamar al programa para que la hable, el retraso generado por la orden PRINT entre cada palabra debe ser equivalente en tiempo a un espacio normal entre palabras asi que no quedaria mal. El programa en BASIC que hace de interfaz se podria llegar a modificar para que detecte los espacios del texto ingresado e imprima las palabras una a una, llamando al sintetizador luego de cada impresion. Yo lo hice lo mas basico posible porque sirve a la vez de demostracion para saber como se usa, por eso no quise complicarlo demasiado.
En línea
Mortimer
Karoshi Lover
***
Mensajes: 216


WWW
« Respuesta #17 : 17 de Febrero de 2012, 02:58:26 pm »

Se me ocurre una forma de hacerlo más o menos fácil para que pueda indicar palabra a palabra, que sería que dejara configuar (Opcionalmente claro) una dirección para una llamada callback que se invocaría cada vez que termine de leer una palabra. Además no hace falta tocar el código del sintetizador para cada uso. (Eso sí, la rutina de presentación también tendría que estar en ASM)

Así que cada vez que termina una palabra, se llama a esta rutina nuestra pasándole la posición de la siguiente palabra que va a leer. Y ya podemos colorear o lo que queramos, y como es entre palabra y palabra, si la rutina es razonablemente rápida no creo que afecte mucho a la calidad del sonido. ¿No?

También se podría aprovechar esta rutina para indicarle al sintetizador si tiene que terminar, dejando algún flag para ello, así también le quitamos al sintetizador otro asunto digamos 'externo' de lo que preocuparse.


En línea
MsxKun
Karoshi Forum's Guru
*******
Mensajes: 1554


Kimochi-ii


WWW Email
« Respuesta #18 : 17 de Febrero de 2012, 03:35:54 pm »

Lo de cambiar el color del fondo en realidad no tiene sentido, es una opcion hecha para C64 y Spectrum, donde existe realmente el borde, cuando converti el programa a MSX me di cuenta que no existia el color de borde en la pantalla normal de texto, y que solo se puede tener un color de tinta en toda la pantalla.

Si usas screen 1, podras tener el color del borde a tu antojo. Simplemente añade una linea con SCREEN 1, antes de nada, y veras.
En línea

--

Cindy Lauper She Bops!
pastbytes
Karoshi Fan
**
Mensajes: 66


Email
« Respuesta #19 : 17 de Febrero de 2012, 03:43:07 pm »

Lo de cambiar el color del fondo en realidad no tiene sentido, es una opcion hecha para C64 y Spectrum, donde existe realmente el borde, cuando converti el programa a MSX me di cuenta que no existia el color de borde en la pantalla normal de texto, y que solo se puede tener un color de tinta en toda la pantalla.

Si usas screen 1, podras tener el color del borde a tu antojo. Simplemente añade una linea con SCREEN 1, antes de nada, y veras.


El problema es que deberia funcionar en cualquier modo de pantalla que el usuario necesite, asi que tengo que ajustarme al modo mas basico, en todo caso hacer seleccionable que cambie los colores, o detectar el modo para decidir si se hace o no.
En línea
pastbytes
Karoshi Fan
**
Mensajes: 66


Email
« Respuesta #20 : 17 de Febrero de 2012, 04:01:08 pm »

Se me ocurre una forma de hacerlo más o menos fácil para que pueda indicar palabra a palabra, que sería que dejara configuar (Opcionalmente claro) una dirección para una llamada callback que se invocaría cada vez que termine de leer una palabra. Además no hace falta tocar el código del sintetizador para cada uso. (Eso sí, la rutina de presentación también tendría que estar en ASM)

Así que cada vez que termina una palabra, se llama a esta rutina nuestra pasándole la posición de la siguiente palabra que va a leer. Y ya podemos colorear o lo que queramos, y como es entre palabra y palabra, si la rutina es razonablemente rápida no creo que afecte mucho a la calidad del sonido. ¿No?

También se podría aprovechar esta rutina para indicarle al sintetizador si tiene que terminar, dejando algún flag para ello, así también le quitamos al sintetizador otro asunto digamos 'externo' de lo que preocuparse.

Entre palabras suele haber espacios, aunque no siempre, esos espacios, en vez de especificarlos en el texto para que el sintetizador no ejecute mas que un bucle de espera, se pueden aprovechar para que el mismo programa BASIC imprima la palabra que el usuario quiere y luego llame al sintetizador con el texto que sigue.
Si quisiera hacer un programa que hable e imprima "hola, mundo. saludos." tendria que hacer algo asi, todo esto implementado en BASIC:

imprimir "HOLA, "
llamar al sintetizador para que hable "O+LA"
imprimir "MUNDO. "
llamar al sintetizador para que hable "MU+NDO-"
imprimir "SALUDOS"
llamar al sintetizador para que hable "SALU+DO-S"

Me parece que tal como esta el programa se resuelve perfectamente, y como dije si uno quiere que sea mas automatico se puede hacer un bucle en el programa BASIC para que busque los espacios en una cadena, obtenga las palabras una a una y haga el procedimiento con cada una (imprimir y hablar).
Tambien se puede poner el texto en lineas DATA, o en una matriz para contener el texto a imprimir y el texto a hablar correspondiente al mismo, y muchos otros refinamientos posibles.
El programa no imprime porque es una accion muy dependiente del usuario, se me hace que tendria mas sentido incorporar la impresion en el futuro sintetizador cantante, donde puede ser mas importante ir marcando la letra a medida que se canta.
De todos modos, antes habia dicho que la impresion se podria especificar como parte del texto, colocando el texto a imprimir entre parentesis, lo que haria que el programa no lo procese como habla y lo mande directo a la pantalla antes de continuar con el resto del texto. La limitacion de esto es que imprimiria de forma estandar, en las coordenadas y color de tinta actuales, por lo que si se quiere ir imprimiendo en distintas zonas o colores el usuario tendra que dividir la frase en partes y hacer distintas llamadas.
En línea
Mortimer
Karoshi Lover
***
Mensajes: 216


WWW
« Respuesta #21 : 17 de Febrero de 2012, 04:07:27 pm »

Sí, así en basic funcionaría bien. Mi idea iba más para poder usarlo desde ASM de forma genérica sin tener que tocar el código para cada uso.
En línea
pastbytes
Karoshi Fan
**
Mensajes: 66


Email
« Respuesta #22 : 17 de Febrero de 2012, 04:30:59 pm »

Sí, así en basic funcionaría bien. Mi idea iba más para poder usarlo desde ASM de forma genérica sin tener que tocar el código para cada uso.

Lo mismo vale para assembler, y es mejor que se llame al sintetizador por cada palabra, porque asi el programa principal del usuario puede decidir cuando detener el proceso. Si es un programa que muestra un texto y lo va hablando, por ejemplo alguna demo o la presentacion de la historia de un juego, el usuario puede querer presionar espacio o escape para saltar a lo que sigue, y al ser el programa del usuario quien tiene el control puede tras cada palabra leer el teclado y tomar la decision de no seguir enviando texto para hablar.
En línea
pastbytes
Karoshi Fan
**
Mensajes: 66


Email
« Respuesta #23 : 01 de Marzo de 2012, 01:55:13 pm »

Pregunta, hay programas que permitan cargar desde disco archivos de sonido digitalizado para reproducirlos? Algo asi como un sampler que permita reproducir sonidos, como decian en los 80s, con la pulsacion de una tecla. Hay tambien editores de sonido digitalizado, o todo debe hacerse en un PC e importarlo en el MSX?
Todo esto funciona en el PSG, o es para otros chips?
En línea
MsxKun
Karoshi Forum's Guru
*******
Mensajes: 1554


Kimochi-ii


WWW Email
« Respuesta #24 : 01 de Marzo de 2012, 02:47:11 pm »

Epa.

El señor Robsy se curro una rutina que reproduce sonido digitalizado a 1bit mediante el puerto PPI (el click click click de teclado de toda la vida). 1bit no es mucho, pero no suena del todo mal. Yo mismo utilice la rutina en el josconzio final del Parachuteless Joe. Incluso el Sr. Dioniso se curro un jueguecillo entero, el Beepertron, que solo usaba este metodo para reproducir sonido.
Luego, player para PSG algo habia por ahi. Y tambien para SCC. En todos los casos (segun yo se) son simplemente rutinas para reproducir, no un programa realmente dedicado a ello (interface, playeo, etc...)
Por supuesto, tambien puede usarse el Music Module, el PCM del TurboR y la Moonsound. Y ese pequeño cacharrito llamado Covox, que se conecta a la impresora. En todos de una forma u otra podras cargar algun sample, pero es casi siempre un tema de hacerlo a manubrio. (aunque en el Music Module puedes usar el Moonblaster para cargar y playear samples, idem para la Moonsound, pero es un apaño...)


Software para editar el sonido, convertir y demas... no hay nada que yo sepa. Todo lo que he visto necesita convertir el sample en PC primero y luego ya pasarlo al MSX.  Personalmente quiero experimentar con la Covox (tengo una), ya que parece un metodo sencillo, pero mas adelante, cuando tenga un poco de tiempo.

Cualquier soft de este estilo seria bienvenido Smiley

Saludos!
En línea

--

Cindy Lauper She Bops!
pastbytes
Karoshi Fan
**
Mensajes: 66


Email
« Respuesta #25 : 01 de Marzo de 2012, 03:08:41 pm »

En realidad todo esto venia porque el sintetizador no es mas que un secuenciador simple de sonidos digitalizados, aunque algunos son generados por codigo, pero se podria ver como una forma de compresion de sonido. Las versiones para 6502 y Z80 difieren en la frecuencia de muestreo, pero todas parten del sonido digitalizado fuente en 44KHz y 16 bits, todas las modificaciones al sonido las hago primero ahi, para luego reducir al muestreo y cantidad de bits necesarios. Pasar sonido de 8 bits a 4 me ha complicado bastante, ya que no encontre soft para PC que lo haga directamente, por lo que tuve que escribirme un programa en BASIC para leer el archivo raw grabado con el GoldWave a 4 bits redondeando los numeros en vez de recortar lo que vendrian a ser los "decimales". De esta manera se redujo un poco el ruido que queda de fondo al convertir, pero aun sigue, convertir un audio de 8 bits a 4 es una tarea artesanal, y la unica manera de hacerla bien es mirando las ondas graficamente y corrigiendolas a mano para decidir en cada muestra si el valor intermedio (16 niveles de 8 bits) que se encuentra entre 2 niveles de 4 bits lo ajustamos hacia arriba o hacia abajo.
Lo que se me ocurrio es hacer un programa que permita cargar un audio de 8 bits directamente en el ordenador de 8 bits, que se pueda ver graficamente la onda en 8 bits, y que encima de eso se pueda dibujar la onda en 4 bits, o dejar que el programa la dibuje automaticamente. Tambien seria interesante que se pudiera usar raton para seleccionar partes y que haya opcion de cortar y pegar. No creo que el programa sea adecuado para teclado o joystick, es algo que solo funciona con raton.
Esto era un proyecto de largo (o muy largo) plazo, ya que ademas del sonido requiere conocimientos de graficos y de como aprovechar cada byte libre de RAM para almacenar todo el sonido que se pueda. Tampoco habia pensado empezar por MSX sino por C64, pero viendo ultimamente el uso que se les da a los programas de sonido en ordenadores de 8 bits para hacer musica, creo que del proyecto original y del sintetizador se pueden desarrollar algunas cosas no tan ambiciosas que se puedan aprovechar.
Una cosa que aun tengo pendiente es encontrar alguna forma de temporizacion precisa en MSX, desconozco si existen timers en el hard, en la version para C64 se sincroniza el sonido con las lineas impares de la pantalla, por eso es tan estable, y ademas de eso se dispone de varios timers en las CIA.
En línea
MsxKun
Karoshi Forum's Guru
*******
Mensajes: 1554


Kimochi-ii


WWW Email
« Respuesta #26 : 01 de Marzo de 2012, 09:15:13 pm »

Parece complicado, si...
Lo malo es que aqui el unico timer que tendras sera el del VDP... Si, hay gente por aqui que cuenta ciclos de reloj y otras cosas esotericas, pero eso complica mucho el asunto. Para temas de audio y sincro, quien te podria ayudar seria Madonna MkII, pero no se si volvera a aparecer por aqui Sad

Por conocimiento sobre graficos si que no te has de preocupar, se nos da bien por aqui.
En línea

--

Cindy Lauper She Bops!
pastbytes
Karoshi Fan
**
Mensajes: 66


Email
« Respuesta #27 : 02 de Marzo de 2012, 02:51:53 am »

El otro dia le comentaba a makinavaja de la idea de hacer algun programa que cargue algunos sonidos digitalizados y permita reproducirlos con las teclas de funcion, el me comentaba que seria interesante que se pudiera secuenciar eso, que se usen tiempos musicales y se pueda decir en que momento se reproducen los sonidos. Yo de musica conozco poco, pero algo de eso tuve que hacer en la demo de C64 donde el programa canta, para ir ajustandose lo mejor posible a lo que indica la partitura, pero al ser una demo la precision no era tan importante. El asunto es, que si se suele usar varios MSX simultaneamente para hacer musica, no ocurre acaso que en algun momento se desincronizan? Se puede temporizar en cada uno pero no hay una fuente de reloj maestro que permita a todos sincronizarse entre si, y esto se agrava mas cuanto mas tiempo pasa, mas aun si los MSX usan distintas frecuencias de reloj en el procesador, o incluso distintos programas, ya que cada uno aproxima los tiempos como mejor puede.
Sin conocer mucho de lo existente, me parece que tendria que haber algo que emitiera pulsos de reloj, sea un MSX o una pequeña placa, y se podria conectar esa señal de reloj (una cierta cantidad de pulsos por minuto) a los puertos de joystick, con lo cual cada programa tendria una manera de estar perfectamente sincronizado con los otros. En este caso podria haber retrasos para detectar el pulso a tiempo, por lo cual la precision a muy corto plazo dependeria del programa, pero a largo plazo todo estaria perfectamente en sincronia.
Como es lo del timer del VDP? Estuve buscando pero es tan generico que da demasiados resultados. Hay algun sitio que hable de eso?
En línea
Mortimer
Karoshi Lover
***
Mensajes: 216


WWW
« Respuesta #28 : 02 de Marzo de 2012, 08:00:18 am »

El timer del VDP de los MSX1 es muy sencillo, dependiendo de si el ordenador es NTSC o PAL simplemente produce una interrupción 60 o 50 veces por segundo respectivamente que llega al Z80. La únicas opciones que tenemos al respecto es decirle al VDP que genere o no esta señal, y a la CPU que la ignore o que la acepte y salte a una rutina de interrupción.

Sobre un reloj maestro externo, estaría genial, pero mejor que usar el puerto de Joystick en que hay que mirar el estado por polling, supongo que sería mejor hacer algo que se conectara a un slot de cartucho y poder así generar una interrupción al Z80 con la cadencia que nos interese.








En línea
pastbytes
Karoshi Fan
**
Mensajes: 66


Email
« Respuesta #29 : 02 de Marzo de 2012, 09:20:47 am »

Bueno, esa interrupcion de 50/60 Hz serviria entonces para la temporizacion musical, detectando previamente en que frecuencia funciona el MSX donde corre el programa, no digo que detecte PAL o NTSC porque los MSX brasileros usan PAL M a 60Hz.
Sin embargo para otro tipo de temporizacion mas precisa parece que se va a complicar un poco, en el sintetizador cantante uso tiempos de 200 microsegundos que son temporizados por una de las CIA (en C64), sin que tenga que hacer mas que cargar el valor y sentarme a esperar que se active un bit, o directamente habilitar una interrupcion. La temporizacion seria muy importante para reproducir el sonido digital en una frecuencia de muestreo estable, y mas importante si ademas no se quiere trabajar con una frecuencia fija, porque no todos van a querer usar una frecuencia alta desperdiciando memoria, o una baja sacrificando la calidad de sonido.
Si tan solo se pudiera conocer el estado de la onda de un canal en un momento dado, hasta se podria usar el PSG para temporizar, aunque si se pudiera no seria util justamente para aplicaciones que usan el sonido.
Voy a tener que seguir investigando, por el momento todo funciona con bucles para perder tiempo, calibrados a prueba y error, pero seria mejor que el hard se ocupe de esos asuntos, ya que de tiempos de ejecucion no conozco demasiado y prefiero no complicarme con eso.
En línea
Páginas: 1 [2] 3 4 5
  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!