Guía para principiantes de JFugue Parte II: Acordes y progresiones de acordes

¡JFugue es una biblioteca de Java que crea música! Este es el segundo artículo de una serie de tutoriales de JFugue, y cubrimos acordes y progresiones de acordes.

Introducción

En esta guía, aprenderemos cómo crear y manipular acordes y progresiones de acordes, cómo usar los métodos setKey(), distribute() y allChordsAs() de la clase ChordProgression, y cómo tocar diferentes patrones simultáneamente usando voces en JFugue.

Esta es la segunda parte de la serie de tutoriales de tres partes, en la que intentamos recrear la introducción de la versión jazz de [Domingo por la mañana de Maroon 5](https://www.youtube.com/watch ?v=lpt_Y5uLm6Q). Pero los pasos proporcionados en los artículos también son fácilmente aplicables a cualquier otro proceso de creación de canciones.

En la parte anterior de la serie, cubrimos los fundamentos de la biblioteca JFugue, aprendiendo cómo usar notas, octavas, duraciones, tempo, instrumentos y patrones. Al final del primer artículo, creamos las voces de introducción sin ningún acorde. Al final de este tutorial, nuestra canción tendrá los acordes listos para tocar junto con las voces.

En la parte final de nuestra serie de tutoriales, aprenderemos sobre los ritmos en JFugue. Esto nos permitirá construir y tocar los ritmos sobre las partes anteriores. También veremos cómo guardar nuestra música en un archivo MIDI usando JFugue, así como leer música de un archivo MIDI usando la biblioteca de JFugue.

Si quieres ver otras partes de la serie, aquí están los enlaces:

Acordes y progresiones de acordes en JFugue

Cuando se trata de acordes, JFugue ofrece múltiples formas de crearlos. Primero, echemos un vistazo a cómo crear nuestros propios acordes combinando las notas una por una.

Crearemos el acorde D-Minor7, que también resulta ser el primer acorde de nuestra canción. Este acorde consta de cuatro (4) notas que podemos combinar y tocar simultáneamente:

1
player.play("D+F+A+C");

Eso funciona bien por ahora, pero puede volverse un trabajo muy tedioso crear cada acorde, nota por nota. En esta canción tenemos tres (3) acordes (Dm, G, C) con 3 inversiones (DMin9, GMaj13, CMaj9).

No necesariamente tenemos que crear todos los acordes manualmente. Puedes crear tus acordes usando ChordProgression si estás familiarizado con la teoría musical. Para hacerlo, importaremos e instanciaremos la clase ChordProgression con las progresiones de nuestros acordes:

1
2
3
import org.jfugue.theory.ChordProgression;

ChordProgression cp = new ChordProgression("ii V I");

También podemos establecer la clave de la progresión de acordes encadenando el método setKey():

1
2
ChordProgression cp = new ChordProgression("ii V I")
            .setKey("C");

Podemos tocar progresiones de acordes tal como lo hicimos con los patrones:

1
player.play(cp);

ChordProgression implementa PatternProducer, que, como sugiere el nombre, produce patrones. Y cuando pasamos ChordProgression al método Player.play(), el método solicita el patrón de ChordProgression y lo reproduce de la misma manera que lo hace con los patrones.

Otro método efectivo de ChordProgression es distribute(). Este método nos permite distribuir una característica musical junto con los acordes dentro de un objeto ChordProgression.

Por el momento, nuestros acordes en cp son Dm, G y C.

Cambiemos todos los acordes a la séptima usando distribute():

1
2
3
4
ChordProgression cp = new ChordProgression("ii V I")
            .setKey("C")
            .distribute("7");
player.play(cp);

Otro cambio esencial sería establecer la duración de cada acorde y agregar algo de 'Descanso' entre los acordes. Usando el método allChordsAs(), podemos seleccionar cada acorde en cp escribiendo $ con un número de índice del acorde:

1
2
3
4
ChordProgression cp = new ChordProgression("ii V I")
            .setKey("C")
            .distribute("7")
            .allChordsAs("$0hqit Ri $1hqi Ri $2wh Rht");

Podemos pensar en $0, $1 y $2 como marcadores de posición que se refieren a ii, V e I respectivamente. Cualquier modificación que les apliquemos se aplicará a los acordes en cp. Adelante, juega para ver la diferencia.

Otra cosa interesante de ChordProgression es que podemos convertirlo fácilmente a Pattern y usar métodos específicos de Pattern para modificarlo aún más:

1
2
3
Pattern cpPattern = cp.getPattern();
System.out.print(cpPattern);
player.play(cpPattern.setTempo(180).setInstrument("DRAWBAR_ORGAN").repeat(4));

Con el método getPattern(), convertimos el cp en una instancia de Pattern, luego imprimimos los acordes actuales en el cp para que podamos ver cómo se completan los acordes. Finalmente, establecemos el tempo , el instrumento y el valor de repetición.

Los acordes que toca JFugue se parecen a:

1
D4MIN7hqit Ri G4MAJ7hqi Ri C4MAJ7wh Rht

ChordProgression proporciona una gama de posibilidades, pero como se mencionó anteriormente, requiere algunos conocimientos de teoría musical. Si no sabes mucho sobre teoría musical pero tienes conocimientos básicos de acordes, entonces puedes usar acordes convenientemente dentro de los patrones.

Para obtener todo el potencial del Staccato, que se enorgullece de ser legible por humanos, escribiremos nuestros acordes directamente en el patrón:

1
Pattern mainChords = new Pattern("T180 D4Min9hqit Ri G4Maj13hqi Ri C4Maj9wh Rht");

Desglosemos D4Min9hqit. "D" es el nombre del acorde, seguido de "4" que es el número que representa la octava, seguido de "Min9" que significa "Menor 9th ", y seguido de "hqit" que son las medidas de duración.

Podemos aprovechar la clase Patrón y agregar algunos acordes más al patrón encadenando el método .add():

1
mainChords.add("D4Minhqit Ri 4Majhqi Ri C4Majwh Rht");

Tenga en cuenta que no especificamos el tempo en la segunda parte del patrón, ya que establecer el tempo una vez es suficiente para aplicarlo a todos los eventos musicales siguientes.

En el mundo real, no todos los instrumentos de una canción se reproducen en orden secuencial. Ahora que tenemos nuestros acordes tocando correctamente, nos gustaría agregar algunos otros patrones para tocar junto con ellos, no para agregarlos directamente, como hicimos con add().

JFugue proporciona un token especial llamado 'Voice'. La mayoría de las canciones están hechas de capas de patrones. Por ejemplo, el piano sigue tocando acordes mientras el tambor continúa y las voces cantan junto con ellos. En JFugue, el token 'Voice' representa a cada uno de estos jugadores/cantantes individuales, permitiéndoles tocar juntos, tocar al mismo tiempo.

Podemos utilizar hasta 16 voces diferentes, que es la suma de los canales MIDI estándar. Los números de voz pueden variar de V0 a V15. Podemos poblar las voces con cualquier instrumento que queramos. Excepto por el canal 10 o V9. Esta capa de voz especial está reservada para la percusión de forma predeterminada y puede tener diferentes conjuntos de instrumentos de percusión y capas en V9 (más sobre esto más adelante).

Intentemos recrear la introducción de 'Sunday Morning' (versión Jazz) agregando nuevas voces a nuestros mainChords actuales:

1
2
3
4
5
6
7
Pattern mainChords = new Pattern("T180 V0 D4Min9hqit Ri G3Maj13hqi Ri C4Maj9wh Rh");
mainChords.add("D4Minhqit Ri G4Majhqi Ri C4Majwh Rht");

Pattern pianoTouch = new Pattern("T180 V1 Rw | Rw | Rhi | G4qi G3s A3is CMajis ri");
pianoTouch.add("Rw | Rw | Rhi | G4s C5wa100d0");

player.play(mainChords, pianoTouch);

El patrón mainChords es el mismo que antes. Agregamos un nuevo patrón pianoTouch y lo configuramos en el segundo canal de voz V1. Dado que estas notas ocurrieron al final de cada ciclo de acordes, tuvimos que mantenerlas usando Rw para tocarlas en el momento correcto. Es posible que haya notado que la nota final del patrón pianoTouch tiene este extraño token a100d0 pegado a toda la nota de C. Ese token representa la velocidad de ataque y la velocidad de caída de la nota.

Hemos establecido el valor de ataque en 100, haciendo que nuestra nota suene un poco más fuerte que las demás, y hemos establecido el valor de decaimiento en 0, lo que provocó que el volumen de nuestra nota disminuyera a cero muy rápidamente. Puede establecer cualquiera de ellos y ninguno de ellos en su preferencia en cualquier valor entre 0 y 127.

La parte que compusimos en pianoTouch solo se reproduce una vez en la canción original. Por lo tanto, queremos asegurarnos de que mientras mainChords se reproduce en repetición, pianoTouch no se repite.

Podemos crear un nuevo patrón introOnce para agrupar nuestros otros patrones. De esta manera podemos organizar qué reproducir una vez y qué reproducir repetidamente. Reemplaza la línea que llama a play() con estas dos líneas:

1
2
Pattern introOnce = new Pattern(mainChords, pianoTouch);
player.play(introOnce, mainChords.repeat(2));

Esto debería tocar el pianoTouch una vez, y repetir los mainChords 2 veces más después.

¡Nuestra canción va muy bien! ¡Ahora es el momento de ayudar a los bailarines, usaremos la clase Ritmo para guiarlos en la siguiente parte de la serie!

Conclusión

En este tutorial, aprendimos a usar acordes y progresiones de acordes en la biblioteca JFugue. También cubrimos los métodos setKey(), distribute() y allChordsAs() de la clase ChordProgression, cómo tocar diferentes patrones simultáneamente usando voces y cómo aplicar propiedades de ataque/caída a notas o acordes. .

En la siguiente y última parte de la serie de artículos, aprenderemos cómo crear y usar los ritmos en JFugue. Al hacerlo, podremos finalizar nuestra canción. También cubriremos cómo guardar nuestra canción en un formato de archivo MIDI usando JFugue, así como también cómo importar un archivo MIDI y leer contenido en el formato Staccato.

You can continue to read the next part: Guía para principiantes de JFugue Parte III: Ritmos, lectura y escritura en MIDI.

Or if you need more details about the fundamentals of JFugue, you can check out the first article to refresh your knowledge: Guía para principiantes de JFugue Parte I: notas, duraciones, patrones.