Va-De-Re-Tracker / Como programar el chip AY-3-8912 /10

Aquí solo proyectos que incluyan el código fuente

Moderador: Fundadores

Reglas del Foro
Si no se incluyen los fuentes, se debe usar el foro de proyectos de software generales
Avatar de Usuario
tacha Uruguay
Hermano de Lucifer
Hermano de Lucifer
Mensajes: 3167
Registrado: 04 Abr 2013, 20:22
Ubicación: Montevideo, Uruguay
Has thanked: 52 times
Been thanked: 35 times
Contactar:

Va-De-Re-Tracker / Como programar el chip AY-3-8912 /10

Mensaje por tacha »

Cuenta la historia que me estaba haciendo un jueguito en ZX Boriel... cuando quice meterle musiquita con el WizTracker me lleve la sorpresa de que no pude compilar el WizPlayer, pregunte a SanPedro pero no bajo del cielo para contestar. Luego me huce unas musiquitas para compilarlas con el famoso Beepola. Sucedia de que ejecutaba las musicas sin problemas, pero cuando volvia a mi Basic compilado, las variables quedaban flipando y el juego quedaba corrupto. Que podia hacer para hacer musica pero que fuera totalmente compatible con el Boriel Basic? :idea: un Tracker hecho en ZX Boriel ! :D y como a mi me encanta esto de "Make your own lo que sea..." :P

Pasos: No tenia idea de como eran los registros del AY 3-8912, asi que investigando di con un post internetsiano donde tenia esto:
AY REGISTROS

CANAL A
00 - A fine (0-255)
01 - A course (0-15)

CANAL B
02 - B fine (0-255)
03 - B course (0-15)

CANAL C
04 - C fine (0-255)
05 - C course (0-15)

06 - Noise pitch (0-31)

07 - Mixer (see below)

08 - A vol (0-15)
09 - B vol (0-15)
10 - C vol (0-15)

11 - Envelope fine (0-255)
12 - Envelope course (0-255)
13 - Envelope shape (0-15)

14 - I/O port A (0-255)
15 - I/O port B (0-255)
Podemos ver que hay 3 canales de sonido ABC que emiten notas (frecuencias).

El canal "noise" no es un canal en si, que se pueda utilizar independiente de los primeros 3 (como pensaba otrora). El Noise suena a traves de uno, de dos o de los 3 canales, sumandose a las notas (frecuencias) o sonando solito por el canal selecionado.

Hice varios programas en basic investigando como es esto del mixer y los registros de 0 a 255 tratando de encontrar una coherencia :? lamentablemente "lo atamo con alambre" (como decimos en Uruguay)...
Manipulando el registro "mixer" los canales se prendia, se apagaban, se les sumaba el ruido, el ruido salia solo por alguno de ellos... entonces busque 3 configuraciones que iba a utilizar. Son estas:
MIXER

58 = A - frecuencia / B - frecuencia / C -frecuencia
112 = A - frecuencia + NOISE / B - frecuencia / C - frecuencia
113 = A - solo NOISE sin frecuencia / B - frecuencia / C - frecuencia
Metiendo el valor 58 en el registro 07 (mixer) los 3 canales suenan limpis sin ruido.

Metiendo el valor 112 en el registro 07, el canal A emitira notas (frecuencias) sumandole ruido, lo cual es ideal para crear sonidos de Snare o Toms de percusion (y lo que se les ocurra), dejando los canales B y C limpios, para Bajos y Melodias.

Metiendo el valor 113 en el registro 07, el canal A emitira solamente NOISE, con lo que podemos aprovechar para hacer sonidos de naves espaciales, Hi-Hats o Crash de Bateria (y a la prima de flopping rajando la sabaja con las unias :)) ), dejando igual que el anterior los canales B y C limpios.

Como meto los registros al AY? Simple:

Código: Seleccionar todo

	OUT 65533, (registro)
	OUT 49149, (valor)
Asi que si quiero los 3 canales ABC limpios debo hacer:

Código: Seleccionar todo

OUT 65533, 7
OUT 49149, 58
Perfecto, o sea que si quiero hacer un "La" en el canal A, lo primero es activarlo con el mixer como anteriormete, luego setear el volumen del canal ya que por defecto es '0' (por ej a volumen 10):

Código: Seleccionar todo

OUT 65533, 8
OUT 49149, 10
Afinando la nota 'La' en 440hz como referencia tenemos que la nota 'La' mas grave que el AY puede emitir se obtiene asi:

Código: Seleccionar todo

OUT 65533, 0      ' A Fine tune
OUT 49149, 217  ' valor
OUT 65533, 1     ' A Course tune
OUT 49149, 15   ' valor
Bien, ahora a resetear el Spectrum o a bajar el volumen ! :D

Como se que esa nota es asi? lo deduje relacionando las frecuencias reales de las notas musicales?
No, ni mamao, no pude allar una relacion matematica entre los valores de Coarse+Fine tune del AY con los valores reales de las frecuencias en Hz =)

Recuerdo habia encontrado una ecuacion matematica donde podia obtener las notas, pero lamentablemente con esta podia solo sacar una octava creo, hace ya un par de anios de esto, y se', que me salia humo del bocho por no poder encontrarle la vuelta a esa cuenta >:-(

Que hago?

Enchufo el Spectrum real a la entrada de la tarjeta de sonido, Cargo en el Macbook un afinador poderoso (el del AmpegSVX me sirve) y comienzo a variar los registros Fine y Coarse hasta dar con las notas. Luego de hora y pico llegue a esta conclusion (joder!, que esto no existe por internet):

Imagen

Como esta tablita en un TXT no me iba a servir de nada me dispongo a pasarla al Spin (mi emulador favorito), compilando un txt con POKES. Utilice la memoria 32000 pero no importa mucho el sitio ya que luego exportaria un .BIN para meterlo donde qiciera.
Por cierto, ordene' los Fine y Coarse tune de modo que pudiera leerlos con PEEKs como si estuviera haciendo musica con la instruccion BEEP... (0=C, 1=C#, 2=D, 3=D#... 12=C... 24=C,etc)

Si quiciera saber que valores de Fine y Coarse tienen la nota G (correspondiente al No7 en la escala cromatica o de semitonos como el BEEP) de la primer octava hago un simple: PEEK 32000+7 para fine y PEEK 32084+7 para Coarse.

Código: Seleccionar todo

'FINE PITCH	-   COARSE PITCH

'----- Octava 1 -----

POKE 32000,86	: POKE 32084,13
POKE 32001,148	: POKE 32085,12
POKE 32002,224	: POKE 32086,11 
POKE 32003,53	: POKE 32087,11
POKE 32004,149	: POKE 32088,10
POKE 32005,252	: POKE 32089,9
POKE 32006,110	: POKE 32090,9
POKE 32007,230	: POKE 32091,8
POKE 32008,75	: POKE 32092,8
POKE 32009,238	: POKE 32093,7
POKE 32010,123	: POKE 32094,7
POKE 32011,16	: POKE 32095,7


'----- Octava 2 -----

POKE 32012,170	: POKE 32096,6
POKE 32013,74	: POKE 32097,6
POKE 32014,240	: POKE 32098,5
POKE 32015,155	: POKE 32099,5
POKE 32016,74	: POKE 32100,5
POKE 32017,255	: POKE 32101,4
POKE 32018,183	: POKE 32102,4
POKE 32019,115	: POKE 32103,4
POKE 32020,51	: POKE 32104,4
POKE 32021,247	: POKE 32105,3
POKE 32022,190	: POKE 32106,3
POKE 32023,136	: POKE 32107,3


'----- Octava 3 -----

POKE 32024,85	: POKE 32108,3
POKE 32025,37	: POKE 32109,3
POKE 32026,248	: POKE 32110,2
POKE 32027,205	: POKE 32111,2
POKE 32028,165	: POKE 32112,2
POKE 32029,127	: POKE 32113,2
POKE 32030,91	: POKE 32114,2
POKE 32031,57	: POKE 32115,2
POKE 32032,25	: POKE 32116,2
POKE 32033,251	: POKE 32117,1
POKE 32034,223	: POKE 32118,1
POKE 32035,196	: POKE 32119,1


'----- Octava 4 -----

POKE 32036,171	: POKE 32120,1
POKE 32037,147	: POKE 32121,1
POKE 32038,124	: POKE 32122,1
POKE 32039,103	: POKE 32123,1
POKE 32040,83	: POKE 32124,1
POKE 32041,64	: POKE 32125,1
POKE 32042,46	: POKE 32126,1
POKE 32043,29	: POKE 32127,1
POKE 32044,13	: POKE 32128,1
POKE 32045,254	: POKE 32129,0
POKE 32046,239	: POKE 32130,0
POKE 32047,226	: POKE 32131,0


'----- Octava 5 -----

POKE 32048,213	: POKE 32132,0
POKE 32049,201	: POKE 32133,0
POKE 32050,189	: POKE 32134,0
POKE 32051,179	: POKE 32135,0
POKE 32052,169	: POKE 32136,0
POKE 32053,160	: POKE 32137,0
POKE 32054,151	: POKE 32138,0
POKE 32055,142	: POKE 32139,0
POKE 32056,134	: POKE 32140,0
POKE 32057,127	: POKE 32141,0
POKE 32058,120	: POKE 32142,0
POKE 32059,113	: POKE 32143,0

'----- Octava 6 -----

POKE 32060,107	: POKE 32144,0
POKE 32061,101	: POKE 32145,0
POKE 32062,95	: POKE 32146,0
POKE 32063,90	: POKE 32147,0
POKE 32064,85	: POKE 32148,0
POKE 32065,80	: POKE 32149,0
POKE 32066,75	: POKE 32150,0
POKE 32067,71	: POKE 32151,0
POKE 32068,67	: POKE 32152,0
POKE 32069,63	: POKE 32153,0
POKE 32070,60	: POKE 32154,0
POKE 32071,57	: POKE 32155,0

'----- Octava 7 -----

POKE 32072,53	: POKE 32156,0
POKE 32073,50	: POKE 32157,0
POKE 32074,48	: POKE 32158,0
POKE 32075,45	: POKE 32159,0
POKE 32076,42	: POKE 32160,0
POKE 32077,40	: POKE 32161,0
POKE 32078,38	: POKE 32162,0
POKE 32079,36	: POKE 32163,0
POKE 32080,34	: POKE 32164,0
POKE 32081,32	: POKE 32165,0
POKE 32082,30	: POKE 32166,0
POKE 32083,28	: POKE 32167,0
O sea que con 168 Bytes tengo la informacion de todas las notas musicales correspondientes a la musica occidental que el AY puede reproducir.

Que conste que este hilo es el responsable de que "sacara estos papeles que tenia tirados dentro de un cajon". Ojala encuentre la forma de ver como programar musica para CPC.

El lunes seguire con mas :twisted:

Pueden putearme, mostrarme la relacion entre los valores de Fine&Coarse tune y las frecuencias en Hz, enseniarme como joraca compilo el WIZplayer. Estoy abierto a todo (homosexuales abstenerse, es que aqui los abundan)

:-* :-* :-* :-* :-* :-* :-* :-* :-*
66 6C 6F 70 70 69 6E 67 20 6D 61 73 63 61 20 50 30 6C 6C 34 / 6D 61 73 20 63 6F 74 69 6C 6C 61 20 73 65 72 E1 73 20 74 75 20 49 7A 61 72 6F 20 3A 70
Avatar de Usuario
Sinclair
Hermano de Lucifer
Hermano de Lucifer
Mensajes: 3101
Registrado: 04 Jul 2013, 23:42

Re: Va-De-Re-Tracker / Como programar el chip AY-3-8912 /10

Mensaje por Sinclair »

Menudo currazo de investigación que te estas pegando Tacha!!
Quizás te pueda ayudar a descifrar el funcionamiento de este chip el desemamblado de la ROM del Spectrum 128K junto con su datasheet y toda la documentación genética que debe existir sobre el mismo.

Saludos.
Imagen
Avatar de Usuario
flopping
Fundador
Fundador
Mensajes: 9974
Registrado: 29 Mar 2013, 15:26
Ubicación: Valencia
Been thanked: 124 times
Contactar:

Re: Va-De-Re-Tracker / Como programar el chip AY-3-8912 /10

Mensaje por flopping »

Buen curro si señor, aunque yo creo que debe de haber algún documento que lo explique o algo así, será cuestión de investigar un poco.
No me hago responsable de mis post pues estan escritos bajo la influencia del alcohol y drogas psicotropicas, por la esquizofrenia paranoide.
(C) 1982-2024, 42 años de ZX Spectrum.
http://www.va-de-retro.com/ un foro "diferente".

Mi juego, que puedes descargar desde aqui
Avatar de Usuario
wilco2009 !Sinclair 1
Hermano de Lucifer
Hermano de Lucifer
Mensajes: 8156
Registrado: 01 Abr 2013, 23:47
Ubicación: Valencia
Has thanked: 47 times
Been thanked: 107 times

Re: Va-De-Re-Tracker / Como programar el chip AY-3-8912 /10

Mensaje por wilco2009 »

Buen trabajo de investigacion, tacha. A ver lo que sale de esto. ;)
"Aprender a volar es todo un arte. Aunque sólo hay que cogerle el truco. Consiste en tirarse al suelo y fallar".

Douglas Adams. Guía del autoestopista galáctico.
Avatar de Usuario
zx81
Demonio tercer orden
Demonio tercer orden
Mensajes: 502
Registrado: 19 Oct 2013, 16:27
Ubicación: Valencia
Has thanked: 15 times
Been thanked: 6 times
Contactar:

Re: Va-De-Re-Tracker / Como programar el chip AY-3-8912 /10

Mensaje por zx81 »

Joer Tacha, vaya curro por la cara que te has pegao.... pá ná. :D

Dicen que cuando todo falla, se aconseja leer las instrucciones. Lo primero es buscar un Datasheet del AY-3-8910. Si además miras en el manual del Spectrum te dicen que la frecuencia del AY es la del reloj de la CPU (3.546.900 Hz) dividida por dos. Luego esa frecuencia se divide por 16 y ese valor es dividido por el valor de 12 bits introducido en el registro de tono. Hay una tabla en la ROM de los Spectrums que hace el mapeo de notas con los valores a poner en el registro de tono. Por si eso fuera poco, los fuentes de la ROM del OpenSE de Andrew Owen tienen esa tabla "corregida" (no me he puesto nunca a investigar por cuanto).

Tal y como has podido ver, el canal de ruido es único y se suma al canal o canales seleccionados. El generador de ruido es, según los fuentes de MAME:

Código: Seleccionar todo

/* The Random Number Generator of the 8910 is a 17-bit shift */
/* register. The input to the shift register is bit0 XOR bit3 */
/* (bit0 is the output). This was verified on AY-3-8910 and YM2149 chips. */
Al generador de envolventes le pasa lo mismo, se activa en todos los canales en que esté seleccionado, pero solo hay un generador.

Una curiosidad del AY es que la salida de cada canal puede ser 0 o 1. En el caso de ser 1, eso se transforma al valor de volumen escogido para el canal o al valor que le toque del generador de envolvente. Cuando un canal está deshabilitado en el mixer, su salida es 1, no 0 como podría pensarse. Eso significa que la salida del AY solo puede ser "eliminada" poniendo a cero los volúmenes de los canales, no basta con deshabilitarlos en el mixer. Esto da otra posibilidad de hacer música que es deshabilitar un canal y hacer música cambiando rápidamente el valor del volumen, como si fuera un pequeño PCM de 4 bits. Como los canales se suman a la salida, se puede hacer una tabla de valores con la que poder simular, al menos, un PCM de 7 u 8 bits (nunca me he molestado en calcular esa tabla). Sé que hay juegos que usan el AY de esa forma y creo que las voces digitalizadas del Robocop se generan mediante un método semejante.

Por cierto, si me preguntas te diré que no, que no tengo ni puta idea de música. Pero tener que emular ese bicho te obliga a conocerlo mejor de lo que te gustaría... :D
Today's robots are very primitive, capable of understanding only a few simple instructions such as 'go left', 'go right' and 'build car'.
John Sladek

Emulador de Spectrum JSpeccy.
Emulador de Spectrum Bare-metal para las Raspberry PI ZXBaremulator
Avatar de Usuario
Bubu
Demonio segundo orden
Demonio segundo orden
Mensajes: 1125
Registrado: 02 May 2013, 20:35

Re: Va-De-Re-Tracker / Como programar el chip AY-3-8912 /10

Mensaje por Bubu »

I (¯`v´¯)
`·.¸.·´
¸.·´¸.·¨) ¸.·¨)
(¸.·´ (¸.·´ (¸.·¨ tacha
Si algo funciona... no lo toques. ¡¡Pero ni de coña!!
Avatar de Usuario
tacha Uruguay
Hermano de Lucifer
Hermano de Lucifer
Mensajes: 3167
Registrado: 04 Abr 2013, 20:22
Ubicación: Montevideo, Uruguay
Has thanked: 52 times
Been thanked: 35 times
Contactar:

Re: Va-De-Re-Tracker / Como programar el chip AY-3-8912 /10

Mensaje por tacha »

zx81, menudo bocho te regalaron tus apas :D excelente y gracias por los datos que me pasas. Yo por lo pronto nunca supe de la existencia de Andrew Owen, ni que habia corregido la ROM, ni que hubiera una tabla de registros para las notas musicales en ella :-*
Imagino que para hacer sonar el AY durante un jueguito es mucho mas rapido leer 3 bytes (la nota y los dos registros correspondientes) que hallar la cuenta esa del manual del Spectrum (joer, que en el de las TK90 y 95 solo esta la instruccion SOUND :)) ) y que por eso es bastante moralejico que en la ROM haya una tabla de valores de registros para las notas musicales como la que me consegui.

Recuerdo la musica intro del Golden Axe con su Power Snare sampleado, tambien un ruido accidental en la grabacion del "Up hold the law" de Robocop... Tendre que investigar como es esto de samplear un PCM, ya se me hace que desde Basic Boriel, aunque compilado, no le daria la velocidad.


Bubu, dejate de amarme y vamos a programar ese Tracker en Assembler !! el ZX Boriel me queda corto B-)

PD: zx81, si tenes la suficiente matematica como para emular un AY, te sobran neuronas para comprender la musica. Yo tengo metodos para explicar la armonia del universo en nuestra dimension utilizando simple geometria circunscripta :-] entre otras cosas.
66 6C 6F 70 70 69 6E 67 20 6D 61 73 63 61 20 50 30 6C 6C 34 / 6D 61 73 20 63 6F 74 69 6C 6C 61 20 73 65 72 E1 73 20 74 75 20 49 7A 61 72 6F 20 3A 70
Avatar de Usuario
Kyp !Sinclair 1
Hermano de Lucifer
Hermano de Lucifer
Mensajes: 3401
Registrado: 30 Sep 2013, 14:54
Ubicación: Madrid
Has thanked: 31 times
Been thanked: 163 times

Re: Va-De-Re-Tracker / Como programar el chip AY-3-8912 /10

Mensaje por Kyp »

En WOS tienes el manual del interface DK'Tronics 3 Channel Sound Synthesiser que lleva un AY-3-8912. En él se explica para que es cada registro e incluso trae una lista de los valores para cada nota en varias escalas aunque si depende de la frecuencia de reloj no valdrán porque estarán pensadas para los 3,5 MHz del Spectrum y no para los 4 MHz del CPC. Bueno, supongo que como la 'distancia' entre tonos es constante será como si todas las notas estuvieran transpuestas.

Link a la página del interface:
http://www.worldofspectrum.org/infoseek ... id=1000118

Link al manual:
ftp://ftp.worldofspectrum.org/pub/sincl ... Manual.pdf
Avatar de Usuario
tacha Uruguay
Hermano de Lucifer
Hermano de Lucifer
Mensajes: 3167
Registrado: 04 Abr 2013, 20:22
Ubicación: Montevideo, Uruguay
Has thanked: 52 times
Been thanked: 35 times
Contactar:

Re: Va-De-Re-Tracker / Como programar el chip AY-3-8912 /10

Mensaje por tacha »

He subido a Archivos infernales/Programas propios/va-de-retracker/vaderetracker_BETA_10.z80

y aunque les pueda parecer la mierda mas grande del universo (y aunque tiene algun bug de compilacion el cual hace que se cuelgue en algun punto, mas montones de millones de cosas a mejorar), me siento orgulloso de seguir programando para mi querido Spectrum, y que con mi put" programa pueda crear musica directamente desde mi Spectrum 128k.

Como dice en el primer post, está programado en ZX Boriel.

TECLAS:

--2-3---5-6-7---9-0- (teclas negras del piano)
Q W E R T Y U I O P (teclas blancas del piano)

4 borrar nota
8 mutear


...H... (arriba cursor)
B-N-M (izq, abajo, der cursor)

SPACE (play)
J (stop play)

K (modo edición de ordenamiento de patterns)
B/M (mueve cursor izq/der en orden de patterns)
H/N (sube/baja numero de pattern en orden de patterns)
J (volver a edición de pattern)

A (sube octava)
Z (baja octava)

S (sube tempo)
X (baja tempo, cuanto mas pequeño mas rápido)

D (sube pattern a editar)
C (baja pattern a editar)

F (slide off, slide up1, slide up2, slide up3, slide up4 semitonos)
v (slide off, slide down1, slide down2, slide down3, slide down4 semitonos)

DRUM KIT solo para el canal A (octava 8):

Q = kick
2 = kick+hihat close
W = snare
R = ghost snare
5 = hihat open
6 = hihat foot
7 = hihat close
U = crash

CHORDS FX solo para el canal B (octava 9):

Q = chords off
2 = 5ta justa
W = 3ra menor+5ta justa
3 = 3ra mayor+5ta justa

Y = tempo-1
7 = tempo-2
U = tempo-3
I = tempo-4

9 = tempo+1
O = tempo+2
0 = tempo+3
P = tempo+4

VIBRATO (octava10):

R = vibrato off
5 = vibrato lento
T = vibrato rápido

L = refresh pattern (para cuando se cargan binarios en emulador)

CAPSSHIFT+C = copy pattern
CAPSSHIFT+v = paste pattern
CAPSSHIFT+x = cut pattern

CAPSSHIFT+S = save song (con esto ya se buguea mal :~( i don´t know why )

dejo algunos .BIN que he creado en algun tiempito como para probar,algunos mas viejos (en versiones viejas del programa), otros mas nuevos...
En el inicio, al cargar el .z80 en un emulador (Spin por ej) hice un PAUSE 0 para que esots .bin se puedan cargar a partir de la direccion 24200.
Al darle a cualquier tecla se inicia el prog, ya mostrando la "partitura" de lo cargado en memoria.

Defectos: a demas de muchas mejoras que haría en cuanto a la ejecución de sonido, es tan lento el borielbasic, que en la reproducción de canciones es inviable hacer un refresh pattern, ya que se cortaria la cancion un par de segundos.

y muchos defectos más, como el que se cuelga no se por que pornga si yo estoy escribiendo correctamente el basic a compilar :?

Bueno, ya tendran ganas de mandarme al paraiso :(

PD: me encantaria que algun capaso en assembler me ayudara a convertir (obviamente muy mejoradamente) este tracker para hacer de él una herramienta óptima.

Salu!
66 6C 6F 70 70 69 6E 67 20 6D 61 73 63 61 20 50 30 6C 6C 34 / 6D 61 73 20 63 6F 74 69 6C 6C 61 20 73 65 72 E1 73 20 74 75 20 49 7A 61 72 6F 20 3A 70
Avatar de Usuario
tacha Uruguay
Hermano de Lucifer
Hermano de Lucifer
Mensajes: 3167
Registrado: 04 Abr 2013, 20:22
Ubicación: Montevideo, Uruguay
Has thanked: 52 times
Been thanked: 35 times
Contactar:

Re: Va-De-Re-Tracker / Como programar el chip AY-3-8912 /10

Mensaje por tacha »

PD: también deje el TXT con el programa hasta el momento, por si alguien quiere hecharle diente o corregirme.

:-* :D
66 6C 6F 70 70 69 6E 67 20 6D 61 73 63 61 20 50 30 6C 6C 34 / 6D 61 73 20 63 6F 74 69 6C 6C 61 20 73 65 72 E1 73 20 74 75 20 49 7A 61 72 6F 20 3A 70
Responder

Volver a “Proyectos de software abiertos”