Sonido controlado por interrupciones IRQ

Avatar de Usuario
pser1
Mensajes: 4094
Registrado: 08 Dic 2012 18:34
Agradecido : 1352 veces
Agradecimiento recibido: 1118 veces

Sonido controlado por interrupciones IRQ

Mensajepor pser1 » 13 Ene 2017 22:38

Buenas,
abro el hilo como comenté para no mezclar temas.

@gabriel
ya me dirás si te va bien comentar y/o hacer experimentos utilizando
este hilo o prefieres usar facebook ...

saludos
pere

Avatar de Usuario
minter
Mensajes: 4826
Registrado: 22 Jul 2014 18:51
Agradecido : 6762 veces
Agradecimiento recibido: 2602 veces

Re: Sonido controlado por interrupciones IRQ

Mensajepor minter » 14 Ene 2017 11:45

El comando PLAY acapara el uso de la CPU?
Puede ser llamado desde el asm? Supongo que si, pero Gabriel está preparando una llamada al DAC desde irqs?
Después de arreglar el coche, voy a buscar como tiene que ser los parámetros para la reproducción de sonidos. Forma de onda, ataque, frecuencia... Osea, ver cómo se parametrización el DAC.

Avatar de Usuario
pser1
Mensajes: 4094
Registrado: 08 Dic 2012 18:34
Agradecido : 1352 veces
Agradecimiento recibido: 1118 veces

Re: Sonido controlado por interrupciones IRQ

Mensajepor pser1 » 14 Ene 2017 13:44

minter escribió:El comando PLAY acapara el uso de la CPU?
Puede ser llamado desde el asm? Supongo que si, pero Gabriel está preparando una llamada al DAC desde irqs?
Después de arreglar el coche, voy a buscar como tiene que ser los parámetros para la reproducción de sonidos. Forma de onda, ataque, frecuencia... Osea, ver cómo se parametrización el DAC.

Utilizar comandos internos del Basic utilizaría casi exclusivamente toda la CPU.
Simon Jonassen me dió (en Facebook) el fichero fuente que le pasó a Gabriel.
Básicamente es un programa que utiliza las dos interrupcions IRQ que se generan cada linea (HS9 y cada cuadro (FS)
para hacer cáculos sobre los patrones que se quieren reproducir y el otro para enviar los datos al DAC (conversior 6 bits)
Su programa de muestra mezcla dos canales de sonido, pero a la velocidad de reproducción que tiene, no resulta muy útil
ya que se come demasiado tiempo de CPU

Yo preferiría algo que permitiera tener una canción entrada como nota/duración al estilo partitura, mas que los patrones.
Incluso preferiría compilar la partitura a valores uniformemente espaciados en el tiempo y luego tener una rutina que cada
cierto tiempo (n IRQ de linea) tome un valor y lo envíe al DAC, sería lo *menos* caro para CPU, supongo

Esta tarde os subiré el ejecutable resultado de compilar dicho fichero algo retocado para que finalice y regrese al Basic ...

saludos
pere

Avatar de Usuario
pser1
Mensajes: 4094
Registrado: 08 Dic 2012 18:34
Agradecido : 1352 veces
Agradecimiento recibido: 1118 veces

Re: Sonido controlado por interrupciones IRQ

Mensajepor pser1 » 14 Ene 2017 16:49

Hola,
al final, medio entendiendo lo que hace el reproductor de patrones a dos canales de Simon Jonassen
os adjunto un disco virtual VDK con el compilado
Para probar solo hay que hacer:
RUN"S

Y veréis la *tira* de CPU que se come, claro que reproduce dos canales.
Por cierto a mi me recuerda la musiquilla del juego "Shocktrooper"
A ver si os pasa lo mismo a vosotros ...

Tened en cuenta que esto es un esbozo, borrador como queráis llamarle, y por tanto está lejos de
ser un programa optimizado. Este es el trabajo que se supone que deberíamos hacer nosotros
A ver quien se anima a estudiarlo. Os adjunto el fichero fuente que he parcheado hoy. -nb -nb -nb
Los comentarios, al estar acostumbrado a colaborar con Simon Jonassen los he hecho en
inglés (por si se tercia hablar con el -507 )

saludos
pere
39s - IRQ Sound Demo.zip
(1.71 KiB) Descargado 53 veces

IRQS04.zip
Fuente
(3.04 KiB) Descargado 51 veces

Avatar de Usuario
minter
Mensajes: 4826
Registrado: 22 Jul 2014 18:51
Agradecido : 6762 veces
Agradecimiento recibido: 2602 veces

Re: Sonido controlado por interrupciones IRQ

Mensajepor minter » 14 Ene 2017 22:07

Probado!
Efectivamente, se ralentiza bastante.
Pero para este juego, la música ingame igual no puede ser. Pero el lanzar las notas de tiburón después de cada evento o situación, igual no perjudica mucho.
Ejemplo: le da las llaves, y suena únicamente tiiiii niiii. Del tamaño de un patern.
Se acerca al coche, y el patern es el doble. Tiiiii niiii, tiiiii niiii... Y dice el sherift... Que suena?
Ahora es enterarse en pasar la música de tiburón a dragón.
Por cierto, vi que algunos juegos de dragón hasta hablan, como el Superboy.

Avatar de Usuario
pser1
Mensajes: 4094
Registrado: 08 Dic 2012 18:34
Agradecido : 1352 veces
Agradecimiento recibido: 1118 veces

Re: Sonido controlado por interrupciones IRQ

Mensajepor pser1 » 15 Ene 2017 16:59

Ayer estuve hasta altas horas de la noche comentando el tema del Sonido
para el juego con Simon Jonassen.
Me aclaró partes del programa que yo *no tenía* muy claras.
Ahora mismo yo calificaría dicho motor como un programa
que lee una partitura con dos voces, siendo lo que ellos llaman patrones
algo parecido a un compás de una partitura std donde tu metes las notas
individuales para cada canal.
Como las notas se cambian cada 3 interrupciones de cuadro, en PAL europeo
(50Hz freq de red) implica 50/3, aproximadamente 16 veces por segundo.
Entonces cada patrón con 16 parejas de notas produce música durante un segundo.
Si una nota debe durar mas de 1/16avo entonces la repetimos las veces necesarias
hasta obtener la duración deseada. Por ejemplo 4 veces para crear una nota de 1/4
Las notas se sacan de una tabla calculada a partir de la escala temperada basada
en el LA de 440Hz
Seguiré con Simon con este tema a ver si conseguimos optimizar el player lo suficiente
como para no afectar la jugabilidad.
Yo, espero que los bucles de retardo que puse tras *cada* fotograma en movimiento
den margen suficiente para que no se note la carga de CPU por culpa de la música.

seguimos en contacto
pere

Pd Animaros y entrad en este hilo para dar vuestras ideas / ayudas -thumbup -drinks -nb

Avatar de Usuario
minter
Mensajes: 4826
Registrado: 22 Jul 2014 18:51
Agradecido : 6762 veces
Agradecimiento recibido: 2602 veces

Re: Sonido controlado por interrupciones IRQ

Mensajepor minter » 16 Ene 2017 11:58

Buenas,

Voy a intentar explicarme (pensando en alto) como funciona en sonido en Dragón.

Primeramente, veamos como se comporta el comando PLAY, de su manual de referencia:

El comando PLAY dispone de varios parámetros:

Notas:
Las notas emplean la notación anglosajona, A B C D E F G, o un número entre 1 y 12.
El equivalente latino sería C (do) D (re) E (mi) F (fa) G (sol) A (la) B (si)
Sabiendo que existen 7 notas básicas: Do, Re, Mi, Fa, Sol, La y Si, usando las alteraciones (sostenidos y bemoles) podemos crear otras notas diferentes para completar 12 sonidos que se repetirán a lo largo de todo el espectro auditivo.

Do, Do#, Re, Re#, Mi, Fa, Fa#, Sol, Sol#, La, La# y Si

O lo que es lo mismo:

C, C#, D, D#, E, F, F#, G, G#, A, A# y B

Si se poner detrás un signo "#" o "+", la nota es Sostenida y si se pone "-" es Bemol

Octava:
En el comando PLAY la octava se indica mendiante la letra "O" seguida de un número entre 1 y 5.

Las notas musicales se repiten en diferentes alturas, por lo tanto todo el ciclo de notas musicales que vimos anteriormente, vuelve a empezar, esto quiere decir que después de Si, empieza otra vez Do, Re, Mi, etc. A todo el ciclo completo de notas de Do a Do, o de Re a Re o de cualquier nota hasta volver a ella misma, lo llamamos una octava.

Duración de la nota:
"L" seguida de un número entre 1 y 255.

Intensidad:
"V" seguida por un número entre 1 y 31

Duración del silencio:

"P" seguida por un número entre 1 y 255. Suponemos que "P" es una pausa o en música sería silencio.

No me enrrollo más y ahora salto al programa de música adjuntado por pser1.

Sin entrar en profundidad en el programa, podríamos resumirlo como enviar datos al DAC de la PIA 1 A.
Dicho de otro modo, enviar las notas musicales al conversor digital analógico del dragón.
Esta información es enviada a la PIA a su puerto 1 situado en la dirección $ff20.

SOUND, PLAY ... o lo que queramos que genere audio (mediante asembler) para que vaya al mezclador de video es necesario ser enviado a este puerto.

Vale, por ahí lo tengo claro...

Ahora veamos las tablas que tiene el programa de música en ensamblador.
Nos encontramos con una tabla que contiene 12 notas por octava, pero en frecuencia.
¿De que me suena eso?
Pues me suena a las notas contenidas en toda una octava, 12 notas.
Tenemos 7 octava, bueno 6, con las frecuencias de cada nota.

fdb 4355,4613,4888,5178,5486,5813,6158,6524,6912,7323,7759,8220

C C# D D# E F F# G G# A A# B

También hay que tener en cuenta, que cada octava en frecuencia es el doble a la anterior.

Do en una octava media en 4355. Y en una octaba superior es el doble 8709. Y en otra más superior, otra vez el doble, 17418.

Por lo que tenemos en esa tabla, ni más ni menos que las notas músicales.


Una melodía de Tiburón sería:

A A#

A A#

A A# A A# A A# G G# A A# A A# A A# G G#

O lo que es lo mismo:

Con una ocatava un grave:

1831 1940
1831 1940
1831 1940 1831 1940 1831 1940 1831 1940 1631 1728 1831 1940 1831 1940 1831 1940 1831 1940 1631 1728

Bueno, esto es lo que interpreto por el momento.

Avatar de Usuario
pser1
Mensajes: 4094
Registrado: 08 Dic 2012 18:34
Agradecido : 1352 veces
Agradecimiento recibido: 1118 veces

Re: Sonido controlado por interrupciones IRQ

Mensajepor pser1 » 16 Ene 2017 14:52

@minter,
me guardaré tu mensaje, pero la información de como utilizar el intérprete de Basic para producir sonidos
*NO* nos va a ayudar para nada ya que lo que necesitamos es un sistema gobernado por interrupciones
que nos permita dedicar parte de la CPU al juego y parte a sonido.
El BASIC simplemente requiere la CPU al 100% por lo que queda, de entrada, descartado -banghead

Yo os subí un fuente que genera sonido (es un esbozo, sin otimizar) por si alguien quiere
arremangarse y hacerlo correr como una liebre. -nb
Yo estoy haciendo pruebas por mi parte y si hace falta contactaré con Simon Jonassen
para acelerarlo el máximo posible.
Estudiar cómo funciona también puede hacer que alguien proponga una alternativa basada
en IRQ que de mejores resultados -thumbup

saludos
pere

Avatar de Usuario
pser1
Mensajes: 4094
Registrado: 08 Dic 2012 18:34
Agradecido : 1352 veces
Agradecimiento recibido: 1118 veces

Re: Sonido controlado por interrupciones IRQ

Mensajepor pser1 » 16 Ene 2017 15:20

minter escribió:Buenas,
No me enrollo más y ahora salto al programa de música adjuntado por pser1.
Sin entrar en profundidad en el programa, podríamos resumirlo como enviar datos al DAC de la PIA 1 A.
Dicho de otro modo, enviar las notas musicales al convertidor digital analógico del dragón.
Esta información es enviada a la PIA a su puerto 1 situado en la dirección $ff20.

Ahora veamos las tablas que tiene el programa de música en ensamblador.
Nos encontramos con una tabla que contiene 12 notas por octava, pero en frecuencia.
¿De que me suena eso?
Pues me suena a las notas contenidas en toda una octava, 12 notas.
Tenemos 7 octava, bueno 6, con las frecuencias de cada nota.
fdb 4355,4613,4888,5178,5486,5813,6158,6524,6912,7323,7759,8220

Veamos, las tablas *NO* son las frecuencias ya que valores de frecuencia enviados al DAC
*NO* darían ningún resultado real.

En realidad son cifras calculadas a partir de las frecuencias estándar de la escala temperada
de forma que sumándolas cada cierto intervalo de tiempo producen una onda triangular-rampa
de la frecuencia deseada.
Un caso límite seria el siguiente (imaginemos que los valores para el DAC fuesen de 0 a 63)
- primer paso 32
- segundo paso 32+32 = 0
- tercer paso = primer paso 0+32 = 32
Así se obtiene una onda (casi cuadrada en este caso) que oscila entre 0 y 32
a mitad de la frecuencia de actualización de datos en el DAC
Otro caso podría ser:
- primer paso 16
- segundo paso 32
- tercer paso 48
- cuarto paso 0
- quinto paso = primer paso = 16
Esto produciría una frecuencia la mitad de la anterior (una octava mas baja)
Vemos que el truco está en ir sumando un valor constante cada cierto tiempo
con lo cual el numero de ciclos que se producen depende de dicho valor que es función
de la frecuencia deseada.
Y ¿Cómo se las apaña el programa para enviar datos al DAC periódicamente?
Pues basándose en el IRQ que genera el VDG por cada línea de pantalla
En realidad actúa UNA de cada TRES lineas para no agobiar demasiado la CPU
La frecuencia de los HS es de 15.750 por segundo, dividido por tres, nos
da un ritmo de 5.250 datos por segundo.
Aplicando el principio de Nyquist, el sampleo mínimo exige dos valores por cada
ciclo de señal (por lo menos), esto implica que la mayor señal que podremos generar
por este método será de 2.625 Hz Y de ahí hacia abajo lo que nos convenga!

Para quien esté interesado en el tema, os diré que el valor que se va acumulando
de la forma antes mencionada, se cambia (o se mantiene) leyendo un valor de
los Patrones. Esto se lleva a cabo en la parte de tratamiento de las interrupciones
de cuadro (FS), cada cuatro cuadros (u otra cifra) se lee otra nota (en realidad
un par de notas ya que el player mezcla dos canales) y se envía al DAC
Si tenemos un sistema PAL (50 frames) serían 50/4 = 12,5 cada segundo
Este valor determina la DURACION mínima de una nota.
Cada entrada de un patrón tendrá esta duración, si queremos que dure *mas*
hay que poner el mismo valor varias veces en el mismo patrón.

Y hasta aquí lo que he entendido yo de como furrula este programa.
Siento el peñazo, pero seguro que para quien esté interesado en el tema
le va a gustar conocer una posible solución.

saludos
pere

Invisible
Mensajes: 9
Registrado: 16 Ene 2017 16:35
Agradecimiento recibido: 4 veces

Re: Sonido controlado por interrupciones IRQ

Mensajepor Invisible » 16 Ene 2017 16:41

RIGHT...

Im Simon Jonassen

and ask me anything about IRQ sound or other mad stuff on the Dragon / CoCo

Avatar de Usuario
pser1
Mensajes: 4094
Registrado: 08 Dic 2012 18:34
Agradecido : 1352 veces
Agradecimiento recibido: 1118 veces

Re: Sonido controlado por interrupciones IRQ

Mensajepor pser1 » 16 Ene 2017 16:49

Hi Simon,
pleased to have you as a member of the Retrowiki!
Hope you enjoy it ... despite the language problems.

till l8r
pere

Invisible
Mensajes: 9
Registrado: 16 Ene 2017 16:35
Agradecimiento recibido: 4 veces

Re: Sonido controlado por interrupciones IRQ

Mensajepor Invisible » 16 Ene 2017 16:52

pser1 escribió:Hi Simon,
pleased to have you as a member of the Retrowiki!
Hope you enjoy it ... despite the language problems.

till l8r
pere


Thank you Pere

Avatar de Usuario
pser1
Mensajes: 4094
Registrado: 08 Dic 2012 18:34
Agradecido : 1352 veces
Agradecimiento recibido: 1118 veces

Re: Sonido controlado por interrupciones IRQ

Mensajepor pser1 » 16 Ene 2017 17:31

Hola compañeros,
ya tenemos en nuestro grupo al genio de las demos C-64 y por supuesto CoCo2/Dragon y
ahora también CoCo3
Espero que sepamos aprovechar para aprender montañas de trucos de programación que
llevan a nuestras máquinas mas allá de los límites previstos por los fabricantes!

saludos
pere

Avatar de Usuario
minter
Mensajes: 4826
Registrado: 22 Jul 2014 18:51
Agradecido : 6762 veces
Agradecimiento recibido: 2602 veces

Re: Sonido controlado por interrupciones IRQ

Mensajepor minter » 16 Ene 2017 17:46

Wellcome Simon!!!
And please to meet you! -drinks

jltursan
Mensajes: 5619
Registrado: 20 Sep 2011 13:59
Ubicación: Madrid
Agradecido : 990 veces
Agradecimiento recibido: 2040 veces
Contactar:

Re: Sonido controlado por interrupciones IRQ

Mensajepor jltursan » 16 Ene 2017 18:12

Welcome Simon!

Simon himself has developed 1-bit (PWM based) routines, doesnt fit the needs?, or are they too slow?.
Using this technique open the door to use Windows tools like Beepola :-)

Invisible
Mensajes: 9
Registrado: 16 Ene 2017 16:35
Agradecimiento recibido: 4 veces

Re: Sonido controlado por interrupciones IRQ

Mensajepor Invisible » 16 Ene 2017 19:02

jltursan escribió:Welcome Simon!

Simon himself has developed 1-bit (PWM based) routines, doesnt fit the needs?, or are they too slow?.
Using this technique open the door to use Windows tools like Beepola :-)


1bit routines are far too slow here.... i did use beepola for the 1bit

with this player you can actually use 2 voices and use a PC based XM tracker.... (i have conversion routines)

i posted PSER a new (MUCH FASTER) routine for IRQ this afternoon.... hopefully he will be able to explain how it works in spanish (not my strong point)

/Simon :-)


Volver a “Software Dragon”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 5 invitados