domingo, 9 de septiembre de 2012

maduración


Aunque no he dado muchos síntomas de vida (en el blog), no he dejado parados mis proyectos.

En el camino de madurar la idea inicial del PSGed (una Groovebox para MSX), empieza a coger forma gracias a la experiencia adquirida en todo este tiempo.

Una de estas experiencias, ha sido el concurso de aplicaciones musicales algorítmicas, de los foros karoshi, que me ha dado ideas para este proyecto. La aplicación con la que participé (TARP), viene a ser el motor del grooveSX, que empezará como una drum machine para 2 AY (si se tiene pinchada la MegaflashROM SCC+ de Pazos) y a la que, en una versión posterior, le añadiré un canal de bajo por AY.

La primera fase de este proyecto esta muy evolucionada, a falta de añadir el acceso a disco, parte que le queda muy poco (y a la que quiero dedicar un merecido post).

sábado, 12 de mayo de 2012

The Alan Randoms Project v0.9b


Mi participación en el primer eXperimental Sound Mini-compo, ha sido una pequeña aplicación que la he llamado The Alan Randoms Project (TARP). No es más que un generador aleatorio de patrones de ritmo y melodía, donde se puede jugar con algunos parámetros para variar el sonido de los instrumentos.
Para la interfaz, he re-utilizado el set gráfico del PSGed y le he añadido un vumeter giratorio para darle un aspecto más marciano, compuesto por circulo rojo central (Marte) y orbitando sobre él, los vumeters de percusión (Fobos) y acompañamiento (Deimos).


Ha sido una experiencia muy positiva. Me ha proporcionado conocimiento, como la creación de envolventes por software y nuevas ideas que podré utilizar para crear un software tipo groove-machine para MSX.

lunes, 16 de abril de 2012

eXperimental Sound Mini-compo 1 (XSM)

En los foros de Karoshi, promovido por Kun, se ha lanzado un concurso con el objetivo de generar nuevas conexiones sinápticas entre las neuronas destinadas a temas musicales. Se trata de hacer un soft para MSX que genere sonidos con formato marciano. Puede ser algorítmico, aleatorio o interactivo. Las reglas son muy permisivas en este aspecto, pero sobre todo ha de ser marciano.

Sospecho que los frikis tenemos en algún momento de nuestra historia, nuestro Adán y Eva, y conociendo el comportamiento de los machos humanos, Eva seria la extraterrestre. Así que como buen friki, no puedo dejar pasar la oportunidad de participar ante tal evento galáctico.

Dif-tor heh smusma!

viernes, 16 de marzo de 2012

Algorithmic Compositions con AY

Hace un tiempo descubrí a través de neuroflip, las Algorithmic Compositions mediante un post del blog de Countercomplex. Se trata de melodías generadas mediante un algoritmo informático. El tema es bastante amplio ya que hay muchas formas de generar este tipo de música, como modelos matemáticos, sistemas basados en el conocimiento, modelos evolutivos, sistemas híbridos, etc.

En el caso del artículo de Computercomplex, se trata de una formula matemática y el código esta reducido a una sola linea. Entrando en un poco más de detalle, la formula proporciona un valor de frecuencia en base a un valor lineal (t) y se reproduce en el instante. Esto produce resultados bastante curiosos.

Cuando lo vi, pensé en intentar adaptarlo para hacerlas funcionar en un MSX con el chip AY, pero me olvide del tema, hasta principios de este año. He utilizado C (SDCC), y debido a la diferencia de velocidad de ejecución, no suenan igual, pero algunas se pueden adaptar para que suene algo con forma que no sea muy ruidoso... ;) Seguramente programado en assembler se ganaría velocidad y se podría conseguir resultados más interesantes...

El código es el siguiente (Contiene dos formulas. Una esta comentada):
/* ============================================================ */
/* sound_01.c */
/* by 2012 aorante */
/* Algorithmic symphonies */
/* ============================================================ */
// http://countercomplex.blogspot.com/2011/10/algorithmic-symphonies-from-one-line-of.html


__sfr __at 0xA8 g_slotPort;

#define HALT __asm halt __endasm

#define BASE5 0x1800

typedef enum {false = 0, true = 1} boolean;

// unsigned integer
typedef unsigned int uint;

// unsigned char
typedef unsigned char byte;

byte sound_get(byte reg);
void sound_set(byte reg, byte val);
void setChannel(byte NumChannel, boolean isTone, boolean isNoise);

void vpoke(uint address, byte value);
void vprint(byte posx, byte posy, char* text);

void main(void) {
__asm
di
ld sp, (#0xFC4A)
ei
__endasm;

g_slotPort = (g_slotPort & 0xCF) | ((g_slotPort & 0x0C) << 2); start(); } void start() { uint t; uint freq; sound_set(8,15); setChannel(0,true,false); vprint(4,15,"Algorithmic Symphonies 1"); for(t=0;t<65535;t++) //65536 { //freq=t*(t>>11&t>>8&123&t>>3); //by tejeez
freq=(t*(t>>11&t>>8&123&t>>3))>>6; //01

//freq=(t*(t>>5|t>>8))>>(t>>16); // by tejeez
//freq=((t*(t>>12&t>>6))>>(t>>16))>>4; //02

sound_set(0,freq & 0xFF);
sound_set(1,(freq & 0xFF00)/255);
}

sound_set(8,0);
vprint(3,17,"Press any key to continue...");
pressKey();

CHKRAM();
}


void pressKey()
{
__asm
call #0x009F ;CHGET
__endasm;
}

void CHKRAM()
{
__asm
call 0x0000
__endasm;
}

// activa tono y ruido de uno de los tres canales del PSG
void setChannel(byte NumChannel, boolean isTone, boolean isNoise)
{
byte newValue;

newValue = sound_get(7);

if(NumChannel==0)
{
if(isTone==true){newValue&=254;}else{newValue|=1;}
if(isNoise==true){newValue&=247;}else{newValue|=8;}
}
if(NumChannel==1)
{
if(isTone==true){newValue&=253;}else{newValue|=2;}
if(isNoise==true){newValue&=239;}else{newValue|=16;}
}
if(NumChannel==2)
{
if(isTone==true){newValue&=251;}else{newValue|=4;}
if(isNoise==true){newValue&=223;}else{newValue|=32;}
}
sound_set(7,newValue);
}


void sound_set(byte reg, byte val)
{
reg;
val;
__asm
ld a, 4(ix)
ld e, 5(ix)
call 0x0093
__endasm;
}

byte sound_get(byte reg)
{
reg;
__asm
ld A,4(ix)
call 0x0096
ld L,A
__endasm;
}

void vprint(byte posx, byte posy, char* text)
{
uint address = BASE5 + (posy * 32) + posx; // calcula la posicion en la VRAM
while(*(text)) vpoke(address++,*(text++));
}

void vpoke(uint address, byte value)
{
address;
value;
__asm
ld l,4(ix)
ld h,5(ix)
ld a,6(ix)
call 0x004D
__endasm;
}

y aquí podeis escucharlas:





El tema da para mucha experimentación. Se podría aprovechar el resto de canales, incluido el ruido.

Nota: Las formulas utilizadas son adaptaciones de las creadas por tejeez.

jueves, 26 de enero de 2012

Versión 0.82b disponible!

He publicado la versión 0.82b del PSGed, con algunas correcciones relacionadas con la modificación en tiempo real de los registros del AY. La tenia olvidada en mi disco duro, y hoy me he acordado gracias a los foros de Karoshi.
Aunque últimamente estoy con otros proyectos, me gustaría mejorar algunos cosas de esta versión y añadirle el acceso a disco.
Enlace a la ROM.

sábado, 17 de septiembre de 2011

Programando con SDCC. Funciones y retornos.

A la hora de programar con SDCC me he encontrado con algunos problemas, que francamente no se si están descritos en alguna parte, pero quiero compartirlos por si alguien se anima a programar con este compilador cruzado y se encuentra que no le funcionan sus programas.

En este post, voy ha hablar de dos casos relacionados con la creación de funciones.

El primero se da en funciones que no devuelven datos (void). Lo normal es que no se incluya la sentencia "RETURN" y por lo general funcionara correctamente, pero me he encontrado con casos en los que me ha dado un error al compilar (cuando compila el código ensamblador que genera a partir del fuente C). La causa la desconozco pero si no recuerdo mal en todos los casos finalizaba la función con una condición de tipo "IF" o "SWITCH CASE". Se soluciona incorporando siempre un retorno.

El segundo caso, es cuando realizamos una función en ensamblador dentro de nuestro fuente en C, y queremos que en un determinado momento salga con un "ret". Las funciones en ensamblador cuando se compilan, añade un retorno automáticamente al final de esta, pero en el caso de que la función le pasemos datos, el compilador añade un "push IX" al inicio y por consiguiente al final añade un "pop IX". En estos casos si ponemos un retorno se colgará nuestro programa al ejecutarlo. Para solucionarlo, antes tendremos que añadir un "pop IX".

Ejemplo:
void IniciaDatos(char valor)
{
valor;
__asm
ld HL,#DATA

ld A,4(IX)
cp #0
jr Z,COPY

ld B,#0
ld C,A

sla C ; multiplico por 8
sla C
sla C

ADD HL,BC

COPY:
ld DE,#BUFFER
ld BC,#8

ldir

pop IX ; IMPORTANTE! solo en funciones con entrada de datos
ret

DATA:
.db 0x00,0x02,0x06,0x0E,0x1E,0x3E,0x7E,0x00
.db 0x38,0x44,0x82,0x82,0x82,0x44,0x38,0x00
.db 0xFF,0xE7,0xC3,0x81,0x00,0x18,0x3C,0x7E
.db 0xF0,0xF0,0xF0,0xF0,0x0F,0x0F,0x0F,0x0F

__endasm;
}

miércoles, 13 de julio de 2011

Nace el proyecto grooveSX live


Como avanzaba en el anterior post, he iniciado un nuevo proyecto de una aplicación musical. Estará orientada a la creación de temás y la reproducción en vivo, con funciones para el lanzamiento independiente de patrones y la posibilidad de jugar con la activación/desactivación de los canales.

Para esta nueva aplicación he querido centrarme en la funcionalidad y la interfaz gráfica, que es mi fuerte, mientras que para el player he buscado uno de los que podemos encontrar para MSX. He de ser realista, programar uno de cero me llevaría mucho tiempo, no me motiva y no creo que pudiera conseguir el nivel de los ya existentes.

Para el chip AY, conozco los players: Vortex, el Arkos, el ZMA y el WYZ y el que más se ajusta a las necesidades del proyecto es el WYZ. He escuchado la música del autor, en muchos sitios pero no conocía las posibilidades del player, hasta que hace poco probé el tracker para PC y me gusto por que tiene muchas de las características que busco, como el uso del efecto de la envolvente (utilizado como un instrumento de bajo) y el canal de FX que permite realizar sonidos para percusión. Además esta preparado para aprovechar el MegaFlashROM SCC+, obteniendo 2 AY + 1 SCC.

Así que me puse en contacto con WYZ. Le ha gustado la idea y ya nos hemos puesto a trabajar en la aplicación.
En la pasada chiptune stage 3 organizada por el ClubSprite, mostré una demo de la parte de reproducción (modo live), que utiliza solo un AY pero suena increíble!


Podéis seguir la evolución del proyecto en este mismo blog.

Más información sobre el WYZ player.