Sonido controlado por interrupciones IRQ

Avatar de Usuario
pser1
Mensajes: 2015
Registrado: 08 Dic 2012 18:34
Agradecido : 198 veces
Agradecimiento recibido: 184 veces

Re: Sonido controlado por interrupciones IRQ

Mensajepor pser1 » 23 Ene 2017 18:02

Último mensaje de la página anterior:

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

Avatar de Usuario
kikems
Mensajes: 1975
Registrado: 30 May 2013 19:23
Agradecido : 306 veces
Agradecimiento recibido: 559 veces

Re: Sonido controlado por interrupciones IRQ

Mensajepor kikems » 23 Ene 2017 23:45

No entiendo la mitad de lo que ponéis en este hilo, pero mola un montón, jajj.

Avatar de Usuario
minter
Mensajes: 1504
Registrado: 22 Jul 2014 18:51
Agradecido : 728 veces
Agradecimiento recibido: 351 veces

Re: Sonido controlado por interrupciones IRQ

Mensajepor minter » 24 Ene 2017 12:20

La generación de la forma de onda del ruido blanco es aleatorio. O eso creo recordar.
¿Se puede hacer una pequeña tabla con valores aleatorios y que sea llamada la interrupción de sonido en cada fotograma de pies abiertos?
Así lanzamos esa tabla al DAC a ver que suena.
Tendría que ser una reproducción equivalente en tiempo al retardo que hay entre fotogramas. Solo que el retardo del fotograma de pies abiertos se puede sustituir por el ruido.
Si lo pusiéramos en pies juntos, igual caería en un bucle, reproduciendo todo el rato el ruido blanco.
No se... es una idea.
Efectivamente, en muchos equipos con hardware adicional, ya tienen esos generadores incorporados. pser1, lo tuyo es titánico luchando contra los elementos hardware. -drinks

Avatar de Usuario
Chema
Mensajes: 1653
Registrado: 21 Jun 2012 20:13
Ubicación: Gijón
Agradecido : 582 veces
Agradecimiento recibido: 221 veces
Contactar:

Re: Sonido controlado por interrupciones IRQ

Mensajepor Chema » 24 Ene 2017 13:55

Ya te digo... Yo uso también ruido blanco, aunque no puro, para los pasos. Habría que probar.

Para que parezca un paso debe durar poco (en mi caso creo que sobre 0.16 segundos, porque es una nota y una nota dura 8 períodos a 50Hz - en mi motor se puede cambiar, pero ese es el valor para los efectos de sonido).

En el AY la onda es cuadrada y se mantiene a cada estado (alto/bajo) un número de ciclos de reloj que depende de la frecuencia elegida. Cuando se añade ruido lo que se hace (más o menos, según creo entender) es aleatoriamente poner a cero el estado de la salida. Estos cambios aleatorios son los que se hacen a la frecuencia elegida para el ruido.

Es un poco rollo, y no sé si me he explicado bien.

A ver si puedo poner un seudocódigo sencillo y aproximado (al fin y al cabo, es sólo la idea general)

Código: Seleccionar todo


n=0; Bitruido=1;
Cada IRQ hacer:
 si n es igual al período seleccionado para el ruido hacer
   Bitruido=aleatorio(0,1); //  0 ó 1
   n=0;
 finsi
 Calcula la salida que toca (si es cuadrada será un valor min o max durante un numero de IRQs dependiendo de la frecuencia de la nota)
 Salida=Salida*Bitruido; // Esto mete los cambios aleatorios, generando el ruido
 Mandar Salida al DAC;
fin


Esto es lo que he sacado de la emulación del AY de oricutron: https://github.com/pete-gordon/oricutron/blob/master/8912.c pero la salida es siempre una onda cuadrada, cuando en tu caso es triangular, así que igual se pueden hacer otras cosas...

Por cierto, eso añade ruido a una nota. Se puede poner sólo la salida del ruido también...

(Intentando ayudar desde la ignorancia, que conste)

Avatar de Usuario
minter
Mensajes: 1504
Registrado: 22 Jul 2014 18:51
Agradecido : 728 veces
Agradecimiento recibido: 351 veces

Re: Sonido controlado por interrupciones IRQ

Mensajepor minter » 24 Ene 2017 14:59

Chema escribió:(Intentando ayudar desde la ignorancia, que conste)


Si, claro! Tú ignorante, eh?
Que te crees tu eso, cara de queso!!! -507

Claro... SkoolDaze, 1999, Oricium, 7 de Blake... etc... los hace un ignorante en programación!!! -shock

Y hablando de sonido... Igual no hace ni falta el crear una tabla para el ruido blanco.
Igual simplemente mandando unas posiciones de memoria, por ejemplo, las del propio programa, ya tenemos ruido blanco. Sería como reproducir el programa, pero a través del altavoz. :D

Avatar de Usuario
pser1
Mensajes: 2015
Registrado: 08 Dic 2012 18:34
Agradecido : 198 veces
Agradecimiento recibido: 184 veces

Re: Sonido controlado por interrupciones IRQ

Mensajepor pser1 » 24 Ene 2017 15:10

muchas gracias a todos por vuestras aportaciones.
Estoy tratando de recopilar el máximo de información sobre generación / imitación de ruidos
en Dragón. Como no, otro nuevo mundo para mí.
Simon incluso planteaba usar la salida de 1-bit para ello, olvidando el DAC, cosa que, creo, debe
ser hacerse cambiando el valor de la salida de 1-bit entre 0 y 1 con lo cual se genera una onda
cuadrada de anchura de pulso variable, lo cual genera diversos armónicos y la frecuencia base
se puede controlar contando los cambios de 1 a cero y de cero a 1
Ya iremos viendo las posibilidades ...

saludos
pere

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

Re: Sonido controlado por interrupciones IRQ

Mensajepor gacaffe » 24 Ene 2017 19:51

*** GENERACIÓN DE RUIDO ****
Hola,

Os mando varios algoritmos en pseudocódigo para genera ruido. Me he basado en la idea de usar un LFSR para generar números pseudoaleatorios intentando realizar el menor número posible de operaciones. La idea es disponer de un registro de desplazamiento que cada ciclo de reloj se va desplazando un bit a la izquierda (también podría ser a la derecha...) y se introduce un nuevo bit en el bit menos significativo. Este nuevo bit es la XOR de varios bits del registro.

Prueba 1:
He probado a utilizar un byte y hacer la XOR de 1, 2 y 3 bits sin conseguir buenos resultados. Siempre me salen señales periódicas.

Prueba 2:
Sin embargo con 16 bits y la XOR de dos bits, sí he conseguido generar una señal de ruido. No es ruido 100% blanco: tiene componentes en todas las frecuencias, pero se fomentan las altas frecuencias. Pero bueno, no suena mal, aunque se notan las altas frecuencias.

El pseudocódigo:

Código: Seleccionar todo

rnd=65535 (2 bytes)
begin loop{
wait_for_DAC();      
rnd=rnd*2 + (rnd(15) xor rnd(10);    # generar ruido
send_to_DAC(rnd(7:0))           # enviar byte menos significativo al DAC
}end loop




Prueba 3:
Por otra parte he conseguido generar ruido con un contador de 8 bits y aplicando desplazamiento de un bit y añadiendo un bit (XOR de otros dos bits). También suena bastante bien y este si es aparentemente blanco.

Código: Seleccionar todo

rnd=0 (1 byte)
cnt=0 (1 byte)
begin l loop{
wait_for_DAC();      
rnd=(rnd+cnt)*2 + (rnd(7) xor rnd(4);
cnt=cnt+1
send_to_DAC(rnd)      # enviar rnd al DAC
}end loop


Prueba 4:
En esta prueba disponemos de 256 muestras de ruido cuantificado a 6 bits en un buffer (o look-up table si queréis). Lo que hacemos es leerlo utilizando el propio valor de ruido para calcular la posición de la siguiente muestra. He utilizado 256 muestras para que sea gratis el cálculo del módulo 256. He generado ruido durante un segundo y suena perfecto. No he probado a utilizar otros tamaños de buffer como por ejemplo 128 o 64. Si queréis lo pruebo.
El resultado es tan bueno (o mejor) como la prueba 3 y creo que computacionalmente es el más rápido. Os puedo pasar la tabla con los 256 valores si os gusta este algoritmo.



Código: Seleccionar todo

noise[256]={...};   # array de 256 bytes con ruido blanco uniformes (precision de 6 bits)
cnt=0;   # esto es un byte para que las direcciones estén siempre entre 0 y 255
loop{
wait_for_DAC()
rnd=noise(cnt);
cnt=cnt+rnd;
send_to_DAC(rnd);
}


Ahora habría que ver si no es muy costoso implementar esto en ensamblador. Creo que las pruebas 3 y 4 son las más interesantes.

Para conseguir que el ruido sea más grave basta con repetir las muestras cada n lamadas al DAC. He probado manteniendo cada 2 y 3 llamadas al DAC y se consigue el efecto de ruido más grave.

Espero no haber hecho mucho ruido con todo esto ;)

Avatar de Usuario
pser1
Mensajes: 2015
Registrado: 08 Dic 2012 18:34
Agradecido : 198 veces
Agradecimiento recibido: 184 veces

Re: Sonido controlado por interrupciones IRQ

Mensajepor pser1 » 24 Ene 2017 22:01

Hola Gabriel,
yo he estado jugando con una versión del player actual haciendo que lea bytes de la ROM de Basic de Dragón
sin conseguir grandes resultados.
El problema no es solo de los datos, sino también del ritmo al que hay que leerlos y durante cuanto tiempo.
Muchos factores para acertar la quiniela -507
Obviamente puedo hacer un PRINT #-2, RND(0)*256 en un bucle 256 veces y tendré una lista creada por Dragón que
*puede* que sea realmente aleatoria, ya veremos, es una posibilidad
La segunda parte es que debe ser procesada en los HS para mantener el movimiento de Brody aceptable, como en
la versión que subí con música ... no vale usando el 100% de la CPU

saludos
pere

Avatar de Usuario
pser1
Mensajes: 2015
Registrado: 08 Dic 2012 18:34
Agradecido : 198 veces
Agradecimiento recibido: 184 veces

Re: Sonido controlado por interrupciones IRQ

Mensajepor pser1 » 26 Ene 2017 17:42

Buenas tardes,
he actualizado el VDK de la demo añadiendo un efecto de pasos para el
movimiento del jefe Brody. Podéis descargarla en el otro hilo.
A ver si alguien echa una mano y nos sorprende con unos cuantos efectos sonoros
sean en forma de código ensamblador de alguna máquina de 8 bits o en formato
WAV, ya nos buscaremos la vida para extraer parte de las muestras para no cargar
demasiado la CPU ni devorar toda la RAM -nb -nb

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