Biblioteca de funciones gráficas para el proyecto KL

Texto completo

(1)

INSTITUTO POLITECNICO NACIONAL

ESCUELA SUPERIOR DE INGENIERIA MECANICA Y ELECTRICA

ZACATENCO

ICE

Biblioteca de Funciones Gr´

aficas

para el Proyecto KL

Tesis que presenta

Hern´

andez Bola˜

nos Blanca Marisol

erez Ram´ırez Jair Alonso

Para Obtener el Grado de

Ingeniero en Comunicaciones y Electr´

onica

Director de la Tesis: Ing. Jos´e de Jes´us Negrete Redondo. Codirector: Dr. Maximino Pe˜na Guerrero.

(2)
(3)

Resumen

La necesidad de escribir m´usica ha originado que la tecnolog´ıa se vea inmersa en el mundo musical, creando herramientas que ayuden no solo a los m´usicos, sino tambi´en a las personas que van iniciando en la m´usica. KL (Kernel for a music Language), es un compilador creado por investigadores del Instituto Polit´ecnico Nacional, orienta-do al procesamiento digital de la m´usica. KL facilita la escritura musical con la ayuda de un programa escrito en lenguaje C, por medio de comandos designados para cada instrucci´on, por ejemplo, para generar una nota Do5 con duraci´on de corchea. Uno de los problemas de KL es que no contiene una biblioteca de gr´aficos propia para ge-nerar la salida necesaria de forma gr´afica, utiizando otros recursos, como MusicTex.

En este trabajo de tesis se presenta el dise˜no de los algoritmos para la construc-ci´on de una biblioteca de funciones gr´aficas (escritas en lenguaje C) de los elementos necesarios (pentagrama, notas, claves, etc.) para realizar la escritura de m´usica. El m´etodo utilizado para graficar cada s´ımbolo musical es la concatenaci´on de los splines o polinomios de tercer orden, donde cada polinomio representa un segmento de cur-va perteneciente a una figura m´as compleja, debido a que los splines se utilizan para graficar curvas de gran complejidad. Cada figura se grafic´o por segmentos para poder obtener resultados de gran calidad.

(4)

Agradecimientos

Me siento agradecida con Dios por permitirme alcanzar una de las metas m´as im-portantes de mi vida, s´e que todos y cada uno de los momentos que he vivido ya sean buenos o malos han sucedio por alguna raz´on y me han permitido madurar y valorar m´as todo lo que la vida me ofrece, gracias por nunca dejarme sola y por darme la fuerza necesaria para seguir adelante, esta tesis te la dedico a ti mi Dios con todo mi amor. Quiero agradecer a mi asesor Dr. Maximino Pe˜na Guerrero por compartir sus conocimientos, experiencia y tiempo para la realizaci´on de esta tesis, gracias por ayu-darme a comprender de una forma m´as sencilla todas las dudas que surgieron en el de-sarrollo de la misma, me siento muy feliz y agradecida con usted por haberme brinda-do la oportunidad de contribuir en el desarrollo de un proyecto tan importante.

A mi asesor Ing. Jorge Negrete Redondo le quiero dar las gracias por impul-sarme a realizar este trabajo de tesis, por ense˜narme que la mejor forma de alcanzar una meta es esforzandose siempre a dar lo mejor de uno mismo, gracias por todo el apoyo y experiencia compartidos, gracias a sus consejos el d´ıa de hoy me siento llena de satisfacci´on y orgullo por el trabajo realizado.

Esta tesis se la dedico a mis padres con todo mi amor.

(5)

metas y sue˜nos y a nunca darme por vencida, aunque no te pod´ıa ver, s´e muy bien que en todo momento estuviste presente apoy´andome y cuid´andome, todos tus consejos y amor los tendr´e guardados por siempre en mi mente y en mi coraz´on. A ti hermanita te agradezco toda la paciencia que me tuviste para conseguir uno de los sue˜nos mas grandes de mi vida, estoy muy feliz de tenerte como hermana, hemos compartido ale-grias y tristezas, siempre has estado dispuesta a todo con tal de verme feliz, estoy se-gura que sin tu apoyo y ayuda esto no hubiera sido posible, gracias por alentarme a seguir adelante, por escucharme y estar a mi lado en todos y cada uno de los mo-mentos m´as importantes de mi vida. A mi novio le doy las gracias por cruzarse en mi camino y darle un nuevo sentido a mi vida, gracias por toda la paciencia mostrada cuando lloraba y me enojaba por que las cosas no sal´ıan bien, jamas me dejaste re-nunciar y en todo momento me impulsaste a luchar, cre´ıas en mi a´un cuando yo de-jaba de hacerlo, me ense˜naste a enfrentar la vida de una forma m´as positiva y me hi-ciste ver que yo era m´as capaz de lo que pensaba, mi cielo eres el hombre maravilloso que siempre so˜n´e, te amo y te amar´e por siempre.

Gracias a mis familiares y amigos.

Gracias a mi ESIME y por supuesto, orgullosamente del Instituto Polit´ecnico Nacional.

(6)

Agradecimientos

Dr. Maximino Pe˜na Guerrero, quiero agradecerle las facilidades y el apoyo que nos brind´o durante la realizaci´on de este trabajo de tesis y en los cursos de la especia-lidad, sus conocimientos compartidos fueron m´as que una gran ayuda, ense˜n´andonos que el camino a seguir siempre ser´a el del trabajo y el esfuerzo.

Ing. Jos´e de Jes´us Negrete Redondo, le agradezco sus palabras de aliento para motivarnos y creer que todo es posible si se tiene paciencia y se trabaja correcta-mente, sus aportes en nuestro trabajo fueron vitales para guiarnos y llegar a la meta, sin esa ayuda no lo hubieramos logrado.

Pap´a, Mam´a, no tengo las palabras adecuadas para expresar mi amor y mi agradecimiento, les debo m´as de lo que les puedo ofrecer. Gracias por la educaci´on que me dieron, que aunque a veces parece que me esfuerzo en mostrar lo contrario, fue la mejor que pude haber tenido. Todo lo que soy es por ustedes. Pap´a, en todo el mundo no hay persona alguna que me haya ense˜nado el significado de ser humilde, y valerse por s´ı mismo, sin importar lo dificil que sea el trabajo, como t´u me ense˜nas hasta ahora. Mam´a, no conozco a nadie que tenga un d´ıa pesado y mantenga una sonrisa como t´u, me has ayudado a formar mi parte humana, saber que no soy m´as que nadie, y nadie es m´as que yo.

Hermanitos, no se que hubiera sido mi vida sin ustedes, tal vez m´as feliz o tal vez m´as triste, pero de algo s´ı estoy seguro, mi vida no ser´ıa la misma sin los dos. Braulio, me serviste de inspiraci´on en mi infancia, y a´un lo sigues siendo, me demuestras que no hay nada que no se pueda aprender y nada que no se pueda hacer, sin importar el tiempo que tome, siempre lo consigues. Monse, quisiera ser al menos la mitad de fuerte de lo que eres, jamas te dejas y siempre luchas por tus sue˜nos, sin importar nada.

(7)

cuan-do no queria trabajar, gracias por ser mi mejor compa˜nera de toda la carrera, y por ense˜narme que se puede tener un gran coraz´on sin importar lo que la vida nos quita, gracias por el amor y paciencia que me tienes siempre.

A mi familia y amigos, gracias por todo lo que hacen por mi sin esperar nada a cambio.

Dios, gracias!

(8)

´

Indice general

1. Introducci´on 4

2. Fundamentos de graficaci´on 7

3. Graficando con splines 11

4. Figuras musicales 15

5. Programaci´on de las figuras musicales 20

6. Pruebas y resultados 25

7. Conclusiones y Trabajos Futuros 31

A. Gr´aficos con OpenGL 34

B. Compilador KL 37

(9)

´

Indice de figuras

3.1. Puntos de control de un B-spline . . . 12

3.2. Graficaci´on de dos B-splines . . . 13

3.3. Concatenaci´on de dos B-splines . . . 13

3.4. Trazado de una circunferencia . . . 14

3.5. Circunferencia s´olida . . . 14

5.1. Ventana en la que se graficar´an las figuras musicales . . . 21

5.2. Primer secci´on; (a)Curva formada por dos B-splines; (b)Curva s´olida 22 5.3. Segunda secci´on; (a)Curva formada por cuatro B-splines; (b)Curva s´olida 23 5.4. (a)Clave de Fa con puntos de control visibles; (b)Clave de Fa s´olida . 24 6.1. El programa prueba kgk.c . . . 25

6.2. Lista de las figuras en kgk . . . 26

6.3. Resultados gr´aficos . . . 27

6.4. Resultados gr´aficos . . . 28

6.5. Resultados gr´aficos . . . 28

6.6. Resultados gr´aficos . . . 29

6.7. Resultados gr´aficos . . . 29

6.8. Resultados gr´aficos . . . 29

6.9. Partitura elaborada con la biblioteca de figuras musicales . . . 30

A.1. Diagrama seccionado de la clave de fa . . . 36

(10)

´

Indice de tablas

5.1. Valores de las coordenadas de los B-splines de la primer curva . . . . 22

5.2. Valores de las coordenadas de los B-splines de la segunda curva . . . 23

5.3. Coordenadas para graficar el primer c´ırculo . . . 24

5.4. Coordenadas para graficar el segundo c´ırculo . . . 24

5.5. Coordenadas para graficar el tercer c´ırculo . . . 24

(11)

Cap´ıtulo 1

Introducci´

on

(12)

El Proyecto KL(Kernel for a music Language) es un sistema CAC creado por investigadores del IPN, con el fin de facilitar la composici´on e interpretaci´on musical. Con este sistema es posible eliminar la necesidad de escribir en papel la partitura, ya que se puede ir escribiendo nota por nota en una composici´on virtual, o bi´en gener-arla a partir de la ejecuci´on de un instrumento real. De este modo se obtiene un gran avance, puesto que ya no se tendr´a que interpretar un pasaje musical cientos de ve-ces hasta que se logre memorizar cada una de las notas. La limitante de ´este compi-lador es que no cuenta con una biblioteca de gr´aficos, la cual deber´a contener una se-rie de s´ımbolos musicales que son b´asicos para el solfeo, por ejemplo, los tiempos que duran las notas (redonda, negra, corchea, etc.), los s´ımbolos que se utilizan para in-dicar una repetici´on, las claves musicales, el pentagrama, etc.

En este trabajo de tesis se presenta el dise˜no y construcci´on de la biblioteca de funciones gr´aficas para el proyecto KL el cual es un sistema de ayuda para la com-posici´on musical. Las funciones gr´aficas que se contemplaron para la biblioteca son las claves musicales como la clave de Fa o la clave de Sol, o la duraci´on de las notas, como la corchea, semicorchea, negra, etc. Para la creaci´on de los dibujos, se aplicar´an fundamentos de graficaci´on tales como el punto, la l´ınea recta y la l´ınea curva, los cuales est´an presentes en la mayor´ıa de los s´ımbolos debido a que con ellos se forman los splines, con los cuales es posible hacer una aproximaci´on adecuada de las curvas a los graficos musicales, tomando en cuenta la importancia de establecer puntos fijos y puntos de control en el trazado de cada spline; hecho lo anterior se procede a una concatenaci´on de splines, es decir, unir dos splines punto por punto, lo cual es nece-sario debido a que se requieren dise˜nos de figuras s´olidas.

(13)

Las figuras se realizan por medio de algoritmos programados en lenguaje C que ayudan a calcular y obtener los valores de los polinomios que conformar´an los splines; se prepara el ambiente gr´afico inicializando con un conjunto de librer´ıas que contienen las funciones requeridas para este trabajo de tesis, despu´es se crea una ventana la cual ser´a el ´area de trabajo donde se har´a el trazado de los s´ımbolos, adem´as se es-tablecen los par´ametros de la misma, tales como su posici´on, tama˜no y el color; al cumplirse lo anterior se procede a dise˜nar cada uno de los gr´aficos musicales.

Como resultado se presenta el dise˜no de treinta y cuatro s´ımbolos musicales tales como: becuadro, bemol, clave de fa, clave de sol, etc. Se muestra el conjunto de c´odigo fuente responsable de la generaci´on de los graficos musicales, los cuales con-tienen los comandos necesarios para trabajar en el ambiente OpenGL, as´ı como tam-bi´en las coordenadas obtenidas de cada spline. Para comprobar el correcto funciona-miento de la biblioteca, se presenta un peque˜no programa llamadokgk.c , el cual eje-cuta los s´ımbolos de manera conjunta verificando que las mismas estan libres de erro-res y que est´an listas para utilizarse.

(14)

Cap´ıtulo 2

Fundamentos de graficaci´

on

Representar de manera visual alg´un tipo de informaci´on ha sido una necesidad que se ha presentado desde que el ser humano comenz´o a desarrollar su inteligen-cia. Desde un dibujo rupestre en una cueva, hasta el comportamiento de un efecto f´ısico, el hombre ha sido capaz de plasmar e interpretar tanto emociones como resul-tados matem´aticos por medio de figuras. Para poder realizar estas interpretaciones, se deben considerar los tres elementos fundamentales de la geometr´ıa: el punto, la recta y el plano. Porpunto se debe entender como el principal generador de la forma, ya que es el comienzo de toda representaci´on gr´afica. Matem´aticamente, el punto es una figura geom´etrica adimensional ya que no tiene longitud, ´area, volumen, ni otro par´ametro dimensional; adem´as indica una posici´on en el espacio, en referencia a un

(15)

puede representar mediante la ecuaci´on:

y =mx+b (2.1) Dondexyyson variables que pueden tomar cualquier valor dentro de un plano,

mes la relaci´on con la inclinaci´on que toma la recta con respecto a un par de ejes co-ordenados que determinan un plano, mientras que b representa la posici´on del pun-to en el cual la recta corta con el eje vertical del plano. Al definir una l´ınea recta, se tiene una sucesi´on de puntos con la misma direcci´on; en cambio, el resultado de ten-er la misma sucesi´on pten-ero variando la direcci´on es una l´ınea curva. Se pueden obte-ner l´ıneas curvas cerradas, donde el punto inicial es el mismo que el punto final, co-mo la circunferencia y la elipse, y las l´ıneas curvas abiertas, donde el punto final es diferente al punto inicial, como la par´abola y la hip´erbola. Las l´ıneas curvas depen-den adem´as de uno o m´as centros de curvatura.

La necesidad de representar curvas y superficies proviene de modelar objetos reales mediante gr´aficas, con la desventaja que no existe un modelo matem´atico pre-vio de los objetos, realizando as´ı una aproximaci´on por segmentos de l´ıneas, rectas y curvas, pero ´estas no son exactas. Para solucionar esto se utiliza la interpolaci´on, la cual consiste en hallar una serie de datos dentro de un intervalo conociendo los va-lores de los extremos. Generalmente la interpolaci´on se utiliza cuando se tiene una funci´on de la cual s´olo se conoce una serie de puntos de la misma, por ejemplo, de la serie de valores (x0, y0),· · ·,(xn, yn), se requiere encontrar el valor de un punto x

in-termedio entre x0 y xn. Ahora bien, por n+ 1 puntos pasan un n´umero infinito de

funciones, pero s´olo un polinomio pasa por todos los puntos; por lo tanto se busca el polinomio de menor grado que pase por los puntos n+ 1 dados. La funci´on polin´omi-ca de menor grado que pasa por los puntos es en principio de grado n:

f(x) =anxn

+· · ·+a1x+a0 (2.2)

(16)

re-solver este sistema se obtiene elpolinomio de interpolaci´on, y sustituyendo valores en la expresi´on obtenida, se pueden encontrar nuevos puntos de la funci´on. En la inter-polaci´on polinomial existen varios m´etodos usados para obtener el polinomio de inter-polaci´on; la forma m´as simple de interpolaci´on consiste en unir dos puntos mediante una l´ınea recta, a la que se llama Interpolaci´on Lineal, cuya ecuaci´on est´a dada por:

f1(x) =f(x0) +

f(x1)−f(x0)

x1−x0

(x−x0) (2.3)

La notaci´onf1(x) designa que ´este es un polinomio de interpolaci´on de primer

grado; se puede observar que la ecuci´on 2.3 tiene la misma forma que la ecuaci´on 2.1, es por esto que se llama interpolaci´on lineal (se une por medio de l´ıneas). En gene-ral, cuanto menor sea el intervalo entre los datos, mejor ser´a la aproximaci´on. Por consiguiente, si los intervalos entre los datos son mayores, existir´a un porcentaje de error mayor. Para reducir esta problem´atica y mejorar la aproximaci´on, se introduce una curvatura a la l´ınea que une los puntos, es decir, si se tienen tres puntos como datos, ´estos pueden ajustarse en un polinomio de segundo grado, una interpolaci´on parab´olica, cuya ecuaci´on es:

f2(x) = b0+b1(x−x0) +b2(x−x0)(x−x1) (2.4)

Se observa que los primeros dos t´erminos de la ecuaci´on 2.4 son equivalentes de la interpolaci´on lineal dex0ax1, y el ´ultimo t´ermino,b2(x−x0)(x−x1), determina la

cur-vatura de segundo grado de la ecuaci´on (con este m´etodo se une por medio de curvas). Los dos m´etodos de interpolaci´on anteriores son dos casos del m´etodo de inter-polaci´on polinomial de Newton, el cual se basa en el polinomio de n-´esimo grado:

fn =b0+b1(x−x0) +· · ·+bn(x−x0)(x−x1)· · ·(x−xn1) (2.5)

(17)

pre-sentan con mayor frecuencia en los polinomios de grado elevado, haciendo que la fun-ci´on pueda coincidir en muchos puntos, pero tambien es posible que la distancia tien-da a infinito si el grado de la funci´on crece. Para muchas aplicaciones pr´acticas es con-veniente un algoritmo que proporcione una funci´on interpoladora que tenga un com-portamiento m´as suave. Como se ha mencionado, el modelo m´as sencillo es la interpo-laci´on lineal constituida por rectas que unen los puntos interpolados; sin embargo esta interpolaci´on tiene una derivada discontinua en los puntos de interpolaci´on. Es conve-niente obtener un polinomio de interpolacion que tenga derivadas continuas hasta un orden dado y de no presentar oscilaciones entre puntos de interpolaci´on, adem´as de ser continua; el m´etodo de interpolaci´on por splines se encarga de obtener polinomios que cumplan con las condiciones antes mencionadas; dichos polinomios que fungen co-mo conectores son los denominados splines; la idea fundamental de estas funciones es hacer posible la construcci´on de gr´aficas suficientemente suaves y f´aciles de manejar; en otras palabras, una funci´on spline est´a formada por varios polinomios, cada uno definido sobre un subintervalo, que se unen entre s´ı obedeciendo a ciertas condiciones de continuidad. Los splines m´as utilizados son los splines c´ubicos, debido a que son los m´as sencillos con segunda derivada continua, haci´endolos adecuados para aproximar funciones que intervienen en ecuaciones diferenciales. Un spline c´ubico esta dado por:

Sk(x) =ak+bk(x−xk) +ck(x−xk)2

+dk(x−xk)3

(2.6) DondeSk(x) se define como un conjunto de n funciones dentro de una serie de

n+ 1 puntos de interpolaci´on (x0, y0),· · ·(xn, yn)

(18)

Cap´ıtulo 3

Graficando con splines

Como se ha mencionado, un spline es una curva definida por segmentos me-diante polinomios, y se utiliza com´unmente para resolver problemas de interpolaci´on ya que se obtienen excelentes resultados recurriendo a polinomios de bajo grado. La diferencia entre un spline y un b-spline es que en el primero, la curva pasa por los puntos que definen la interpolaci´on, mientras que en el segundo la curva no pasa por dichos puntos, sino solo se define la curva en base a ellos; las curvas de tercer grado empleadas para unir cada par de datos se llamansplines c´ubicos. Los splines c´ubicos proporcionan un excelente ajuste y sus c´alculos no son estrictamente complejos, de-bido a ´esto son los m´as utilizados.

Los splines c´ubicos se representan a trav´es de un polinomio de tercer orden en-tre cada par de puntos que se van a interpolar, y tienen la forma:

f(x) =ai(x−xi)

3

+bi(x−xi)

2

+ci(x−xi) +di (3.1)

Dondexi ≥x≥xi+1, para cadai= 1,2,· · ·, n−1 siendon el n´umero de

pun-tos a interpolar. Los par´ametros ai, bi,ci y di se determinan de tal forma que

cum-plan con las condiciones siguientes: el polinomio debe pasar por los puntos termi-nalesxi yxi+1; la pendiente (primera derivada) de los polinomios adyacentes al

(19)

Un spline se especifica a partir de un conjunto de posiciones de coordenadas, conocidos como puntos de control; dado el conjunto de puntos de control, por medio de la interpolaci´on se genera una curva que pasa por todo el conjunto de puntos. Al implementar los splines gr´aficamente por medio de programaci´on en lenguaje C se necesitan establecer cuatro puntos, de los cuales dos deben ser los puntos donde ini-cia y termina el spline, y los dos restantes ser´an los que tienen la funci´on de ajustar el spline; en la figura 3.1 se pueden observar tanto los puntos fijos incial y final, co-mo los puntos de control que ajustan la curvatura resultante.

Figura 3.1: Puntos de control de un B-spline Para dibujar el B-spline, se utiliza la funci´on:

void DrawCuerno(x1,y1,x2,y2,x3,y3,x4,y4,w1,z1,w2,z2,w3,z3,w4,z4,z);

(20)

uni´on entre un spline y otro por medio de una l´ınea. Como el c´alculo de los splines se realiza dentro de un bucle1, la concatenaci´on de splines se hace tambi´en dentro del

mismo bucle; es decir, el programa calcula un punto (xn, yn) del primer spline, otro punto (wn, zn) del segundo spline, y la uni´on de estos dos puntos en el mismo ciclo

del bucle. En la figura 3.2 se puede observar dos splines sin concatenar; en la figura 3.3 se observa el par de splines siendo concatenados.

Figura 3.2: Graficaci´on de dos B-splines

Figura 3.3: Concatenaci´on de dos B-splines

1

(21)

La concatenaci´on se utiliza para rellenar figuras hechas a base de splines, o de otro modo, crearobjetos s´olidos. Si por ejemplo, se requiere graficar una circunferen-cia la cual se secciona en dos partes, la concatenaci´on une cada uno de los puntos de la primer secci´on con la que le corresponde de la segunda (figuras 3.4 y 3.5).

Figura 3.4: Trazado de una circunferencia

Figura 3.5: Circunferencia s´olida

(22)

Cap´ıtulo 4

Figuras musicales

Para poder comprender y leer una partitura, es necesario saber los conceptos b´asicos de la Teor´ıa Musical, as´ı se entender´a sin problemas el lenguaje musical, qu´e es un comp´as de cuatro cuartos, qu´e es una corchea seguida de una redonda y una ne-gra. Esto permitir´a leer, ejecutar, o componer una melod´ıa con seguridad, precisi´on y calidad.

Cuando se escribe m´usica se hace sobre un pentagrama, que no es otra cosa m´as que el s´ımbolo gr´afico en el que se centra la gr´afica musical. Es el lugar donde se es-criben las notas musicales, silencios, y dem´as s´ımbolos musicales, el cual consta de cinco l´ıneas y cuatro espacios, enumerados de abajo hacia arriba. En el pentagrama se pueden representar una serie de elementos, tal es el caso de las claves musicales, las cuales tienen la funci´on de asociar las notas musicales con las l´ıneas o espacios del pentagrama; en otras palabras, es una referencia para saber la ubicaci´on de una determinada nota musical, de modo que a las notas siguientes les corresponder´an los espacios y l´ıneas adyacentes. Existen tres s´ımbolos diferentes para representar a las distintas claves, que corresponden a las tres claves existentes: clave de Sol (G),clave de Fa (F),clave de Do(C).

(23)

ser representados en el pentagrama y cuando se presentan estos casos, se utilizan las l´ıneas adicionales, que son unas l´ıneas cortas paralelas y equidistantes a las del pen-tagrama, encima o debajo del mismo, y las notas se escriben en los espacios o sobre las l´ıneas. Adem´as existen las figuras musicales que son las que dan valor en tiempo a las notas que componen una melod´ıa, ya que si no fuera as´ı, no existir´ıa armon´ıa en lo que se toca, simplemente, no ser´ıa posible la m´usica. Las figuras musicales son s´ımbolos que indican el tiempo que duran las notas musicales, las cuales son siete, y de mayor a menor son: REDONDA (valor = 1) se toma como unidad; BLANCA (val-or = 1\2) dura la mitad de una redonda; NEGRA (valor = 1\4) dura la mitad de una blanca; CORCHEA (valor = 1\8) dura la mitad de una negra; SEMICORCHEA (valor = 1\16) dura la mitad de una corchea; FUSA (valor = 1\32 ) dura la mitad de una semicorchea; SEMIFUSA (valor = 1\64) dura la mitad de una fusa.

El valor de la redonda es referencia del comp´as de Cuatro cuartos, como se ver´a posteriormente. En otras palabras, un comp´as de cuatro cuartos, quedar´a com-pleto con una redonda, o dos blancas, o cuatro negras, y as´ı sucesivamente.

Si se requiere representar una pausa, es decir el intervalo de tiempo en el que la voz o el instrumento no genera sonido alguno, se coloca un silencio, que esta sub-dividido de la misma manera que las notas en t´erminos de duraci´on y cada silencio durar´a el mismo tiempo que su nota correspondiente. Algunas veces despues de una figura se puede encontrar un puntillo, el cual tiene la funci´on de aumentar la mitad de la duraci´on a la que precede, por ejemplo, si se encuentra una blanca con un pun-tillo, indica que la nota durar´a una blanca m´as una negra.

(24)

encuentra por debajo de la l´ınea central del pentagrama, y hacia abajo cuando se en-cuentren encima de la l´ınea central.

Para hacer la lectura de la m´usica mucho m´as ordenada, se necesita dividir la graf´ıa en una serie de porciones iguales. A cada porci´on se le llama comp´as, que tiene la funci´on de dividir al pentagrama en partes iguales, y agrupar a una porci´on de no-tas musicales en el pentagrama. El comp´as es la entidad m´etrica musical, conforma-da por varias uniconforma-dades de tiempo (como la negra o la corchea). Esta separaci´on se representa gr´aficamente con unas l´ıneas verticales, llamadas l´ıneas divisoras o bar-ras de comp´as, que se colocan perpendicularmente a las l´ıneas del pentagrama. En una composici´on musical escrita, las notas y los silencios que est´en comprendidos en-tre dos l´ıneas divisoras componen un comp´as. Una porci´on musical est´a constituida por el conjunto de compases que la conforman, estos tendr´an la misma duraci´on has-ta que se cambie el tipo de comp´as. Los m´as comunes son: Binario, se dividen en dos tiempos (dos cuartos); Ternario, se dividen en tres tiempos (tres cuartos); Cuater-nario, se dividen en cuatro tiempos (cuatro cuartos).

Para separar un comp´as de otro, se utilizan las barras divisoras, representadas por una l´ına perpendicular que une la primera con la quinta l´ınea del pentagrama. Las

dobles barras representan el final de una obra, cuando la l´ınea derecha es m´as gruesa que la otra. Cuando las dos l´ıneas son iguales representan la separaci´on entre dos sec-ciones dentro de la misma obra. Los compases se indican por medio de dos cifras, que se representan en forma de fracci´on, y se colocan al principio del pentagrama, detr´as de laclave y laarmadura, y no se indican de nuevo a menos que el comp´as cambie.

(25)

o en conjunto con otros instrumentos o voces. La unidad empleada para medir el tempo son las Pulsaciones por minuto (Beats per Minute o BPM), que equivale al n´umero de pulsaciones que se generan en un minuto; se indica con una figura (nor-malmente el s´ımbolo de negra), igualada con el n´umero que representa la cantidad de la figura que se puede tocar durante un minuto. Por ejemplo, si el BMP=60, ca-da negra en la partitura, valdr´a un segundo. Se coloca al inicio de la partitura para indicar el tempo al que se debe ejecutar la obra, desde ese momento hasta la pr´oxi-ma indicaci´on, o (en caso de que no exista) hasta el final.

Si se desea modificar la entonaci´on de las notas, haciendolas subir o bajar de su estado natural, se colocan alteraciones, que son dislocaciones de tono, tales como: SOSTENIDO (♯), se encarga de subir un semitono a la nota natural; BEMOL (♭), ba-ja a la nota natural un semitono; BECUADRO (♮), anula el efecto de los bemoles y de los sostenidos.

Las alteraciones siempre se colocan antes de las notas provocando que la altura de las mismas se modifique, as´ı como tambi´en se representan despu´es del nombre de las notas, cifras y tonalidades, tambi´en es necesario tomar en cuenta la tonalidad, es decir la asociaci´on de bemoles y sostenidos representados junto a la clave musical, la cu´al indica la escala en que se expresar´a la m´usica.

Existen dos s´ımbolos encargados de sugerir el aumento o disminuci´on de volu-men, tambi´en llamados crescendo y diminuendo, estos s´ımbolos se colocan en donde inicia la alteraci´on y se estiran hasta donde se interrumpe dicha alteraci´on causando que el volumen establecido permanezca as´ı hasta que se d´e una nueva indicaci´on.

(26)
(27)

Cap´ıtulo 5

Programaci´

on de las figuras

musi-cales

En este cap´ıtulo se describe paso a paso el procedimiento a seguir en el dise˜no de la figura musical Clave de Fa; es muy importante analizar detenidamente el dibu-jo que se desea trazar, ya que como se ha venido explicando a lo largo de este traba-jo de tesis, el uso de los splines es sencillo siempre y cuando se entienda claramente la definici´on y aplicaci´on de los mismos, dando como resultado un dise˜no satisfacto-rio y de buena calidad.

Para poder programar las figuras, se necesita saber el lugar donde se graficar´an, por lo que se necesita crear una ventana de trabajo de Windows donde se dibujar´a la figura con OpenGL1

, despu´es se debe indicar la posici´on de la ventana as´ı como tam-bi´en establecer el tama˜no inicial de la misma, las ventanas pueden ser de nivel su-perior, sub-ventanas, o superposiciones. Adem´as se necesitan determinar los par´ame-tros de inicializaci´on del modo gr´afico, los cuales se refieren al color que se usar´a, la selecci´on de la matriz de trabajo y la definici´on de una regi´on ortogr´afica en dos di-mensiones. En la figura 5.1 se puede observar la ventana donde se graficar´an las figu-ras musicales.

(28)

Figura 5.1: Ventana en la que se graficar´an las figuras musicales

Como bien se ha dicho, para que un B-spline pueda formar una curva requiere de cuatro puntos, de los cuales (x0,y0) y (x3,y3) son los puntos fijos incial y final respec-tivamente, (x1,y1) y (x2,y2) son los puntos de ajuste, los cuales modifican la curvatu-ra que toma el B-spline y no tocan la curva; pacurvatu-ra comenzar a progcurvatu-ramar la clave de fa, se realiz´o un diagrama de la clave, a su vez ´este se dividi´o en partes para as´ı poder tener una idea de la cantidad de splines que se iban a necesitar, tambi´en se utiliz´o co-mo referencia para establecer los puntos inciales y finales de cada secci´on para poder obtener splines m´as estilizados y cercanos al s´ımbolo musical de la Clave de Fa. 2

. En este caso, la clave de fa se ha dividido en 5 secciones: dos curvas y tres cir-cunferencias; cada una de estas secciones esta delimitada por un B-spline, es decir, el per´ımetro de cada secci´on esta formado por dos B-splines. Se comenz´o a graficar la primer curva, tomando los puntos A y D como inicial y final del primer B-spline, y los puntos B y C como inicial y final del segundo B-spline. Partiendo de A y D se debe ajustar la curva con los puntos de ajuste A’ y D’ hasta que sea necesario para obtener la curva exacta, y se toman las coordenadas de los cuatro puntos; despu´es de esto, se toman los puntos B y C para ajustar la curva del segundo B-spline, con los

2

(29)

puntos de ajuste B’ y C’; una vez hecho el ajuste, se toman las coordenadas de los puntos; en la tabla 5.1 se muestran los valores de las coordenadas que se obtuvieron.

SPLINE 1 SPLINE 2 A(57,588) B(104,671) A’(74,916) B’(180,857) D’(556,896) C’(434,857) D(510,521) C(398,521)

Tabla 5.1: Valores de las coordenadas de los B-splines de la primer curva Para graficar las coordenadas se utiliza la funci´onDrawCuernodel c´odigo fuente, la cual utiliza como par´ametros los puntos obtenidos, graficando dos B-splines al mis-mo tiempo, comis-mo se vio en el cap´ıtulo 3 (Fig. 5.2).

(30)

SPLINE 1 SPLINE 2 C(398,521) D(510,521) C’(370,215) D’(487,305) E1’(108,116) E2’(273,109)

E(31,113) E(31,113)

Tabla 5.2: Valores de las coordenadas de los B-splines de la segunda curva Como se puede notar, los dos B-splines de la segunda curva comparten el pun-to fijo final, ya que los dos B-splines convergen en esa posici´on. De la figura 5.3: a)se pueden observar los puntos de control y los puntos fijos necesarios para graficar la cur-va; b) se puede observar las dos curvas unidas, formando una curva s´olida m´as grande.

(31)

SPLINE 1 SPLINE 2 F(127,675) F(127,675) F1’(208,675) F2’(26,664) G1’(233,546) G2’(39.536) G(127,535) G(127,535)

Tabla 5.3: Coordenadas para graficar el primer c´ırculo SPLINE 1 SPLINE 2

H(594,564) H(594,564) H1”(655,561) H2’(531,560)

I1’(654,477) I2’(535,482) I(594,472) I(594,472)

Tabla 5.4: Coordenadas para graficar el segundo c´ırculo SPLINE 1 SPLINE 2

J(594,736) J(594,736) J1’(652,735) J2’(536,728) K1’(655,649) K2’(533,654)

K(594,643) K(594,643)

Tabla 5.5: Coordenadas para graficar el tercer c´ırculo

Utiizando estas coordenadas se graficaron los c´ırculos restantes para finalizar la figura musical Clave de Fa (Fig. 5.4).3

Figura 5.4: (a)Clave de Fa con puntos de control visibles; (b)Clave de Fa s´olida

(32)

Cap´ıtulo 6

Pruebas y resultados

Despu´es de desarrollar cada figura por separado, se utiliz´o un programa para ejecutarlas de manera conjunta, a modo de prueba, para verificar que todas las figu-ras se encontraran sin errores. El programa prueba, llamadokgk.c, funciona como un compilador general, sin necesidad de tener en el mismo programa el c´odigo para ca-da figura, ya que al correr kgk simplemente se tiene que escribir la palabra clave para cada una de las figuras y busca con ayuda de un comando la ruta donde se encuentra el archivo ejecutable; para saber las palabras claves existentes, se escribe help para desplegar la lista (figura 6.1).

Figura 6.1: El programa prueba kgk.c

(33)

clave que contiene el c´odigo, si la comparaci´on da como resultado 0 quiere decir que las dos cadenas son iguales. El comando utilizado para esto es:

system("..\\figuras\\becuadro\\becuadro.exe" );

El cual, con la ruta especificada busca el archivo figura.exe para ejecutarlo, y as´ı la figura aparecer´a en la pantalla (figura 6.2).

Figura 6.2: Lista de las figuras en kgk

(34)

N◦ FIGURA NFIGURA

1 becuadro 19 negra 2 bemol 20 negrainv 3 blanca 21 parrafo 4 blancainv 22 puntillo 5 calderon 23 redonda 6 clavefa 24 repcompasder 7 coda1 25 repcompasizq 8 coda2 26 repeticion 9 compas 27 seisoctavos 10 corchea 28 semicorchea 11 crescendo 29 semiinv 12 cuatrocuartos 30 sepcomp 13 diminuendo 31 silcorchea 14 dosmedios 32 silencioredonda 15 fin 33 silsemicor 16 grcsol1 34 sostenido 17 ligaduradown 35 trescuartos 18 ligaduraup 36 tresillo

Tabla 6.1: Lista de figuras

A continuaci´on se presentan los resultados gr´aficos obtenidos despu´es de pro-gramar las figuras, adem´as se muestra un ejemplo de la apariencia de los mismos den-tro de una partitura.

(35)

Figura 6.4: Resultados gr´aficos

(36)

Figura 6.6: Resultados gr´aficos

Figura 6.7: Resultados gr´aficos

(37)
(38)

Cap´ıtulo 7

Conclusiones y Trabajos Futuros

CONCLUSIONES

(39)

de splines que se pueden utilizar, etc.

El dise˜no de esta biblioteca de s´ımbolos musicales se cre´o para ser incorpora-do al proyecto KL el cual podr´a hacer uso de este conjunto de gr´aficos, para realizar la lectura de un archivo MIDI y a su vez obtener la partitura del mismo. Desde otro punto de vista, KL es conformado por varios bloques que estructuran su funci´on de manera global. Cada bloque realiza una funci´on, ya sea de entrada o de salida. En la

p´ag. 38 se pueden ver las partes de las que esta compuesta la estructura del compi-lador KL, en uno de estos bloques se integrar´a la biblioteca de gr´aficos, la cual se uti-lizar´a para poder generar una partitura con todos los elementos que la componen.

LIMITACIONES Y TRABAJOS FUTUROS:

Este trabajo de tesis en general present´o algunas limitantes, una de ellas es el tiempo, ya que la teor´ıa musical cuenta con una gran cantidad de s´ımbolos musicales por lo cual no se pudieron abarcar todos. Al principio no se comprend´ıa muy bien la definici´on de los splines por lo que las figuras resultantes no eran del todo satisfac-torias, era algo complicado decidir por d´onde iniciar el dise˜no de una figura, es de-cir, empezar por la parte m´as secilla para que as´ı la complejidad fuera en aumento, despu´es se observ´o que no era posible dise˜nar simplemente viendo la figura, sino que se ten´ıa que analizar y para esto se crearon diagramas divididos que proporcionaban una imagen en partes mucho m´as f´acil de comprender, y que adem´as sirvieron co-mo ”co-molde”; tambi´en surgieron inconvenientes que se solucionaron conforme pas´o el tiempo y se fue adquiriendo m´as experiencia en los temas del trabajo de tesis.

(40)

de-pendiendo del lugar que ocupen en el pentagrama, por lo que se necesitaria crear los dise˜nos de las notas con las plicas en distintas direcciones y tomando en cuenta que la mayoria de las veces las notas musicales se encuentran muy cerca una de la otra, ser´a necesario encontrar la forma de unirlas entre s´ı.

(41)

Ap´

endice A

Gr´

aficos con OpenGL

OpenGL es unaAPI (Application Programming Interface) que permite la inter-acci´on con dispositivos gr´aficos as´ı como multiplataforma para escribir aplicaciones con las que se obtengan gr´aficos 2D y 3D. Los comandos contenidos en OpenGL ayu-dan en la transformaci´on de objetos definidos, gracias a este es posible variar el color, luz, textura, etc. Cabe recalcar que OpenGL es una librer´ıa gr´afica, es decir no cuen-ta con funciones para controlar audio, red, entre otros. El programa para graficar las figuras musicales fue escrito en Lenguaje C por medio del Visual C++ 2008. Todo programa se inicializa con un conjunto de librerias, las cuales incluyen todas las fun-ciones requeridas para la correcta ejecuci´on del mismo. En este proyecto se utilizaron las siguientes librer´ıas:

#include <windows.h> #include <GL/gl.h> #include <GL/glu.h> #include <math.h> #include "glut.h" #include "glext.h" #include "wglext.h"

Para inicializar el modo gr´afico, se utilizan los comandos de OpenGl:

glutInit(&argc,argv);

glutInitDisplayMode(unsigned int mode);

(42)

Las ventanas creadas pueden ser de nivel superior, sub-ventanas, o superposi-ciones. Los comandos para realizar esta operaci´on son:

glutInitWindowPosition(x,y);

glutInitWindowSize(winWidth,winHeight); glutCreateWindow("Nombre de la ventana");

El primero es usado para indicar la posici´on inicial de la ventana; el segundo se utiliza para establecer el tama˜no inicial de la ventana, donde los par´ametros win-Width ywinHeight deben ser mayores a cero; el tercer comando se utiliza para reali-zar la creaci´on de la ventana, entre comillas se coloca el nombre deseado.

Para establecer los par´ametros del modo gr´afico se utiliza la siguiente funci´on:

void init(void) {

glClearColor(red, green, blue, unknown); glMatrixMode(mode);

gluOrtho2D(left,right,bottom,top); );

Coninit(), se establece el color que se utilizar´a, adem´as selecciona la matriz de trabajo, y se define una regi´on ortogr´afica en dos dimensiones (2D).

Ya que se tiene el modo gr´afico listo, se puede comenzar a dibujar las figuras musicales (p´ag. 20).

Como se vio en el cap´ıtulo 3 se utiliza la siguiente funci´on para graficar un B-spline:

void DrawCuerno(x1,y1,x2,y2,x3,y3,x4,y4,w1,z1,w2,z2,w3,z3,w4,z4,z);

La funci´on DrawCuerno necesita las coordenadas de dos b-splines, ya que toma las dos curvas y por medio de otras funciones y algoritmos matem´aticos rellena el ´area formada entre ellas.

(43)
(44)

Ap´

endice B

Compilador KL

(45)

Figura B.1: Diagrama estructural KL

BLOQUES DE ENTRADA -Es necesario que KL obtenga informaci´on para poder realizar la compilaci´on; MIDI IN - En este bloque, el KL recibe un archivo MI-DI, con el cu´al, decodificar´a toda la informaci´on necesaria contenida dentro del mis-mo, como duraci´on, tempo, nota, comp´as, etc; PARTITURA (MuSicTeX) - KL recibe un archivo TeX de m´usica, donde contiene todos los comandos para mostrar la parti-tura, por ejemplo, si es un Do4 con duraci´on de corchea, o si es un instrumento de to-nalidad baja, como un contrabajo, o un instrumento de toto-nalidad alta, como un cla-rinete; INSTRUMENTOS MUSICALES - Por medio de una interfaz MIDI se conecta uno o varios instrumentos musicales, la cual obtendr´a la informaci´on de forma similar que con el archivo MIDI, pero ser´a en tiempo real, es decir, como se vaya ejecutando una pieza musical, se leer´a la informaci´on; COMANDOS - Con un programa imple-mentado para el KL en lenguaje C, se utilizan comandos para colocar los elementos del pentagrama, por ejemplo do3negra, para que aparezca la nota Do3 con duraci´on negra. De esta forma la partitura se hace arbitrariamente.

(46)
(47)

Ap´

endice C

odigo fuente

En este apartado, se muestra el c´odigo fuente utilizado para graficar las fun-ciones. #include <windows.h> #include <GL/gl.h> #include <GL/glu.h> #include <math.h> #include "glut.h" #include "glext.h" #include "wglext.h"

#define TRUE 1 #define FALSE 0

void Recta(GLint gx0,GLint gy0,GLint gx1, GLint gy1); void DrawTxt(GLfloat x, GLfloat y, char *text);

void DrawSpline(GLfloat x1,GLfloat y1, GLfloat x2,GLfloat y2, GLfloat x3,GLfloat y3, GLfloat x4,GLfloat y4, GLfloat z);

void DrawCuerno(GLfloat x1,GLfloat y1, GLfloat x2,GLfloat y2, GLfloat x3,GLfloat y3, GLfloat x4,GLfloat y4, GLfloat w1,GLfloat z1, GLfloat w2,GLfloat z2, GLfloat w3,GLfloat z3, GLfloat w4,GLfloat z4, GLfloat z);

void DrawCoordsSpline(void); void DrawFigura(void);

GLsizei winWidth=660, winHeight=840; GLbyte texto[80];

(48)

static GLint mx3; static GLint my3; static int Click=TRUE;

void init(void) { glClearColor(0.5,0.5,0.5,1.0); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,660.0,0.0,840.0); mx0=286; my0=826; mx1=367; my1=557; mx2=441; my2=379; mx3=286; my3=218; } void displayFnc(void) { glClear(GL_COLOR_BUFFER_BIT); glColor3f(2.0,2.0,2.0); glClear(GL_COLOR_BUFFER_BIT); DrawFigura(); DrawSpline(mx0,my0,mx1,my1,mx2,my2,mx3,my3,1);//9999 DrawCoordsSpline(); Drawmarca(); glFlush(); }

void winReshapeFnc(GLint newWidth, GLint newHeight) {

glViewport(0,0,newWidth,newHeight); glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluOrtho2D(0.0,(GLdouble) newWidth,0.0,(GLdouble) newHeight); winWidth=newWidth;

winHeight=newHeight; }

void DrawCursor1(GLint x, GLint y) { glBegin(GL_LINES); glVertex2i(x-10,y); glVertex2i(x+10,y); glEnd(); glBegin(GL_LINES); glVertex2i(x,y-10); glVertex2i(x,y+10); glEnd(); }

void plotPoint(GLint x, GLint y) {

glBegin(GL_POINTS); glVertex2i(x,y); glEnd();

}

void Teclado(GLint flecha, GLint xMouse, GLint yMouse) {

switch(flecha) {

(49)

if (Click==TRUE) mx1--; else if (Click==FALSE) mx2--; break; case GLUT_KEY_RIGHT:

if (Click==TRUE) mx1++; else; if (Click==FALSE) mx2++; break; case GLUT_KEY_UP:

if (Click==TRUE) my1++; else; if (Click==FALSE) my2++; break; case GLUT_KEY_DOWN:

if (Click==TRUE) my1--; else; if (Click==FALSE) my2--; break; default: break; } displayFnc(); } void DrawCoordsSpline(void) {

sprintf(texto,"(x0=\% d, y0=\% d)",mx0,my0); DrawTxt(5,80, texto);

sprintf(texto,"(x1=\% d, y1=\% d)",mx1,my1); DrawTxt(5,60, texto);

sprintf(texto,"(x2=\% d, y2=\% d)",mx2,my2); DrawTxt(5,40, texto);

sprintf(texto,"(x3=\% d, y3=\% d)",mx3,my3); DrawTxt(5,20, texto); DrawCursor1(mx0,my0); DrawCursor1(mx1,my1); DrawCursor1(mx2,my2); DrawCursor1(mx3,my3); } void DrawFigura(void) { //BECUADRO DrawCuerno(268,815,268,815,268,204,268,204,286,826,286,826,286,218,286,218,1.0); DrawCuerno(268,538,268,538,442,630,442,630,268,436,268,436,442,531,442,531,1.0); DrawCuerno(268,305,268,305,442,403,442,403,268,204,268,204,442,300,442,300,1.0); //BEMOL DrawCuerno(182,18,182,18,182,801,182,801,209,41,209,41,209,833,209,833,1.0); DrawCuerno(209,322,219,457,605,418,209,86,209,394,341,546,766,324,287,96,1.0); DrawCuerno(209,41,230,62,221,54,287,96,207,81,205,82,284,132,281,130,1.0); //BLANCA DrawCuerno(226,276,48,210,73,-12,313,35,249,216,80,157,129,27,304,96,1.0); DrawCuerno(226,276,439,358,549,115,313,35,249,216,406,273,498,176,304,96,1.0); DrawCuerno(419,829,419,829,419,153,419,153,455,828,455,828,455,153,455,153,1.0); //BLANCA INVERTIDA DrawCuerno(207,681,207,681,207,7,207,7,243,683,243,683,243,8,243,8,1.0); DrawCuerno(330,804,557,877,639,637,432,561,357,755,469,806,615,710,410,615,1.0); DrawCuerno(330,804,134,735,200,473,432,561,357,755,180,691,220,540,410,615,1.0); //CALDERON DrawCuerno(49,297,96,697,569,680,616,297,75,297,136,616,552,559,588,297,1.0); DrawCuerno(295,329,293,399,380,391,376,329,295,329,296,279,380,280,376,329,1.0); //CLAVE DE FA

(50)
(51)

DrawCuerno(431,264,431,264,431,831,431,831,455,189,455,189,455,831,455,831,1.0); //NEGRA INVERSA DrawCuerno(207,681,207,681,207,7,207,7,243,683,243,683,243,8,243,8,1.0); DrawCuerno(330,804,557,877,639,637,432,561,330,804,134,735,200,473,432,561,1.0); //PARRAFO DrawCuerno(523,538,523,597,610,599,610,538,523,538,524,470,617,476,610,538,1.0); DrawCuerno(45,295,40,353,135,355,135,295,45,295,43,232,137,229,135,295,1.0); DrawCuerno(224,804,136,804,136,671,224,673,224,804,314,799,310,677,224,673,1.0); DrawCuerno(433,160,346,154,346,32,433,28,433,160,516,163,529,32,433,28,1.0); DrawCuerno(224,804,15,814,-51,480,287,359,168,776,38,715,61,533,367,475,1.0); DrawCuerno(367,475,668,407,655,-13,433,28,287,359,615,282,608,96,490,58,1.0); DrawCuerno(554,775,554,775,82,56,82,56,573,777,573,777,103,58,103,58,1.0); //PUNTILLO DrawCuerno(25,469,71,834,578,890,620,468,25,469,43,58,614,45,620,468,1.0); //REDONDA DrawCuerno(14,410,65,721,626,665,639,407,177,394,64,566,300,715,482,404,1.0); DrawCuerno(14,410,29,133,625,131,639,407,177,394,361,126,549,251,482,404,1.0);

//REPETICION COMPAS DERECHA

DrawCuerno(125,528,121,574,202,580,203,528,125,528,122,473,205,471,203,528,1.0); DrawCuerno(125,322,124,372,201,379,203,322,125,322,130,268,198,270,203,322,1.0); DrawCuerno(283,835,283,835,283,6,283,6,304,835,304,835,304,6,304,6,1.0);

DrawCuerno(363,835,363,835,363,6,363,6,486,835,486,835,486,6,486,6,1.0); //REPETICION COMPAS IZQUIERDA

DrawCuerno(205,833,205,833,205,7,205,7,328,833,328,833,328,7,328,7,1.0); DrawCuerno(386,833,386,833,386,7,386,7,404,833,404,833,404,7,404,7,1.0);

DrawCuerno(484,514,490,561,562,566,563,514,484,514,490,463,561,465,563,514,1.0); DrawCuerno(484,313,484,373,567,366,563,313,484,313,488,263,561,261,563,313,1.0); // REPETICION DE SECCION

(52)

DrawCuerno(310,6,104,227,116,188,126,392,292,153,130,227,137,259,145,345,1.0); DrawCuerno(292,178,52,386,102,487,211,666,292,306,258,346,30,324,211,666,1.0); DrawCuerno(310,6,310,6,310,50,310,50,299,30,299,30,299,50,299,50,1.0);

//SILENCIO DE CORCHEA

DrawCuerno(97,706,112,866,299,825,303,706,97,706,101,584,299,548,303,706,1.0); DrawCuerno(97,706,80,588,380,494,554,755,284,636,389,622,503,753,526,779,1.0); DrawCuerno(526,779,526,779,244,63,244,63,554,755,554,755,265,14,265,14,1.0);

//SILENCIO DE REDONDA Y BLANCA

DrawCuerno(10,599,10,599,10,366,10,366,648,599,648,599,648,366,648,366,1.0); //SILENCIO SE SEMICORCHEA

DrawCuerno(189,759,205,843,310,837,328,759,189,759,185,653,344,653,328,759,1.0); DrawCuerno(114,473,121,564,237,553,251,473,114,473,113,371,259,370,251,473,1.0); DrawCuerno(315,702,368,700,451,760,476,810,189,759,217,607,442,692,448,730,1.0); DrawCuerno(235,418,249,406,388,430,404,567,114,473,98,362,312,358,366,437,1.0); DrawCuerno(474,816,474,816,254,40,254,40,497,790,497,790,285,16,285,16,1.0); //SOSTENIDO DrawCuerno(265,831,265,831,265,18,265,18,291,808,291,808,291,35,291,35,1.0); DrawCuerno(400,831,400,831,400,18,400,18,426,808,426,808,426,35,426,35,1.0); DrawCuerno(204,571,204,571,481,674,481,674,204,460,204,460,481,570,481,570,1.0); DrawCuerno(204,313,204,313,481,418,481,418,204,205,204,205,471,310,481,310,1.0); //TRES CUARTOS DrawCuerno(37,673,37,747,135,747,139,673,37,673,41,612,132,612,139,673,1.0); DrawCuerno(48,712,67,755,206,789,267,735,111,723,103,755,203,752,207,695,1.0); DrawCuerno(267,735,314,694,330,576,112,576,207,695,206,675,232,609,112,600,1.0); DrawCuerno(29,491,44,543,113,564,137,491,29,491,30,405,136,430,137,491,1.0); DrawCuerno(112,600,212,601,332,578,295,468,112,576,146,573,223,564,215,488,1.0); DrawCuerno(295,468,269,383,72,377,45,445,215,488,225,441,127,388,117,448,1.0); DrawCuerno(450,425,447,423,455,283,348,188,577,425,576,425,487,289,380,188,1.0); DrawCuerno(348,188,348,188,635,188,635,188,348,160,348,160,635,160,635,160,1.0); DrawCuerno(500,263,495,152,519,84,454,87,593,351,601,178,572,68,633,87,1.0); DrawCuerno(454,87,454,87,633,87,633,87,454,57,454,57,633,57,633,57,1.0); DrawCuerno(89,241,89,241,581,616,581,616,108,215,108,215,603,591,603,591,1.0); //TRESILLO DrawCuerno(22,471,22,471,22,413,22,413,31,471,31,471,31,413,31,413,1.0); DrawCuerno(22,471,22,471,255,471,255,471,22,462,22,462,255,462,255,462,1.0); DrawCuerno(401,471,401,471,634,471,634,471,401,462,401,462,634,462,634,462,1.0); DrawCuerno(625,471,625,471,625,413,625,413,634,471,634,471,634,413,634,413,1.0); DrawCuerno(314,495,314,478,336,481,329,505,314,495,329,526,346,517,329,505,1.0); DrawCuerno(314,495,347,563,409,462,315,467,329,505,343,533,369,482,317,474,1.0); DrawCuerno(317,474,401,464,296,373,294,448,315,467,357,463,320,411,307,429,1.0); DrawCuerno(294,448,296,458,326,455,307,429,294,448,295,406,339,422,307,429,1.0); }

void mousePtPlot(GLint button, GLint action, GLint xMouse, GLint yMouse) {

if (button==GLUT_LEFT_BUTTON && action== GLUT_DOWN) {

mx1=xMouse;

my1=winHeight-yMouse; Click=TRUE;

}else

if (button==GLUT_RIGHT_BUTTON && action== GLUT_DOWN) {

mx2=xMouse;

(53)

}

if (action==GLUT_DOWN) displayFnc(); }

int main(int argc, char** argv) {

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowPosition(100,100); glutInitWindowSize(winWidth,winHeight); glutCreateWindow("becuadro"); init(); glutDisplayFunc(displayFnc); glutReshapeFunc(winReshapeFnc); glutMouseFunc(mousePtPlot); glutSpecialFunc(Teclado); glutMainLoop(); return(1); }

void DrawTxt(GLfloat x, GLfloat y, char *text) {

char *p;

glRasterPos2f(x,y);

for (p = text; *p; p++) glutBitmapCharacter(GLUT_BITMAP_9_BY_15,*p); }

void DrawCuerno(GLfloat x1,GLfloat y1, GLfloat x2,GLfloat y2, GLfloat x3,GLfloat y3, GLfloat x4,GLfloat y4, GLfloat w1,GLfloat z1, GLfloat w2,GLfloat z2, GLfloat w3,GLfloat z3, GLfloat w4,GLfloat z4, GLfloat z) { GLint i; GLint j; GLfloat t; GLint x; GLint y; GLint x11; GLint y11; for(t=0.0;t<1;t+=0.0001) {

x = pow((1.0-t),3.0)*(x1*z) + 3.0*t*pow((1.0-t),2.0)*(x2*z)

+ 3*pow(t,2.0)*(1.0-t)*(x3*z) + pow(t,3.0)*(x4*z) ;

y = pow((1.0-t),3.0)*(y1*z) + 3.0*t*pow((1.0-t),2.0)*(y2*z)

+ 3*pow(t,2.0)*(1.0-t)*(y3*z) + pow(t,3.0)*(y4*z);

x11 = pow((1.0-t),3.0)*(w1*z) + 3.0*t*pow((1.0-t),2.0)*(w2*z) + 3*pow(t,2.0)*(1.0-t)*(w3*z) + pow(t,3.0)*(w4*z) ;

(54)

plotPoint(x,y); plotPoint(x11,y11); Recta(x,y,x11,y11); }

}

void Recta(GLint x,GLint y,GLint x11, GLint y11) {

GLint t;

GLfloat b, j, k, m; for (t = 0; t <= 1; t++) {

float dy = y11 - y; float dx = x11 - x; float stepx, stepy;

if (dy < 0) { dy = -dy; stepy = -1; } else { stepy = 1; } if (dx < 0) { dx = -dx; stepx = -1; } else { stepx = 1; } //dy <<= 1;

dy *= 2;

dx *= 2;//dx <<= 1; plotPoint(x,y); if (dx > dy) {

float fraccion = dy - (dx * 2); //(dx >> 1); while (x != x11)

{

if (fraccion >= 0) {

y += stepy; fraccion -= dx; }

x += stepx; fraccion += dy; plotPoint(x,y); }

} else {

float fraccion = dx - (dy * 2); //(dy >> 1); while (y != y11)

{

if (fraccion >= 0) {

x += stepx; fraccion -= dy; }

y += stepy; fraccion += dx;

plotPoint(x,y); }

} } }

(55)

GLfloat x4,GLfloat y4, GLfloat z) { GLint i; GLint j; GLfloat t; GLfloat x; GLfloat y; for(t=0.0;t<1;t+=0.01) {

x = pow((1.0-t),3.0)*(x1*z) + 3.0*t*pow((1.0-t),2.0)*(x2*z)

+ 3*pow(t,2.0)*(1.0-t)*(x3*z) + pow(t,3.0)*(x4*z) ;

y = pow((1.0-t),3.0)*(y1*z) + 3.0*t*pow((1.0-t),2.0)*(y2*z)

+ 3*pow(t,2.0)*(1.0-t)*(y3*z) + pow(t,3.0)*(y4*z);

plotPoint(x,y); }

}

A continuaci´on, se presenta el c´odigo fuente del programa kgk.c

#include <windows.h> #include <stdio.h> # include <string.h> unsigned long error; void man(void);

int graficar(char s[]); char string[80];

int main(void) {

char *token;

printf("K2K: Draw figures. (c) Dr. Max P.G., fabruary 9 2011.\n"); printf("Press [quit] for quit or [help] for help.\n");

for(;;) { printf(">>"); gets(string); token=strtok(string," "); if (token) { printf("[%s]",token);

(56)

} }

return(0); }

(57)

printf("tresillo\n"); }

A continuaci´on se presenta el c´odigo fuente del programa para realizar el pen-tagrama penta.c

#include "../common/openglsb.h" #include<math.h>

void grlineas(GLint spos);

void grcsol(GLfloat z,GLfloat x, GLfloat y); void grcorl(GLfloat z, GLfloat x, GLfloat y); void grsil4(GLfloat z, GLfloat x, GLfloat y); void grnota4l(GLfloat z, GLfloat x, GLfloat y); void grclvfa(GLfloat z, GLfloat x, GLfloat y);

void mimain(void) { glClear(GL_COLOR_BUFFER_BIT); grlineas(10); grcsol(0.05,10,740); grcorl(0.027,50,740); grsil4(0.025,90,750); grnota4l(0.03,110,745); grclvfa(0.03,160,745); glFlush(); } void init(void) {

glClearColor(0.0,0.0,1.0,0.0); // color de la ventana. glMatrixMode(GL_PROJECTION); // Parametros de proyeccion gluOrtho2D(0.0,660.0,0.0,840.0); // xmax=660.0 ymax=840.0 }

int main(int argc, char **argv) {

glutInit(&argc,argv); // Iniciar glut

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // modo de display. glutInitWindowPosition(100,100);

glutInitWindowSize(660,840);

glutCreateWindow("penta.c -pentagrama con componentes"); init();

glutDisplayFunc(mimain); glutMainLoop();

(58)

Bibliograf´ıa

[1] Richard S.Wright Jr.,Michael Sweet. “Programaci´on en Open GL”Ediciones Anaya Multimedia,1997.

[2] Carl De Boor “A practical guide to splines”Springer [3] Chui,Charles K “Multivariate Splines”

[4] Larry L.Schumaker “Spline Functions:Basic theory”Third Edition Cambridge Mathematical Library

[5] Moncada Garc´ıa Francisco “La m´as sencilla,´util y pr´actica teor´ıa de la m´usica” [6] Latham Alison “Diccionario enciclop´edico de la m´usica”

[7] Hill Francis S. “Computer graphics: Using Open GL”

[8] Pe˜na Guerrero Maximino “Captura de M´ultiples Eventos MIDI en tiempo de ejecuci´on”, Tesis Doctorado.

[9] Pe˜na Guerrero Maximino “Proyecto KL”, Proyecto de Investigaci´on. [10] Alberto Williams “Teor´ıa de la m´usica”

[11] Harry y Michael Baxter “C´omo leer m´usica”2007,Ediciones Robinbook

[12] Narcis Llongueras(Traducci´on y Adaptaci´on) “Gu´ıa de Lenguaje Musi-cal”Editorial Icaria

[13] Joost Langeveld “Escuchar y mirar”,Teor´ıa de la m´usica. Ediciones Akal, 2002. [14] Felipe Pedrell “Diccionario T´ecnico de la m´usica”Editorial Maxtor, 2009 [15] Roger Evans “C´omo leer m´usica”Editorial Edaf

[16] Dave Astle, Kevin Hawkins “Beginning OpenGL”,Game Programming. 2004 by Premier Press

(59)
(60)

Glosario

ALTERACION: Se le llama as´ı a la dislocaci´on de tono, puede ser becuadro, be-mol o sostenido.

BEMOL: Alteraci´on que se coloca antes de una nota para que disminuya un semitono.

BECUADRO: S´ımbolo musical que se encarga de anular el efecto de un sostenido o bemol, se coloca a la izquierda de una nota.

BLANCA: Es una figura musical que dura la mitad de una redonda, su valor es igual a 1

2.

B-SPLINE: Funci´on spline que posee el m´ınimo apoyo en relaci´on a un determi-nado grado,suavidad y partici´on del dominio.

BPM: Beats Per Minute: Unidad empleada para medir el tempo en m´usica.

CALDER ´ON: S´ımbolo musical que indica que se debe alargar m´as tiempo la du-raci´on de una nota, hasta que el director o la partitura indique la nota siguiente.

CLAVE MUSICAL: S´ımbolo que tiene la funci´on de asociar las notas musicales con las l´ıneas o espacios del pentagrama.

C ´ODIGO FUENTE: Conjunto de l´ıneas de comando que un programa o soft-ware interpreta como instrucciones para realizar alguna acci´on.

COMPAS MUSICAL: Entidad m´etrica musical,conformada por varias unidades de tiempo.

CORCHEA: Figura musical que es igual a 1

8 del valor de la figura denominada

re-donda.

(61)

DIMINUENDO: Se encarga de la disminuci´on de vol´umen,se coloca al inicio de una alteraci´on y tiene efecto hasta donde se interrumpe dicha alteraci´on.

FIGURA MUSICAL: S´ımbolos que indican el tiempo que duran las notas musi-cales.

FUSA: Equivale a 1

32 de valor de la figura redonda, dura la mitad de una

semi-corchea.

INTERPOLACI ´ON: Permite encontrar una serie de datos dentro de un interva-lo conociendo interva-los vainterva-lores de interva-los extremos.

KL: Kernel for Music Languaje Compilador construido por investigadores del In-stituto Politecnico Nacional para el procesamiento digital de la m´usica.

METRONOMO: Dispositivo musical utilizado para indicar eltempo de las com-posiciones musicales.

MIDI: Musical Instrument Digital Interface, Protocolo industrial estandar que per-mite la comunicaci´on entre los ordenadores, secuenciadores, sintetizadores y otros dis-positivos electr´onicos musicales.

MusicTEX: Paqueter´ıa de LA

TEXpara la escritura de partituras musicales po-lif´onicas.

NEGRA: Es una figura musical que equivale a 1

4, dura la mitad de una blanca.

NOTA: S´ımbolo que representa un determinado sonido musical.

OPEN GL: Es una API (Application Programming Interface)que permite la in-teracci´on con dispositivos gr´aficos as´ı como multiplataforma para escribir aplicaciones con las que se obtengan gr´aficos en 2D y 3D.

PENTAGRAMA: S´ımbolo gr´afico en el que se centra la gr´afica musical, la cual representa una melod´ıa.

(62)

PUNTO: Figura geom´etrica adimensional que no posee ´area, longitud o volumen, indica una posici´on en el espacio.

REDONDA: Figura musical con valor igual a 1,es decir se toma como unidad.

SEMICORCHEA: Figura musical que equivale a 1

16, dura la mitad de una corchea.

SEMIFUSA: Esta figura musical tiene un valor equivalente a 1

64 del valor de la

re-donda, dura la mitad de una fusa.

SILENCIO: Representa la pausa, intervalo de tiempo en el que la voz o el instru-mento no genera sonido alguno.

SISTEMA DE COORDENADAS: Conjunto de valores y puntos que permiten definir un´ıvocamente la posici´on de cualquier punto de un espacio.

SOSTENIDO: S´ımbolo musical, encargado de elevar medio tono la altura de la nota inmediata derecha.

SPLINE: Curva definida por segmentos mediante polinomios.

TEMPO: Velocidad a la que debe ser ejecutada la obra musical. Se mide en BPM (Beats Per Minute)

TONALIDAD: Asociaci´on de bemoles y sostenidos representados junto a la clave musical, indica la escala en que se expresar´a la m´usica.

Figure

Figura 3.1: Puntos de control de un B-spline

Figura 3.1:

Puntos de control de un B-spline p.19
Figura 3.4: Trazado de una circunferencia

Figura 3.4:

Trazado de una circunferencia p.21
Tabla 5.1: Valores de las coordenadas de los B-splines de la primer curva

Tabla 5.1:

Valores de las coordenadas de los B-splines de la primer curva p.29
Figura 5.2: Primer secci´on; (a)Curva formada por dos B-splines; (b)Curva s´olida

Figura 5.2:

Primer secci´on; (a)Curva formada por dos B-splines; (b)Curva s´olida p.29
Tabla 5.2: Valores de las coordenadas de los B-splines de la segunda curva

Tabla 5.2:

Valores de las coordenadas de los B-splines de la segunda curva p.30
Figura 5.3: Segunda secci´on; (a)Curva formada por cuatro B-splines; (b)Curva s´olida

Figura 5.3:

Segunda secci´on; (a)Curva formada por cuatro B-splines; (b)Curva s´olida p.30
Figura 5.4: (a)Clave de Fa con puntos de control visibles; (b)Clave de Fa s´olida

Figura 5.4:

(a)Clave de Fa con puntos de control visibles; (b)Clave de Fa s´olida p.31
Tabla 5.3: Coordenadas para graficar el primer c´ırculo

Tabla 5.3:

Coordenadas para graficar el primer c´ırculo p.31
Tabla 5.4: Coordenadas para graficar el segundo c´ırculo

Tabla 5.4:

Coordenadas para graficar el segundo c´ırculo p.31
Tabla 5.5: Coordenadas para graficar el tercer c´ırculo

Tabla 5.5:

Coordenadas para graficar el tercer c´ırculo p.31
Figura 6.1: El programa prueba kgk.c

Figura 6.1:

El programa prueba kgk.c p.32
Figura 6.2: Lista de las figuras en kgk

Figura 6.2:

Lista de las figuras en kgk p.33
FIGURAN◦
FIGURAN◦ p.34
Figura 6.3: Resultados gr´aficos

Figura 6.3:

Resultados gr´aficos p.34
Figura 6.4: Resultados gr´aficos

Figura 6.4:

Resultados gr´aficos p.35
Figura 6.5: Resultados gr´aficos

Figura 6.5:

Resultados gr´aficos p.35
Figura 6.6: Resultados gr´aficos

Figura 6.6:

Resultados gr´aficos p.36
Figura 6.7: Resultados gr´aficos

Figura 6.7:

Resultados gr´aficos p.36
Figura 6.8: Resultados gr´aficos

Figura 6.8:

Resultados gr´aficos p.36
Figura 6.9: Partitura elaborada con la biblioteca de figuras musicales

Figura 6.9:

Partitura elaborada con la biblioteca de figuras musicales p.37
Figura A.1: Diagrama seccionado de la clave de fa

Figura A.1:

Diagrama seccionado de la clave de fa p.43
Figura B.1: Diagrama estructural KL

Figura B.1:

Diagrama estructural KL p.45

Referencias

Actualización...