El algoritmo del mapa de Henon para generar una melodía parte de la
siguiente ecuación:
x(n+1)= ax(n)^2 + bx(n-1) + 1
x(n+1) = 1 + ax(n)^2 + by(n)
y(n+1) = x
Noten que hay valores pasados presentes y futuros.
x(n+1), es el valor futuro x(n), es el valor presente y x(n-1) es el
pasado. x(n)^2 es la función x(n) al cuadrado.
a = alfa, b = beta son los coeficientes del mapa Henon.
Los puntos en el mapa Henon (i.e. la gráfica) se generan al reiterar la
ecuación varias veces dependiendo de la resolución que se quiere. En el
caso de una melodía no es necesario sino hacerla reiterar 100 veces para
100 notas, por ejemplo.
Los valores alfa y beta son los que se cambian para lograr diferentes
formas y patrones del mapa Henon. Los alfa deben estar entre:
[-2.5 y -1/N ], los beta deben estar entre: [-0.5 y 0.5].
El algoritmo en pseudo C o Java para generar los valores MIDI a partir
de Henon puede ser el siguiente:
/******************************************************************
*
* Henon.c por Juan Reyes [EMAIL PROTECTED]
* N, iteraciones. a,b, coeficientes. x,y, condiciones iniciales.
* X[N], Y[N], arreglos con valores de la ecuación
*
*******************************************************************/
void Henon ()
{
float newx = 0, newy =0;
float a =-1.85039, b = 0.00393701;
float x = 0.63135448, y = 0.18940634;
for (int i=1; i < (N+1); i++)
{
newx = (a*(x^2)) + (b*y) + 1;
newy = x;
x = newx;
y = newy;
X(i) = x;
Y(i) = y;
}
/*****************************************************************
* Para mapear valores de Henon a Notas MIDI
* se utiliza la siguiente formula:
* y = floor( [(x+offset)/delta] * (127+ c))+cota_baja
*****************************************************************/
void MIDIize () {
int N=100;
float offset=1.0;
float maxin=2.0;
float d=1.25;
float maxMIDI=127.0;
float c=0.75;
int cota=15;
for (int j=1; j < (N+1); j++)
{
MIDI(j) =floor(((Y(j) + offset)/(maxin*d)) * (maxMIDI+c))+cota;
}
}
int main () {
// variables globales
int N=100;
float MIDI[N], X[N], Y[N];
//
// valores MIDI a standard out
//
for (int i=1; i < (N+1); i++)
{
cout << "NOTA_MIDI["<< i << "] = "<< MIDI[i] << endl;
}
}
//
//
/*************************************************************
*
* F I N
*
*
************************************************************/
_______________________________________________
____ _ _ ___ _ _ ____ ___ ___
|___ \/ |__] \_/ |___ / |__]
|___ _/\_ | | |___ /__ |
expyezp mailing list
[email protected]
http://lists.slow.tk/listinfo.cgi/expyezp-slow.tk