lunes, 13 de diciembre de 2010

Test 1 con potenciometros

Ha llegado la hora de probar el tema de los potenciometros con el MSX.
Para ello he utilizado el circuito del blog HotBit, con el que se puede construir un controlador tipo paddle. Estos se utilizaron en consolas antiguas en juegos tipo Pong, y para el MSX (que yo sepa), solo se uso en el juego Arkanoid 2 que se incluía junto al cartucho . Pero el caso es que los MSX tiene una ventaja ante otros ordenadores, ya que en un solo puerto de joystick permite conectar hasta 6 paddles!!

También podéis encontrar más información sobre el funcionamiento, en el documento "MSX Technical Data Book" en el punto 1.4.7 (pag.28).

Para este test he comprado los componentes para montar un solo paddle, sobre una protoboard. Una vez montado lo he conectado a un MSX y he creado un pequeño programa en basic, utilizando la  instrucción PDL.

v = PDL(n)

Donde n es un valor del 1 al 12 y el resultado un numérico de 0 a 255. Cuando n sea un número impar, se corresponderán a los que se encuentren conectados en el puerto A y los pares en el B.

También hay una función equivalente en la BIOS, la GTPDL (h00DE), donde en el acumulador se le proporciona el número de paddle y en este mismo se obtiene el resultado.

El programa usado para el test es el siguiente:

10 CLS
20 SOUND 0,0:SOUND 1,1
30 SOUND 7,&B00001000:SOUND 8,15
40 A=PDL(2) ' primer paddle port 2
50 LOCATE 19,10:PRINT A
60 SOUND 0,A
70 GOTO 40

martes, 23 de noviembre de 2010

Demo con el PSGed v0.8b

Ayer me puse un rato a probar con el PSGed, de conseguir un efecto de sonido característico del AY-3-8910, que se produce al aplicar una envolvente cíclica sobre determinadas frecuencias del tono de onda cuadrada. EL resultado es el que aparece en el vídeo.
A demás, esta prueba me ha permitido detectar algunos puntos deficientes del software, que afectan a la modificación en tiempo real de algunos registros. Quiero mejorarlo y crear una versión, antes de ponerme con las funcionalidades que me faltan.
También espero vuestras opiniones para ayudarme a mejorarlo. :)



Yesterday I got a while to try the PSGed in getting a sound effect characteristic of AY-3-8910 which is produced by applying a cyclic envelope on certain frequency square wave tone. The result is what appears in the video.
In addition, this test has allowed me to detect some weak points in the software that affect real-time modification of some registers. I want to improve and create a version before starting to work with missing features.
I also hope your opinions to help improve it. :)

sábado, 20 de noviembre de 2010

Versión 0.8b disponible!


Ya podéis descargar la versión 0.8b del PSGed.
En los últimos meses, he mejorado la funcionalidad del secuenciador junto con otros temas que tenia pendientes, pero sobretodo, he trabajado la parte de la información, abriendo un proyecto en Google Code y añadiendole a la wiki, el manual de uso y la lista de tareas.
También, he reestructurado el código para hacerlo más reutilizable.
Esta versión no permite guardar el trabajo realizado a un fichero, aunque le he añadido el volcado de valores de los registros, por si queréis utilizarlo para desarrollar efectos con el PSG para usarlos en vuestros programas.


Now you can download the version 0.8b of PSGed.
In recent months, I have improved the functionality of the sequencer along with other outstanding issues had, but I've also worked on the piece of information, opening a project on Google Code and adding to the wiki, the user manual and the task list.
Also, I restructured the code to make it reusable.
This version can not save the work done to a file, but I've added the dump register values, if you want to use it to develop effects with the PSG for use in your programs.

viernes, 19 de noviembre de 2010

Presentación del PSGed v08b

Mañana se realizará el chiptune stage v2 organizado por el club sprite, donde se charlará sobre la subcultura del chiptune/música 8bits y se mostrarán novedades hardware y software. Aprovecharé la ocasión para publicar y presentar la versión 0.8b del PSGed.

Para más info del evento consultar la web del club-sprite.

viernes, 12 de noviembre de 2010

neuroflip - minimalTech

Aquí está el primer tema elaborado, creado por neuroflip, que será la segunda demo incluida en el PSGed. Es de estilo Techno minimalista y podemos observar que sigue un patrón rítmico Four on the floor (4/4), a 126 BPMs, que a partir de la intro va evolucionando hasta que hace un cambio a la melodía principal del tema y finaliza de forma que pueda enlazar con el inicio. Utiliza un canal para el bombo, otro para el charles usando el canal de ruido y el último para un bajo muy bien conseguido, que fluctúa (efecto wah-wah), gracias a que usa una envolvente tipo triangular.

Me ha sorprendido mucho, ya que mi intención inicial con el PSGed era solo la de poder jugar con los registros del AY-3-8910 y aunque le he ido añadiendo funcionalidad, este tema supera mis expectativas. Queda demostrado que la imaginación junto con la experiencia del usuario, es lo que le da vida a una herramienta...

neuroflip - minimalTech by aorante

Here is the first full track, created by neuroflip, which will be the second demo, which includes the PSGed. The song is Techno minimalist style can be seen that follows a rhythmic pattern Four on the floor (4 / 4), at 126 BPM, which from the intro evolves until it makes a change to the main melody the topic and ends so that it can bind to boot. Uses a channel for the bassdrum, one for the hi-hat, using the noise channel and the last achieved a very good bass with a wah-wah efect, by using a triangular envelope.

I was very surprised, because my initial intention was only the PSGed you can play with the registers of AY-3-8910 and although I have been added functionality, this issue is beyond my expectations. We demonstrate that imagination along with the user experience is what gives life to a tool ...

lunes, 6 de septiembre de 2010

Nuevo logo del PSGed!



Aprovechando que estoy poniendo apunto la web del proyecto, he realizado el logo en mayor resolución y le he añadido algunos cambios:

Las 3 formas rectangulares de color magenta, representan los tres canales del PSG, pero le faltaba algo: el generador de ruido blanco... Al nuevo recuadro le he aplicado un efecto de ruido, para que se entienda mejor el simbolismo que le quiero dar al logo.

También le he añadido el texto "AY-3-8910 Sound Editor" para reforzar el significado, y el símbolo del copyleft... (da un toque más serio ;) ).

martes, 13 de julio de 2010

Primera demo de una canción

En la primera versión que haré publica, tendrá 3 demos, que sirve para poder ver las posibilidades y como ayuda para el aprendizaje.
La primera demo, que he realizado la podéis escuchar en el player incluido en este post. La he pasado a formato digital (wav), mediante la opción de "Captuta Audio" del blueMSX. No se por que, pero al comprimirse, se produce una distorsión, que provoca que no suene del todo bien. De todas formas, ya sirve para que os hagáis una idea.

PSGed v07b demo001 song by aorante

viernes, 2 de julio de 2010

Añadiendo un control tipo ComboBox


Para mejorar la elección del tipo de envolvente, he cambiado el control basado en dos botones de incremento/decremento, por un Combo box. En realidad el termino correcto seria "drop-down list", ya que en este caso no dispone de un campo de entrada, pero uso "combobox", ya que es la forma más común de denominarlo.

El control no es más que una función que muestra la lista de las envolventes, con su valor correspondiente al del registro 13 y su forma. Muestra todos los valores y no tiene barra de scroll. Se queda esperando a que pulsemos el primer botón sobre una de las opciones o a la tecla [Esc] para dejar el valor actual.

jueves, 1 de julio de 2010

Configurando el PSGed!


Lo último que le he añadido es una mejora en la presentación, la posibilidad de poder usar el PSG del MegaFlashROM SCC+ y una ventana de configuración (F2), para tocar todo esto a demás de permitirnos  cambiar el dispositivo de control (ver captura de pantalla).

Ahora cuando se ejecuta el PSGed, una de las primeras cosas que hace es detectar si se esta utilizando un modelo superior al MSX1. Si es afirmativo aprovecha el VDP V9938 (o superiores), cambiando la paleta de colores en screen 2, por una mejor (o al menos eso creo yo ;) ).

De todas formas, si tenemos un MSX1 con el V9938, como el Yamaha CX5MII o el Spectravideo SVI-738, podemos utilizarlo accediendo a la ventana de configuración.

Nota: El cambiar el tipo de VDP o de PSG, sin disponer de estos, puede provocar comportamientos imprevisibles. XP

lunes, 28 de junio de 2010

Music Module (MSX AUDIO)


Después de investigar durante un tiempo los diferentes chips de audio de MSX, me acabo de convencer la demo que hizo MsxKun del Music Module, en el club sprite. Así que uno de los propósitos que tenia para la pasada RU era de conseguir uno de segunda mano y hubo suerte! :D
También tuve la suerte de contar con Xenon para enseñarme algunas cosas que desconocía, sobre este hardware. Muchas gracias a los dos por su ayuda!

El Music Module utiliza el chip de audio yamaha Y8950, también denominado MSX Audio. Básicamente es un OPL compatible (YM3526), que añade un capturador/generador de sonido digital PCM de 8 bits pero con unas características peculiares. Se creo como un estándar específico para los MSX, pero fuera de los cartuchos, ninguna marca lo incluyo en sus ordenadores. Es similar, aunque no compatible, con el YM2413 (MSX Music, OPLL, FM-pac), que es una versión bastante recortada del OPL, que supuestamente se adapto al sistema por ser más económico.

El Y8950 fue utilizado en 3 cartuchos:

  • Philips NMS-1205 Music Module
  • Toshiba HX-MU900 MSX Music System
  • Panasonic FS-CA1 MSX-Audio



Algunas de las características del Y8950 son:

  • Dos modos de funcionamiento (compatible con el OPL): 
a) 9 canales de sonido FM 
b) 6 canales de sonido FM + 5 de percusión FM.
  • Un canal de 4-bit ADPCM (Advanced Differential Pulse Code Modulation) con un sampling rate de 1,8kHz a 16kHz de captura, que se convierten en 1,8kHz a 50kHz en reproducción. Soporta hasta 256kB de RAM externa para samples. Funciona como un canal de 8bits PCM ya que utiliza un sistema de codificación para que las muestras ocupen menos memoria.
  • Conversores AD/DA.
  • Puertos de I/O de 8bits para control de teclados.

El Music Module además dispone de las siguientes características:

  • 32kB de RAM para muestras ADPCM.
  • Interfaz MIDI (in/out/thru).
  • conector para el teclado musical NMS-1160.
  • 2 conectores RCA de salida de audio mono.
  • 1 conector RCA de entrada de linea.
  • 1 conector RCA para micrófono.
  • Micrófono interno.
  • Dispone del soft Music-Box en ROM.

Aunque disponga de salida de audio, también se mezcla internamente con el PSG y se puede escuchar por la salida del ordenador.

Mi intención es aprender a programarlo y hacer un software tipo groovebox (caja de ritmos + línea de bajos), que utilice el Y8950 con una interfaz gráfica basada en la del PSGed.

Más info:

sábado, 5 de junio de 2010

Mejorando el secuenciador


Siguiendo el consejo de neuroflip, me he dedicado a mejorar el secuenciador, durante las últimas semanas. Ahora permite editar hasta 16 patrones diferentes y secuenciarlos con un máximo de 32 pasos. Esto nos permite la construcción de temas. También he añadido herramientas para copiar y borrar patrones, que se muestran en ventanas modales sobre la pantalla principal.
Una vez terminada esta funcionalidad, pensé en añadir alguna nota para dar más juego, pero de una forma que no complicase en exceso la edición del patrón. Esta nueva funcionalidad se consigue pulsando varias veces sobre una posición, con lo que se añade una nota y dos variaciones de esta.
Por último, por sugerencia de JamQue, he añadido una nota de silencio. Esta nos sera muy útil cuando no usemos los envolventes, ya que al quedarse la nota sonando infinitamente, podremos interrumpirla.
Todo esto me ha obligado hacer cambios en la interfaz gráfica (lo que más me gusta :D ).
Primero he modificado la distribución de la frecuencia de ruido y los datos de la envolvente, para ganar una linea de tiles (8 pixeles).
Debajo he creado una nueva subdivisión para separar la información de la secuencia en la parte izquierda, del editor de patrón y he colocado los botones para la reproducción del tema, a la derecha de la última línea.
Ya de paso, he cambiado los botones de incremento y decremento de valores, ya que al estar distanciados, eran incómodos. También han mejorado su comprensión, ya que ahora se muestran con los símbolos de más y menos.

jueves, 3 de junio de 2010

MegaFlashROM SCC+ 1024K

He adquirido este cartucho, pensando en el PSGed y en futuras aplicaciones.
Hoy me ha llegado y lo he probado con mi Yamaha MSX1 CX5MII/128, junto con una LPE-MMC-V7 y me ha funcionado perfectamente!!! Lo único que hay que tener en cuenta, es que la tecla que utilizan ambos cartuchos para inhabilitarse, es la [Esc]. Para solventar este problema, el MegaFlashROM permite configurar la tecla cuando se guarda una ROM. Yo he usado la tecla [Ins].
El sonido del SCC+ suena muy bien. No he apreciado ninguna diferencia con el original.
Le he instalado el PSGed y lo he podido probar, pero con el PSG del MSX. Quiero añadir un menú de configuración para poder elegir entre los dos procesadores de sonido.

domingo, 30 de mayo de 2010

Sincronizando!

Un punto importante un cualquier programa donde se reproduzca música, es que esta se escuche siguiendo sus tiempos, si no el resultado podría ser algo desagradable... :P

Para conseguir esto, necesitamos sincronizar la ejecución de nuestro programa y en MSX se utilizan las interrupciones del Z80.

He investigado un poco el tema, y he encontrado unas funciones en la web de Avelino (interrupt.s), pensadas para cuando se trabaja en MSX-DOS. Estas se puede adaptar para el caso de trabajar en formato ROM, con la solución dada por SapphiRe (FD9APATCH.ASM), en los foros de desarrollo de Karoshi. Todavía no lo he probado, ya que he dado con una solución más propicia para la forma en la que esta programado el PSGed.

Al principio utilicé una función de Andrear llamada wait_retrace:
   di
$3:
   in a,(0x99)
   and #0x80
   cp #0x00
   jr z, $3
   ei
Esta espera a que finalice el redibujado de la pantalla, para dejar continuar el flujo de ejecución. Haciendo pruebas, vi que en los emuladores y en el onechip, funcionaba perfectamente, pero al probarlo en un MSX real, al reproducir una secuencia, no se escuchaba correctamente.

Estudiando el articulo de SapphiRe, descubrí una instrucción del z80 (no se mucho de assembler), que podía servirme en sustitución de la función wait_retrace, me refiero a la instrucción "halt". Esta pone en espera la ejecución hasta que se dispara una interrupción. Así que me puse manos a la obra. Primero definí una función en assembler con esta instrucción:
#define HALT __asm halt __endasm
y luego lo coloqué en el inicio del bucle que controla el play y la interfaz gráfica de la pantalla principal.
while(1)
{
   HALT;

   //resto del codigo
}
Lo he probado en un MSX y ha funcionado perfectamente! :)

viernes, 28 de mayo de 2010

Acceso a funciones Asm desde C


Además del "assembler in line" que permite añadir directamente código ensamblador de Z80 en nuestras funciones en C, podemos acceder a funciones incluidas en fuentes totalmente en assembler. Si este código esta creado para compiladores como el asMSX, antes tendremos que adaptarlo para que lo acepte el compilador de SDCC. Algunos de estos cambios son:
Los valores deberán de preceder del caracter almohadilla.
0ffh --> #0xFF

Los corchetes de las instrucciones que apuntan a direcciones de memoria, habrá que cambiarlo por paréntesis.
ld a,[#FAFE] --> ld a,(#0xFAFE)

Las variables con la instrucción "equ" por un igual.
initmem equ 0E000h --> initmem = #0xE000

En mi caso, lo he necesitado para utilizar las rutinas de Ramones para el control de ratón.

Una vez adaptado el código, el siguiente paso, sera marcar de alguna forma, que funciones son a las que queremos acceder desde C. Para ello tendremos que poner al inicio de la etiqueta usada, un subrayado y al final dos veces el caracter de dos puntos.
_checkmouse::

Una vez hecho todo esto compilaremos el fuente, obteniendo un fichero object (".rel"):
sdasz80 -o mouse.asm

Luego desde nuestro editor, crearemos un fichero "header" donde definiremos las funciones que acceden a las de assembler. Utilizaremos la instrucción "extern" y pondremos el nombre de la etiqueta sin los caracteres añadidos (el tema parámetros, en estos momentos desconozco como funciona).
extern void checkmouse(void);

Incluiremos el include en nuestro fuente y llamaremos a la función utilizando el nombre dado en la definición.
checkmouse();

Para finalizar, compilaremos nuestro proyecto incluyendo el objet:
sdcc -mz80 -o --no-std-crt0 --code-loc 0x4010 --data-loc 0xC000 mouse.rel PSGed_v06a.c

Para conseguir este "item", quiero agradecer la ayuda de Andrear, Ramones y Avelino.

domingo, 23 de mayo de 2010

Utilizar datos en assembler

Este caso específico, lo comento, ya que me encontré con un problema con la forma de trabajar con las etiquetas en el "assembler in line", que no estaba descrito (o no lo localicé) , en la documentación del SDCC (manual + ASxxxx Cross Assembler Documentation).

En mi caso, para mostrar el texto de ayuda, necesito que se aloje en un área de la memoria, que luego voy copiando a la VRAM, creando un efecto de scroll. Lo que estaba haciendo, hasta el momento, era utilizar un array de char, que luego volcaba en la RAM. Mi intención es situarlo en la ROM y acceder directamente a la dirección donde se aloje. Para ello he utilizado el "assembler in line", añadiendo los datos con la instrucción "db".

Nota: Esta técnica nos sirve para añadir cualquier tipo de dato, como por ejemplo gráficos, con lo que conseguiríamos mucha más velocidad al volcarlos a la VRAM, utilizando directamente una rutina en ensamblador.

Para conseguir esto, necesitaríamos averiguar en que dirección apuntan nuestros datos. En assembler utilizaremos una etiqueta, pero nos encontramos con el problema de que en C no podemos acceder a esta. Para solucionarlo, tendremos que usar un puente: escribiremos la dirección en la RAM. Para ello, ejecutaremos un programita en ensamblador. Fijaos que al hacer el "load" de la etiqueta al registro HL, hay que añadirle el caracter de la almohadilla "#" (este es el problema que comentaba al inicio).

void setData()
{
__asm

ld hl,#ALABEL
ld (#0xE007),hl
ret

ALABEL:
.db 0x50,0x53,0x47,0x65,0x64,0x20,0x56,0x30
.db 0x2E,0x34,0x42,0x20,0x20,0x20,0x20,0x20
.db 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20
.db 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20
__endasm;
}

Nota: En el ejemplo se puede observar que los datos utilizan el formato típico de SDCC ("0xFF"), ya que no acepta el común en algunos compiladores de asm ("0FFh").

Club Sprite Chiptune Stage

Ayer pase la tarde con el Club Sprite, en uno de sus stages, esta vez dedicado al chiptune.
Había un MSX onechip, un Amiga 1200 y un portátil, donde escuchamos un buen puñado de módulos de los trackers más variados.
MsxKun trajo un Music Module (MSX Audio), y pudimos apreciar la calidad de sus 9 canales FM + su canal PCM de 8 bits.
Neuroflip, mostró algunos de sus trabajos (tanto soft como temas musicales), junto al nst0002 (el player de SIDs). TPM mostró unos nuevos temas en el ZMA player y yo pude hacer la primera demo al publico del PSGed (la v0.5b), en un MSX onechip!!!
También pudimos ver el nuevo Mega Flash ROM SCC+ pero no lo llegamos a probar...

domingo, 16 de mayo de 2010

Control con ratón



Ya he añadido el control de ratón. Para ello he utilizado las funciones de Ramones, para identificar y leer los datos del ratón. Primero he compilado con asMSX las funciones y el binario resultante lo he incrustado en el ROM que creado con SDCC. Por otro lado, he programado unas funciones en C, que llaman a las rutinas de Ramones. Es verdad que no es una solución elegante, pero he tenido que optar por esta, ya que no sabia como resolverlo totalmente con SDCC. Afortunadamente, Andrear, me ha facilitado una forma de hacerlo, que seguramente lo pondré en practica la semana que viene.

He creado un vídeo de demo con blueMSX, para que podáis ver el funcionamiento del PSGed con el ratón. Como observaréis, he cambiado algunos elementos de la interfaz. Esto ha sido debido a que al probar el ratón, he visto algunos puntos a mejorar para aprovechar el manejo con este.

viernes, 7 de mayo de 2010

El registro 13


Programando la función del player del PSGed, me he dado cuenta de una peculiaridad del AY-3-8910 que desconocía, que repercute en el funcionamiento del secuenciador.

El PSG tiene dos formas de operar. Si no utilizamos la envolvente, lo que determina que suene el PSG, es principalmente el valor del volumen y del mixer, pero si la utilizamos la cosa cambia. Lo que provoca que se disparen los sonidos, es cuando damos un valor al registro 13 (la forma de envolvente). Eso quiere decir que si queremos disparar sonidos independientes en cada canal, con el mismo envolvente, no lo podremos hacer, ya que al tocar este registro, nos sonarán los tres a la vez.

Una posible solución es apagar el sonido del resto de canales, poniendo el valor 0 en los registros de amplitud (con el mixer suena un beep extraño). Como deduciréis, dependiendo del periodo y el tipo de envolvente que usemos, nos cortará el sonido de los otros canales.

La mejor solución seria crear envolventes modificando los valores del volumen mediante programación. Esto nos permitiría utilizar diferentes envolventes en cada canal, o asignarlas a instrumentos. En el caso del PSGed, como la intención es usar directamente los registros del PSG, he utilizado la primera solución.

A continuación un ejemplo para probar lo explicado en este post:
Nota: Suena el tono de los canales A y C, y el ruido del canal B.
100 ' frecuencias de los 3 canales
110 '
120 SOUND 0,100
130 SOUND 1,10
140 SOUND 2,200
150 SOUND 3,100
160 SOUND 4,200
170 SOUND 5,20
180 ' frecuencia de ruido
190 SOUND 6,10
200 ' registros de amplitud
210 ' activamos la envolvente
220 SOUND 8,16
230 SOUND 9,16
240 SOUND10,16
250 ' mixer
260 SOUND 7,&B00101010
270 ' periodo de la envolvente
280 SOUND 11,100
290 SOUND 12,10
300 '
310 IF INKEY$="" THEN 310
320 ' forma de la envolvente
330 ' y dispara el sonido
340 SOUND 13,1
350 GOTO 310

domingo, 2 de mayo de 2010

Pantalla de ayuda

Ya he terminado la pantalla de ayuda!

Para mostrarla antes guardo la pantalla anterior (tabla de nombre de patrones), en un buffer de memoria para luego recuperarla al salir. Utilizo dos funciones de la BIOS (LDIRVM y LDIRMV), para copiar de VRAM a RAM y viceversa. Se nota la velocidad, comparado cuando utilizo un bucle y vpoke desde C.

Luego muestro el texto que lo he alojado en una zona de la memoria y que se desplaza pulsando en los botones correspondientes. He programado la funcionalidad para mostrar la posición de la barra de scroll. Se ajusta automáticamente, por lo que es totalmente reutilizable. Lo que no tiene es la función de arrastrarla con el puntero.

He modificado el diseño de la barra de scroll original, haciéndola más fina (2 columnas en vez de 3). He utilizado dos sprites para las flechas para que se muestren con el color azul, utilizado en todos los botones de las pantallas.

He tenido que cambiar el tileset, y también le he añadido más caracteres que faltaban en la fuente de color negro, necesario para que se mostrará correctamente los textos.

Si os fijáis en la imagen, vereis que no hay minúsculas. Estas se corresponden a la fuente de color magenta, y la utilizo para poder resaltar títulos y otras palabras. Pensé en cambiar el tileset en esta pantalla y añadirle las minúsculas y una fuente completa en otro color para resaltar las teclas, pero no he querido complicarlo hasta ver si tendré suficiente memoria (se trata de una ROM de 32k).

viernes, 30 de abril de 2010

Estado del proyecto

Quiero hacer una pausa para poneros al día de la situación del proyecto. En la actualidad ya dispongo de una versión operativa. La interfaz esta bastante evolucionada. Se puede controlar con teclado y joystick, y le he añadido funcionalidades que no tenia pensadas.

Sobre el problema en el ajuste de los campos con valores grandes, he seguido la idea que me dio Andrear de utilizar aceleración. Quiero puntualizar, que para resolver este problema he conseguido 4 posibles soluciones: el numpad modal de JamQue, el segundo botón de Neuroflip, la aceleración de Andrear y el slider por mi. Al final he optado por la que he encontrado más óptima para esta aplicación, aunque es muy probable que implemente alguna en futuras aplicaciones.

También he añadido aceleración en el control del puntero, para agilizar el movimiento por la pantalla. Otros novedades seria la sustitución del campo que controla el tempo, por el valor de las pulsaciones por minuto (BPM), y la función de "mute" independiente para cada canal, accionable desde el teclado.

El control por potenciometros lo he dejado parado hasta que termine una primera versión. Ahora quiero centrarme en el acceso a disco y el control por ratón. He encontrado unos tutoriales de Ramones en la página de Konamito que me pueden ayudar en la tarea:
Os dejo una demo de un patrón, para que os hagáis una idea de como suena.
PSGed demo001 by aorante

domingo, 25 de abril de 2010

Mostrar números en Screen 2

Para resolver esta tarea, tendremos que convertir el valor de nuestra variable a una cadena de caracteres y luego mostrarlo en la pantalla de forma similar a como lo hicimos con la función vprint del post anterior. Para la conversión he adaptado una función en assembler de baze (Z80bits Collection of Z80 routines). La he llamado Num2Dec16 y como parámetros se le pasa un valor de tipo entero y la cadena donde se ha de escribir el resultado.

/*
16-bit Integer to ASCII (decimal)
by baze
Input: HL = number to convert, DE = location of ASCII string
Output: ASCII string at (DE)
*/
void Num2Dec16(unsigned int aNumber, char *address)
{
aNumber;
address;
__asm
ld l,4(ix)
ld h,5(ix)

ld e,6(ix)
ld d,7(ix)

ld bc,#-10000
call $Num1
ld bc,#-1000
call $Num1
ld bc,#-100
call $Num1
ld c,#-10
call $Num1
ld c,b
call $Num1
jr $Num3
$Num1:
ld a,#47
$Num2:
inc a
add hl,bc
jr c,$Num2
sbc hl,bc
ld (de),a
inc de
ret
$Num3:

__endasm;
}

La función que tenemos que utilizar se llama vprintNumber y le pasaremos como parámetros la posición de la pantalla, el valor y el número de cifras a mostrar (máximo 5). Para desempeñar su tarea, llama a la función de conversión y luego utiliza getAddress para obtener la dirección VRAM correspondiente a la posición que le hemos dado. Seguidamente, realizará un bucle para mostrar con vpoke la cadena que contiene el valor.

// vprintNumber: muestra un numero en la pantalla
// column = numero de columna (0 a 31)
// line = numero de fila (0 a 23)
// aNumber = valor a mostrar
// aLength = numero de cifras a mostrar
void vprintNumber(char column, char line, unsigned int aNumber, char aLength)
{
char pos=5;
unsigned int tiladdre=0;
char strBuff[5];

Num2Dec16(aNumber, strBuff);

// proporciona la direccion de la VRAM a partir de una posicion
tiladdre = getAddress(column, line);

//coloca el contador en la posicion donde se ha de empezar a mostrar
pos = 5-aLength;

// muestra el numero en la pantalla
while (aLength-->0){ vpoke(tiladdre++,strBuff[pos++]);}
}

Ejemplo de uso:
unsigned int valor=1024;
vprintNumber(9, 14, valor, 4);

viernes, 23 de abril de 2010

Mostrar textos en Screen 2

Para facilitar la tarea de mostrar textos en el modo gráfico Screen 2, he programado una serie de funciones. Si quieres conocer como se programa el VDP de los MSX (TMS9918), podéis encontrar el datasheet en EmuDocs.

La primera función necesaria, es una que nos permita escribir en la VRAM (igual que la instrucción de basic VPOKE). Está programada en assembler y es muy sencilla, ya que utiliza la función WRTVRM de la BIOS. En el registro HL se le pasa la dirección, y en el registro A el valor a escribir.

// address = direccion de memoria VRAM
// value = valor a escribir
void vpoke(unsigned int address, unsigned char value)
{
  address;
  value;
__asm
  ld l,4(ix)
  ld h,5(ix)
  ld a,6(ix)
  call 0x004d
__endasm;
}

La siguiente función es la que nos mostrará el texto en la pantalla.

// posx = numero de columna (0 a 31)
// posy = numero de fila (0 a 23)
// text = cadena de caracteres
void vprint(unsigned char posx, unsigned char posy, char* text)
{
  int longi = strLength(text); // tamaño de la cadena
  unsigned int address = 6144 + (posy * 32) + posx; // calcula la posicion en la VRAM
  while (longi-->0)
  {
   vpoke(address++,*(text++)); // escribe en la VRAM
  }
}

Veréis que lo primero que se hace, es identificar el tamaño de la cadena. En vez de utilizar la función de la librería del SDCC, he creado una que la he llamado strLength:

int strLength(char *str)
{
    int i = 0;
    while(*(str++))  i++;
    return i;
}

Luego se calcula la posición en la memoria de vídeo donde se ha de escribir la cadena, en base a la posición dada. El valor 6144 se refiere a la posición de la tabla de nombre de patrones, en la VRAM. Por último se hace un bucle que escribe los caracteres utilizando la función vpoke.

Para finalizar un ejemplo de uso:
vprint(9, 14, "VERSION 0.21B");

martes, 20 de abril de 2010

Cambios en la GUI

He empezado a programar la interfaz y al probarla me he encontrado con un problema. Al modificar valores grandes como la frecuencia de tono o la frecuencia de la envolvente, los botones para incrementar y reducir, resultan muy lentos. Es necesario añadir un sistema que permita modificar el valor de forma más rápida.

JamQue me ha dado la idea de mostrar a través de un botón, una ventana modal con un teclado numérico que permita introducir el valor. A raíz de esta idea se me ha ocurrido mostrar una modal con un control tipo deslizador. Así que me he puesto con el nMSXtiles y he creado el botón y he diseñado las dos posibles ventanas. Cuando lo implemente veré cual de las dos soluciones es la más ágil.

Tendré que hacer una función que gestione las ventanas modales, para que antes de mostrarse guarde los tiles que se ocultan para luego recuperarlos. Para el caso del "slider", sera necesario utilizar un sprite para el cursor.

También he modificado el control del conmutador (checkbox), ya que no quedaba muy claro cuando estaba activo o inactivo. Para ello he añadido una simulación de un led, que se muestra de color verde cuando esta activo.

lunes, 19 de abril de 2010

Pantalla de presentación


Me he entretenido haciendo la pantalla de presentación, que incluye el logo, mi nombre, la versión y un menú donde se podrá seleccionar el dispositivo de control (teclas de cursor, joystick o mouse).

Para el logo me basado en una fuente TrueType, que he adaptado para que se mostrará con la forma adecuada. Para diferenciar las dos partes que se compone el nombre, he utilizado dos colores. Para acabar, lo he adornado con tres líneas de diferentes grosores, que simbolizan los tres canales con tonos de forma cuadrada del PSG. Esta dibujado con Gimp, y he necesitado utilizar tres sprites de 8x8, para que se mostraran correctamente el color de algunas partes del logo.

También he utilizado un sprite, para la flecha usada como cursor en el menú.

martes, 13 de abril de 2010

Hello World


Para mi primer programa con SDCC, me he propuesto hacer el clásico "Hello World" en una ROM. Primeramente he de agradecer el tutorial de Nerlaska para la creación de ROMs y la información de Andrear. En el código podéis encontrar funciones de acceso al VDP, de ambos. También he usado el nMSXtiles de Pentacour, para crear el tileset de la fuente, que para su conversión a código C, me he apoyado de una utilidad que he creado. Para simplificar la compilación y del proceso de creación de la ROM, también he desarrollado una utilidad con una interfaz gráfica. Cuando estén más estables las compartiré con vosotros.

En el desarrollo me encontré con problemas al insertar los datos de la fuente utilizando muchos arrays de chars. El fichero resultante era muy grande y además al ejecutarlo daba errores. He aprendido que cuando se trabaja con bloques muy grandes de datos, como es el caso de los gráficos, es mejor añadirlo en un único array de char (uno para los patrones, otro para los colores y otro para los nombres de patrones). Además para mi sorpresa, el compilador SDCC comprime los datos repetidos, que para este caso se aprovecha bastante. Es un sistema similar al RLE, pero que afecta únicamente a series de valores repetidos.

El programa es muy simple. Primero llena la pantalla del tile 32, para que no se vea como se escriben los gráficos en la VRAM, que aunque es rápido no es tanto como en assembler. Luego lleno la tabla de colores con el color que uso para la fuente (blanco con fondo azul). Para estas dos tareas utilizo una sencilla función en assembler de Nerlaska que es muy rápida (VDP_FillVRAM). Después copio los datos gráficos (del tileset), a los tres bancos de la pantalla (con vpoke_block). En el siguiente paso pongo los textos en la pantalla con una función a la cual indico la posición de la pantalla y el texto (vprint, esta es mía ;D ). Para finalizar espero la pulsación de una tecla (llamada a la bios CHGET-h009F), y después reinicio el ordenador.

Para compilar, he utilizado la siguiente sentencia (al resultado faltaría aplicarle el hex2bin y convertirlo en una ROM de 16k):
sdcc -mz80 --no-std-crt0 --code-loc 0x4010 --data-loc 0xC000 HelloSC2.c

viernes, 9 de abril de 2010

Elección de lenguaje y herramientas de desarrollo

He investigando como programar la aplicación y he llegado a las siguientes conclusiones:
  • La opción más optima es el Assembler. Es el más utilizado por que permite ante una CPU de 3,58 MHz, aprovechar los recursos al máximo. Encontraremos mucha información y es el que dispone más herramientas y soporte de usuarios expertos. Lo malo es que es mucho más complicado programar y mantener el código.
  • Otra opción interesante es el C. Este lenguaje es menos complicado y más legible. Al compilarse se obtiene una velocidad de ejecución aceptable para determinadas tareas. Como punto negativo, nos encontramos que el fichero compilado puede ser muy grande.
Por los pros y contras de estos lenguajes, he decidido combinar los dos. Dependiendo de como evolucione, continuaré con este sistema o trabajaré únicamente con Assembler.

Como entorno de desarrollo he decidido utilizar el SDCC (Small Device C Compiler), sobre Windows. Se trata de un compilador cruzado de Z80 (y otros microprocesadores), open source, para windows y Linux. Para la edición utilizo PSpad y para completar el kit, estoy creando herramientas para facilitar la compilación y transformación de datos gráficos.
Como comentaba, con el uso de algunas de sus librerias, podemos obtener ficheros excesivamente grandes, por lo que es mejor evitarlas. Se puede compensar, gracias a que permite introducir código assembler, con el que podemos crear librerías para acceso al hardware de los MSX (VDP, PSG, etc...), o con funciones más optimas.

Más info:

sábado, 20 de febrero de 2010

Diseño de la GUI (6). Los sprites.

En el anterior post me centré en las herramientas pero no mostré el diseño final de los sprites. Y aquí los tenéis:

 
Cursor. Se ha reducido el tamaño con relación al diseño inicial.

 
Indicador izquierdo del campo de foco.

Indicador derecho del campo de foco.


Datos de los sprites para Basic y Assembler:
cursor ---------------
1000 REM --- sprites data
1001 DATA 192, 160, 144, 136, 132, 130, 129, 128
1002 DATA 143, 144, 160, 192, 0, 0, 0, 0
1003 DATA 0, 0, 0, 0, 0, 0, 0, 128
1004 DATA 128, 0, 0, 0, 0, 0, 0, 0
1005 DATA 0, 64, 96, 112, 120, 124, 126, 127
1006 DATA 112, 96, 64, 0, 0, 0, 0, 0
1007 DATA 0, 0, 0, 0, 0, 0, 0, 0
1008 DATA 0, 0, 0, 0, 0, 0, 0, 0

; --- sprites data
DB 192, 160, 144, 136, 132, 130, 129, 128
DB 143, 144, 160, 192, 0, 0, 0, 0
DB 0, 0, 0, 0, 0, 0, 0, 128
DB 128, 0, 0, 0, 0, 0, 0, 0
DB 0, 64, 96, 112, 120, 124, 126, 127
DB 112, 96, 64, 0, 0, 0, 0, 0
DB 0, 0, 0, 0, 0, 0, 0, 0
DB 0, 0, 0, 0, 0, 0, 0, 0

foco izq. -------------------
1000 REM --- sprites data
1001 DATA 255, 128, 128, 128, 128, 128, 128, 128
1002 DATA 255, 0, 0, 0, 0, 0, 0, 0
1003 DATA 128, 0, 0, 0, 0, 0, 0, 0
1004 DATA 128, 0, 0, 0, 0, 0, 0, 0

; --- sprites data
DB 255, 128, 128, 128, 128, 128, 128, 128
DB 255, 0, 0, 0, 0, 0, 0, 0
DB 128, 0, 0, 0, 0, 0, 0, 0
DB 128, 0, 0, 0, 0, 0, 0, 0

foco der. -------------------
1000 REM --- sprites data
1001 DATA 255, 0, 0, 0, 0, 0, 0, 0
1002 DATA 255, 0, 0, 0, 0, 0, 0, 0
1003 DATA 128, 128, 128, 128, 128, 128, 128, 128
1004 DATA 128, 0, 0, 0, 0, 0, 0, 0

; --- sprites data
DB 255, 0, 0, 0, 0, 0, 0, 0
DB 255, 0, 0, 0, 0, 0, 0, 0
DB 128, 128, 128, 128, 128, 128, 128, 128
DB 128, 0, 0, 0, 0, 0, 0, 0

martes, 9 de febrero de 2010

Diseño de la GUI (5). Editando los sprites.

Después de dibujarlos, me decidí a pasarlos por un editor de sprites, pero primero voy a comentar las aplicaciones no-nativas que conozco.

img2spr de Andrea (MS-DOS)
Utilizando la consola de sistema, a partir de una imagen (PNG, BMP y TIFF, entre otros), a la salida te proporciona los datos para Basic, Asm y C.

MSX Sprite Draw de Andrea (WEB)
Se trata de una aplicación WEB, desde donde se puede dibujar un sprite con varios colores. Pulsando el botón "Get Sprite" te muestra el código en Basic o Asm, en un recuadro que podremos copiar a un editor de texto. A diferencia de otros editores permite crear sprites de 8x8. Ir a la versión 8x8.

TinySprite de Jannone (WEB)
Es otro editor de sprites de 16x16 desde WEB, pero tiene algunas ventajas sobre el anterior. Tiene bastantes opciones para la edición y permite la creación de mas de un sprites ("slots"). Utiliza el botón derecho del ratón para borrar pixels. Genera código para sprites de MSX1 y 2, en diferentes lenguajes de programación (Basic, Asm, C y Pascal). Tiene un sistema para guardar y leer el set de sprites.


nMSXsprites de Pentacour (MS-DOS)
Con esta utilidad se puede extraer de una imagen en formato PNG, el código assembler de sprites de 16 pixels de ancho. Genera un sprite por cada color y acepta varias figuras separadas por una linea transparente. Proporciona los fuentes para compilarse en otras plataformas como MAC y LINUX.

nMSXtiles de Pentacour (Windows)
Además del editor de tiles, incluye una herramienta para crear sprites de MSX1. Permite la creación de cuatro sets de cuatro sprites de hasta cuatro planos de colores (444! ;D ). Exporta a código Asm.


Para los sprites del PSGed, he utilizado el MSX Sprite Draw de Andrea.

jueves, 4 de febrero de 2010

Diseño de la GUI (4). Tiles y Sprites.

Después de escribir la información sobre el PSG, me he dado cuenta de que hay una carencia en la pantalla del editor. Falta un conmutador para elegir entre un valor fijo de amplitud o variable (envolvente).


Hoy me he dedicado a modificar la pantalla y de paso la he analizado para ver si necesitaba algún cambio más.
Pensando en la forma de señalizar el foco (con sprites), me he percatado de que los colores usados en la pantalla podrían hacer que estos no resaltaran correctamente. Por ese motivo, he cambiado el color de todos los tiles que representan botones, de rojo a magenta y así los sprites se mostrarán en color rojo. Y para finalizar las modificaciones al tileset, distinguiremos los nuevos botones, de los números de las teclas de función, cambiando el color de estos a cían.


Aprovechando que tenia en mente los sprites, los he dibujado. Serán de 16x16 pixels y en el caso del cursor del ratón, utilizaré dos: uno para el fondo y otro para el contorno de color negro.


Para la señalización del foco en modo teclado, utilizaré dos recuadros abiertos por uno de los extremos, para situarlos en los lados del campo.

(clicar para zoom X2)

En la imagen podemos ver señalizados dos campos (a modo prueba), el conmutador de tono del canal B y el registro de la frecuencia de ruido. Por otro lado se puede observar el sprite del cursor en la barra de la secuencia del canal A.

miércoles, 3 de febrero de 2010

Instrucción SOUND

Empecé a experimentar con el PSG desde un programa BASIC, con la instrucción SOUND. Esta permite escribir directamente a los registros. Es una buena manera de aprender su funcionamiento.

Su formato es el siguiente:

SOUND número de registro, expresión
  • número de registro = Enteros de 0 a 13
  • expresión = Constantes, variables o expresiones dentro del margen determinado para cada registro.

En los registros del 8, 9 y 10, hay que tener en cuenta que para ajustar el volumen tendremos que utilizar un valor del 0 al 15 y para activar la envolvente le aplicaremos el valor 16.

En el registro 7, la mejor manera de tocarlo, es utilizando una expresión binaria:

SOUND 7,&B00110110

Su funcionamiento es: 0 es activar y 1 es desactivar. En el ejemplo anterior estaríamos activando el tono del canal A y la mezcla con este del canal de ruido.

En el ejemplo activaríamos el tono de los tres canales (los tres primeros bits) y el ruido se mezclaría con el tercer canal (bit 5).

En el siguiente ejemplo podemos probar de hacer un sonido similar al de un bassdrum, utilizando un tono grave junto a la señal de ruido y aplicándole la envolvente numero 1 (la que empieza en su amplitud máxima y se reduce a cero).
Si utilizamos envolventes infinitas, podemos parar el sonido, aplicando el valor 63 al registro 7 o ejecutando la instrucción beep.
110 ' frecuencia canal A
120 SOUND 0,10
130 SOUND 1,15
140 ' frecuencia ruido
150 SOUND 6,31
160 ' activacion de canales
170 SOUND 7,&B00110110
180 ' amplitud canal A
190 SOUND 8,16
200 ' periodo de la envolvente
210 SOUND 11,0
220 SOUND 12,15
230 ' tipo de envolvente
240 SOUND 13,1

comando sound PSG MSX, tono+ruido
comando sound PSG MSX, tono

martes, 2 de febrero de 2010

Sobre el AY-3-8910 (PSG)

El AY-3-8910 es un chip de sonido diseñado por General Instrument, que proporciona 3 canales generadores de tonos de onda cuadrada, más un generador pseudo-aleatorio de ruido blanco que se puede mezclar independientemente con cada canal.
Tiene control de amplitud de 16 niveles por canal que se puede sustituir por una envolvente común para todos los canales.

Yamaha fabricó un clon totalmente compatible llamado YM-2149, que fue utilizado en ordenadores como los Atari-ST.

Dispone de 16 registros, dos de los cuales son para puertos de entrada/salida que se utilizan para los joysticks.

Nº registro Función Valor
0 Periodo de Tono del canal A (12 bits)
(0 a 4095)
8 bits
1 4 bits
2 Periodo de Tono del canal B (12 bits)
(0 a 4095)
8 bit
3 4 bit
4 Periodo de Tono del canal C (12 bits)
(0 a 4095)
8 bit
5 4 bit
6 Periodo de ruido (0-31) 5 bits 
7 Mixer. Activación de tono y ruido por canal
B7 B6 B5 B4 B3 B2 B1 B0
B A C B A C B A
I/O Port Activación ruido Activación tono
(0=Activo,1=Inactivo)

8 Amplitud del canal A.
B7 B6 B5 B4 B3 B2 B1 B0
X X X Env. Volumen (0-15)
El bit 4 se utiliza para activar la envolvente.

9 Amplitud del canal B
Idem que el registro 8.

10 Amplitud del canal C
Idem que el registro 8.

11 Periodo de la envolvente (16 bits)
(0 a 65535)
8 bits
12 8 bits
13 Tipo de envolvente.
(El periodo se encuentra marcado en gris)
4 bits


Más información:

    lunes, 1 de febrero de 2010

    Diseño de la GUI (3). Las pantallas.

    Esta mañana me la he pasado acabando las pantallas con la herramienta nMSXtiles de Pentacour. He retocado un poco la de edición y la he traducido al ingles. Mi intención es la de hacerlo multiidioma, pero de momento lo dejo para mas adelante, hasta ver como me desenvuelvo con la programación. También he terminado la de leer y guardar ficheros, la de ayuda y la ventana modal. He tenido que modificar el tileset, para reestructurarlo y añadir nuevos tiles que son necesarios.

    Aquí podéis verlas. Espero vuestras opiniones para poderlas mejorar (si esta dentro de mis posibilidades).

    Pantalla principal de la aplicación.

    Pantalla de carga de ficheros. Contiene una serie de botones para seleccionar la unidad y mostrar el directorio. El uso de carpetas (MSXDOS2), no es seguro que lo soporte.

    Pantalla para guardar ficheros. Similar a la de lectura, pero con un campo de entrada para el nombre del fichero.

    Pantalla de ayuda. Es una área donde se mostrará un texto que se controlará mediante una barra de scroll.


    Ventana Modal. He tenido que crear unos tiles para el contorno y la sombra. Aprovecho la fuente con fondo negro de la barra de menú, para hacer los botones.


    domingo, 31 de enero de 2010

    Funcionalidad

    He creado una lista de la funcionalidad, desglosada por categorías.
    Algunas ya están resueltas ;D>

    Proyecto y código
    • Crear blog como canal de información.
    • Dar de alta proyecto en Google Codesourceforge.
    • Recolección de documentación técnica para el desarrollo.
    • Elección de la tecnologia a usar (lenguaje/s de programación), y herramientas de desarrollo.
    • Buscar librerías y código de apoyo para MSX.
    • Crear "Hello World".
    • Decidir lenguajes soportados: (monoidioma/multiidioma)? (Español/Ingles)?
    • La aplicación ha de ser de tipo ROM de 32k.

      Diseño de la interfaz gráfica
      • Tileset
      • Pantalla de presentación.
      • Pantalla del editor.
      • Pantalla de ayuda
      • Pantalla de carga de ficheros.
      • Pantalla para guardar ficheros.
      • Ventana modal de salida de mensajes (alerta, aviso y error).
      • Sprite cursor para ratón.
      • Sprite cursor para teclado.

      I/O
      • Acceso a los controles por teclado.
      • Acceso a los controles con ratón.
      • Acceso a los controles mediante potenciometros.
      • Acceso a disco. Leer y guardar ficheros binarios de un área de memoria (datos del PSGed)

      Controles de pantalla
      • Selector de valor simple. Izquierda decrementa y derecha incrementa el valor.
      • Selector de valor de envolvente. Igual que el simple, pero muestra una imagen correspondiente a la forma del envolvente.
      • CheckBox: Conmutador con dos estados (Off/On).
      • Tira de conmutadores de los patrones.
      • Botón de salida de la aplicación (solo desde ratón).
      • Control de flujo de tabulación (con cursores arriba y abajo)

      Funcionalidades por teclas
      • [F1] Muestra la pantalla de Ayuda.
      • [F2] Player del secuencia (3 canales un solo patrón).
      • [F3] Acceso al Editor.
      • [F4] Acceso a la ventana de carga de ficheros.
      • [F5] Acceso a la ventana para guardar ficheros.
      • [Stop]. Detiene el secuenciador y reset de los tres canales.
      • Cursores Arriba y abajo. Cambia el foco del control de la pantalla.
      • Cursores Izquierda y derecha. Cambia el valor del control.
      • [Enter] Ok.
      • [Esc] Cancelar/Salir (Ventanas modales, Help, Load y Save).

      jueves, 28 de enero de 2010

      Diseño de la GUI (2). Las herramientas.

      Primeramente, me olvide decir de que la pantalla esta realizada para el modo screen 2 de los MSX. Aprovecho para presentaros un tutotial de como dibujar imágenes para screen2 con Photoshop, que he alojado recientemente en mi blog.

      La imagen final que vimos en el post anterior, es un boceto desde donde saque el tileset para crear las pantallas con un programa editor de mapas de caracteres (tiles).


      El sofware que he utilizado es nMSXtiles v0.4.2 de Pentacour para Windows. Es una aplicación especifica para crear pantallas en modo screen 2, a partir de una imagen con los tiles. Simplifica enormemente el desarrollo de las pantallas, comparado con otros medios y nos proporciona un fichero con los datos preparados para utilizarlos en nuestros programas en assembler.


      De momento he realizado la ventana de Edición y he empezado a trabajar las ventanas de leer y guardar ficheros. Haciendo estas últimas, me he dado cuenta de que tendré que añadir nuevos tiles.

      Nota: Si alguien quiere utilizar estos tiles, autorizo a usarlos y modificarlos sin ningún tipo de requisito, aunque agradecería que me lo comunicarais.

      martes, 26 de enero de 2010

      Diseño de la GUI (1). Diseño y Bocetos.

      Antes de entrar en detalle de como se elaboró, quiero mostrar varios de los pasos de la evolución de la Interfaz Gráfica de Usuario (GUI), hasta llegar a la definitiva.
      Aunque lo mejor es empezar dibujándola en papel, yo muchas veces empiezo a plasmar mis ideas directamente desde Photoshop. Quizás no sea lo mejor para pantallas de poca resolución, siendo aconsejado un programa tipo Paint, como los existentes para Amiga como el Deluxe Paint o Personal Paint. También existen programas de este tipo para PC, creo que son freeware. Habría que probarlos para ver que tal funcionan. Para MAC existe el Pixen, pero me es un poco incomodo, seguramente por que no estoy acostumbrado a él. Para MSX también hay bastantes programas tipo Paint. Lo recomendable es utilizar la herramienta con la que uno trabaje más a gusto.

      En el primer boceto, podemos ver que empecé a desarrollar varias partes. Una de ellas es un control tipo potenciometro. Probé con dos tamaños, pero me decidí por el pequeño, con un tamaño de 16x16 puntos. También creé la fuente, unos marcos, un controlador tipo checkbox, un selector de envolvente y un deslizador para el control de volumen.

      En la siguiente pantalla, podemos ver que comencé a darle forma. Desestime el control tipo potenciometro y lo sustituí por un selector donde se muestra el valor decimal de los registros. Mi intención era de poner un controlador del volumen general, pero como veremos más adelante, lo eliminé, para simplificar.

      En esta pantalla, amplié la zona del envolvente y el ruido para que abarcara el ancho de la pantalla para indicar que afectan a los tres canales. También compacté los controles para ganar espacio en la zona de abajo y utilicé colores para mejorar el aspecto y diferenciar la información. Aunque no se vea, en una capa iva trabajando en el set de caracteres.

      En el siguiente paso cambié el dibujo de los marcos por unos en relieve.

      En este último paso, como podéis observar, hay bastantes cambios. El logo lo he modificado por una barra horizontal con el nombre de aplicación y la versión más un botón de salida. Uno de los motivos, es el de ganar espacio para poder incorporar todas las funcionalidades necesarias. He añadido un título de la pantalla, que en este caso seria la de Edición, ya que habrá una de ayuda, y las de acceso a disco para leer y grabar la información. Abajo he añadido un pequeño secuenciador de 16 pasos (tipo TR 909), pero de un solo patrón. y una barra con un menú de opciones, que se lanzan con las teclas de función.

      lunes, 25 de enero de 2010

      Comienza un nuevo proyecto

      PSGed pretende ser un programa para los ordenadores MSX de primera generación, para edición de los registros del chip de sonido AY-3-8910.
      La idea nació el año pasado, inspirado en el post del blog de Neuroflip del controlador basado en potenciometros para el Prophet64 de Commodore 64. Mi intención es conseguir una utilidad para jugar con el PSG, con una interfaz atractiva y fácil de usar, con la posibilidad de usar ratón y potenciometros.
      El objetivo es adquirir experiencia para abordar un proyecto mas complejo, como es el desarrollo de un secuenciador musical tipo tracker para el modulo de sonido SFG-01/05 de Yamaha (incluido en los ordenadores CX5M).
      Con este blog quiero compartir la experiencia por si puede servir de ayuda a alguien y aprovechar para invitaros a participar con vuestros comentarios e ideas.