AugustoRuiz / WYZTracker

A .NET Tracker to create music for WYZPlayer.
MIT License
45 stars 8 forks source link

Emulador AY en C++ #5

Open Markets00 opened 6 years ago

Markets00 commented 6 years ago

Buenas! Soy Marcos, el alumno de Fran que estaba buscando un emulador del AY ^^'. Ya he traducido tu librería a C++, pero para probar que funcione correctamente, necesitaría un main o un código de ejemplo. Cuando validemos que funcione, puedes añadir el código sin problema.

Muchas gracias! Un saludo.

AugustoRuiz commented 6 years ago

Hola Marcos, mi recomendación es que mires el código del player para ver un ejemplo de uso. Básicamente tienes que configurar el ay con una determinada frecuencia de chip, y opcionalmente seleccionar un modo de estéreo (o mono), seleccionar una ecualización, y a partir de ahí tendrías que configurar los registros del AY como lo harías con tu player, llamando al método GenSound.

Si tu player modifica los registros 50 veces por segundo, lo más fácil es pasar a GenSound un buffer del tamaño adecuado teniendo en cuenta los milisegundos, si es estéreo o no, y poco más. El buffer se llena con valores entre 0 y 1 para que tú los pongas en la salida con la resolución que necesites.

Saludos,

Augusto.

EDIT: Mira cómo se usa el chip AY en el player. Puedes verlo aquí:

https://github.com/AugustoRuiz/WYZTracker/blob/master/WYZTracker.Core/Player/Player.cs#L955

El mié., 2 may. 2018 18:26, Markets00 notifications@github.com escribió:

Buenas! Soy Marcos, el alumno de Fran que estaba buscando un emulador del AY ^^'. Ya he traducido tu librería a C++, pero para probar que funcione correctamente, necesitaría un main o un código de ejemplo. Cuando validemos que funcione, puedes añadir el código sin problema.

Muchas gracias! Un saludo.

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/AugustoRuiz/WYZTracker/issues/5, or mute the thread https://github.com/notifications/unsubscribe-auth/ANE5qLcjx3yd-eRTdqKauYCRqkZrnHX9ks5tud4igaJpZM4TvxE- .

Markets00 commented 6 years ago

Buenas! Parece que ya tengo funcionando la librería y sonando con Port Audio en C++. Estoy utilizando la tabla de periodos que se ve en la imagen, y parece que suena el tono deseado, pero por debajo suena un ruido que parece que cambia de frecuencia para cada tono. Por ejemplo, para que solo suene el canal A, estoy llamando a genSound con los periodos de la tabla para el tono, 0b00000001 como control, un volumen cualquiera por debajo de 16 (para no activar evelopes) y envfreq y envstyle a 0.

¿Estoy haciendo algo mal, o cómo debería usar la función? Gracias! Un saludo. image

AugustoRuiz commented 6 years ago

Me puedes enviar un MP3 para hacerme a la idea?

El mié., 30 may. 2018 17:17, Markets00 notifications@github.com escribió:

Buenas! Parece que ya tengo funcionando la librería y sonando con Port Audio en C++. Estoy utilizando la tabla de periodos que se ve en la imagen, y parece que suena el tono deseado, pero por debajo suena un ruido que parece que cambia de frecuencia para cada tono. Por ejemplo, para que solo suene el canal A, estoy llamando a genSound con los periodos de la tabla para el tono, 0b00000001 como control, un volumen cualquiera por debajo de 16 (para no activar evelopes) y envfreq y envstyle a 0.

¿Estoy haciendo algo mal, o cómo debería usar la función? Gracias! Un saludo. [image: image] https://user-images.githubusercontent.com/20399842/40728997-aa149726-642b-11e8-8c6b-29c8700467b1.png

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/AugustoRuiz/WYZTracker/issues/5#issuecomment-393201179, or mute the thread https://github.com/notifications/unsubscribe-auth/ANE5qKLXLnzDi6yhkdAB00MEyM-lUnUuks5t3rgOgaJpZM4TvxE- .

Markets00 commented 6 years ago

En el link puedes oir el mp3, se puede oir de fondo en casi todas las notas un ruido de fondo que va variando su frecuencia, de hecho, en algunas notas, no se oye, suponque que porque la frecuencia en ese caso, será la adecuada, pero en realidad, sí se está oyendo el tono adecuado. Es dos veces la escala mayor, de C-4 a C-6, digamos. En fin, juzga tú mismo y me dices. https://instaud.io/2gXf

AugustoRuiz commented 6 years ago

Da la sensación de que estás generando varios canales con la misma frecuencia a la vez. ¿Es así?

¿Podrías probar a generar esa misma escala en un único canal a la vez?

2018-06-04 15:28 GMT+02:00 Markets00 notifications@github.com:

En el link puedes oir el mp3, se puede oir de fondo en casi todas las notas un ruido de fondo que va variando su frecuencia, de hecho, en algunas notas, no se oye, suponque que porque la frecuencia en ese caso, será la adecuada, pero en realidad, sí se está oyendo el tono adecuado. Es dos veces la escala mayor, de C-4 a C-6, digamos. En fin, juzga tú mismo y me dices. https://instaud.io/2gXf

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/AugustoRuiz/WYZTracker/issues/5#issuecomment-394354307, or mute the thread https://github.com/notifications/unsubscribe-auth/ANE5qC3aAEc2ACIhFJ0J-HRcRkUlsXexks5t5TXugaJpZM4TvxE- .

Markets00 commented 6 years ago

¿Cómo pondrías tú el registro de control para pasárselo a genSound? Yo en el AY directamente, le escribiría 0b00111110, para que sonara el canal A sin ruido. En tu emulador, creo que a genSound se le pasa sin invertir, verdad? Le estoy pasando 0b00000001, no deberían sonar los otros canales, ¿no?.

AugustoRuiz commented 6 years ago

Le tienes que pasar el valor del registro 7. Es decir, 0b00111110.

Si miras en el código del player, se hace esto:

regs[7] = (byte)((~control) & 0x3f);

Y luego se llama a GenSound pasándole los valores de los registros.

Saludos,

Augusto.

El mié., 6 jun. 2018 14:25, Markets00 notifications@github.com escribió:

¿Cómo pondrías tú el registro de control para pasárselo a genSound? Yo en el AY directamente, le escribiría 0b00111110, para que sonara el canal A sin ruido. En tu emulador, creo que a genSound se le pasa sin invertir, verdad? Le estoy pasando 0b00000001, no deberían sonar los otros canales, ¿no?.

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/AugustoRuiz/WYZTracker/issues/5#issuecomment-395050081, or mute the thread https://github.com/notifications/unsubscribe-auth/ANE5qHrtX7HIL8f9SOGuWpzioH4ORQL4ks5t58ozgaJpZM4TvxE- .

Markets00 commented 6 years ago

Buenas de nuevo, Augusto. Perdona por molestarte en verano, pero en una semana entrego mi TFG y sigo teniendo el mismo problema. Tengo debugeadísimo mi código y no tengo ni idea de por dónde van los tiros.

El tamaño del buffer se calcula igual que en tu player (TICK_BUF_LENGTH). Tengo una función que llama a genSound a una frecuencia determinada y estoy usando un pequeño test que cambia los registros del AY y hace una breve espera, y así 6 veces con diferentes configuraciones del registro de control. Te copio la información de debug, lo que debería sonar (o yo espero que suene) y lo que suena finalmente, a ver si me puedes dar alguna pista de por dónde van los tiros.

Esta es la información que guardo por cada vez que llamo a GenSound: Estos valores antes del "----------" son los parámetros tal cual los recibe GenSound. Tones: 119; 0; 0 (periodo para canales A, B y C, solo la parte baja, los periodos que utilizo mantienen la parte alta (coarse) a 0). Vols: 15; 0; 0 (volumen del canal A, B, y C) Mixer: 62 (registro de control) "---------" Estos valores después del "----------" son los mismos valores que los de arriba, pero después de procesarlos, es decir, tal cual se le pasan a SetRegs. Tones: 119; 0; 0 Vols: 15; 0; 0 Mixer: 1 Reg 7: 00111110 (este último valor es una concatenación de "00" y ay.regs.R7_noise_c, R7_noise_b, ... después de SetRegs, para comprobar cómo han quedado los registros del AY).

Vamos allá:

Con esta información, se produce el siguiente audio: https://instaud.io/2C28. Cuando la ejecución comienza y termina suena un "click". El resultado es que la primera mitad no se oye nada, y la otra mitad, solo se oye el ruido.

Ojalá lo podamos solucionar. En cualquier caso, muchas gracias.