Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
20-06-2011
NMERO RAE
PROGRAMA
AUTOR
TTULO
FUENTES
Bibliografa Sobre Lenguajes De Desarrollo De
BIBLIOGRFICAS Programacin, Midi Y Software
ELEANOR SELFRIDGE-FIELD BEYOND
MIDI, The Handbook Of Musical Codes
GEM ENTORNO GRFICO PARA MULTIMEDIA
(PAGINA OFFICIAL)
http://www.iua.upf.edu/~csora/gmv/index.php
GONZALEZ DUQUE RAUL
Python para todos
JOHANNES KREIDLER
Loadbang: Programming Electronic Music in Pure Data
PURE DATA (PAGINA OFFICIAL)
http://puredata.info/
Python PROGRAMMING
OFFICIAL)
http://www.Python.org
LANGUAGE
(PAGINA
lnea]
ROSEN, CHARLES:
Bach y Hndel, La Msica para Teclado
STEPHEN ANTHONY MALINOWSKI
Computer-Assisted Performance music animation
machine http://www.musanim.com (pagina official)
THOMAS WHITNEY SURETTE
The Appreciation of Music
WILLI APEL
Harvard dictionary of music
NMERO RAE
PROGRAMA
CONTENIDOS
METODOLOGA
Enfoque De La Investigacin
El enfoque para este proyecto es emprico-analtico
porque su fin est hallado en el hacer como creacin
donde la principal pregunta para su realizacin es el
cmo, y puede llegar a ser diseado, cuyo producto (el
sistema) proviene de una estructura en particular a la
metodologa de investigacin orientando el trabajo a la
contrastacin permanente de las aseveraciones teoras
como aseveraciones tericas musicales, la semiologa y la
semntica de la imagen trasformadas a travs de mtodos
tecnolgicos hallados en los lenguajes de programacin
dando como fin un sistema que transforma los procesos
musicales, en procesos visuales.
El ncleo problmico de este proyecto est desarrollado
dentro del ncleo de Anlisis y Procesamiento de
Seales, ya que el sistema consiste en tomar una seal
lineal (informacin MIDI en cdigo binario) y transformarla
en una seal bidimensional (imagen) que vara en el
tiempo. En detalle, se est diseando una herramienta
mediante la programacin que, vinculando varios
software, logra crear un mtodo de anlisis para el
protocolo MIDI, que a su vez genera informacin
necesaria para que un software de animacin acte
respecto de dicho anlisis. Todo es controlado por una
interfaz grfica que enlaza la herramienta de anlisis con
el software que genera la animacin y un secuenciador
MIDI.
La lnea de investigacin de la facultad en este proyecto
que, como ya se mencion, se desarrolla dentro del
campo de Anlisis y Procesamiento de Seales (APS),
busca, a travs de los mtodos y la conceptualizacin del
campo de la ingeniera de sonido, instrumentar el
desarrollo de nuevas tecnologas encaminadas al apoyo
de la composicin y la enseanza de la apreciacin
musical, creando un sistema novedoso de automatizacin
de la animacin, mediante la construccin, anlisis y
enlace de programas, a partir de la informacin musical
encontrada en el protocolo MIDI.
La lnea de investigacin de la universidad dentro de las
lneas de investigacin de la Universidad de San
Hiptesis
Utilizando software libre, disear un sistema que permita
relacionar la teora musical y la expresin grfica con el fin
de crear un mtodo dirigido hacia la enseanza de la
apreciacin musical.
Variables
Variables Independientes
-
Variables Dependientes
-
sintetizador o muestreador
Accin de la animacin para el conjunto de
elementos desarrollados en GEM
Interfaz Grfica
Proceso
Para el desarrollo del sistema se ha creado una estructura
metodolgica que desglosa cada una de las etapas de la
siguiente manera:
CONCLUSIONES
conocimiento
y
crecimiento
de
la
tecnologa,
especialmente para el software que es de todos y para
todos (Open Source).
Para que el programa fuera capaz de hallar los resultados
esperados, es decir, que procesara la estructura musical,
se tuvo que partir de informacin binaria hallada en el
protocolo de comunicacin y haciendo uso de pequeos
programas, disear mtodos de anlisis que vayan
descifrando la informacin numrica hasta lograr
informaciones bsicas sobre la estructura musical,
teniendo en cuenta que dicho protocolo no se ha diseado
en si para la escritura musical sino ms bien fue creado
para la comunicacin musical; los archivos MIDI estn
diseados para reproducir msica, y no para la notacin
musical o impresin; en otras palabras, los archivos no
incluyen informacin sobre la notacin como ligaduras,
articulaciones y/o maquetacin. Tampoco puede discernir
la escritura enarmnica (como la diferencia entre Fa# y
Solb) . Es decir,
el proyecto logr desarrollar un
programa capaz de interpretar la informacin musical de
un protocolo de comunicacin estndar y espera llegar a
descifrar procesos ms complejos de la teora musical,
como las funciones armnicas y las formas musicales.
Es un objetivo logrado haber creado las herramientas para
que el desarrollador interesado pueda, haciendo uso de la
programacin, reconocer los procesos musicales,
mediante un solo sistema que analiza innumerables
posibilidades de escritura en archivos MIDI. Una de estas
herramientas consiste en tomar la secuencia y diferenciar
las notas alteradas de la misma, continuar con la
aclaracin de la informacin enarmnica y descubrir si las
notas alteradas son sostenidos o bemoles hasta,
finalmente, dar con la tonalidad mayor o menor en la que
fue compuesta la pieza. Otra herramienta lograda que
parte de la anterior, es la que genera la visualizacin de
un flujo de eventos de manera matricial sin perder de vista
las propiedades armnicas musicales de la secuencia; y
que est bastante cerca de poder discernir las lneas
meldicas de una pieza polifnica; adems, ya es un
recurso que facilita el anlisis de las funciones armnicas.
Como instrumento de enseanza, el programa puede
Proyecto de Grado
Nota de aceptacin
______________________________
______________________________
______________________________
______________________________
______________________________
______________________________
Jurado
______________________________
Jurado
AGRADECIMIENTO
Primero que nada doy gracias a l Todo, de quien nace y se crea la primera
causa, por la cual todos provenimos y existe la unidad, es por l que puedo ser y
tengo la fortuna de poder modificar la materia y la energa para crear.
No podra faltar mi madre, Mara Fernanda Daz, gracias a su ejemplo y su gran
valenta he salido adelante, su fuerza y coraje que nos ha impulsado a m y a toda
la familia por ser cada da mejores.
A mi padre, Jos Luis Gonzlez, su sabidura y consejos aunque a veces necios,
me dieron la visin para el desarrollo de este proyecto, gracias por toda su ayuda;
el cario de mi abuelita, la paciencia de Santiago, el apoyo de Natalia y la
compaa de Simn.
Son muchas ms las personas a las que debo y quiero agradecer, todas y cada
una de ellas que me prestaron atencin y contribuyeron a esta idea, entre ellos
quiero destacar a:
Ingeniero Carlos Andrs Cabas
El Seor Hernn Espinoza
Doctor Jaime Durn
Maestro Jaime Morn
Ingeniero Luis Andrs Murcia
Fsico Luis Jorge Herrera
Ingeniero Manuel Dvila
Ingeniero Miljail Posada
Diseador Oscar Mauricio Reyes
La Seorita Roxana Puente
Por ltimo agradezco la maravillosa contribucin de los desarrolladores en cdigo
abierto, creadores de programas que hicieron posible la construccin de ste
sistema como MIDICSV, Python, Pure Data y GEM, Rose Garden; para ellos mi
ms profunda admiracin por su trabajo.
RESUMEN
TABLA DE CONTENIDO
INTRODUCCIN ..............................................................................................................................7
PLANTEAMIENTO DEL PROBLEMA ..............................................................................8
1.
1.1.
ANTECEDENTES .............................................................................................................8
1.2.
1.3.
JUSTIFICACIN ............................................................................................................ 14
1.4.
1.4.1.
1.4.2.
1.5.
1.5.1.
ALCANCES .......................................................................................................................... 18
1.5.2.
LIMITACIONES .................................................................................................................... 19
METODOLOGA ................................................................................................................ 20
2.
2.2.
HIPTESIS ..................................................................................................................... 25
3.
NUCLEOS PROBLMICOS / LNEA DE INVESTIGACIN DE LA FACULTAD /
LNEA DE INVESTIGACIN DE LA UNIVERSIDAD .............................................................. 25
3.1.
3.2.
3.3.
4.
4.1.
4.1.1.
PYTHON ................................................................................................................................ 26
4.1.2.
TKINTER ............................................................................................................................... 28
4.1.3.
MIDICSV ................................................................................................................................ 28
4.1.4.
4.1.5.
4.1.6.
MIDI ........................................................................................................................................ 31
4.1.7.
4.1.8.
4.1.9.
LA IMAGEN .......................................................................................................................... 34
4.2.
4.2.1.
4.2.2.
4.2.3.
5.
5.1.
5.2.
5.3.
5.4.
5.5.
5.6.
5.6.1.
MATRIZ CONCATENADA evnt=[ ] DE NOTAS SIMULTANEAS POR
DURACION ............................................................................................................................................. 53
5.7.
5.7.1.
5.7.2.
5.7.3.
5.7.4.
5.7.5.
5.7.6.
5.8.
5.9.
5.9.1.
5.9.2.
5.9.3.
5.9.4.
5.9.5.
5.9.6.
5.9.7.
5.9.8.
MONITOR............................................................................................................................ 118
5.10.
5.10.1.
5.10.2.
5.10.3.
LA FUNCIN __INIT__ ((( MUSIC ))) ((( GARDEN ))) .............................................. 122
5.10.4.
5.10.5.
5.10.6.
5.10.7.
5.10.8.
5.10.9.
5.10.10.
5.10.11.
5.10.12.
5.10.13.
5.10.14.
5.10.15.
5.10.16.
5.10.17.
5.10.18.
6.
6.1.
6.2.
6.3.
6.3.1.
6.3.2.
6.3.3.
6.3.4.
6.3.5.
6.4.
7.
8.
7.1.
7.2.
GLOSARIO.................................................................................................................................... 166
INTRODUCCIN
1.1.
ANTECEDENTES
nombres de las notas, los nombres fueron sacados de las primeras slabas
iniciales de un Himno a San Juan Bautista, llamado Ut queant Laxis, escritas por el
historiador lombardo Pablo el Dicono, en el Siglo VIII. Posteriormente, en el siglo
XVII, Giovanni Battista Doni sustituy la nota ut por do, que facilitaba el solfeo por
terminar en vocal y creando as el sistema de notacin con pautas de cinco lneas
que se convirti en el patrn para toda la msica occidental mantenindose as
hasta el da de hoy3.
Ut queant laxis
Resonare fibris
Mira gestorum
Famuli tuorum
Solve polluti
Deshaz el reato de
Labii reatum
Sancte Ioannes
las videoesculturas. Durante los primeros aos del vdeo se produjo una frecuente
y fructfera colaboracin entre los artistas de la msica y los artistas de la imagen.
Paik proceda de la msica electrnica y John Cage era, a travs de Paik, el
msico de vanguardia que ms cerca estuvo de la creacin videogrfica. Por su
parte, Gary Hill investig las relaciones entre sonido e imagen hasta conseguir
visualizar sus vibraciones y reproducir la estructura de la materia sonora en la
gama de grises de la imagen en blanco y negro, como sucede en Elements
(1978), Sums & Differences (1978) y Soundings (1979). Consigue, en esta ltima
cinta, convertir el sonido en movimientos y sensaciones tctiles, a travs de las
imgenes del altavoz que modifica los materiales con los que entra en contacto9.
Un fuerte referente nace en 1989 donde Wayne Lytle funda la Animusic con el fin
de animar la msica de instrumentos. Este artista ha ganado premios y se ha
presentado en diversos contextos electro-acsticos a nivel mundial. En 1991 Lytle
recibi un premio de IBM para su primer trabajo en la animacin de la msica. En
1995 Lytle trabaj con el artista David Crognale, creando una animacin
estereoscpica para VRex, la premiada versin llamada Concierto en 3D, y la
versin normal llamada Ms all de los Muros, despus public
Animusic:
Special Edition en DVD con sonido envolvente 5.1, despus public Animusic 2
y ya anunci la publicacin de Animusic 3.10 Sin embargo las visualizaciones en
tiempo real a partir de una seal solo se dan cuando aparecen los reproductores
de audio en los computadores personales. Es as como en 1985 con un software
llamado Sound to Light Generator, muy usando para mediados y finales de los
noventas, se implementaron programas como Winamp, Audion, y el SoundJam.
Luego aparece Cthugha en 1994 para DOS y despus, en 1999, ya haba varias
docenas de software que se distribuan libremente para la visualizacin musical.
En particular el MiljDrop creado por Ryan Geiss, G-Force por Andy O'Meara, y
Advanced Visualization Studio (AVS) por Nullsoft, fueron grandes visualizadores
9
Dra. Ana Mara Sedeo Valdells: Artculo publicado en Julio del 2007 en la revista n 0004 de Sinfona
Virtual, Espaa (pag 4).
10
Animusic: (pgina oficial) [en lnea]. <http://www.animusic.com/> [citado en 07-04-2011]
de msica, AVS ahora es parte de Winamp y public su cdigo fuente para libres
desarrollos (open-sourced); G-Force un producto de la compaa de Andy
O'Meara (creadora del SoundSpectrum), fue aprobada para su uso en iTunes, y en
Windows Media Player11.
Otras opciones que han crecido con el pasar de los tiempos son software que se
utilizan para mezclar videos en tiempo real, fenmeno al que se le ha llamado
videojockey o VJ y que consiste en la actividad de proyectar visuales sobre la
performance musical de un discjockey;
11
PRIETO, Daro: Imgenes de recorta y pega: Msica de colores en La Luna del Siglo XX, n. 230, 11 de
julio de 2003
12
Dra. Ana Mara Sedeo Valdells: Artculo publicado en Julio del 2007 en la revista n 0004 de Sinfona
Virtual, Espaa.
13
Music Animation Machine (pgina official) [en linea]. <http://www.musanim.com/mam/mamhist.htm >
[citado en 16/10/09 de 2009]
1.2.
1.3.
JUSTIFICACIN
El ingeniero de sonido puede aliar la parte ingenieril con la parte artstica. Este
Proyecto toma en cuenta factores artsticos que son posibles de analizar a travs
de la abstraccin y los conocimientos de carcter ingenieril, con el propsito de
crear algoritmos que logren la transformacin de la informacin musical en
imgenes coherentes y sincrnicas. Por esta razn, la ingeniera de sonido es un
campo propicio para la creacin de este tipo de interfaz.
grafica capaz de reunir y acoplar todos los elementos descritos en las etapas
anteriores.
Algunas de estas etapas han llegado a ser grandes proyectos de la teora del arte
como los de Alexander Scriabin, Olivier Messiaen15 y Vassily Kandinsky16, que
establecieron la relacin entre la msica y el color; en el campo de la
programacin, los que establecieron la comunicacin entre distintos programas
para que funcionen en tiempo real como el OSC (Open Sound Control); o el
proyecto de la pianista Carmen Paz17, que relaciona nuevamente los colores y la
msica tratando de crear su propia sinestesia; o el proyecto Audiogames18 que
consiste en crear un espacio sonificado interactivo en donde la etapa de
sincronizacin es vital para su desarrollo. As pues, apoyar efectivamente la
composicin o la enseanza de la apreciacin musical, por medio de un programa,
es un trabajo bastante amplio que requerir el trabajo de diferentes disciplinas
como la ingeniera de sistemas, la msica, el diseo grfico aplicado a la
multimedia, entre otras. Por eso este proyecto es una aproximacin dirigida a la
enseanza de la apreciacin musical buscando caminos para desarrollar todas las
etapas y dejando este conocimiento para su posterior contribucin proyectndose
en el campo de la visualizacin musical.
15
COLORES/PROYECTO
DE
FINAL
DE
CARRERA:
Carmen
Paz
[en
lnea].
2011]
Hay una gran variedad de formas de representar la msica visualmente, que van
desde las comunes visualizaciones que usan los reproductores de multimedia, o
los programas que mezclan loops de videos e imgenes y que son usados por
los software llamados VideoJockeys (VJ), como el Arkaos VJ o el Resolume VJ,
entre muchos otros; hasta las animaciones diseadas para la msica, como las
msic machines, que construyen imgenes que corresponden a la msica. El
referente csico es la pelcula Fantasa de Walt Disney. Pero son muy pocos los
que realmente se interesan por representar la estructura terica musical, como lo
hace la Music Animation Machine. El propsito de este proyecto es ir ms all,
con una interfaz grfica que convierta la estructura musical en un lenguaje grfico
coherente y sincrnico que pueda llegar a establecer una fuerte relacin entre la
msica y la imagen, teniendo en cuenta que las interfaces en tiempo real que
permiten al usuario ver cierta correspondencia entre la msica y lo visual, son an
aplicaciones bsicas y sin el componente didcticos.
Se hace uso del protocolo MIDI, porque es el protocolo en que est escrita la
msica en el lenguaje de digital; por lo tanto es la forma ms directa de manipular
la informacin musical en el entorno de las nuevas tecnologas de la informacin y
de la comunicacin.
1.4.
OBJETIVOS DE LA INVESTIGACIN
Desarrollar una interfaz grfica que permita al usuario interactuar enlazando las
herramientas visuales con el protocolo MIDI.
1.5.
1.5.1. ALCANCES
Usar este sistema como una herramienta para el aprendizaje musical y para la
composicin musical.
1.5.2. LIMITACIONES
Pure Data es una herramienta poderosa con variadas aplicaciones, pero presenta
dificultad al no disponer de una herramienta directa para programar objetos de una
manera simple, utilizando condicionales, ciclos o vectores, como en la
programacin convencional, a menos que se desee entender el cdigo fuente y
desarrollar la aplicacin (objeto) que se necesita.
2. METODOLOGA
Crear la comunicacin necesaria para que Pure Data entienda las rdenes
generadas por el programa de anlisis y genere la animacin.
Hacer una interfaz grfica que permita manipular y enlazar los programas
que deben ser usados.
la polifona19. Las Invenciones son 15 piezas a dos voces y las Sinfonas son 15
piezas a tres voces. Bach, al componerlas, us las escalas ms sencillas,
haciendo un pequeo clave bien temperado didctico para sus hijos 20. Luego se
tomaron los dos libros de El Clave Bien Temperado BWV 846-869 y BWV 870893, que son un conjunto grande de partituras usadas para el estudio de la
interpretacin polifnica, como tambin un referente cumbre para el estudio de la
forma musical del periodo barroco en cuanto al preludio y la fuga 21. Cada libro
posee 24 grupos constituidos por un preludio y una fuga en todas las tonalidades
mayores y menores de la gama cromtica completando toda la escala cromtica
de mayor a menor. Es, por tanto, una coleccin enorme que comprende 48
preludios y 48 fugas cuyo contenido es a la vez musical, terico y didctico.22
Este trabajo est inicialmente dirigido hacia nios que ya tengan conocimientos
musicales y nociones de armona y contrapunto23, as como tambin a jvenes que
tengan la capacidad o estn cerca de interpretar las obras de El Clave Bien
Temperado. Entonces, la interfaz mostrar a los usuarios, por medio de dos
canales de comunicacin: auditivo y visual, la forma cmo la msica ha sido
escrita y estudiada, con lo cual las obras podrn ser entendidas mucho ms
didcticamente, introducindolos en el significado y las estructuras en las cuales
se escribieron.
19
2.1.
DIAGRAMA DE FLUJO
Los archivos MIDI con extensiones *.mid o *.midi son archivos que se encuentran
almacenados en formato binario y para su lectura se us el programa gratuito
MIDICSV, que toma el archivo y lo transforma en una lista de eventos con el
Otro proceso importante es definir la duracin de las notas en una secuencia por
su valor individual y no por el orden de activacin y desactivacin referido a toda la
secuencia, como un tiempo marcado con cronmetro (time). Para poder analizar la
msica no basta con tener una lista de eventos MIDI. Se opta por crear un mtodo
para poder visualizar la msica dentro de los eventos; para ello hay que filtrar
nuevamente la informacin despreciando las notas de apagado y tomando las
notas de encendido. Como las notas simultneas vienen una detrs de otra, es
necesario poder verlas al tiempo, como en una partitura, as las notas simultneas
esferas una detrs de otra representando las notas segunda, tercera, cuarta etc.
las esferas pueden tener un rastro que visualmente refiera a sta y de donde a
donde se est desplazando; por ltimo las esferas van a adquirir un color y ste va
a depender de la relacin que se establecer entre la msica y la imagen.
2.2.
HIPTESIS
3.1.
NCLEOS PROBLMICOS
3.2.
3.3.
4. MARCO DE REFERENCIA
4.1.
4.1.1. PYTHON
Muchos de los procesos que se van a realizar, se hacen usando listas que son
vectores dentro de Python, una variable en donde se pueden almacenar varios
datos de una sola vez; para lo cual hay que tener en cuenta las propiedades27,
tiles para el manejo de listas como el mtodo para definirlas, citar rpidamente su
informacin usando atajos, aadir o quitar elementos, buscar dentro de una lista y
usar listas concatenadas. Otro elemento vital son los diccionarios, que definen una
relacin uno a uno entre claves y valores tiles para citar rpidamente informacin
o generar, mediante la clave, valores correspondientes en grandes procesos como
introducir el valor de nota MIDI, obtener su nombre y su octava. Tambin tiene
propiedades como definir un diccionario, mezcla de tipos de datos en un
diccionario, eliminacin de elementos de un diccionario.
24
4.1.2. TKINTER
4.1.3. MIDICSV
28
Entre las herramientas externas que se van a utilizar esta MIDICSV29 que es un
programa con el que se toma un archivo MIDI y lo transforma en una lista de
eventos con el formato CSV (valores separados por comas) cuyas siglas
provienen de Comma Separated Values. A este tipo de programas se le llaman
parsing (analizador). Al pedirle a MIDICSV que analice un archivo, ste va a
generar una lista sujeta a una estructura de registro la cual indica cada uno de los
eventos que el archivo tiene, dentro de esta los parmetros que se van a utilizar
son 0, 0, HEADER, FORMAT, NTRACKS, DIVISIN que es el registro de
cabecera del archivo MIDI, TRACK, TIME, TIME_SIGNATURE, NUM, DENOM,
CLICK, NOTESQ El comps, la tasa de clic del metrnomo, el TRACK, TIME,
KEY_SIGNATURE, KEY, MAJOR/MINOR, donde especifica el valor numrico de
la clave, mayor / menor TRACK, TIME, TEMPO, NUMBER que contiene el tempo
y los eventos de activacin de nota TRACK, TIME, NOTE_ON_C, CHANNEL,
NOTE,
4.1.4. COMUNICACIN OPEN SOUND CONTROL
Walker John: MIDICSV [en linea]. < http://www.fourmilab.ch/webtools/midicsv/ > [citado en 08-04-2011]
Open Sound Control: pgina oficial [en linea]<http://opensoundcontrol.org/introduction-osc >[ citado en
04-05-2011]
31
Librera OSC para PYTHON: pyOSC: [en linea]< https://trac.v2.nl/wiki/pyOSC>[ citado en 04-05-2011]
30
Data
debe
tener
(http://puredata.info/community/projects/software)
la
que
versin
ya
cuenta
extendida
con
este
La animacin y el secuenciador MIDI se van a trabajar con Pure Data (PD) que es
un entorno grfico de programacin en tiempo real diseado para aplicaciones de
audio, vdeo y procesamiento de grficos32, Pure Data cuenta con la ayuda que
gua a el usuario facilitando de gran manera el trabajo mediante ejemplos
mostrndole las posibilidades que tiene en cuanto a la programacin de cada
objeto, adicionalmente recomienda otros objetos relacionados con l mismo.
Para hacer uso del protocolo MIDI es necesario direccionar las entradas y salidas
en Pure Data, tambin hay que manejar la estructura para la entrada y salida de
informacin MIDI, se utilizara tambin el objeto acorde chord que va a ser til
para la ejecucin en tiempo real de la animacin con un controlador.
32
4.1.6. MIDI
Generacin Musical y Visual: GEM - Pure Data: [en line] < http://www.dtic.upf.edu/~csora/gmv/index.php
> [ citado en 04-05-2011]
Para analizar las piezas propuestas por ste proyecto (Invenciones y Sinfonas, y
el Clave Bien Temperado) se deber tener claro los conceptos de la teora
musical35 como: armaduras de clave, intervalos, las escalas, los tipos de escalas,
las triadas, los grados de las escalas y, en menor medida, las funciones
armnicas; con el fin de poder hacer anlisis armnico. Tambin es importante
entender aspectos como las texturas musicales de las sinfonas e invenciones de
J. S. Bach, as como qu es una invencin o qu es una sinfona, qu es el clave
bien temperado, donde se encuentran trminos como: preludio y fuga. Toda esta
informacin se encuentra en el apndice
Eleanor Selfridge-Field Beyond: MIDI, The Handbook Of Musical Codes (pg. 43)
Alvira Rodrguez Jos: Teora Musical; Aprendizaje [en lnea]. <http://teoria.com/aprendizaje/lectura/15armaduras.htm> [citado en 29/10/09 de 2009]
35
4.1.9. LA IMAGEN
4.2.
Este proyecto est trabajando con software no privatizado y por ello es importante
distinguir entre los diversos tipos de licencias que pueden existir: La informacin
en detalle se encuentra en el apndice, donde se desarrollan conceptos como las
licencias de software libre, la definicin de software libre37, la licencia pblica
general de GNU, la licencia pblica general reducida de GNU, licencia pblica
general de affero de GNU, licencia de documentacin libre de GNU, copyleft38.
Este software es de dominio pblico. Tiene el permiso para usar, copiar, modificar
y distribuir este software y su documentacin con cualquier propsito y sin cargo a
la presente se otorga, sin ningn tipo de condiciones o restricciones. Este software
36
se otorga sin ninguna garanta implcita o explcita39. Por John Walker, Febrero,
2004, Revisado Enero de 2008
La Python Software Foundation License, o PSFL por sus siglas en ingls, es una
licencia de software libre permisiva, al estilo de la licencia BSD, es decir, que
cumple con los requisitos OSI para ser declarada licencia de software libre;
adems, es compatible con la licencia GPL. A diferencia de la licencia GPL, y
como la mayora de licencias tipo BSD, la licencia PSFL no es una licencia
copyleft, y permite modificaciones del cdigo fuente, as como la creacin de
trabajos derivados, sin requerir que ni las modificaciones ni los trabajos derivados
tengan que ser a su vez de cdigo abierto. La licencia PSFL est dentro de las
listas de licencias aprobadas tanto por la Free Software Foundation como por la
Open Source Initiative.40
4.2.3. LICENCIA DE PURE DATA Y GEM41
39
John Walker : MIDICSV [en linea] < http://www.fourmilab.ch/webtools/midicsv/ > [ citado en 04-05-2011]
PYTHON 2.7 licencia: [en linea] < http://www.PYTHON.org/download/releases/2.7/license/> [ citado en
04-05-2011]
41
Pure Data licencia: [en linea] <http://wiki.puredata.info/en/Pd_license> [ citado en 04-05-2011]
40
estando muy cercana al dominio pblico. La licencia BSD al contrario que la GPL
permite el uso del cdigo fuente en software no libre.
5.
DESARROLLO INGENIERIL
En este captulo del desarrollo ingenieril se van a explicar uno a uno los procesos
que fueron necesarios para la creacin del sistema. Ntese que para la redaccin
y la ejemplificacin del cdigo se ha respetado la sangra correspondiente al
proceso, tal como se escribe el cdigo en Python con el fin de que se tenga un
mayor entendimiento.
5.1.
class MusicGarden:
def __init__(self,nmid,fin):
def Termcsv(self):#programa que recoge la informacin de midicsv
def Nummat(self):#Cuanta el numero de notas on y off
def Eventmidi(self):#Filtra las notas on y off, los cambios de tempo, Header o PPQN
def Vermatriz(self):#Ordena tracks en uno solo y los organiza los eventos de menor a mayor
def MtrzAnls(self):#Matriz concatenada de notas on simultaneas
def Analisis(self):# Anlisis Musical
5.2.
El cdigo es el siguiente:
def Termcsv(self):
def csvlist():
import subprocess
outfd = open('Out', 'w+')
errfd = open('Err', 'w+')
subprocess.call(['midicsv','-v',nmid], stdout=outfd, stderr=errfd)
outfd.close()
errfd.close()
csvlist()
Se cre, por conveniencia, una funcin def csvlist():, luego se import la biblioteca
subprocess, creando dos archivos para la salida de datos y otra funcin para los
mensajes de error. Out y Err, a los que se les asigna las variables outfd y errfd;
w+, significa que abre los archivos Out y Err en modo escritura y si no existen
entonces estos se crean; luego subprocess.call llama a midicsv.exe, lo ejecuta con
el comando -v que sirve para descompilar y llamar el nombre del archivo MIDI; con
esto logra generar una lista de eventos ejecutados en MS-DOS pero, como no se
quiere que solo se impriman en MS-DOS, sino que los guarde entre los ficheros
Out y Err, se logra con stdout. Finalmente se cierran los ficheros. Para ejecutar la
subsuncin def csvlist(): se hace agregndole csvlist() al final. Hay que tener en
cuenta que el archivo MIDI debe estar dentro de la carpeta que contiene los
archivos de MIDICSV; otra cosa muy importante es que siempre en Python las
jerarquas estn notadas por la sangra y as se sabr el orden de los procesos,
por eso csvlist() debe tener la misma sangra que def csvlist(): para ejecutarse.
5.3.
Con global nev se hace para que la variable nev pueda ser llamada con el mismo
valor en cualquier clase o funcin; en n se abre el archivo Out y r+ para leerlo, en
el ciclo while tomo lnea a lnea cada evento dentro del texto Out; luego se va a
filtrar la informacin de cada lnea con el ciclo for mediante los condicionales if.
Ms adelante el contador nev va a registrar cada vez que una lnea con el nombre
Note_on_c o Note_off_c aparezca.
5.4.
El cdigo es el siguiente:
def Eventmidi(self):
global sos,tmp
sos=[];tmp=[]
n = open('Out','r+')
while True:
linea = n.readline()#toma cada linea del texto
if not linea: break
cdn='';a=[]
for num in linea:#quita caracteres no deseados
if num != ' ' and num != ',' and num != '\n':
cdn=str(cdn)+str(num)
if num == ',' or num == '\n' and cdn != '\n' and cdn != '':
a=a+[cdn]
cdn=''
#print a
global sgndo,tcom
if a[2]=='Header':
sgndo=a[5]
if a[2]=='Time_signature':
tcom=[int(a[3]),int(a[4])]
if a[2]=='Tempo':
tmp.append([a[1],a[3]])
if a[2]=='Note_on_c':
a=[a[3],a[5],a[4],a[1]]
ro=+1
sos=sos+[a]
if a[2]=='Note_off_c':
a[5]=0
a=[a[3],a[5],a[4],a[1]]
sos=sos+[a]
(0, 0, HEADER,
Los siguientes valores a tomar son los valores a[1] y a[3] del Tempo (TRACK,
TIME, TEMPO, NUMBER) guardados en la lista tmp, a[1] es la duracin donde va
a existir el cambio de tempo, en a[3] va a estar el valor del tempo. Ms adelante se
toman los valores ms importantes que son Note On y Note Off (TRACK, TIME,
NOTE_ON_C, CHANNEL, NOTE, VELOCITY y TRACK, TIME, NOTE_OFF_C,
CHANNEL,
NOTE,
VELOCITY).
Al
hacer
a=[a[3],a[5],a[4],a[1]]
se
est
5.5.
HERRAMIENTA DE ANLISIS
Bajo la influencia del protocolo Qlist, cuando se empez a experimentar con las
secuencias musicales MIDI para piano, se encontr que as como existan
secuencias con tres canales (por ejemplo, representando el nmero de voces),
tambin existan secuencias que podan tener siete canales para la misma pieza
musical, bajando la misma secuencia desde dos fuentes distintas, entonces como
este proyecto estaba enfocado hacia piezas para piano, se tom la decisin de
unir todos los canales en un solo canal MIDI.
El primer paso es tomar los valores numricos de la lista sos y pasarlos a enteros
as:
for i in range(len(sos)):
for j in range(4):
sos[i][j]=int(sos[i][j])
Hay que tener en cuenta que si una secuencia tiene varios canales, entonces va a
aparecer una lista de eventos por cada canal, hasta llegar al ltimo canal, es decir;
la primera lista tendr el canal cero, la siguiente lista el canal uno y as
sucesivamente; pero la clave est en que las duraciones son las que tienen el
orden de todas las notas de la secuencia as que se van a organizar de menor a
mayor todos los eventos de la secuencias de acuerdo a los valores de las
duraciones. Para ordenar los eventos se usa el mtodo de la sacudida que
proviene del mtodo de la burbuja as:
for i in range(1 , len(sos)-1): #Ordena sos[3] DURACION
for j in range(0, len(sos)-i):
if sos[j][3] > sos[j+1][3]:
sos[j],sos[j+1] = sos[j+1],sos[j]
izq = 1
der = len(sos)-1
j = len(sos)-1
while izq <= der : #Ordena sos[3] DURACION
for i in range(der,izq-1,-1) :
if sos[i-1][3] > sos[i][3]:
sos[i],sos[i-1] = sos[i-1],sos[i]
j=i
izq = j+1
for i in range(izq,der+1):
if sos[i-1][3] > sos[i][3]:
sos[i],sos[i-1] = sos[i-1],sos[i]
j=i
der = j-1
Es bueno notar que la forma de cambiar de posicin a dos elementos en una lista
se logra fcilmente con sos[j],sos[j+1] = sos[j+1],sos[j]; para entender ms sobre el
mtodo de la sacudir puede remitirse al tem titulado Ordenamiento por
Sacudida en Python del marco terico.
Cuando hay notas simultaneas, stas para encenderse deben tener el mismo valor
de duracin, por ejemplo, si hay siete notas simultaneas, van a existir siete
eventos con la misma duracin de encendido, pero no siempre la organizacin del
valor de las notas estn ordenados de menor a mayor; por ello se usar
nuevamente el mtodo de organizacin anterior para ordenar dichos valores de
nota de la siguiente manera.
izq = 1
der = len(sos)-1
j = len(sos)-1
while izq <= der : #Ordena [2] VALOR NOTA para cada duracin
for i in range(der,izq-1,-1) :
if sos[i][2] < sos[i-1][2] and sos[i][3] == sos[i-1][3] and sos[i][1] == sos[i-1][1]:
sos[i],sos[i-1] = sos[i-1],sos[i]
j=i
izq = j+1
for i in range(izq,der+1):
if sos[i][2] < sos[i-1][2] and sos[i][3] == sos[i-1][3] and sos[i][1] == sos[i-1][1]:
sos[i],sos[i-1] = sos[i-1],sos[i]
j=i
der = j-1
Por alguna razn despus de este proceso no funcion totalmente este mtodo
as que se us el mismo una segunda vez para cerciorarse de que todos los
eventos que tuvieran la misma duracin estuvieran organizados de menor a
mayor.
Las duraciones para una secuencia MIDI estn dadas como un cronometro
contabilizando en qu momento est sucediendo un evento, en cambio para el
protocolo Qlist de Pure Data, las duraciones estn dadas para cada evento, por
ejemplo: para una secuencia MIDI donde los eventos tienen la misma duracin y
uno va detrs de otro, sera: evento 0 y duracin 0, evento 1 y duracin 1, evento
2 y duracin 2, evento 3 y duracin 3; en cambio para el protocolo de Qlist sera:
evento 0 y duracin 1, evento 1 y duracin 1, evento 2 y duracin 1, evento 3 y
duracin 1. Para esto se ha creado el siguiente cdigo:
for i in range(len(sos)):
if i < len(sos)-1:# and sos[i][0]==sos[i+1][0]:
sos[i]=sos[i]+[sos[i+1][3]-sos[i][3]]
sos[i]=[sos[i][0],sos[i][1],sos[i][2],sos[i][4],sos[i][3]]
else:
sos[i]=sos[i]+[0]
sos[i]=[sos[i][0],sos[i][1],sos[i][2],sos[i][4],sos[i][3]]
Entonces el valor de duracin para cada evento es la resta de las duraciones del
evento posterior al anterior sos[i]=sos[i]+[sos[i+1][3]-sos[i][3]]; lo que sucede en
este cdigo es crear una nueva columna con los valores de duracin para cada
evento que se est organizando (sos[i]=[sos[i][0],sos[i][1],sos[i][2],sos[i][4],sos[i][3]])
una columna antes que las duraciones de la secuencia; a continuacin un ejemplo
de los resultados del cdigo antes de proceso:
0
0
0
0
0
0
0
0
0
0
0
0
0
0
100
100
100
100
100
100
100
0
0
0
0
0
0
0
60
64
67
72
76
79
84
60
64
67
72
76
79
84
0
0
0
0
0
0
0
480
480
480
480
480
480
480
100
100
100
100
100
100
100
0
0
0
0
0
0
0
60
64
67
72
76
79
84
60
64
67
72
76
79
84
0
0
0
0
0
0
480
0
0
0
0
0
0
0
0
0
0
0
0
0
0
480
480
480
480
480
480
480
La siguiente etapa es adecuar las duraciones de cada evento a los valores para el
protocolo de Qlist en el que si una nota dura un segundo, la duracin para Qlist
sea un segundo es decir mil milisegundos de la siguiente manera:
sgndo2=1000/float(sgndo)
for i in range(len(sos)):
sos[i][3]=float(sos[i][3]);sos[i][4]=float(sos[i][4])
if sos[i][3] != 0:
sos[i][3]=sos[i][3]*(sgndo2)
if sos[i][4] != 0:
sos[i][4]=sos[i][4]*(sgndo2)
El proceso consiste en que se toma el valor de la variable sgndo que contiene el
nmero de pulsos por negra y se crea una relacin para la conversin de las
duraciones que ser aplicada a las dos columnas que se tiene de duracin.
100
100
100
100
100
100
100
0
60
64
67
72
76
79
84
60
0.0
0.0
0.0
0.0
0.0
0.0
1000.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
1000.0
0
0
0
0
0
0
0
0
0
0
0
0
64
67
72
76
79
84
0.0
0.0
0.0
0.0
0.0
0.0
1000.0
1000.0
1000.0
1000.0
1000.0
1000.0
Las duraciones de los cambios de tempo tambin deben ser transformado para
que Qlist los entienda, por ello se aplica el mismo proceso; as mismo se debe
tener en cuenta que los tempos deben estar de acuerdo a una relacin ya que
para Pure Data donde un tempo de tempo 60 = 1 segundo = 1 en Pd, y tempo 120
= 1/2 segundo = 2 en Pd. Estos dos procesos se hacen de la siguiente manera:
Pasar duracin de los tempos con factor de sgndo con la misma relacin del
proceso anterior:
for i in range(len(tmp)):
tmp[i][0]=float(tmp[i][0]);tmp[i][1]=float(tmp[i][1])
if tmp[i][0] != 0:
tmp[i][0]=round((tmp[i][0]*(sgndo2)), -1)
Los pasos siguientes son pequeos procesos donde algunos se deben hacer para
el correcto funcionamiento en Pure Data y otros que son ayudas para el anlisis
musical:
Creacin de listas con los 128 valores donde tenga el nombre del valor de la nota,
la octava a la que pertenece y el valor nota;
n=['C','C#','D','D#','E','F','F#','G','G#','A','A#','B']
vn=[];vo=[];vv=[];num=-1;note=-1
for i in range(128):
vv=vv+[i]
if i%12==0:
num+=1
note+=1
vo=vo+[num-1]
vn=vn+[n[note]]
if note==11:
note=-1
#print vn # Nombre de la nota
#print vo # Valor Octava
#print vv # Valor de la nota
Como se tuvo que establecer una relacin para todas las duraciones, existen
valores que tienen varios decimales y que con el siguiente cdigo se redondean a
un decimal:
for i in sos:
i[4]=round(i[4], -1)
i[5]=round(i[5], -1)
ch
vel
not
drpd
dr
4C
4E
4G
5C
5E
5G
6C
4C
4E
4G
5C
5E
5G
6C
0
0
0
0
0
0
0
0
0
0
0
0
0
0
100
100
100
100
100
100
100
0
0
0
0
0
0
0
60
64
67
72
76
79
84
60
64
67
72
76
79
84
0.0
0.0
0.0
0.0
0.0
0.0
1000.
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
1000.0
1000.0
1000.0
1000.0
1000.0
1000.0
1000.0
5.6.
0
0
0
0
0
0
0
0
100
100
100
100
0
0
0
0
72
76
79
84
72
76
79
84
0.0
0.0
0.0
1000.0
1000.0
2000.0
4000.0
0.0
0.0
0.0
0.0
0.0
1000.0
2000.0
4000.0
8000.0
En este caso es muy difcil comprender de una manera prctica qu es lo que est
sucediendo con las notas simultneas dentro de la secuencia. En realidad las
notas de desactivacin no ayudan a entender lo que sucede con la secuencia, y el
sentido vertical del flujo de datos resultantes, tampoco muestra claramente cmo
ests sucediendo dentro de la secuencia; entonces hay que construir un mtodo
no solo para asimilar la msica en el flujo de datos generados sino que adems,
ste mtodo debe ser prctico para transformarlo mediante la programacin.
Los valores de la tabla anterior son arbitrarios y estn tomados como ejemplo. Se
trata de una tabla ideal en la que cada color representa una meloda, por lo tanto
habra 4 melodas distintas. En las columnas de la derecha, los valores presentan
la secuencia de llegada de cada conjunto de eventos, es decir, los eventos
encendidos en dicho tiempo. Por ejemplo en el evento con la duracin 19, la nota
encendida es 94 mientras que para el evento con la duracin 21, las notas
simultneas son 44 - 65 - 33. El ejemplo sirve, entonces, para ver que la armona
queda establecida en el sentido horizontal y que las melodas aparecen en el
sentido vertical, contrario, a como se expresaran en una partitura (armona
vertical, meloda horizontal).
0
0
0
0
0
0
0
0
100
100
100
100
0
0
0
0
72
76
79
84
72
76
79
84
0.0
0.0
0.0
1000.0
1000.0
2000.0
4000.0
0.0
0.0
0.0
0.0
0.0
1000.0
2000.0
4000.0
8000.0
Matiz evnt:
1000.0
1000.0
2000.0
4000.0
0.0
1000.0
2000.0
4000.0
El proceso para lograr la matriz evnt est dado por el siguiente cdigo:
io=0;n1=0;n0=0;sim=[];evnt=[];time=[];rtime=[]
self.ev=[];self.txt=''
for i in range(len(sos)):
if i < len(sos)-1 and sos[i][5] == sos[i+1][5]:
if sos[i][2] != 0:
sim.append(sos[i][3])
else:
if sos[i][3] in sim:
sim.remove(sos[i][3])
En primer lugar, se abre un ciclo for que va a finalizar con el numero de eventos
(notas on y off) que tiene la secuencia; el propsito del primer condicional es
evaluar si las duraciones (ltima columna) anterior y posterior son iguales; los
siguientes condicionales verifican que estos valores iguales pertenezcan o no, a
una nota que se enciende con vel (columna 2) diferente de cero; entonces se
agregan el valor-nota a la lista sim si cumple la condicin.
else:
if sos[i][2] != 0:
sim.append(sos[i][3])
izq = 1
der = len(sim)-1
j = len(sim)-1
while izq <= der :
for x in range(der,izq-1,-1) :
if sim[x] < sim[x-1]:
sim[x],sim[x-1] = sim[x-1],sim[x]
j=x
izq = j+1
for x in range(izq,der+1):
if sim[x] < sim[x-1]:
sim[x],sim[x-1] = sim[x-1],sim[x]
j=x
der = j-1
aux=[]
for k in sim:
aux.append(k)
evnt.append(aux)
time.append(sos[i][5])
rtime.append(sos[i][4])
Si el evento es una nota apagada, entonces sta es quitada de la lista sim y sta
es la razn por la cual se utiliza la variable aux; luego, mientras que el nmero de
valores en la matriz sim sea diferente de cero, se van a organizar nuevamente los
elementos dentro de ella de menor a mayor y finalmente se va agregar una nueva
lista sim a la lista evnt a la que corresponder los valores de duracin asignados a
time y rtime.
'''for i in range(len(evnt)):
print rtime[i],'\t',time[i],'\t',evnt[i]#,i'''
self.evnt=evnt
self.time=time
self.rtime=rtime
Por ltimo con self se toman las matrices y los valores de duracin time y rtime
para ser usados los procesos de anlisis.
5.7.
El proceso es el siguiente:
vlnt['F']=5
vlnt['F#']=6
vlnt['Gb']=6
vlnt['G']=7
vlnt['G#']=8
vlnt['Ab']=8
vlnt['A']=9
vlnt['A#']=10
vlnt['Bb']=10
vlnt['B']=11
vlnt['Cb']=11
self.vlnt=vlnt
aquel nombre y finalmente se guarda la lista como self de nts de las notas) y el
diccionario dccnts de la siguiente forma:
nts=['C','C#','D','D#','E','F','F#','G','G#','A','A#','B']
dccnts={}
n=0
for i in range(128):
dccnts[i]=nts[n]
n+=1
if n==12:
n=0
self.nts=nts
self.dccnts=dccnts0
El prximo diccionario sirve para hallar la tonalidad mediante las notas con
nombres que tienen sostenidos, pero como una tonalidad que tiene una relativa
menor tiene el mismo nmero de alteraciones, entonces el valor devuelto a la
clave es el nombre de la tonalidad ms y su relativa menor:
dccaltr={}
dccaltr['']=['CM','Am']
#Tonalidades con Sostenidos
dccaltr['F#',]=['GM','Em']
dccaltr['F#','C#']=['DM','Bm']
dccaltr['F#','C#','G#']=['AM','F#m']
dccaltr['F#','C#','G#','D#']=['EM','C#m']
dccaltr['F#','C#','G#','D#','A#']=['BM','G#m']
dccaltr['F#','C#','G#','D#','A#','F']=['F#M','D#m']
dccaltr['F#','C#','G#','D#','A#','F','C']=['C#M','A#m']
#Tonalidades con Bemoles
dccaltr['A#',]=['FM','Dm']
dccaltr['A#','D#']=['BbM','Gm']
dccaltr['A#','D#','G#']=['EbM','Cm']
dccaltr['A#','D#','G#','C#']=['AbM','Fm']
dccaltr['A#','D#','G#','C#','F#']=['DbM','Bbm']
dccaltr['A#','D#','G#','C#','F#','B']=['GbM','Ebm']
dccaltr['A#','D#','G#','C#','F#','B','E']=['CbM','Abm']
self.dccaltr=dccaltr
dccenar={}
dccenar['BM','CbM']=['BM']
dccenar['G#m','Abm']=['G#m']
dccenar['F#M','GbM']=['F#M']
dccenar['C#M','DbM']=['C#M']
dccenar['A#m','Bbm']=['Bbm']
dccenar['D#m','Ebm']=['Ebm']
self.dccenar=dccenar
El diagrama de flujo sobre el proceso para hallar la tonalidad y que involucran los
dos tems siguientes estn dados as:
bemol cosa que en la estructura musical no es as, pero, para llegar a tener
resultados, hay que tomar esta comparacin como verdadera, un do sostenido
equivale a un re bemol y as suceder para todas las notas alteradas. Ahora
cmo saber si las alteraciones dentro de una secuencia cualquiera, son
sostenidos o bemoles?
La respuesta comienza por saber cules notas estn siendo alteradas dentro de la
secuencia y para ello es vital hacer un conteo de cada una de las notas. Ahora,
qu pasa si hay un nmero significativo para una nota como el do sostenido o re
bemol?. Como esta alteracin puede ser parte de una tonalidad con do sostenidos
o tambin puede ser parte de una tonalidad con re bemoles, entonces habr que
comparar cada una de las notas con la anterior o posterior, es decir; si do tiene el
valor 0 do sostenido es 1 y re es 2, hay que comparar 1 versus 0 y 1 versus 2 as
podr intuirse con mayor certeza a qu nota se inclina la alteracin y sta es la
base para encontrar las alteraciones analizando todas las 12 notas de 0 a 11 en
los valores MIDI. Para contarlas solo hay que tomar el valor de la nota y calcular el
mdulo 12 as se sabe rpidamente a que nota pertenece.
posibilidades no
aparece la nota a evaluar, esta nota no ser una alteracin ni una nota importante
en la secuencia MIDI.
Ms adelante despus de haberse extrado las notas que pueden ser alteradas, se
cotejan con las estructuras de bemoles y sostenidos mediante el uso de
diccionarios, entonces as se sabr con exactitud si son bemoles o sostenidos. En
seguida el problema es saber si es una tonalidad mayor o menor, entonces se
evalan las notas iniciales y finales como tambin las triadas respectivas a las
posibles tonalidades y se sabr la tonalidad a la que pertenece la secuencia;
ahora como pueden existir tonalidades enarmnicas, entonces usando como
referente El Clave Bien Temperado de Juan Sebastin Bach se deja la
enarmnica que Bach us.
La clave para encontrar la tonalidad es conocer sus alteraciones, por ello el primer
procesos es contar el nmero de veces que se repite cada nota dentro de una
secuencia:
def alteraciones(self):
dccnt={}
prm=[[0]*2,[0]*2,[0]*2,[0]*2,[0]*2,[0]*2,[0]*2,[0]*2,[0]*2,[0]*2,[0]*2,[0]*2]
nm=['C','C#','D','D#','E','F','F#','G','G#','A','A#','B']
for i in range(12):
dccnt[i]=nm[i]
for i in range(12):
prm[i][0]=nm[i]
for i in range(len(sos)):
if sos[i][3]%12==0:
prm[0][1]+=1
elif sos[i][3]%12==1:
prm[1][1]+=1
elif sos[i][3]%12==2:
prm[2][1]+=1
elif sos[i][3]%12==3:
prm[3][1]+=1
elif sos[i][3]%12==4:
prm[4][1]+=1
elif sos[i][3]%12==5:
prm[5][1]+=1
elif sos[i][3]%12==6:
prm[6][1]+=1
elif sos[i][3]%12==7:
prm[7][1]+=1
elif sos[i][3]%12==8:
prm[8][1]+=1
elif sos[i][3]%12==9:
prm[9][1]+=1
elif sos[i][3]%12==10:
prm[10][1]+=1
elif sos[i][3]%12==11:
prm[11][1]+=1
C
C#
D
D#
E
F
F#
G
G#
A
A#
B
184
0
170
156
12
174
6
148
40
108
180
6
v={}
for i in range(12):
v[i]=prm[i][1]
0
1
2
3
4
5
6
7
8
9
10
11
184
0
170
156
12
174
6
148
40
108
180
6
las siguientes
tablas:
Entonces la primera nota para analizar es fa#=6 (Sol Mayor), despus do#=1 (Re
Mayor) luego sol#=8 (La Mayor) y as analizando todas las notas que pueden ser
alteradas dentro de los sostenidos y los bemoles (sib=8 (Fa Mayor), reb=1 (Si
Bemol Mayor), lab=6 (Mi Bemol Mayor)). Para analizar cada nota hay que saber
qu nota tiene un valor de veces mayor comparando entre la nota que est atrs y
la nota que est adelante, el cdigo para desarrollar este proceso es:
dccst={}
dccst[0]=6,5,7
dccst[1]=1,0,2
dccst[2]=8,7,9
dccst[3]=3,2,4
dccst[4]=10,9,11
dccst[5]=5,4,6
dccst[6]=0,11,1
dccbe={}
dccbe[0]=10,9,11
dccbe[1]=3,2,4
dccbe[2]=8,7,9
dccbe[3]=1,0,2
dccbe[4]=6,5,7
dccbe[5]=11,10,0
dccbe[6]=4,3,5
als=[]
for i in dccst:
u=0;d=0
if v[dccst[i][0]]>v[dccst[i][1]]:
u=v[dccst[i][0]]
else:
u=v[dccst[i][1]]
if v[dccst[i][0]]>v[dccst[i][2]]:
d=v[dccst[i][0]]
else:
d=v[dccst[i][2]]
if u==v[dccst[i][0]] or d==v[dccst[i][0]]:
als.append([dccnt[dccst[i][0]],dccst[i][0]])
else:
als.append(['X','X'])
alb=[]
for i in dccbe:
u=0;d=0
if v[dccbe[i][0]]>v[dccbe[i][1]]:
u=v[dccbe[i][0]]
else:
u=v[dccbe[i][1]]
if v[dccbe[i][0]]>v[dccbe[i][2]]:
d=v[dccbe[i][0]]
else:
d=v[dccbe[i][2]]
if u==v[dccbe[i][0]] or d==v[dccbe[i][0]]:
alb.append([dccnt[dccbe[i][0]],dccbe[i][0]])
else:
alb.append(['X','X'])
Se crean dos diccionarios, las claves y valores estn organizadas de esta manera
porque el anlisis depende del orden de las armaduras desde Sol Mayor hasta
Do# Mayor para los sostenidos y desde Fa Mayor hasta Do Bemol Mayor para los
bemoles; los tres valores por cada clave corresponde a: el primer valor ser
evaluado por el siguiente y por el anterior por medio de los condicionales, ej. En
dccst[0]=6,5,7
184
0
170
156
12
174
6
148
40
108
180
195
dccst[0]=6,5,7 entonces 6<5 d=5 y 6<7 u=7,u=6 o d=6? NO, entonces als =['X', 'X']
dccst[1]=1,0,2 entonces 1<0 d=0 y 1<2 u=2,u=1 o d=1? NO, entonces als =['X', 'X'], ['X', 'X']
dccst[2]=8,7,9
dccst[3]=3,2,4
dccst[4]=10,9,11
dccst[5]=5,4,6
dccst[6]=0,11,1
dccbe[0]=10,9,11 entonces 10>9 d=10 y 10<11 u=11,u=10 o d=10? SI, entonces alb = ['A#', 10]
dccbe[1]=3,2,4 entonces 3>2 d=3 y 3<4 u=3,u=3 o d=3? SI, entonces alb = ['A#', 10], ['D#', 3]
dccbe[2]=8,7,9
dccbe[3]=1,0,2
dccbe[4]=6,5,7
dccbe[5]=11,10,0
dccbe[6]=4,3,5
als =[['X', 'X'], ['X', 'X'], ['X', 'X'], ['D#', 3], ['A#', 10], ['F', 5], ['C', 0]]
bls= [['A#', 10], ['D#', 3], ['X', 'X'], ['X', 'X'], ['X', 'X'], ['X', 'X'], ['X', 'X']]
El siguiente proceso elimina los elementos de als y alb con x y sern nombradas
con sus y fla (sustained y flat):
i=0;sus=[]
while i < 7 and als[i][0] != 'X':
sus.append(als[i][0])
i+=1
i=0;fla=[]
while i < 7 and alb[i][0] != 'X':
fla.append(alb[i][0])
i+=1
self.sus=sus
self.fla=fla
Por lo que las alteraciones dentro de la secuencia son bemoles y las notas A# y
D# es decir Bb y Eb.
5.7.3. DEFINIENDO LA TONALIDAD
Las alteraciones halladas en sus y fla son buscadas en el diccionario dccaltr como
claves y mientras contengan informacin, si ninguna de las dos tiene informacin,
se cumplir la ltima condicin, es decir que la secuencia no posee alteraciones
por lo que puede ser C Mayor o A menor. Observe que en los tres casos se
agregar informacin a la lista tn.
Por conveniencia se crea la lista psb donde se separan los caracteres de los
nombres de las tonalidades, si el nombre de la escala no tiene ninguna alteracin
se le agrega n indicando que es natural:
psb=[]
for j in range(len(tn)):
for i in tn[j]:
if len(i)==3:
psb.append([i[0],i[1],i[2]])
else:
psb.append([i[0],'n',i[1]])
Por ejemplo:
tn [['BbM', 'Gm']]
psb [['B', 'b', 'M'], ['G', 'n', 'm']]
Luego se agrega una nueva lista a la lista tri con valores [0,0,0]; entonces se
revisa si en la primera nota de la secuencia se halla alguna de las notas le la
primera lista de tri y mientras se cumpla la condicin ser agregada en la segunda
lista de tri. En el siguiente ciclo se revisa si existen estas notas en la ltima nota de
la secuencia; y lo mismo va a suceder para la tonalidad menor despus del
siguiente else (si tp es menor). Estos datos son almacenados en resul.
tri=[]
if tp=='M':
tri.append([vlnt[tk],(vlnt[tk]+4)%12,(vlnt[tk]+3)%12])
tri.append([0,0,0])
for j in evnt[0]:
if j%12==vlnt[tk]:
tri[1][0]+=1
elif j%12==(vlnt[tk]+4)%12:
tri[1][1]+=1
elif j%12==(vlnt[tk]+3)%12:
tri[1][2]+=1
for j in evnt[len(evnt)-1]:
if j%12==vlnt[tk]:
tri[1][0]+=1
elif j%12==(vlnt[tk]+4)%12:
tri[1][1]+=1
elif j%12==(vlnt[tk]+3)%12:
tri[1][2]+=1
else:
tri.append([vlnt[tk]%12,(vlnt[tk]+3)%12,(vlnt[tk]+4)%12])
tri.append([0,0,0])
for j in evnt[0]:
if j%12==vlnt[tk]:
tri[1][0]+=1
elif j%12==(vlnt[tk]+3)%12:
tri[1][1]+=1
elif j%12==(vlnt[tk]+4)%12:
tri[1][2]+=1
for j in evnt[len(evnt)-1]:
if j%12==vlnt[tk]:
tri[1][0]+=1
elif j%12==(vlnt[tk]+3)%12:
tri[1][1]+=1
elif j%12==(vlnt[tk]+4)%12:
tri[1][2]+=1
resul.append(tri)
El siguiente paso es ordenar las listas dentro de tonal de mayor a menor dejando
la que tiene el mayor nmero triadas al inicio y la que tiene menor nmero al final.
intercambios=1
pasada=1
while pasada<len(tonal) and intercambios==1:
intercambios=0
for i in range(0,len(tonal)-pasada):
if tonal[i][1] < tonal[i+1][1]:
tonal[i], tonal[i+1] = tonal[i+1], tonal[i]
intercambios=1
pasada += 1
Por ejemplo:
psb [['B', 'b', 'M'], ['G', 'n', 'm']]
tonal [[10, 3], [7, 3]]
vlnt[TN],tonal[0][0] 10 = 10
TN,TI,EN Bb M ['BbM']
LA
self.TON=TON
Por ltimo se guarda TON con Self para ser usado en las siguientes funciones.
5.7.4. USO DE LA TONALIDAD
En esta funcin se van a crear pequeos programas para usar la tonalidad hallada
y as analizar la secuencia MIDI de acuerdo a sta, el proceso es el siguiente:
def TONalidad(self):
ton=self.TON
vlnt=self.vlnt
dccnts=self.dccnts
nt='';al='';ti=''
if len(ton)==3:
nt=ton[0];al=ton[1];ti=ton[2]
else:
nt=ton[0];al='n';ti=ton[1]
Ahora se crea una lista tone con las notas que debe haber para la tonalidad
encontrada de esta manera:
ton=['BbM']
nt,al,ti B b M
tone = [['B'], ['C'], ['D'], ['E'], ['F'], ['G'], ['A'], ['B']] y se guarda nt+al+ti en self.TONN.
El siguiente cdigo sirve para crear un diccionario llamado auxton que contiene los
grados de la tonalidad:
auxton={}
grad=['I','II','III','IV','V','VI','VII']
for i in range(7):
#print tone[i][0],vlnt[tone[i][0]],grad[i]
auxton[vlnt[tone[i][0]]]=tone[i][0],grad[i]
self.auxton=auxton
Ejemplo de auxton:
('C', 'II') 0
('D', 'III') 2
('Eb', 'IV') 3
('F', 'V') 5
('G', 'VI') 7
('A', 'VII') 9
('Bb', 'I') 10
La programacin es la siguiente:
def armonia(self):
dccnts=self.dccnts
ti=self.ti
dccvlton=self.dccvlton
auxton=self.auxton
tone=self.tone
#print tone
vlnt=self.vlnt
trM=[[4,3],[3,4],[3,4],[4,3],[4,3],[3,4],[3,3]]
trm=[[3,4],[3,3],[4,3],[3,4],[4,3],[4,3],[3,3]]
grad=['1','2','3','4','5','6','7']
CA={};FA1={}
for i in range(7):
FA1[vlnt[tone[i][0]]%12]=grad[i]
if ti=='M':
CA[(vlnt[tone[i][0]])%12,(vlnt[tone[i][0]]+trM[i][0])%12,(vlnt[tone[i][0]]
+trM[i][0]+trM[i][1])%12]=grad[i]
elif ti=='m':
CA[(vlnt[tone[i][0]])%12,(vlnt[tone[i][0]]+trM[i][0])%12,(vlnt[tone[i][0]]
+trM[i][0]+trM[i][1])%12]=grad[i]
A continuacin:
modnt=[];fnarm=[]
for i in evnt:
comp2=[]
for j in i:
comp2.append(j%12)
nn=list(comp2)
En ste punto del cdigo se toma lista por lista de la matriz evnt y a cada valor de
nota se le calcul el mdulo 12, luego se guarda la lista en nn como una lista.
if len(nn)==1 and nn[0] in FA1:
modnt.append(nn)
fnarm.append(['m',FA1[nn[0]]])
elif len(nn)==1:
modnt.append(nn)
fnarm.append([])
elif len(nn)>1:
io=0
for k in range(len(nn)):
comp=[]
for l in range(k,len(nn)+k):
comp.append(nn[l%len(nn)])
if tuple(comp) in CA:
modnt.append(comp)
fnarm.append(['p',CA[tuple(comp)]])
io=1
if io==0:
modnt.append(comp)
fnarm.append([])
self.modnt=modnt
self.fnarm=fnarm
Entonces se compara los valores de la lista nn: si nn es slo un valor y este valor
pertenece a una del las notas en FA1 entonces se almacena en modnt y fnarm, si
el valor es nuevamente uno solo pero no pertenece a FA1 entonces no se guarda
nada en fnarm. En el ltimo si nn es mayor a uno, se crean todas las
confinaciones posibles en los acordes con el fin de verificar si alguna combinacin
le pertenece a CA, que en dado caso ser parte de las funciones armnicas y ser
guardado nuevamente en las listas modnt y Fnarm que sern tiles ms adelante.
Como Qlist recibe un archivo de texto con instrucciones, entonces hay que crear
las instrucciones necesarias para cubrir todos los parmetros audibles y de video,
por ello hay que crear una lista (matriz) en Python para cada aspecto; la primera
orden que precede a la primera lista puede ser la tonalidad definida como mayor o
menor, luego la lista de rdenes a tener en cuenta es aquella que ser necesaria
para ser comunicada la informacin MIDI hacia la salida de Pure Data esperando
para ser recibida por un sintetizador o un sampling, teniendo en cuenta el tempo y
sus cambios eventuales. La siguiente lista debe estar relacionada con el
movimiento de la animacin donde cada valor de nota representa una posicin y
desplazamiento, una parte muy importante de esta lista es asignar una posicin
para cada una de las notas que estn siendo activadas simultneamente; as
De acuerdo al protocolo Qlist de Pure Data, esta funcin va a crear una lista con
rdenes para que Pure Data las entienda y es con la que va a funcionar como
secuenciador de eventos MIDI y a su vez va a dar rdenes a GEM para que acte
la animacin; se van a crear paquetes de informacin con ordenes por tipo, as
ser ms fcil poder generar organizadamente la lista de rdenes. Esta funcin va
a tener varias etapas de la siguiente manera:
El primer paso es crear un archivo que va a leer Pure Data llamado pypd:
def Ordenes(self):
pev = open('pypd', 'w')
pev.write('')
pev.close()
Ahora se va a crear una variable llamada Tln en donde se guardar el valor a que
la tonalidad (self.TONN) pertenece:
Tnl=0;Mm=0
if self.TONN in ToneM:
Tnl=ToneM[self.TONN]
Mm=0
elif self.TONN in Tonem:
Tnl=Tonem[self.TONN]
Mm=1
else:
Tnl=2
Mm=0
Ejemplo:
self.TONN,Tnl,MmBbM 4 0
Para la siguiente etapa, se va a generar un valor que ser el valor de color para
cada nota; la lista clnot va a guardar dos valores, el primer valor es cero y el
segundo, el valor de la tonalidad de la siguiente manera:
clnot=[]
if self.TONN[1:2]=='n' and self.TONN[:1] in self.vlnt:
clnot.append([0,self.vlnt[self.TONN[:1]]])
elif self.TONN[1:2]!='n' and self.TONN[:2] in self.vlnt:
clnot.append([0,self.vlnt[self.TONN[:2]]])
else:
print 'error en self.TONN[x:x]'
Ejemplo:
self.TONN,Tnl,MmBbM 4 0
clnot [[0, 10]]
Bb Eb Ab C#
F#
10
11
600
650
700
750
800
850
900
Ilustracin 14: Tabla con los valores de nota y valores de color para cada tonalidad
Lton=[2,7,0,5,10,3,8,1,6,11,4,9]
colorTN={};con=600
for i in range(12):
colorTN[Lton[i]]=con
con+=50
CN=clnot[0][1]
global COLORNOTA
COLORNOTA=colorTN[CN]
print 'El Color de la Tonalidad es',COLORNOTA;print
Ejemplo:
clnot [[0, 10]]
El Color de la Tonalidad es 800
Cada tonalidad tendr una paleta de colores y su nota cero (nota de la tonalidad)
es la que se ha encontrado con el diccionario colorTN[CN], la siguiente tabla es un
ejemplo para la tonalidad de Re Mayor:
Consonancias perfectas
Consonancias imperfectas
F#
A#
Disonancias absolutas
Smicns
G#
C#
D#
10
11
8,33
16,7
25
33,3
41,7
50
150
175
200
225
250
600
592
583
575
567
558
550
450
425
400
375
350
Ilustracin 15: Tabla de ejemplificacin de paleta con colores creados para la tonalidad de Re (mayor o menor)
La programacin es la siguiente:
con=clnot[0][1]
for i in range(11):
clnot.append([i+1,con+i+1])
for i in range(len(clnot)):
clnot[i].append(clnot[i][1]%12)
En este momento se crea una tabla que consta de tres columnas: La primera de 0
a 11 la segunda toma el valor de la nota de la tonalidad y se le suma 10 valores
ms y la tercera son estos valores calculados con el modulo 12.
Ejemplo:
Tonalidad DM
El Color de la Tonalidad es 600
clnot[0][1] = 2
clnot
[0, 2, 2]
[1, 3, 3]
[2, 4, 4]
[3, 5, 5]
[4, 6, 6]
[5, 7, 7]
[6, 8, 8]
[7, 9, 9]
[8, 10, 10]
[9, 11, 11]
[10, 12, 0]
[11, 13, 1]
El siguiente paso es crear una lista con los valores de los intervalos Lton y con
ayuda de la lista anterior clnot se establecen las relaciones para el color as:
De intervalos
colorNot={}
RLCNINTV={}
Lton=[0,5,7,4,8,3,9,6,10,2,11,1]
ivtest=Lton
con1=colorTN[clnot[0][1]]
con2=colorTN[clnot[0][1]]-150
rcon1=0
rcon2=150
for i in range(12):
if i <=6:
colorNot[(Lton[i]+CN)%12]=con1
RLCNINTV[Lton[i]]=rcon1
con1-=(50/6)
rcon1+=(50/6)
else:
colorNot[(Lton[i]+CN)%12]=con2
RLCNINTV[Lton[i]]=rcon2
con2-=25
rcon2+=25
2
3
4
5
6
7
8
9
10
11
0
1
600
350
400
560
576
592
450
584
568
552
425
375
0
250
200
40
24
8
150
16
32
48
175
225
Ahora ya que se tiene un diccionario (colorNot) con el valor de color para cada
nota; entonces se va asignar dicho valor a todas las notas encendidas de la
secuencia; ac se crear el primer paquete de informacin respecto al color:
pclax=[]
PNOT=0
for i in evnt:
aux=[]
for j in range(len(i)):
if j==0:
PNOT=colorNot[i[j]%12]
aux.append(colorNot[i[j]%12])
if j<len(i)-1:
aux.append((PNOT+RLCNINTV[(i[j+1]-i[j])%12]))
PNOT=PNOT+RLCNINTV[(i[j+1]-i[j])%12]
pclax.append(aux)#
La lista pclax va a contener los valores de color, se toma la lista evnt as como
tambin cada lista que puede estar dentro de s misma y por esto se usan dos
siclos for; a cada valor de nota se le calcula el mdulo 12 e inmediatamente se
ingresa como clave en el diccionario colorNot para saber su valor de color que es
aadindolo en la lista pclax que ser usada ms adelante.
FM=[0,1,1,0,0,1,2]
Fm=[1,2,0,1,0,0,2]
pfaaux=[]
for i in self.fnarm:
if len(i)!=0 and i[0]=='p':
if Mm==0:
pfaaux.append([i[0],colorTN[(notax[i[1]]+clnot[0][1])%12],F
M[int(i[1])-1]])
elif Mm==1:
pfaaux.append([i[0],colorTN[(notax[i[1]]+clnot[0][1])%12],F
m[int(i[1])-1]])
elif len(i)!=0 and i[0]=='m':
if Mm==0:
pfaaux.append([i[0],colorTN[(notax[i[1]]+clnot[0][1])%12],F
M[int(i[1])-1]])
elif Mm==1:
pfaaux.append([i[0],colorTN[(notax[i[1]]+clnot[0][1])%12],F
m[int(i[1])-1]])
else:
pfaaux.append([])
j=0
t=0
for i in range(len(sos)):
prt.append([sos[i][1],sos[i][2],sos[i][3]])# pd ch,vel,not
pdr.append(sos[i][4])# duraciones
pvl.append(sos[i][2])# vel sin ceros
if sos[i][5]==time[j]:
pol.append(evnt[j])#notas polifonicas en la duracin time
pcl.append(pclax[j])#color notas polifonicas
pfa.append(pfaaux[j])#color funciones armonicas
if t<len(tmp) and tmp[t][1]==time[j]:
ptm.append([tmp[t][0]])
t+=1
elif i>0 and j>0 and t<len(tmp) and tmp[t][1]<time[j] and
tmp[t][1]<time[j-1]:#cuadra cambios de tempo
ptm.append([tmp[t][0]])
t+=1
else:
ptm.append([])#cuadra cambios de tempo
if j<len(time)-1:
j+=1
else:
pol.append([])
ptm.append([])
pcl.append([])
pfa.append([])
if len(ptm[i]) != 0:
pev.write (str('tmp %s; ' % (ptm[i][0])))#'''
En seguida los eventos como canal ch, velocidad vel y el valor de la nota note
desacuerdo al protocolo de Pure Data:
pev.write (str('ch %s; vel %s; note %s;' % (prt[i][0],prt[i][1],prt[i][2])))
Se agregan las velocidades de nota diferente de cero vlz, por ello el condicional:
if pvl[i] != 0:
pev.write (str(' vlz %s;' % (pvl[i])))#'''
Ahora el color de las notas simultaneas sim, en donde hay que usar un ciclo para
aquellas notas mayores a una nota:
if len(pol[i]) != 0:
for j in range(len(pol[i])):
pev.write (str(' sim%s %s;' % (j,pol[i][j])))#'''
As mismo como se hizo anteriormente pero con el color de las notas simultaneas
clr, en donde hay que usar un ciclo para aquellas notas mayores a una nota:
if len(pcl[i]) != 0:
for j in range(len(pcl[i])):
pev.write (str(' clr%s %s;' % (j,pcl[i][j])))#'''
Los siguientes son los valores de color dependiendo de si son para tonalidades
Mayores faclm y o tonalidades menores faclp en relacin a las funciones
armnicas:
if len(pfa[i]) != 0 and pfa[i][0] == 'm':
pev.write (str('faclm %s; fadom %s;' % (pfa[i][1],pfa[i][2])))#'''
if len(pfa[i]) != 0 and pfa[i][0] == 'p':
pev.write (str('faclp %s; fadop %s;' % (pfa[i][1],pfa[i][2])))#'''
Por ltimo las duraciones para cada fila de eventos aadiendo un salto de lnea:
pev.write (str(' %s' % (pdr[i]))) #'''
pev.write('\n')
pev.close()
5.8.
5.9.
El programa en Pure Data est destinado a leer con Qlist la lista de ordenes pypd,
tambin va a enviar la informacin MIDI a un sintetizador y mediante la aplicacin
GEM se programar la animacin que despus ser controlada por la lectura de
Qlist extrada del la informacin del archivo pypd. Todos estos procesos sern
programados y ordenados dependiendo de su funcionalidad.
El objeto Qlist puede ser usado para leer mensajes ordenados con diferentes
duraciones cronolgicamente, estos mensajes son enviados a Objetos receive
que deben ser nombrados con unas variables; el mensaje con el nombre read
pypd toma el archivo guardando en la misma carpeta que se encuentra la orden
Qlist del archivo programado de Pure Data PyPdGem.pd, el activador o pulsador
es el botn (bang) verde que a su vez activa tambin al mensaje rewind, bang
ejecutando a Qlist, entonces va a leer los eventos lnea a lnea dependiendo de la
duracin; otro elemento importante es el mensaje tempo, bang que va a recibir
valores una vez ejecutado Qlist y que cambiar el tempo de acuerdo a los masajes
en la lista, si no existiera el mensaje tempo, Qlis toma el tempo a 1 segundo por
pulso = 120 tempo musical. Si se est ejecutando una lista de mensajes en Qlist y
se le da la orden de que ejecute otra lista, Qlist detiene el proceso que tena y
pone en marcha la nueva orden; existen varios archivos que se van a reproducir
como el archivo offall cuyo contenido son todas las notas de 0 a 127 con vel=0 y
con esto se desactivan todas las notas parando la ejecucin de Qlist; as mismo
hay otros archivos que pueden ser ejecutados por Qlist como los test 1,2,3,4; cuyo
mensaje Ntese que hay un objeto con el nombre de r nev ste objeto va indicar
el evento que est ejecutando.
Este programa tambin posee unos objetos con el nombre de pd OSC de 2-7, su
programacin est dada as:
Ilustracin 19: Estructura para la llegada de mensajes por el por protocolo OSC
EL objeto import mrpeach importa las libreras de Pure Data, el objeto udpreceive
9002 es el que contiene el nmero de canal por el cual va a entrar la informacin,
el objeto unpackOSC decodifica la informacin entrante y el objeto routeOSC
/print, recibe la informacin que lleva la variable /print. Entonces de esta manera
Pure Data recibe las rdenes que sern enviadas desde Python. Los botones de
colores en la parte superior bang reciben la informacin mediante OSC por
diferentes canales (de 9001 9007) enviando la seal de pulsado, estos a su vez
enva la orden de pulsado por medio de send a un botn receive con el mismo
color que recibir la informacin y ejecutar la orden a Qlist; send y receive son
propiedades que tienen los objetos pulsadores bang.
El programa en Pure Data est destinado a leer con Qlist la lista de ordenes pypd,
tambin va a enviar la informacin MIDI a un sintetizador y mediante la aplicacin
GEM se programar la animacin que despus ser controlada por la lectura de
Qlist extrada del la informacin del archivo pypd. Todos estos procesos sern
programados y ordenados dependiendo de su funcionalidad.
Los mensajes ledos por Qlist son enviados como mensajes send, por ello para
recibirlos se antepone en la escritura de los objetos la variable con la letra r (r ch,
r vel, r note); El objeto noteout es el programa que se encarga de traducir los
valores en informaciones MIDI envindolos al dispositivo MIDI (sintetizador,
sampling, etc.). De la misma manera sucede para la informacin MIDI de entrada
Ilustracin 21: Estructura del programa para la creacin de la ventana de animacin GEM
El primer objeto es la cabeza gemhead que al ser unido con el objeto curve3d
crean la curva (plano); despus de la cabeza se le une a la propiedad de
translacin (en los ejes x, y, z), y ms adelante la propiedad de rotacin (para los
ejes, x, y, z), finalmente se le aade el objeto de color, al que le se asignan los
valores RGB. Hay un objeto receive con el nombre de r curve3d, este objeto es
el puerto de llegada para propiedades como draw con propiedades como fill poin
line y la grilla grid cuya definicin podr ir variando. Por ltimo hay un objeto res
con la propiedad resolucin fija de 5 por 5.
El ltimo objeto creado es pd MatrizPlano que contiene la programacin para la
posicin de cada uno de los puntos de la curva en los ejes x, y, z de la siguiente
manera:
Ilustracin 26: Estructura de programacin para controlar en una grilla de 5x5 en los 3 ejes del plano
Luego para tener un control ms preciso sobre los ejes del plano se usan variables
de nmero con el cual pueda editar los ejes de la grilla como filas y columnas
adems del eje de profundidad. Finalmente los valores constantes son valores que
se activan una vez inicia la animacin y son aquellos los que le dan la forma
simulando un escenario.
Ilustracin 28: Propuesta de color para cada tonalidad del seor Llus Pujals i Carretero
Los colores basados en esta figura, sern aproximados a valores RGB con el fin
de facilitar la utilizacin de la programacin del color; los colores aproximados son
representados por sus correspondientes letras as:
C
G
Bb
Ab
Eb
B
C#
F#
Para facilitar el uso del color RGB en Pure Data se crea un sistema que relaciona
valores sencillos con la combinacin de los 3 valores RGB, por ejemplo el rojo que
equivaldra en RGB a 255-0-0, ser igual a el valor 0; el amarillo que en RGB es
255-128-0, equivale a 100 y el verde que es 0-255-0 ser igual a 200; es decir que
la relacin entre los colores de todas las tonalidades varan de 50 en 50. Como se
van a realizar operaciones matemticas con sustracciones, entonces para facilitar
42
Llus Pujals i Carretero: Las notas musicales y sus colores [en lnea]. <
http://www.lluispujals.com/escucha_la_musica_disfruta_de_sus_colores_013.htm > [citado en 02-05-2011]
el manejo de estos valores, el programa que relaciona RGB con los valores se
extiende de 0 a 1200 repitindose la gama de colores a partir del 600.
Bb Eb Ab C#
F#
11
10
600
650
700
750
800
850
900
Ilustracin 30: Tabla que relaciones colores, tonalidades valor de nota y valor de color correspondiente
Ahora, cada tonalidad tendr una paleta de colores creada a partir de una tabla de
intervalos desde los ms consonantes hasta los ms disonantes donde la
consonancia est representada por los colores adyacentes y la disonancia por
colores contrastes; En seguida una tabla de referencia para ubicar los colores
primarios (P) segundarios (S) y terciarios (T).
Ilustracin 31: 18: Referencia de colores primarios (P) segundarios (S) y terciarios (T).
Consonancias perfectas
Consonancias imperfectas
Disonancias absolutas
Smicns
F#
A#
G#
C#
D#
10
11
8,33
16,7
25
33,3
41,7
50
150
175
200
225
250
600
592
583
575
567
558
550
450
425
400
375
350
Ilustracin 32: Tabla de ejemplificacin de paleta con colores creados para la tonalidad de Re (mayor o menor)
Consonancias imperfectas
Smicns
Disonancias absolutas
10
11
4J
5J
3M 6m 3m 6M
4A
7m 2M 7M 2m
3A
6d
4d
5d
6A
5A
2A
7d
3d
Ilustracin 33: Tabla de intervalos del ms consonante al ms disonante relacionado al nmero de semitonos y sus
posibles nombres correspondientes
Tabla de referencia.
43
II
III
IV
VI
VII
2m 2M
3d
4
5
6
7
10
11
12
7m 7M
7A
2A
3m 3M
3A
4d
4J
4A
5d
5J
5A
6d
6m 6M
7d
6A
Al haber creado esta relacin de color se puede creer que ya est resuelta pero
an no logra resolver el estado de color para varias notas simultneas; es decir la
intencin de representar las notas consonantes o disonantes con colores
adyacentes o contrastes, an no se logra porque la nota solo dependera de la
escala de colores, es decir que si la tonalidad de Do mayor, se activa la nota C-FG, la relacin visual de color entre C y F es congruente, entre C y G es congruente
pero entre F y G no lo es porque de acuerdo a la tabla anterior las notas C-F-G
tiene colores adyacentes, pero F y G son notas disonantes con un intervalo de
segunda mayor igual a 2 semitonos; entonces se plantea la posibilidad de asignar
un color a la primera nota, es decir que si existe una meloda, est va a tener los
colores de la paleta mencionada, pero si existen ms de una nota, el color de la
segunda nota depender del intervalo, entonces la primera nota tiene un valor
correspondiente a la paleta de colores por tonalidad y para la segunda nota se
calcula el intervalo y dependiendo de est (consonante o disonante), asignar un
valor de color (adyacente o contraste); si existe una tercera nota, se calcula el
intervalo entre la segunda y la tercera y se asigna un color y as se resuelve la
visualizacin para la consonancia o disonancia de las notas.
luz con el color de las esferas el resultado queda combinado, por ello hay que
tener cuidado en no variar demasiado el color de las esferas.
Alguna de las luces pueden iluminar con luz blanca las esferas para que stas no
pierdan su color original, otras luces pueden ser proyectadas en la pared del
escenario con colores relacionados a el anlisis que se hizo para los grados de las
escalas y las triadas, encontradas en la secuencia. Entonces el producto final de
color ir alrededor de la paleta de colores de acuerdo con la tonalidad, logrando
experimentar matices que dependern de la estructura musical.
La cabeza como todo objeto a ser construido debe ir conectado a la funcin que
es el elemento a graficar, en este caso se llama spot_light, que es un elemento al
que se le pueden asignar varias propiedades como la rotacin rotateXYZ -120 120 -120 y la propiedad de translacin translateXYZ 0 0 0; se le aade tambin
un elemento llamado debug $1 til para visualizar la luz en el espacio de la
animacin, adicionalmente a la cabeza existen dos puertos de entrada en
spot_light tiles para asignarle el color RGB y el siguiente que contiene tres
valores, la intensidad de la luz, el degradado sobre las paredes y cono de ngulo
Ilustracin 36: Estructura para el control de color y movimiento de rotacin y traslacin para las luces
Ilustracin 38: Estructura programa para traducir 3 variables RGB en un solo control, programa que oxida y
degrada el color
Su funcin es tomar un valor que puede variar desde 0 hasta 1200 y transformarlo
en 3 valores RGB (255 255 255) que varan a su vez de 0 a 255 y definen el color
para ser enviados al objeto luz spot_light; la idea es que al desplazar la barra en
Hslider el color vaya en gamas pasando desde los rojos hasta los violetas. Esta
estructura comienza con obtener un valor (0-1200) luego entra nuevamente a un
subprograma llamado pd RGB_linea as:
Ilustracin 39: Estructura Sub programa para toma un valor de entrada y traducirlo en tres valores para RGB
Al tomar el valor mediante condicionales verifica que el valor est dentro de los
rangos 0-100-200-3001200 y dependiendo de ste incrementa o decremento el
valores de 0 a 100, en seguida mediante una relacin los valores se traducen en
los 3 valores RGB de 0 a 255. En el siguiente ejemplo se puede ver como las 3
barras (Vslider) cambian a medida que vara el valor numrico debajo de Hslider
(tenga en cuenta que el valor que se va variando es el objeto nmero de 50 en 50
que se encuentra debajo de Hslider)
Ilustracin 40: Ejemplo de gamas de color respecto al programa de transformacin en colores RGB
Al tomar el valor 600 llega de nuevo al color rojo y comienza de nuevo la gama
hasta llegar al valor 1200; estos valores se distribuyeron de 100 en 100 para
facilitar su uso y crear la paleta de colores a partir de valores diseados en la
funcin de Ordenes por medio de la tabla que distingue intervalos desde los
consonantes hasta los ms disonantes.
Retomando la estructura que controla las propiedades del color, la segunda barra
Vslider, es la que degrada el color o lo oxida, su rango est entre -255 y 255 y lo
que hace esta variable dentro del programa pd COLOR es sumar el valor por un
factor agregndoles o sustrayndoles el mismo valor a todos los valores RGB
ejemplo:
Ilustracin 41: Estructura detalle del programa para oxidar y degradar el color
Tenga en cuenta las barras ubicacin de las barras Vslider que representan a
RGB respecto a la barra Vslider que oxida o degrada el color.
Para cada uno de los grupos hay un pulsador que activa valores preestablecidos
para la ejecucin de la animacin organizando a cada una de las luces en sus
propiedades de inicio.
Ilustracin 45: Ejemplo del control de: radiacin, rotacin y traslacin de la luz
Ilustracin 47: Ejemplo de todas las luces en conjunto con la propiedad debug activada
Para una de las luces centrales se utiliz una variable con el contenido de la
velocidad de nota logrando proyectarse como ms intensa o ms suave
hacindose ms evidente la fuerza con que se activan las notas de la siguiente
manera:
Ilustracin 48: Estructura y sub-estructura del programa para la orden de velocidad en nota traducida en
intensidad de luz
500 unido a un line que retarda la intensidad de la luz desde su posicin inicial
hasta la posicin final haciendo mucho ms agradable y entendible el concepto de
fuerza en la secuencia.
un valor diseado para posicionar las esferas a una determinada altura, y hay dos
programas por cada conjunto; uno donde se programa cada grupo de esferas pd
Esfera, y el otro un programa de control para manipular las propiedades de las
mismas pd Control.
El primer programa pd apaga para prender o apagar un grupo de esferas est
dado por la siguiente estructura:
Ilustracin 62: Programa general para la ejecucin de la animacin a partir de una entrada en tiempo real
El programa pd POLY toma los valores de llegada del controlador con el objeto
notein luego pasa esta informacin al objeto llamado chord 128, donde 128
significa que el rango a tomar es de 0-127 y mediante el objeto unpack f f f f f f
divide los valores de las notas que se estn presionando simultneamente, as se
pueden obtener las notas simultaneas independientes. Luego se envan estos
valores mediante send para ser recibidos por las esferas como s sim0 hasta s
sim5.
Ms adelante luego de tener el valor de las notas, hay que asignarle un valor de
color a cada una de ellas de una manera similar como la programacin hecha en
Python; para ello existen los programas llamados pd COLOR el primer programa
asigna un valor de color a la primera nota relacionndolo con la tonalidad que se
haya elegido as:
Ilustracin 64: Estructura que recibe un valor de nota y genera un valor para el color
Este programa posee un subprograma que toma el valor, y toma el resultado del
mdulo 12 entonces mediante la relacion que se estableci en la funcin rdenes,
se crea una paleta de colores con la que se asigna un valor de color a cada una
de las primeras notas tocadas de la siguiente manera:
Ilustracin 65: Estructura que identifica una nota y genera un valor de color
Ilustracin 66: Programa que identifica el intervalo a partir de la primera y genera un valor de color para la
segunda nota
Ilustracin 67: Ilustracin 56: Programa que toma el valor de la segunda nota y asigna un valor de color
Ilustracin 68: Estructura que toma los valores de velocidad de nota diferentes a cero
5.9.8. MONITOR
El ltimo programa pd MONITOR es una de ayuda para visualizar las variables
que est recibiendo Qlist de la lista as como tambin los valores recibidos por el
controlador y la interfaz grfica:
Ilustracin 69: Programa para visualizar los eventos recibidos desde la lista de ordenes o el controlador MIDI
El mtodo en que se quiere dar a mostrar la interfaz consiste en crear los botones
a partir de la activacin de ellos mismos, es decir; que la interfaz arranca con un
botn y al presionar ste aparecer nuevos botones y opciones guiando al usuario
en el uso de la interfaz de principio a fin.
5.10.1.
ESTRUCTURA DE LA INTERFAZ
def MG(self):
def auxabrirpd(self):
def abrirpd(self):
def auxventana(self):
def ventana(self):
def test1(self):
def test2(self):
def test3(self):
def test4(self):
def auxplaystop(self):
def Play(self, event):
def Stop(self, event):
def salir(self):
root = Tk()
Interfaz = Interfaz(root)
root.mainloop()
Dentro de esta estructura se encontrar la programacin de los botones, la
manipulacin de algunas operaciones como las ubicaciones dentro de Windows 7,
abrir un archivo de Pure Data desde Python, mover o copiar archivos entre
directorios, comunicacin mediante el protocolo OSC, etc. Todo esto enmarcado
nuevamente dentro de la programacin orientada a objetos.
5.10.2.
INICIANDO EL PROGRAMA
Al inicio se usa el encoding: utf-8 para poder utilizar caracteres como tildes o ees
aunque se busc escribir el cdigo sin este tipo de caracteres para no toparnos
con problemas al compilar, sin embargo se usa para prevenir la utilizacin de
variables que tengan dichos caracteres y que sea inevitable eliminar como por
ejemplo caracteres dentro de los eventos de la informacin MIDI, import os y
import sutil, son unas libreras que sirven para comunicarnos con el sistema
operativo y poder manipular archivos, DirP=str((os.getcwd())) guarda en una
variable el directorio donde se est trabajando la programacin, from Tkinter
import *, y from tkFileDialog import askopenfilename, son libreras importantes
para el uso de tkinter; a continuacin se crea la clase, class Interfaz donde se
desarrollarn las funciones del programa y finalmente se utiliza root = Tk(), Interfaz
5.10.3.
El cdigo es el siguiente:
def __init__(self, master):
global ioSLCTON;ioSLCTON=0
self.DirP=DirP
self.io1=1;self.io2=1;self.io3=1;self.io4=1;self.io5=1;self.io6=1;self.io7=1
self.frame = Frame(root, width=300, height=200, bg=#FFFFFF)
self.frame.pack()
self.titulo = Button(self.frame, text='((( MUSIC ))) ((( GARDEN )))', fg=white,
background=black, width=30, command=self.Inicio)
self.titulo.config(bg='black', fg='#FFFF00', bd=10, font=('Tempus Sans ITC', 20,
'bold'));self.titulo.pack(side=LEFT, padx=5, pady=5)
La primera parte inicia como global la variable ioSLCTON que servir como un
conmutador ms adelante, luego otros conmutadores sern nombrados como
selft.io(n) que tambin sern usados como conmutadores. Ac se crea la
Sans
ITC',
20,
'bold')
la
fuente
de
la
letra
5.10.4.
LA FUNCIN INICIO
Al crear botones dentro de las funcione se puede lograr que a medida que se
vayan presionando los botones vayan apareciendo nuevos botones, por eso con el
botn de la funcin anterior se crea un nuevo botn.
Ilustracin 72: Botones de abrir archivo MIDI y ttulo antes de ser importado el archivo
width=0,
font=('Tempus
command=self.buscar).pack(side=LEFT,
command=self.buscar);self.bmidi.pack()
Sans
padx=0,
ITC',10,
'bold'),
pady=0)#,
Sans
5.10.5.
LA FUNCIN BUSCAR
Al activar el botn de abrir archivo MIDI aparecer una ventana de Windows con la
cual se podr buscar un archivo dentro de los directorios que tenga el computador,
una vez encontrado en donde apareca el texto Nombre del Archivo MIDI
aparecer el nombre del archivo seleccionado y arrancar una nueva funcin que
contiene nuevos botones.
ioSLCTON=0
os.chdir(str(DirP[:-9])) #Directorio
self.DirM=str(askopenfilename()) #Directorio del archivo MIDI
self.nmid=''
for i in self.DirM:
self.nmid+=i
if i == '/':
self.nmid=''
Ilustracin 73: Ventana emergente al activar el botn para abrir un archivo MIDI
auxP=''
for i in range(len(destinationFile)):
if i>2 and destinationFile[i] != '/' and destinationFile[i] != '\\':
auxP+=destinationFile[i]
Ahora, como el nombre de los archivos puede venir con formas diferentes de
escritura, por ejemplo sourceFile = H:/((MG))/crom.mid y destinationFile =
h:\((MG))\Interfaz el siguiente proceso prepara los nombres de las variables
mediante auxM y auxP as:
sourceFile H:/((MG))/crom.mid
destinationFile h:\((MG))\Interfaz
auxM ((MG))crom.mid
auxP ((MG))Interfaz
Como la extensin del formato midi puede variar escribindose como *.midi, *.mid,
*.Midi, *.Mid, *.MIDI, *.MID etc. entonces se decide dejar todos los archivos midi
con una misma extensin, por ello con el siguiente cdigo se transforman los
caracteres en maysculas por minsculas guardado en la variable aux y ms
adelante se modifica de nuevo.
auxP+=self.nmid
auxL={}
auxL['M'],auxL['I'],auxL['D']='m','i','d'
con=len(self.nmid)-1
aux=''
while self.nmid[con]!='.':
if self.nmid[con] in auxL:
aux=str(auxL[self.nmid[con]])+aux
else:
aux=str(self.nmid[con])+aux
con-=1
'SE
HA
COPIADO
EL
MIDI','<<',self.nmid,'>>','\nEN
DIRECTORIO',destinationFile;print
self.narch['text']=self.nmid
self.auxslcton()
if auxM == auxP:
if aux=='mid' or aux=='midi':
print;print 'ARCHIVO NO COPIADO';print
print 'EL ARCHIVO','<<',self.nmid,'>>','YA EXISTE'
self.narch['text']=self.nmid
##self.axMG()
self.auxslcton()
os.chdir(str(DirP[:-9])+'\\Interfaz') #Directorio
ARCHIVO
EL
5.10.6.
LA FUNCIN AUXSLCTON
El cdigo es el siguiente:
def auxslcton(self):
if self.io7==1:
self.frame = Menubutton(text='SELECCIONAR TONALIDAD?')
picks = Menu(self.frame)
self.frame.config(menu=picks)
En la primera parte del cdigo se usa la variable conmutador self.io7 para no crear
ms botones iguales, luego se crea un submen con el nombre de
SELECCIONAR TONALIDAD?, que contiene varios botones con los nombres
de las tonalidades as:
picks.add_command(label='CM', command=(lambda btsel='CM': self.slcton(btsel)))
picks.add_command(label='Cm', command=(lambda btsel='Cm': self.slcton(btsel)))
picks.add_command(label='C#M', command=(lambda btsel='C#M': self.slcton(btsel)))
picks.add_command(label='C#m', command=(lambda btsel='C#m': self.slcton(btsel)))
picks.add_command(label='DM', command=(lambda btsel='DM': self.slcton(btsel)))
picks.add_command(label='Dm', command=(lambda btsel='Dm': self.slcton(btsel)))
picks.add_command(label='EbM', command=(lambda btsel='EbM': self.slcton(btsel)))
picks.add_command(label='Ebm', command=(lambda btsel='Ebm': self.slcton(btsel)))
picks.add_command(label='EM', command=(lambda btsel='EM': self.slcton(btsel)))
picks.add_command(label='Em', command=(lambda btsel='Em': self.slcton(btsel)))
picks.add_command(label='FM', command=(lambda btsel='FM': self.slcton(btsel)))
picks.add_command(label='Fm', command=(lambda btsel='Fm': self.slcton(btsel)))
picks.add_command(label='F#M', command=(lambda btsel='F#M': self.slcton(btsel)))
picks.add_command(label='F#m', command=(lambda btsel='F#m': self.slcton(btsel)))
picks.add_command(label='GM', command=(lambda btsel='GM': self.slcton(btsel)))
picks.add_command(label='Gm', command=(lambda btsel='Gm': self.slcton(btsel)))
picks.add_command(label='AbM', command=(lambda btsel='AbM': self.slcton(btsel)))
picks.add_command(label='G#m', command=(lambda btsel='G#m': self.slcton(btsel)))
picks.add_command(label='AM', command=(lambda btsel='AM': self.slcton(btsel)))
picks.add_command(label='Am', command=(lambda btsel='Am': self.slcton(btsel)))
picks.add_command(label='BbM', command=(lambda btsel='BbM': self.slcton(btsel)))
picks.add_command(label='Bbm', command=(lambda btsel='Bbm': self.slcton(btsel)))
picks.add_command(label='BM', command=(lambda btsel='BM': self.slcton(btsel)))
Ms adelante se editan las propiedades del sub men como fondo letra y en fin:
self.frame.pack(side=TOP, padx=5, pady=5, expand=NO, fill=BOTH)
self.frame.config(bg='black', fg='#6666FF', bd=0, font=('Tempus Sans ITC',10, 'bold'))
picks.config(bg='black', fg='#FFFFFF', bd=5, font=('Tempus Sans ITC',10, 'bold'))
Luego es creado un botn llamado 'OMITIR' que da paso a la funcin axMG pero
en el caso de haber seleccionado una tonalidad del submen se activa la funcin
slcton; el botn 'OMITIR' es programado con sus respectivas propiedades
teniendo en cuenta que su color rojo en RGB es fg=#FF6666.
self.bmg = Button(self.frame, text='OMITIR', fg=#FF6666, background=black,
width=0, font=('Tempus Sans ITC',10, 'bold'), command=self.axMG)
self.bmg.pack(side=LEFT, padx=0, pady=0)#'''
self.io7=0
Ilustracin 74: Men emergente diseado para seleccionar una tonalidad activando el botn SELECCIONAR
TONALIDAD?
5.10.7.
LA FUNCIN SLCTON
El primer paso es llamar como globales las variables ioSLCTON y SLCTON, note
que al entrar en esta funcin ya es activada la siguiente funcin llamada axMG; en
la variable es guardada el nombre de la tonalidad seleccionada como
SLCTON=btsel. Luego es creado un diccionario tn={} que contiene los nombres de
las tonalidades y los valores de color a los que corresponde cada uno.
def slcton(self,btsel):
global ioSLCTON,SLCTON
ioSLCTON=1
self.axMG()
SLCTON=btsel
print;print 'SELECCIONASTE LA TONALIDAD DE', SLCTON;print
tn={}
tn['DM'],tn['Dm'],tn['GM'],tn['Gm'],tn['CM'],tn['Cm'],tn['FM'],tn['Fm'],tn['BbM'],tn['Bbm'],
tn['EbM'],tn['Ebm'],tn['AbM'],tn['G#m'],tn['C#M'],tn['C#m'],tn['F#M'],tn['F#m'],tn['BM'],t
n['Bm'],tn['EM'],tn['Em'],tn['AM'],tn['Am']=600,600,650,650,700,700,750,750,800,800
,850,850,900,900,950,950,1000,1000,1050,1050,1100,1100,1150,1150
if SLCTON[-1]=='M':
import OSC
client = OSC.OSCClient()
msg = OSC.OSCMessage()
msg.setAddress(/print)
msg.append(0)
client.sendto(msg, ('127.0.0.1', 9009))
else:
import OSC
client = OSC.OSCClient()
msg = OSC.OSCMessage()
msg.setAddress(/print)
msg.append(1)
client.sendto(msg, ('127.0.0.1', 9009))
5.10.8.
LA FUNCIN AXMG
Ilustracin 75: Muestra de la interfaz hasta el botn para analizar secuencia MIDI
Esta funcin comienza como se ha visto con un conmutador para no repetir este
botn, ms adelante se crea el botn self.bmg con el mensaje ANALIZAR
SECUENCIA MIDI, y un cuadro de mensaje self.mton sin texto que va a cambiar
cuando el anlisis del programa MG encuentre la tonalidad. El botn self.bmg al
ser activado ejecuta el programa de anlisis MG que al finalizar correctamente
arranca la siguiente funcin llamada auxabrirpd; el cdigo de sta funcin es:
def axMG(self):
if self.io2==1:
self.frame = Frame(root, width=1000, height=1000, bg=black)
self.frame.pack(side=TOP, padx=5, pady=5, expand=YES,
fill=BOTH)#()#(side=TOP, expand=NO, fill=NONE)
self.bmg = Button(self.frame, text='ANALIZAR SECUENCIA MIDI', fg=white,
background=black, width=0, font=('Tempus Sans ITC',10, 'bold'),
command=self.MG).pack(side=LEFT, padx=0, pady=0)#,
command=self.buscar);self.bmg.pack()
self.mton = Label(self.frame, text='', fg=white, background=black, width=20)
self.mton.config(bg='black', fg='#FFFF00', bd=0, font=('Tempus Sans ITC',10,
'bold'))#;self.titulo.pack(side=LEFT, padx=0, pady=0)
self.mton.pack(side=LEFT, padx=5, pady=5, expand=YES, fill=BOTH)
self.io2=0
5.10.9.
LA FUNCIN MG
def MG(self):
os.chdir(str(DirP[:-9])+'\\Interfaz')
self.mton['text']='...Analizando...'
self.mton['fg']='#99FFFF'
print;print self.mton['text'];print
nmid=self.nmid
class MusicGarden:
Ahora se crea un diccionario para asignarle un color al texto de dialogo cambiarlo
por el texto '...Analizando...', luego aplica el nombre de la tonalidad y el color
correspondiente a la tonalidad, finalmente se da la orden para que sea ejecutada
la funcin auxabrirpd.
rfeRGB={}
rfeRGB[600],rfeRGB[650],rfeRGB[700],rfeRGB[750],rfeRGB[800],rfe
RGB[850],rfeRGB[900],rfeRGB[950],rfeRGB[1000],rfeRGB[1050],rfe
RGB[1100],rfeRGB[1150]='#FF0000','#FF6600','#FFFF00','#66FF00','
#00FF00','#00FF66','#00FFFF','#0066FF','#0000FF','#6600FF','#FF0
0FF','#FF0066',
self.mton['text']=TONALIDAD
self.mton['fg']=rfeRGB[COLORNOTA]
self.auxabrirpd()
5.10.10.
LA FUNCIN AUXABRIRPD
Ilustracin 77: Interfaz cuando aparece la tonalidad analizada con el color correspondiente a la misma y el botn
para iniciar Pure Data
5.10.11.
LA FUNCIN ABRIRPD
(['C:\\Program
Files
5.10.12.
LA FUNCIN AUXVENTANA
Ilustracin 79: Programa principal en Pure Data e Interfaz donde aparecen los botones para inicial la ventana de
animacin, los botones de test y el botn de salir.
5.10.13.
LA FUNCIN VENTANA
def ventana(self):
import OSC
client = OSC.OSCClient()
msg = OSC.OSCMessage()
msg.setAddress(/print)
msg.append(1)
client.sendto(msg, ('127.0.0.1', 9004))
for i in range(3):
import OSC
client = OSC.OSCClient()
msg = OSC.OSCMessage()
msg.setAddress(/print)
msg.append(1)
client.sendto(msg, ('127.0.0.1', 9001))
if self.io5==1:
self.auxplaystop()
self.io5=0
Ilustracin 80: Interfaz grfica con la aparicin de los botones iniciar y parar la animacin y la ventana activada
de animacin
5.10.14.
AL presionar los botones TEST son ejecutadas las funciones test(1-4) y cada una
de ellas enva un mensaje OSC con el valor 1 por diferentes canales; test1 por
9004, test2 9005, test3 9006, test3 9003 y test4 9007. La programacin para estas
funciones es as:
def test(n)(self):
import OSC
client = OSC.OSCClient()
msg = OSC.OSCMessage()
msg.setAddress(/print)
msg.append(1)
client.sendto(msg, ('127.0.0.1', 900(n)))
5.10.15.
LA FUNCIN AUXPLAYSTOP
5.10.16.
LA FUNCIN PLAY
con un rojo ms
plido:
def Play(self, event):
import OSC
self.bPS1[fg] = #00FF00
self.bPS1[text] = ' (( INICIAR ANIMACIN )) '
self.bPS2[fg] = #FFCC66
self.bPS2[text] = ' PARAR ANIMACIN '
client = OSC.OSCClient()
msg = OSC.OSCMessage()
msg.setAddress(/print)
msg.append(1)
client.sendto(msg, ('127.0.0.1', 9002))
5.10.17.
LA FUNCIN STOP
client = OSC.OSCClient()
msg = OSC.OSCMessage()
msg.setAddress(/print)
msg.append(1)
client.sendto(msg, ('127.0.0.1', 9003))
5.10.18.
Esta
LA FUNCIN SALIR
funcin
logra
cerrar
el
programa
Pure
Data
haciendo
uso
de
InterfazXP.py (para Windows XP); se recomienda abrirlo con el IDE que viene por
defecto con la instalacin de Python y revisar si en la funcin def abrir(self):, la
variable abrirpuredata = subprocess.Popen(['C:\\ProgramFiles (x86) \\ pd \\ bin \\
pd.exe', 'PyPdGem.pd']), contiene correctamente la direccin donde est
instalado Pure Data como se mencion anteriormente de acuerdo a sus sistema
operativo.
6.2.
Para iniciar la interfaz se debe dar doble clic en el archivo InterfazW7.py (para
Windows 7) e InterfazXP.py (para Windows XP) y se abrir una ventana de
comandos MS-DOS y un botn con el ttulo de la interfaz:
Luego hay que darle clic al ttulo y entonces aparecer un nuevo botn con la
etiqueta ABRIR ARCHIVO MIDI y al lado derecho una etiqueta con Nombre del
Archivo MIDI:
Ilustracin 87: Ejemplo, botn para abrir el archivo y el ttulo del archivo
Ilustracin 88: Ejemplo, carpeta donde se encuentran los archivos MIDI en el directorio ((MG)), y el cuadro de
dialogo cuando se ha logrado copiar un archivo para ser analizado
Una vez haya seleccionado un archivo MIDI la etiqueta cambiar por el nombre
del archivo seleccionado y en seguida aparecern dos nuevos botones, uno para
seleccionar una tonalidad, y otro para omitir este paso.
Ilustracin 89: Ejemplo, ttulo del archivo, botones omitir y seleccionar tonalidad
Si presiona el botn para seleccionar una tonalidad, aparecer un men con los
nombres de las tonalidades que podr seleccionar, entonces el cuadro de dialogo
notifica la tonalidad seleccionada.
Ilustracin 90: Ejemplo, botn activado para seleccionar la tonalidad, men de tonalidades disponibles, y dialogo
de la tonalidad seleccionada
Ilustracin 92: Ejemplo, cuadro de dialogo indicando la tonalidad seleccionada, en nmero de eventos analizados,
la tonalidad por la que se ha cambiado o la encontrada y el color numrico de la tonalidad
600
650
700
750
Bb Eb Ab C#
800
850
900
F#
Ilustracin 93: Tabla de referencia con los nombres de las tonalidades, sus valores y colores correspondientes
Ilustracin 94: Ejemplo, titulo con la tonalidad encontrada y botn para iniciar Pure Data
Entonces aparece el botn para iniciar Pure Data; al ser activado ste botn,
aparecen dos ventanas emergentes de Pure Data, una que es la ventana de
comentarios del programa, y la otra, la ventana donde est programada toda la
animacin. Aparecen nuevos botones para iniciar la ventana de animacin, los test
para ejecutar unas secuencias preestablecidas de demostracin y el botn para
salir:
Al aparecer las ventanas de Pure Data, hay que configurar los dispositivos de
entrada y salida dando clic en Media-MIDI settings de la barra de mens:
Ilustracin 98: 86: Ejemplo, ventana y ejemplo de asignaciones entradas y salidas MIDI
Una vez creada la ventana aparecen los botones para iniciar o parar la animacin;
el botn de la accin es sealado con parntesis.
6.3.
ANIMACIN
Ejemplo de altura:
La velocidad de nota est representada en el eje z por las esferas como tambin
en la intencidad del la luz reflejada en el plano, los rangos de velocidad estan
ralacionados como: 0 a 127 como evento MIDI, de 0 a 2 para la intencidad de la
luz y de -100 hasta 100 dentro del espacio de la animacin en el eje z para las
esferas.
El Programa logra renderizar en tiempo real hasta seis esferas independientes con
todas sus diferentes caractersticas como color, posiscin en los tres ejes, luz; el
programa al detectar ms de una nota, calcla el intervalo entre cada una de ellas
y dependiendo de esto cambi el color generando colores opuestos para las
disonancias o colores dayacentes para las consonancias.
Ejemplos:
Ilustracin 115: Ejemplo, colores que corresponden a los grados y a las triadas halladas en la secuencia MIDI
6.4.
Detrs del toda la parte interactiva o visual, existen productos con informacin que
el programa va generando a medida que va sucediendo ste proceso. El primer
producto es una lista de todos los eventos de la Secuencia MIDI descompilados
por el programa MIDICSV cuyos datos son capturados por Python desde MS-DOS
en una lista de texto ubicada en la carpeta Interfaz con el nombre de Out.
Ilustracin 118: Ejemplo, lista de eventos para ser ledos por el secuenciador Qlist
Ilustracin 119: Ejemplo, detalle de la organizacin del cdigo para la clase general del programa
Ilustracin 120: Ejemplo, detalle documentado de la organizacin del cdigo para una sub-clase
Ilustracin 121: Ejemplo, cdigo para imprimir resultados luego de haber un proceso
7.
CONCLUSIONES Y RECOMENDACIONES
7.1.
CONCLUSIONES
El concepto de sinestesia para aquellas personas que no la poseen (nonsinestsicos), les puede hacer pensar en cules seran las posibilidades, si en
ellas existiera esta singularidad (como problema o virtud) generando otros
panoramas de percepcin y por ende reacciones psicofsicas, ampliando su
capacidad de concepcin de la realidad. Hacer visual la msica es la meta que
nace con este proyecto en donde a la final y de cualquier manera va a existir un
arte que va a germinar en otro arte.
En este proyecto logra crear una base para futuros desarrollos tecnolgicos
relacionando con la msica, la programacin y la animacin. Dicha base ampla el
conocimiento de los sistemas exponiendo claramente diferentes rutas para
analizar, procesar y transformar la informacin, mediante el desarrollo de los
recursos de software libre. Ofrece un variado panorama de posibilidades a quienes
busquen en el tema ampliar el conocimiento y crecimiento de la tecnologa,
especialmente para el software que es de todos y para todos (Open Source).
Para que el programa fuera capaz de hallar los resultados esperados, es decir,
que procesara la estructura musical, se tuvo que partir de informacin binaria
hallada en el protocolo de comunicacin y haciendo uso de pequeos programas,
disear mtodos de anlisis que vayan descifrando la informacin numrica hasta
lograr informaciones bsicas sobre la estructura musical, teniendo en cuenta que
dicho protocolo no se ha diseado en si para la escritura musical sino ms bien
fue creado para la comunicacin musical; los archivos MIDI estn diseados para
reproducir msica, y no para la notacin musical o impresin; en otras palabras,
los archivos no incluyen informacin sobre la notacin como ligaduras,
articulaciones y/o maquetacin. Tampoco puede discernir la escritura enarmnica
Para llegar a los resultados visuales, el proyecto, tuvo que experimentar variadas
relaciones grficas, unidas a los conceptos musicales, convocando as al
nacimiento intrnseco de un nuevo lenguaje de comunicacin musical. Este
sistema est ms cerca de alcanzar un tipo de experiencia sinestsica,
provocando tambin una base para la creacin ms acertada del fenmeno
sincrnico visual-musical.
Otro logro es instrumentar la relacin del protocolo MIDI con el secuenciador Qlist
de Pure Data, convirtindolo en un medio de transformacin del lenguaje binario
de un archivo MIDI a un archivo con el protocolo Qlist. La ventaja es que cualquier
programador en Python puede valerse de este desarrollo y aprovechar el sistema
para extraer informacin del protocolo MIDI para emplearlo en su propio beneficio.
Otro beneficio es haber logrado la entrada de una secuencia MIDI a Pure Data
obteniendo variables fciles de manejar.
En conclusin los programas creados en Pure Data fueron desarrollos para hacer
posible la rpida manipulacin de las animaciones en tiempo real del entorno
grfico GEM, mediante estructuras diseadas, facilitando el uso de las
propiedades y de los objetos de animacin.
7.2.
RECOMENDACIONES
8. BIBLIOGRAFA
8.1.
D. A. DONDIS
La Sintaxis de la Imagen
DE MORENTIN JUAN MAGARIOS
Lo que explica la semntica visual
JOS M GONZLEZ-SERNA SNCHEZ
Sintaxis de la Imagen [en lnea] <http://www.auladeletras.net/mat_med.html#>
Semntica de la Imagen [en lnea] < http://www.auladeletras.net/mat_med.html#>
MAGARIOS DE MORENTIN, J
La(s) semitica(s) de la imagen visual.,Cuadernos 17, Revista de la Facultad de
Humanidades y Ciencias Sociales de la Universidad Nacional de Jujuy; noviembre,
PEP ALSINA, FREDERIC SES
El rea de educacin musical
Historia de la msica con propuestas didcticas y 49 audiciones
KANDINSKY
Punto y lnea sobre el plano
De lo Espiritual en el Arte
GLOSARIO
Apreciacin Musical: Es un tipo de formacin musical destinado a desarrollar la
habilidad
BWV:
Wolfgang
Schmieder,
Thematisch-systcmatisches
Verzeichnis
der
Contrapunto: una rama de la teora musical que estudia la tcnica que se utiliza
para componer msica polifnica mediante el enlace de dos o ms melodas. Un
tipo especial de polifona es el contrapunto.
47
MIDI: Musical Instrument Digital Interface, protocolo en tiempo real para permitir la
comunicacin entre los dispositivos de hardware independiente.
48
49