Академический Документы
Профессиональный Документы
Культура Документы
ndice
Introduccin----------------------------------------------------------------------------------------------------------3 Manejo del API Java Fugue---------------------------------------------------------------------------------------5 Configuracin--------------------------------------------------------------------------------------------------------5 Modo de uso (MusicStrings)-------------------------------------------------------------------------------------8 Archivos MIDI-------------------------------------------------------------------------------------------------------14 Conclusiones--------------------------------------------------------------------------------------------------------15 Bibliografa----------------------------------------------------------------------------------------------------------16 Recomendaciones-------------------------------------------------------------------------------------------------17
Introduccin
En la actualidad las aplicaciones desarrolladas con contenido multimedia son cada vez ms solicitadas y a su vez ms aceptadas por los usuarios (es un cculo vicioso). El formato de manipulacin de audio MIDI est un tanto olvidado con la salida del mp3 al mercado y todas las ventajas que ste nos proporciona. El API JFugue nos da un enlace al formato MIDI para nuestras aplicaciones JAVA de una forma sencilla y factible de tal manera que la edicin de melodas no es cuestin ms que de una cadena de caracteres de configuracin. A diferencia de otros paquetes para el manejo del Java Sound API, JFugue establece todas las caractersticas del audio en simples cadenas sin la necesidad de crear objetos para cada caracterstica o lo que sera peor, para cada nota. El MIDI nos permite la edicin de melodas reproducidas en paralelo (llamadas voces) con una amplia gama de instrumentos, lo que permite crear melodas ms complejas y a su vez ms atractivas. En este documento se muestra la forma de implementar el API JFugue en los proyectos de NetBeans 5.5, aunque la configuracin en otras interfaces es bastante similar. Tambin se trata a profundidad el formato de las MusicStrings a travs de la definicin de sus componentes respaldado en ejemplos que han sido previamente verificados. Por ltimo se presenta la forma en que JFugue se comunica con los archivos MIDI. A continuacin, el API JFugue.
Objetivos
General
Introducir al lector en el uso del API Jfugue como una herramienta para aplicaciones que utilicen sonido em formato MIDI.
Especficos
Configurar Jfugue para ser utilizado en un proyecto. Comprender el modo de trabajo con el API. Aprender a desarrollar melodas en base a las MusicStrings, segn las opciones que estas proveen, as como el uso de Patterns. Establecer un enlace entre los archivos MIDI y los proyectos realizados com Jfugue.
desde
el
url:
Jfugue.jar (Indispensable) Jfugue-source.zip (Nos permite ver el codigo fuente) Jfugue-javadoc.zip (Proporciona acceso a la documentacin)
Universidad de San Carlos de Guatemala Facultad de Ingeniera Escuela de Ciencias y Sistemas 2. A continuacin creamos un nuevo proyecto en NetBeans y le llamaremos jfugue_1.
Fig1. Creacin del proyecto. 3. Agregamos a las librerias de nuestro IDE (en este caso NetBeans) JFugue. Vamos al men: Tools--> Library Manger y a continuacin click en New Library.
Universidad de San Carlos de Guatemala Facultad de Ingeniera Escuela de Ciencias y Sistemas 4. Ahora que ya creamos una nueva librara agregamos al classpath de sta el JAR de JFugue. Seleccionando la ficha de Classpath, luego en Add Jar/File y buscamos en el equipo el archivo, lo seleccionamos y listo.
Fig 3. Especificando el Classpath de JFugue. 5. Ahora que ya hemos agregado el API, vamos a agregar el source y el javadoc para tener acceso a estos cuando lo necesitemos. Se sigue el mismo proceso que en el paso anterior. Para el cdigo fuente seleccionamos el fichero Sources y agregamos el archivo Jfugue-soruce.zip y luego el fichero Javadoc Jfugue-javadoc.zip. 6. Ahora incluiremos en nuestro proyecto (jfugue_1) las librerias del Jfugue.
Fig 5. Agregamos JFugue a nuestro proyecto. Ahora estamos listos para comenzar a programar con JFugue! Probando JFugue Vamos a serciorarnos que la configuracin se haya hecho correctamente. Ingresando el siguiente cdigo en nuestro mtodo main del proyecto en el que estmos trabajando, compilando y ejecutndolo debemos escuchar una escala musical. Player jukebox = new Player(); jukebox.play("C D E F G A B"); Nota:
nmero (entre corchetes) correspondiente a las mismas, se muestra a continuacin en la siguiente tabla.
Las alteraciones se especifican como b para bemos y # para sostenido. JFugue solo permite un sostenido o un bemol como alteracin. Ejemplo: Player jukebox = new Player(); jukebox.play("C D E F G A B"); jukebox.play("[60] [62] [64] [65] R R G A B"); jukebox.play("C# D# Eb Fb G# A B");
Octavas: Como se puede observar en la tabla, la primera columna del lado izquierdo nos muestra la octava en que se reproducira la nota, esto es el grado de agudez. El tipo de octava solo se agrega delante de cada nota. Tomar en cuanta que debe escribirse pegado a la nota ya que es una alteracion de la nota por lo que la toma como un solo token. Entre ms grande es el valor de la octava, la nota ser ms aguda. La octava de las notas es por default 5.
Ejemplo: jukebox.play("C3 D4 E5 F6 G7 A8 B9"); En el caso de las notas escritas por su codigo ( [84] por ejemplo) ya incluyen el valor de octava, por lo que el agregarselo producira un error: jukebox.play("[84]5 [64]8 [65]3"); X
Acordes: Un acorde es el sonido que producen 2 o ms notas presionadas a la vez, los acordes mayores y menores se componen de 3 notas, pero hay una gran variedad de acordes compuestos por mas de 3 notas.
Ejemplo: Las notas que componen al acorde Do son: Do, Mi, Sol (C, E,G). Para que suenen al mismo tiempo debern ser escritas con el operador +. En el siguiente ejemplo se tocar el acorde Do y luego el acorde Re. Note el espacio entre la G y la D, marcan la diferencia de token. jukebox.play(C+E+G D+F#+A)
Universidad de San Carlos de Guatemala Facultad de Ingeniera Escuela de Ciencias y Sistemas Otra forma de escribir los acordes es mediante los acordes definidos que posee JFugue, en este caso no se necesita saber que notas componen a los acordes. La siguiente tabla muestra las notaciones para los acordes. Nombre Conocido Representacion en JFugue
Universidad de San Carlos de Guatemala Facultad de Ingeniera Escuela de Ciencias y Sistemas Ejemplo: jukebox.play( Cmaj Cmaj Amin Amin Fmaj Fmaj Gmaj Gmaj); Nota, la octava de los acordes es por default: 3.
Clave: Permite establecer la clave en que se escribir la meloda. La clave por default es Sol. Su sintaxis es: la letra K seguido de la clave.
Ejemplo: jukebox.play ("KCbmaj C8w D8h E6q C4majw"); En este caso la clave es: Do bemol mayor.
Instrumento: Permite definir el instrumento con el que se va a interpretar. Estos instrumentos(128) estn basados en los estndares MIDI. La sintaxis es la letra I seguido del nombre o el codigo del instruemento entre corchetes. A continuacin el listado de instrumentos.
PIANO 0 BRIGHT_ACOUSTIC 1 ELECTRIC_GRAND 2 HONKEY_TONK 3 ELECTRIC_PIANO 4 ELECTRIC_PIANO_1 4 ELECTRIC_PIANO_2 5 HARPISCHORD 6 CLAVINET 7 CELESTA 8 GLOCKENSPIEL 9 MUSIC_BOX VIBRAPHONE MARIMBA XYLOPHONE TUBULAR_BELLS 10 11 12 13 14
SYNTHSTRINGS_1 50 SYNTHSTRINGS_2 51 CHOIR_AAHS 52 VOICE_OOHS 53 SYNTH_VOICE 54 ORCHESTRA_HIT 55 TRUMPET 56 TROMBONE 57 TUBA 58 MUTED_TRUMPET 59 FRENCH_HORN BRASS_SECTION SYNTHBRASS_1 SYNTHBRASS_2 SOPRANO_SAX ALTO_SAX 60 61 62 63 64
65
PAD_POLYSYNTH 90 POLYSYNTH 90 PAD_CHOIR 91 CHOIR 91 PAD_BOWED 92 BOWED 92 PAD_METALLIC 93 METALLIC 93 PAD_HALO 94 HALO 94 PAD_SWEEP 95 SWEEP 95 FX_RAIN 96 RAIN 96 FX_SOUNDTRACK 97 SOUNDTRACK 97 FX_CRYSTAL 98
70 71 72 73 74 75 76 77 78 79
LEAD_SQUARE 80 SQUARE 80 LEAD_SAWTOOTH 81 SAWTOOTH 81 LEAD_CALLIOPE 82 CALLIOPE 82 LEAD_CHIFF 83 CHIFF 83 LEAD_CHARANG 84 CHARANG 84 LEAD_VOICE 85 VOICE 85 LEAD_FIFTHS 86 FIFTHS 86 LEAD_BASSLEAD 87 BASSLEAD 87 PAD_NEW_AGE 88 NEW_AGE 88 PAD_WARM 89 WARM 89
FIDDLE 110 SHANAI 111 TINKLE_BELL 112 AGOGO 113 STEEL_DRUMS 114 WOODBLOCK 115 TAIKO_DRUM 116 MELODIC_TOM 117 SYNTH_DRUM 118 REVERSE_CYMBAL 119 GUITAR_FRET_NOISE 120 BREATH_NOISE 121 SEASHORE 122 BIRD_TWEET 123 TELEPHONE_RING 124 HELICOPTER 125 APPLAUSE 126 GUNSHOT 127
Voces: Permite la ejecucin entre varias melodas al mismo tiempo, cada voz debe verse como si las melodas fueran personas que cantan en en grupo. As pueden definirse 16 voces (de la voz 0-15). Se representa mediante una V seguida del nmero de voz que ser. Debe incluirse al inicio del MusicString. La dcima voz (V9) es especial para percusiones. Antes de proceder al ejemplo, definiremos los Patterns. Pattern: Permite crear, transformar, distribuir piezas de msica, imaginemos que en un comps se repite tres veces en una partitura, pues entonces solo creamos el patrn de un comps y lo reproducimos 3 veces. Los Pattern permiten insertar MusicStrings as como otros Pattern dentro de ellos.
Universidad de San Carlos de Guatemala Facultad de Ingeniera Escuela de Ciencias y Sistemas Ejemplo: Player jukebox = new Player(); Pattern parte1 = new Pattern( G G A A B G G); Pattern parte2 = new Pattern( B B A A G); Pattern cancion= new Pattern(); cancion.add(parte1,2); // se agrega 2 veces cancion.add(parte2,2); // se agrega 2 veces jukebox.play(cancion); La forma de agregacin entre patrones debemos verla como si concatenaramos los MusicString de cada uno. Ejemplo: Player jukebox = new Player(); Pattern voz1 = new Pattern ("V1 Cmaj Cmaj Cmaj Amin Amin Amin"); Pattern voz2 = new Pattern("V2 I[30] Rw Rh C D Ei Fi C Cb Ch"); Pattern voz3 = new Pattern("v3 I[violin] Rw Rh C7w D7h Cb7w D7h"); Pattern cancion= new Pattern(); cancion.add(voz1,3); cancion.add(voz2,2); cancion.add(voz3); jukebox.play(cancion);
Tiempo: Define los pulsos por minuto que se cuentan segn el comps, el defaul es 120. Nota: Alterar esto alterara la duracin comn de los tiempos. Debe ir al inicio del MusicString.
Ejemplo: Player jukebox = new Player(); Pattern parte1 = new Pattern ( D F# F# D A); Pattern parte2 = new Pattern(T160 D D D G G G); Pattern parte3 = new Pattern(E E D F# F#); Pattern cancion = new Pattern(); cancion.add(parte1); cancion.add(parte2); cancion.add(parte3); jukebox.play(cancion); Si ejecutamos la siguiente melodia nos podemos dar cuenta que desde la parte2 se comienza a interpretar mas lento, a pesar que todas las notas tienen la misma duracin (por default q) lo que sucede que que el T160 afecta al MusicString que esta despus de el, como se dijo anteriormente la adicin de patrones no es ms que concatenar los string, de tal forma que lo anterior queda asi: D F# F# D A T160 D D D G G G E E D F# F# Por lo que, desde la segunda parte se altera la forma de medicin del tiempo.
Constantes: Permite la definicin de constantes para comodidad del usuario, hay que tomar en cuenta que se deben definir antes de usar. Tiene la siguiente sintaxis: $nombre=valor
Ejemplo: Player jukebox = new Player(); Pattern constante = new Pattern("$instrumento=30"); Pattern cancion= new Pattern(); cancion.add(constante); cancion.add(" I[instrumento] B C# D# E D# C# Bh"); jukebox.play(cancion); En el ejemplo anterior, si no se hubiera agregado al Pattern cancion el patern constante, mostrara un error pues seran como dos MusicString diferentes y el player no encontrara la constante instruemento. Archivos MIDI JFugue permite grabar archivos segn el contenido de MusicStrings as como tambin obtener el MusicString de un archivo MIDI. A continuacin un ejemplo: Pattern con = new Pattern("$FAV=30"); Pattern n = new Pattern(); n.add(con); n.add(" I[FAV] Ci Ci Ci Ai Ai F G6i F G G"); Pattern n2 = new Pattern(); n2.add(n,2); player.play(n2); Pattern n3 = new Pattern(" I[FAV] Cmaji Cmaji Cmaji Amaji Amaji Fmaj Gmaji Fmaj Gmaj Gmaj"); Pattern n4 = new Pattern(); n4.add(n3,2); player.play(n4); Pattern union = new Pattern(); n2.insert("V0"); n4.insert("V1"); union.add(n2); union.add(n4); try{ player.saveMidi(union,new File("Uno.midi")); // Graba el Music String de Union en //Uno.midi Pattern p = player.loadMidi(new File("Uno.midi")); //Carga el MusicString de Uno.midi System.out.println(p.getMusicString()); //al Pattern p y lo imprime en pantalla }catch(Exception err){ System.out.println(err.getMessage()); }
Conclusiones a) JFugue es una herramienta muy sencilla de usar gracias a las MusicStrings las
cuales simplifican en un String la configuracin MIDI de las melodas. b) Se puede implementar de forma sencilla en cualquier proyecto con tan solo agregar la librera Jfugue.jar. c) El API provee un acceso simple a la creacin y lectura de archivos MIDI. d) Cuando se graban MusicStrings en archivos .MIDI se percibe una disminucin en el volumen de la meloda. e) Con JFugue tenemos un acceso imendiato a las caractersticas del formato MIDI sin necesidad de manipularlo a bajo nivel.
Tutorial desarrollado por: Nery Chucuy El contenido de este tutorial puede ser editado total o parcialmente, siempre y cuando se respenten los derechos de autor.
Recomendaciones
a) Agregue en la librera de JFugue el cdigo fuente del API as como la documentacin; para poder investigarlo a profundidad en el momento que lo necesite. b) Para obtener mejores resultados del Java Sound API se pueden descargar los soundbaks que provee Sun: http://java.sun.com/products/javamedia/sound/soundbanks.html. c) Es recomendable incluir en cada aplicacin que realizamos una copia de JFugue para evitar problemas cuando el usuario ejecute la aplicacin. d) Cuando grabe archivos MIDI desde el programa, incremente el volumen de las melodas con el control de eventos de JFugue, ya que se percibe un decremento de volumen en el proceso de grabacin. e) Se recomienda tomar en cuenta el orden en que se explico cada componente del MusicString en este tutorial ya que la sintaxis debe respetar dicho orden, en especial para las modificaciones de las notas.