Tesis que para obtener el




descargar 373.05 Kb.
títuloTesis que para obtener el
página6/7
fecha de publicación19.10.2016
tamaño373.05 Kb.
tipoTesis
b.se-todo.com > Derecho > Tesis
1   2   3   4   5   6   7

 

 


Prog. 5 : Pseudocódigo de la rutina Piano(), que genera, en el arreglo Notas[], las frecuencias de cinco escalas cromáticas.

 


do, #do, re, #re, mi, fa, #fa sol, #sol, la, #la, si

notas[]={65, 69, 73, 77, 82, 87, 92, 98, 103, 110, 116, 123}

 

 

Piano()

{

x = 1;

z = 1;

while( x <= 32 )

{

for( i=0; i<12; i++ )

{

notas[z] = notas[i] * x;

z++;

}

x*=2;

}

}



De esta forma, la rutina Piano (), solamente necesita ir duplicando los valores iniciales del arreglo Notas [], hasta obtener 5 escalas; desde luego, se pueden obtener tantas escalas como se desee, pero por razones prácticas sólo se generan 5 escalas, ya que frecuencias más altas difícilmente se escuchan mediante la bocina de la PC.

Una vez que la rutina Piano() ha obtenido las 5 escalas deseadas, se ha creado un piano virtual, en donde ya se puede interpretar una melodía.

b. Lee Matriz Evolutiva Aleatoria (Rutina InArchivosMatriz)

El paso siguiente que da el sistema es abrir un archivo, que representa la memoria a largo plazo del sistema y vacía su información en un arreglo bidimensional llamado Bethoven1 [70][70], que es la Matriz Evolutiva Aleatoria del sistema y representa su memoria a corto plazo. Este proceso se lleva a cabo mediante una rutina llamada InArchivosMatriz().


InArchivosMatriz()

{

/* Abre el archivo matriz.evl, en donde se almacena la

Matriz Evolutiva Aleatoria */

in = fopen( matriz.evl, "rb+");

 

/*Copia la Matriz Evolutiva Aleatoria al arreglo Bethoven1[70][70]

de 70 columnas por 70 renglones */

fread(Bethoven1,70 * 70 * sizeof(unsigned long),1,in);

}

 

Prog. 6 : Pseudocódigo de la rutina InArchivosMatriz(), que copia en el arreglo Bethoven1[70][70], la Matriz Evolutiva Aleatoria, almacenada en el archivo matriz.evl.

 




Una vez ejecutada esta rutina, el sistema entra en un ciclo, del cual sólo podrá salir hasta que el usuario presione la tecla Esc.

Este ciclo está compuesto básicamente de dos rutinas y representa lo que hemos denominado el Administrador de los Procesos.

3.1 Administrador de los Procesos

El Administrador de los Procesos de este sistema, se compone principalmente de dos rutinas, una que se llama Listot() que se encarga de estar pendiente de lo que el usuario indique a través del teclado de la computadora y la rutina Ejecuta() que se encarga de ejecutar tal o cual proceso basándose en la instrucción recibida.

Los procesos que la rutina Ejecuta() puede llamar son 6, uno para salir del sistema, 3 generadores de ruido, uno de blanco, uno de browniano, y otro de 1/f, un generador de música y un proceso de aprendizaje que está íntimamente ligado con el proceso de generación de música, que modifica en tiempo real la memoria a corto plazo del sistema, característica que permite que el sistema sea inteligente, pues no sólo aprende sino además evoluciona.

Señales del Usuario

-Proceso a Ejecutar

-Esc

Recibe Señal

del Usuario

Listot

Señal del

Usuario

Sale


Esc
Llama a los

Procesos del Sistema

Ejecuta

Proceso de Aprendizaje

Guarda Matriz Evolutiva Aleatoria

OutArchivosMatriz

Generador de Ruido Browniano

 

Escala

Generador de Ruido 1/f

 

Ruido_1f

Generador de Musica

 

MusicaPorcentual

Generador de Ruido Blanco

 

Ruido_Blanco

A continuación se muestra el diagrama de flujo de datos del Administrador de los Procesos y los procesos del sistema (nótese, que las rutinas Listot() y Ejecuta() se manejan en forma concurrente).

c. Rutina Listot

Listot()

{

Si usuario presiona tecla /* Si alguna tecla es presionada,

caracter = tecla /* su valor es almacenado en la

} /* variable carácter.

 

Prog. 7: Pseudocódigo de la rutina Listot(). Hay que resaltar que mientras menos funciones tenga esta rutina, mejor.
El sistema debe estar atento, en todo momento, a las señales de entrada del usuario, por esta razón a esta rutina la hemos denominado Listot(). Será la encargada de recibir las señales y almacenarlas, ésta es la única función que le corresponde y tiene que ser una rutina extremadamente pequeña. Listot() deberá de estar en todas partes del programa, esto es, independientemente de las instrucciones que se estén ejecutando en el momento, por lo que se instala de tal forma que se dispara mediante interrupciones al sistema, si hay una señal de entrada, Listot() debe de ser capaz de recibir la señal.

d. Rutina Ejecuta


Ejecuta()

{

switch(caracter)

{ /* Compara la tecla presionada

case '1': ruido browniano; /* con los distintos procesos del

case '2': ruido 1/f; /* sistema, si es desconocida, la

case '3': matriz evolutiva; /* señal es ignorada.

case '4': ruido blanco;

case 'Esc': Salir del Sistema;

case 'a': Proceso de Aprendizaje;

}

}

Prog. 8: Pseudocódigo de la rutina Ejecuta().


La segunda rutina que forma parte del administrador de procesos es Ejecuta() y es la rutina encargada de ejecutar las acciones de las que es capaz el sistema. La única misión, o más bien la más importante de Ejecuta(), es asignar a cada señal, el proceso que le corresponde y ejecutarlo. Esto quiere decir, que cada vez que Listot() detecte una señal de entrada por el teclado, será la rutina Ejecuta() la que se encargue de seleccionar el proceso indicado a ejecutar. Cuando el usuario presione la tecla de Esc, el sistema saldrá, no importando que proceso se esté ejecutando. En caso de que la señal de entrada recibida sea un dato desconocido, causa que el sistema simplemente lo ignore. Es posible desarrollar un sistema evolutivo que aprenda lenguaje natural y que cada vez que encuentre una señal desconocida simplemente pregunte de qué se trata, pero bien podría ser éste, tema para otro trabajo.

Debido a que los procesos para la generación de ruido que la rutina Ejecuta() puede llamar, ya se han descrito anteriormente, nos enfocaremos a describir con más detalle la música compuesta mediante la matriz evolutiva y el proceso que utiliza el sistema para aprender a partir de los ejemplos que el usuario proporcione codificados en el formato musical descrito en el Anexo A.

e. Rutina Aprende

El proceso de aprendizaje de este Sistema es una de sus principales características, es la puerta que lo pone en contacto con el medio ambiente y gracias a ella, el Sistema puede aprender y evolucionar de manera permanente, aumentando su capacidad para adaptarse al medio que lo rodea.

Este proceso de aprendizaje comienza cuando la rutina Ejecuta() llama a la rutina Aprende(). Esta, es la encargada de llenar la Matriz Evolutiva Aleatoria, incrementando la posibilidad de que cada nota leída del arreglo sea tocada, tal y como se hizo con el ejemplo del fragmento de Paganini, en el tema Funcionamiento del Corazón del Sistema Evolutivo, del Capítulo II Sistema Evolutivo Generador de Música.


Prog. 9: Pseudocódigo de la rutina Aprende().

Aprende()

{

Usuario selecciona el nombre de la melodía a aprender; //Cuando la rutina ejecuta() llama a la //rutina aprende(), el sistema permite que //el usuario seleccione alguna melodía.

 

renglón = primer nota de la melodía; //La primer nota de la melodía nos indica el //primer renglón que registrará un cambio.

While(no se acabe la melodía)

{ //El sistema leerá todas las notas hasta que se acabe la

nota = siguiente nota de la melodía; //melodía. Con cada nota leída, se incrementará la

Bethoven1 [renglón] [nota] += 1; //probabilidad de volver a tocar esa nota, en la Matriz

renglón = nota; //Evolutiva Aleatoria.

}


La forma en la que la rutina Aprende() funciona, es registrando en el arreglo Bethoven1[70][70] de 70 renglones por 70 columnas, las notas que aparecen en cada melodía proporcionada como ejemplo. De esta manera, se modifica la Matriz Evolutiva Aleatoria, que originalmente fue cargada con los valores almacenados en el archivo matriz.evl, mismo en el que se almacenarán los cambios evolutivos que sufra la matriz, a lo largo del tiempo que el Sistema se esté ejecutando.

f. Genera Matriz Evolutiva de Frecuencias Acumuladas (Rutina EscalaPorcentual)

Una vez que la rutina Aprende() ha terminado de leer el ejemplo, es el turno de ejecutar otra rutina llamada EscalaPorcentual(), que genera la Matriz Evolutiva de Frecuencias Acumuladas a partir de los valores almacenados en la Matriz Evolutiva Aleatoria (arreglo bidimensional Bethoven1[70][70]).

Esta rutina, primeramente copia la información almacenada en el arreglo Bethoven1[70][70] al arreglo Bethoven[70][70], que también es de 70 columnas por 70 renglones y que representa la Matriz Evolutiva de Frecuencias Acumuladas.

De esta matriz sólo se utilizan 60 columnas y 60 renglones para almacenar el incremento de las probabilidades de cada nota y la columna 62 se utiliza para almacenar los Totales de cada renglón.


EscalaPorcentual()

{

for( a1 = 1; a1 <= 60; a1++ ) //Copia el contenido de la matriz Bethoven1

for( a2=1; a2 <= 60; a2++ ) //en la matriz Bethoven.

Bethoven [a1] [a2] = Bethoven1 [a1] [a2];

 

for ( a1 = 1; a1 <= 60; a1++ ) //Se suman los porcentajes de cada renglón y la suma

{ //se alamacena en la columna 62 de cada renglón.

zz = 0;

for ( a2 = 1; a2 <= 60; a2++ )

{

if( Bethoven [a1] [a2] != 0 ) //zz es la variable que se utiliza

{ //para ir sumando los porcentajes

zz += Bethoven[a1][a2];

Bethoven[a1][a2] = zz;

}

 

}

Bethoven[a1][62] = zz;

}

}

Prog. 10: Pseudocódigo de la rutina EscalaPorcentual().



Una vez que la rutina EscalaPorcentual() ha generado la Matriz Evolutiva de Frecuencias Acumuladas conforme a lo descrito en el tema Sistema Compositor, del Capítulo II Sistema Evolutivo Generador de Música, ya se han almacenado en la matriz Bethoven[70][70] los cambios aprendidos por el Sistema a través del ejemplo proporcionado y la matriz evolutiva contiene las características de los ejemplos que se proporcionen.

Utilizando la información contenida en la matriz obtenida de esta manera, el sistema ya es capaz de componer una melodía y esto lo hace por medio de un generador de música.

g. Generador de Música (Rutina MusicaPorcentual)

La rutina que se encarga de hacer las composiciones musicales se llama MusicaPorcentual(). Lo hace llevando a cabo el proceso mencionado en el tema Sistema Compositor, del Capítulo II Sistema Evolutivo Generador de Música. Esto es, escoge uno de los renglones en los que la columna 62, de la Matriz Evolutiva de Frecuencias Acumuladas, sea diferente de cero. Genera un número aleatorio entre cero y el valor del total almacenado en la casilla 62 de ese renglón y lo compara con todos los valores mayores de cero de ese renglón hasta encontrar el que sea mayor o igual, la columna donde está almacenado el valor encontrado representa la siguiente nota a ser tocada y el siguiente renglón a ser procesado de la misma forma.

Mediante la rutina MúsicaPorcentual() se pueden generar agradables melodías. Pero esta no es la única función de la rutina MúsicaPorcentual(). Una función muy importante que realiza esta rutina es la de ir modificando las dos matrices al mismo tiempo que está generando la melodía. Este hecho es el que convierte a las matrices en evolutivas y por consecuencia al Sistema.

Para explicar este proceso, al cual nos hemos referido anteriormente como proceso de aplicación, tomemos como ejemplo un ser humano (sistema evolutivo) que está aprendiendo a tocar música. La manera en la que aprende a tocar, es repitiendo muchas veces ejercicios y melodías con el fin de adquirir la destreza para ejecutarlos perfectamente. Mientras más se toque una melodía, más se graba en la memoria del músico, llegando al punto en que es capaz de ejecutar la melodía sin tener que voltear a ver la nota que está tocando. Así pues, las notas que más se tocan son las que más se recuerdan y mientras menos se tocan tienden a olvidarse.

Similarmente, la rutina MusicaPorcentual() cada vez que genera una nota, incrementa su posibilidad de ser tocada nuevamente. Esto quiere decir, que las matrices están evolucionando constantemente, pues con cada nota que es tocada las matrices evolutivas sufren modificaciones.


Prog. 11: Pseudocódigo de la rutina MusicaPorcentual().

MusicaPorcentual()

{

a1 = nota_siguiente //Genera un número aleatorio entre el valor almacenado en el

zz = random( Bethoven [a1] [62] )+1; //(renglón a1, columna 62) y cero.

a2 = 1; //encuentra la columna a2 del renglón a1, que contiene

while( Bethoven[a1][a2] < zz && a2<=60 ) a2++; //un valor mayor o igual al número aleatorio, el

nota_siguiente = a2; // número de esa columna es la siguiente nota.

Bethoven1[a1][a2] += 1; //Actualiza (evoluciona) la Matriz Evolutiva Aleatoria.

 

if( Bethoven1[a1][a2] > 500 )

{

for( a1 = 1; a1 <= 60; a1++ ) //Mecanismo de olvido, cada vez que algún valor de la

for( a2=1; a2 <= 60; a2++ ) //matriz llega a 500, a todos los valores se les divide

if( Bethoven1[a1][a2] > 1 ) //entre 2 y aquellos menores a 1 se igualan a 1.

Bethoven1[a1][a2] /= 2;

else

Bethoven1[a1][a2] = 1;

EscalaPorcentual();

}

while( a2 <= 62 )

{

if( Bethoven[a1][a2] != 0 ) //Actualiza (evoluciona) la Matriz Evolutiva de

{ // Frecuencias Acumuladas

Bethoven[a1][a2] += 1;

}

a2++;

}

 

}

 


Es importante que el Sistema cuente con un mecanismo de olvido, ya que mientras más se toca una nota, mayor es la posibilidad de que vuelva a ser tocada y si no existiera un mecanismo de olvido, después de un largo tiempo de ejecución, todas las notas tendrían probabilidades muy grandes de ser tocadas. Sin embargo, desarrollar un mecanismo de olvido no es una tarea sencilla y podría representar un trabajo completo por sí sólo. Uno muy sencillo es que cada vez que algún valor rebasa cierto límite, se les divide a todos los valores de la matriz entre 2, de tal forma que los valores menores a la unidad se igualan a 1.

Para que la melodía se escuche, una vez que se ha ejecutado alguno de los generadores de ruido o por el generador de música, el sistema llama a una rutina llamada ControladorDeBocina(), que es la que se encarga de hacer que se escuche la melodía, por medio de la bocina de la PC.

h. Rutina ControladorDeBocina

Para decirle a la computadora que emita el sonido de alguna frecuencia en particular, necesitamos explicar el funcionamiento del timer de la PC. El timer está controlado mediante un “chip” denominado 8253, que está compuesto de 3 contadores de 16 bits y programables de manera independiente, mediante los puertos 40h – 43h[11].

El 8253 recibe una señal de un reloj a cierta frecuencia (en este caso son 1,193,180 ciclos por segundo) y emite señales por tres canales independientes que se controlan mediante los tres contadores.

El timer del puerto 40h genera una interrupción a 18.2 Mhz aproximadamente, la cual es utilizada por el sistema operativo. El contador del puerto 41h, se utiliza para actualizar la memoria del sistema DRAM, se recomienda no tocar este contador, ya que un error puede acarrear graves consecuencias. El puerto 42h se puede utilizar para controlar la bocina y el puerto 43h se utiliza como palabra de control.

Mediante la palabra de control se selecciona el contador que se va a programar, el modo de operación de dicho contador y el tipo de operación (escritura/lectura). La estructura de esta palabra se indica en la figura 12.


7

6

5

4

3

2

1

0

SC1

SC0

RW1

RW0

M2

M1

MO

BCD
1   2   3   4   5   6   7

similar:

Tesis que para obtener el iconTesis que para obtener el grado de

Tesis que para obtener el iconTesis que para obtener el grado

Tesis que para obtener el iconTesis que, para obtener el grado de

Tesis que para obtener el iconTesis que para obtener el grado de maestro en ciencias de la educacióN

Tesis que para obtener el iconTesis monográfica para obtener el grado de bachiller en música

Tesis que para obtener el iconMientras que los profesionales contactados pueden obtener asesoría...

Tesis que para obtener el iconInvestigación dirigida para obtener el título

Tesis que para obtener el iconTaller de grado para obtener el título de Médico Veterinario y Zootecnista

Tesis que para obtener el iconUtilizar adecuadamente una técnica fácil para obtener dermatoglifos

Tesis que para obtener el iconRequisitos mínimos para obtener calificación positiva en la asignatura...




Todos los derechos reservados. Copyright © 2019
contactos
b.se-todo.com