Sonido controlado por interrupciones IRQ

Avatar de Usuario
luiscoco
Mensajes: 2335
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 34 veces
Agradecimiento recibido: 45 veces
Contactar:

Re: Sonido controlado por interrupciones IRQ

Mensajepor luiscoco » 18 Ene 2017 13:34

Último mensaje de la página anterior:

Interesante, usar un SID como DAC, no sabia que se podía, claro que pierde mucho, yo compre la C64 mas que nada por el SID.

Entonces para nuestro tema, si las interrupciones no están perfectamente espaciadas, y muy cortas entre ellas, o hay rutinas o zonas sin interrupciones se notara en la música.

gacaffe escribió:2. Con el D64 no se pueden usar las IRQs para generar música porque está durante 50 líneas sin generar interrupciones

Una cosa que no entendí es porque la 64k no genera interrupciones?

Con respecto a los limites de DAC, Si como dice @peser1 fisicamente es imposible pasarse, solo hay que prevenir los bits bajos, creo recordar que ponen a imprimir si esta conectada y encendida una impresora.
Pero el se refiere en el ambito musical de como se oye, si baja de golpe se oye chasquido, y si se mantiene a tope se nota distorsión, por eso recomienda bajarlos a 32, yo no estoy de acuerdo, perdería mucho volumen, la suma de los dos canales es en realidad un promedio no una suma lineal.

Otra cosa que no entendí es porque usan esa forma de onda y no senosoidal?, se oye mejor?, no se mucho del tema?.
También se puede usar cualquiera, una forma de guitarra, pianola, sinte, y otras, la musica sonaria como de ese instrumento, claro cortillas, no muy largas, o sea samples cortos.

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

Re: Sonido controlado por interrupciones IRQ

Mensajepor Invisible » 18 Ene 2017 13:50

You can do ALOT of other stuff while playing music on the coco/dragon.....

BUT using IRQ on the dragon32/64/coco is NOT the most effective way to do things....

The coco3 on the other hand is alot better for that purpose.

the trouble with irq driven music on the dragon is the fact that you can only use a normal IRQ and not an FIRQ (firq is tied to cartridge / rs232)

a *normal* irq will stack every single register on the stack before executing and pop all of them on exit, so thats 18 clock cycles to push all registers and 15 to pop all regsiters 18+15=33....... SO ? how wany cycles does one scanline take ???

one scanline is 57 cycles.... oops you ate 33 cycles just for irq entry/exit - not alot of time left over then eh !

can we get around this ?? - sort of ! - make sure your intended playback frequency is half HSYNC (hsync is 15750 Hz).....

now WHY do we want to do that ?? - well imagine checking EVERY hsync (262 for NTSC 312 for PAL) if you ate 33 cycles out of every 57 cycle scanline you would be SLOW !! hows about you only eat 33 cycles every 2 scanlines (half the hsync speed)....

HOW do we do this then ??? - well,make your player (including irq entry/exit) as close to MORE than 57 cycles as possible - this way you get past the second hsync pulse (the irq entry masks out subsequent irqs)

when Pere posts the NEW code, all will become clear !

in this video i am moving a whole 3K of screen on the coco 2 with music (the same code as i have given to pere and to gabriel) but im NOT using IRQ (i told you it wasnt the best way to do it)

/Simon :-)

https://www.youtube.com/watch?v=prkZSet3MbM

Avatar de Usuario
luiscoco
Mensajes: 2335
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 34 veces
Agradecimiento recibido: 45 veces
Contactar:

Re: Sonido controlado por interrupciones IRQ

Mensajepor luiscoco » 18 Ene 2017 14:02

PUSH utiliza 5+ 1 por cada byte PUSHED

OK, no IRQ

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

Re: Sonido controlado por interrupciones IRQ

Mensajepor Invisible » 18 Ene 2017 14:10

pshs x,y,u,cc,dp + mask irq on entry = 18 cycles
rti = 15 cycles out

FIRQ only pushes cc,dp - ALOT FASTER

using every OTHER scanline gives you *room* to work with

about the d64 - the video circuit is different than the d32 - the d32 inserts extra hsync pulses for the extra 50 scanlines on a PAL frame (NTSC only has 262 scanlines) - the d64 does NOT insert the hsync pulses - so for 50 scanlines you have NO IRQ signal

ANOTHER way to do this is to interleave a jsr note in your code every nn clock cycles - then you are not relying on the IRQ - but this can and will be hard to do

/Simon :-)

Avatar de Usuario
luiscoco
Mensajes: 2335
Registrado: 15 May 2011 04:23
Ubicación: Caracas, Venezuela
Agradecido : 34 veces
Agradecimiento recibido: 45 veces
Contactar:

Re: Sonido controlado por interrupciones IRQ

Mensajepor luiscoco » 18 Ene 2017 14:18

Very dificult, no best sincro

Avatar de Usuario
pser1
Mensajes: 2052
Registrado: 08 Dic 2012 18:34
Agradecido : 204 veces
Agradecimiento recibido: 211 veces

Re: Sonido controlado por interrupciones IRQ

Mensajepor pser1 » 19 Ene 2017 18:04

Estuve preparando una respuesta para Luis, pero creo que mejor la subo genérica para todos los que deseen
conocer mas a fondo los entresijos de este player

Veamos, para formar una onda sonora del cualquier tipo hay que enviar valores a intervalos constantes.
Si enviamos de golpe 20 datos (en la práctica nos frenaría el propio tiempo de reacción del DAC)
al estar separados por microsegundos lo que podria producir es una frecuencia demasiado alta ...
Sabemos que para hacer un sonido de, por ejemplo 880 ciclos, hemos de enviar 1.760 valores en un segundo o más (cero, máximo y repetir)
Teniendo en cuenta que la rutina de envío se ejecuta cada dos interrupciones horizontales (líneas de pantalla) que se producen
a un ritmo de 15.750 por segundo, la mitad es 7.875 posibles envíos de datos por segundo.
La máxima frecuencia reproducible, bajo estas condiciones, será de 3.937,5 Hz que no está nada mal!
El truco para crear la rampa ascendente (sawtooth) está en encontrar el número mágico que incrementado por si mismo
vaya produciendo un escalonado que desborde y empiece de nuevo por cero lo más cerca posible del tiempo equivalente
a un ciclo de dicha frecuencia (t = 1/f)
Tenemos claro que para generar 3.937,5Hz necesitamos dos valores (de hecho no podríamos enviar mas), o sea
Numero de valores = 7.875 / frecuenciaDeseada
Para 880 Hz seria 7.875 / 880 = 8,9488636 ... mantengo decimales porque a lo largo del tiempo este sería el promedio.
Al enviar 7875 datos por segundo el tiempo de cada uno es 1/7.875 = 0,127 milisegundos
El tiempo necesario para 8,9488636 valores es de: 8,9488636 x 0,127 mseg = 1,1365 mseg --> 879,89 Hz (casi 880)

Entonces, ¿Cual es el valor mágico que habrá que ir enviando (y acumulando) en el DAC?
Para volver a iniciar un nuevo ciclo debemos llegar al valor máximo y rebasarlo ... 256 -> 0
Luego el valor inicial será 256/número de pasos = 256/8,9488636 = 28,606984
Lo multiplicamos por 256 para tener enteros en el byte alto y los decimales en el byte bajo (mayor precisión)
Valor Tabla = 28,606984 * 256 = 7323 -> $1c9b (28 : 155)

Los valores acumulados a lo largo de los sucesivos envíos serán:
7.323, 14.646, 21.969, 29.292, 36.615, 43.938, 51.261, 58.584, 65.907 - > 371
El décimo valor será 7.323+371 (decalaje debido a los decimales del numero de pasos), empezando un nuevo ciclo.
Abajo he tratado de mostrar con caracteres de texto la presunta gráfica de diente de sierra obtenida.
880Hz                 __                         __ 
__8 | __8 |
__7 | __7 |
__6 | __6 |
__5 | __5 |
__4 | __4 |
__3 | __3 |
__2 | __2 | __
1 |__1 |__1
0 9 9

saludos
pere

Avatar de Usuario
pser1
Mensajes: 2052
Registrado: 08 Dic 2012 18:34
Agradecido : 204 veces
Agradecimiento recibido: 211 veces

Re: Sonido controlado por interrupciones IRQ

Mensajepor pser1 » 19 Ene 2017 18:09

Otro tema importante es como el player resuelve el temido problema del overclipping
ya que estamos sumando dos valores (uno de cada canal) y ambos pueden tener un valor de hasta 255
El truco está en sumar ambos valores en el registro A y luego aplicar una operación de dividir por dos,
PERO que en realidad se aplica a *NUEVE* bits: RORA
Afecta al "CARRY" y al registro A, de forma que si hubo overflow, el carry vuelve a entrar en el bit7 dando el resultado correcto
Podéis hacer cuantas pruebas queráis.
Son la maravillas de la aritmética binaria -507

saludos
pere

Avatar de Usuario
pser1
Mensajes: 2052
Registrado: 08 Dic 2012 18:34
Agradecido : 204 veces
Agradecimiento recibido: 211 veces

Re: Sonido controlado por interrupciones IRQ

Mensajepor pser1 » 19 Ene 2017 18:23

Y ahora vayamos a por hechos, no palabas ....
Os adjunto un fichero VDK a probar en un Dragon32 ya que como bien os comentó Simon
nuestro querido Dragon64 lleva un defecto de diseño que no le permite enviar avisos de linea
a lo largo de 50 de ellas ... esos ingenieros de Dragon Data nos la dieron -banghead
En el disco hay tres ejecutables y tres programas basic para lanzarlos:
- RUN"S03 ejecutará el player versión actual tocando escalas de "prueba"
además juega pokeando al programa para que suene una vez o dos veces.
Al final lo configura para secuenciar solamente una nota cada vez y lo va llamando
dentro de un bucle. ¿El problema? Pues que lo está haciendo el Basic con todos los
los inconvenientes que esto implica, resultando en lentitud ... pero funciona y mejor desde ensamblador -thumbup

- RUN"S04 ejecutará el mismo player para que toque una partitura, que he entrado a manija y por tanto contiene errores
sobre seguro ... Es la canción "Hey Jude" de los Beatles. En el fuente veréis de donde la he sacado
Contiene la melodia y un bajo como acompañamiento (dos canales)

- RUN"S21 ejecutará el player con una demo increíble que ha preparado Simon con las herramientas que tiene en su PC
39s - IRQ Sound Demo03.zip
(3.52 KiB) Descargado 18 veces

saludos
pere

Pd He procurado montar una serie de equates en el fuente para facilitar la entrada manual de una canción
poniendo los nombres de la escala en plan C_3, D_3, As3, etc. Viendo la partitura lo veréis mas claro
En un zip os adjunto los fuentes de las tres versiones del player (03, 04, 21)
Fuentes_Players.zip
(11.93 KiB) Descargado 16 veces

Avatar de Usuario
pser1
Mensajes: 2052
Registrado: 08 Dic 2012 18:34
Agradecido : 204 veces
Agradecimiento recibido: 211 veces

Re: Sonido controlado por interrupciones IRQ

Mensajepor pser1 » 19 Ene 2017 18:27

Mas madera!
El programa está hecho de forma que la partitura, como ya habréis observado queda al final del todo.
Esto permite un truco interesante para quien quiera usarlo ...
Como la partitura siempre empieza en el mismo punto de memoria RAM, podremos cargar de disco
cualquier bloque de notas cuando queramos, facilitando cambios de música según escenas -thumbup
Además el reproductor es bastante programable: Tempo, Número de repeticiones, Una sola nota
Ya iremos viendo que utilidad le podemos dar a estas funciones ...

saludos
pere

Avatar de Usuario
pser1
Mensajes: 2052
Registrado: 08 Dic 2012 18:34
Agradecido : 204 veces
Agradecimiento recibido: 211 veces

Re: Sonido controlado por interrupciones IRQ

Mensajepor pser1 » 19 Ene 2017 18:35

Finalmente,
para conocimiento general, el programa está dividido en varias secciones.
Al ejecutar su punto de entrada, instala y deja residente el reproductor (player)
que al no tener nota alguna, no sonará nada.
Luego tenemos el player propiamente dicho que se limita a reproducir continuamente
las dos notas que le hayamos suministrado (0=silencio)
Finalmente el secuenciador que ahora está en el mismo bloque es la parte que debe
incorporarse al programa / juego que vaya a usar el payer. Su misión es ir enviando
pares de notas al player a periodos regulares, cada N cuadros ó FS
Este trabajo se *DEBE* realizar en el bucle del juego alternando movimiento con cambio
de notas por parte del secuenciador ...

No sé si me estoy dejando mas cosas en el tintero, pero vamos, que si hay alguna cosa
que no hay quedado clara, no dudéis en formular vuestras preguntas.
Y cualquier sugerencia de mejora en el código será también muy bien recibida -drinks

saludos
pere

Avatar de Usuario
minter
Mensajes: 1684
Registrado: 22 Jul 2014 18:51
Agradecido : 940 veces
Agradecimiento recibido: 428 veces

Re: Sonido controlado por interrupciones IRQ

Mensajepor minter » 20 Ene 2017 16:10

Hey Pere...
Dont make it bad...
Take a Dragon 32 and make it better...
Remember to let it into your memory card...
Then you can start to play it better...


pser1 escribió:Y cualquier sugerencia de mejora en el código será también muy bien recibida


Está fantástico el código. Y con la molestia de poner los comentarios en castellano.
A dos voces. Ya se pueden hacer acordes de quinta. Ya podemos poner alguna canción de OffSpring. -507

En porcentajes aproximados, si se pudiera dar una cifra, que igual no se puede... ¿Cuánta CPU ocupamos durante esta ventana para producir el sonido?
¿Quitará mucho de hacer otros procesos en segundo plano? Como mascaras o ¿Posibles scroll de pantalla para escenarios grandes?

Llevaba un par de días medio loco con el notepad y la macro de jltursan. Que no sabía porqué no me compilaba directamente y me creaba el VDK, sino tenía que hacerlo con la línea de comandos. Y era que no tenía el lwasm en la misma carpeta del notepad. -banghead

Avatar de Usuario
pser1
Mensajes: 2052
Registrado: 08 Dic 2012 18:34
Agradecido : 204 veces
Agradecimiento recibido: 211 veces

Re: Sonido controlado por interrupciones IRQ

Mensajepor pser1 » 20 Ene 2017 16:51

minter escribió:Está fantástico el código. Y con la molestia de poner los comentarios en castellano.
A dos voces. Ya se pueden hacer acordes de quinta. Ya podemos poner alguna canción de OffSpring. -507

Es una posibilidad, otra es tener una linea de bajo y el solista ...
En porcentajes aproximados, si se pudiera dar una cifra, que igual no se puede... ¿Cuánta CPU ocupamos durante esta ventana para producir el sonido?
¿Quitará mucho de hacer otros procesos en segundo plano? Como mascaras o ¿Posibles scroll de pantalla para escenarios grandes?

Hay que probarlo, no puedo garantizar nada, pero mi idea era meterlo en el programa Tiburon este mismo fin de semana
Asi iré descubriendo los problemas que pueden surgir

En el juego se van a presentar por lo menos dos situaciones diferentes:
- Pantallas estáticas a las que se les quiera añadir música
- Pantallas con el Jefe Brody en movimiento. Aquí se podría añadir música o efectos de sonido, o como alguien dirá ... las dos cosas -507
Sabemos que se lleva *MAS* de una linea cada dos, cuanto mas podamos adelgazar el Player y dejarlo cerca de 58 ciclos,
entonces podríamos decir que está usando el 50% de la CPU. Ahora está usando 45 ciclos + 18+15 (IRQ + RTI), lo cual da
78 ciclos sobre dos líneas (57*2=114) esto es un uso del 68,42% digamos que aproximadamente unos 2/3 de la CPU
Si con el 1/3 restante podemos mover el sprite ya seria demasiado!
Os comento resultados en cuanto haya hecho las pruebas
saludos
pere

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

Re: Sonido controlado por interrupciones IRQ

Mensajepor Invisible » 21 Ene 2017 00:17

IT CAN BE DONE !

@pere... WE WILL MAKE IT HAPPEN !!! (you know my madness)

/Simon :-)

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

Re: Sonido controlado por interrupciones IRQ

Mensajepor Invisible » 22 Ene 2017 19:36

heres a little MORE idea... of what we can do with the player as IS

http://www.roust-it.dk/coco/dragon/tune2.zip

enjoy...

i like the fact that my music player might be part of a game

/Simon -shock

gacaffe
Mensajes: 45
Registrado: 08 Dic 2015 18:32
Agradecido : 6 veces
Agradecimiento recibido: 6 veces

Re: Sonido controlado por interrupciones IRQ

Mensajepor gacaffe » 22 Ene 2017 21:28

Invisible escribió:heres a little MORE idea... of what we can do with the player as IS

http://www.roust-it.dk/coco/dragon/tune2.zip

enjoy...

i like the fact that my music player might be part of a game

/Simon -shock


Thanks Simon for the code. I am already checking it. Is it ZANACs music?

Cheers,

Gabriel
A bit of this a byte of that -codrg1 -m3s3x -coam1
http://gacaffe.net

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

Re: Sonido controlado por interrupciones IRQ

Mensajepor Invisible » 23 Ene 2017 14:04

Hey Gabriel,

Yes it is zanac - i converted it from a multitrack MIDI into 2 tracks in XM format (used openMPT/MilkyTracker) and ran the xm through a PERL script i have that produces fcb/fdb data statements

/Simon -grin

Avatar de Usuario
pser1
Mensajes: 2052
Registrado: 08 Dic 2012 18:34
Agradecido : 204 veces
Agradecimiento recibido: 211 veces

Re: Sonido controlado por interrupciones IRQ

Mensajepor pser1 » 23 Ene 2017 18:02

Hola amigos,
acabo de subir la última versión musicalizada de la demo de Tiburón ... en su hilo!

Una vez destapada la botella de la música, ya puestos a enredar, deberíamos
buscar una forma de generar ruidos, sonidos, efectos si queréis llamarle así.
Se me ocurren: pasos cuando camina Brody, apertura de puerta en el coche,
ruido del arranque del motor ...
Lo que nos falta ahora es alguien que conozca como obtener estos ruidos ...
Hay libros de juegos que explican como hacer ruidos de láseres, disparos y otras
cosas que no parecen muy útiles para este juego en cuestión.

En fin, queda abierta la veda ... -thumbup
Se aceptan ejemplos en ensamblador de 6502, de Z-80, de lo que sea, lo importante
es aprender el principio en que se basan para generarlos
Pero sobre todo *NO* deben basarse en hardware adicional sino en el DAC

saludos
pere


Volver a “Software Dragon”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado