Armonización de la escala mayor – 6: las tétradas

Objetivo: Deducir los acordes tétradas que aparecen al armonizar por terceras la escala mayor.

En los artículos anteriores aprendimos a armonizar la escala mayor superponiendo intervalos de terceras y dedujimos los acordes de tres notas (tríadas) que nos aparecían. Obtuvimos el siguiente paquete de acordes:

I – IIm – IIIm – IV – V – VIm – VIIº

en el que los números romanos hacen mención al grado de la escala correspondiente.

Hoy vamos a agregar otra tercera diatónica (es decir, perteneciente a la misma escala) para obtener acordes de cuatro notas, conocidos como tétradas o cuatríadas. Eso nos permitirá ampliar nuestro repertorio tonal con siete acordes nuevos de colorido diferente a su versión en tres notas.

Utilizaremos para el cálculo la escala de Do mayor, generalizando después para el resto de las tonalidades mayores.

Do mayor: C – D – E – F – G – A – B – C

1) Acorde sobre el primer grado:

Partimos de la nota Do (C) y solapamos tres terceras.

C – E – G – B

Observa que un intervalo de tercera es equivalente a saltarse una nota y coger la siguiente.

Al igual que hicimos con las tríadas, descubramos la naturaleza de cada sucesiva tercera, es decir, indiquemos si es mayor (4 semitonos) o menor (3 semitonos).

De C a E: cuatro semitonos; tercera mayor.

De E a G: tres semitonos; tercera menor.

De G a B: cuatro semitonos; tercera mayor.

Tercera mayor + Tercera menor + Tercera mayor = acorde de séptima mayor (maj7 o 7M).

En nuestro caso, partiendo de C, el acorde es Do séptima mayor, Cmaj7.

Para entender mejor la aparición de esta séptima voy a ofrecerte un cálculo alternativo con el que conviene que estés familiarizado. En lugar de calcular el intervalo existente entre una nota y la anterior, vamos a hacerlo en relación a la primera nota del acorde, la fundamental.

Entre C y E, una tercera mayor, como ya hemos visto.

Entre C y G hay una quinta. Si cuentas los semitonos de diferencia obtienes siete, de modo que se trata de una quinta justa o perfecta.

[Si no tienes soltura calculando intervalos, puedo sugerirte la lectura de los ocho artículos de la serie Intervalos sin secretos, en el que se explica toda la teoría junto a numerosos ejemplos prácticos.]

Entre C y B hay una séptima. Se compone de 11 semitonos, de modo que es una séptima mayor.

Todos los intervalos nos han salido mayores, de modo que la fórmula de este acorde es:

1 – 3 – 5 – 7: acorde de séptima mayor, Cmaj7 en nuestro caso.

2) Acorde sobre el segundo grado:

Partimos de Re (D) y apilamos terceras:

D – F – A – C

Realizando las mismas cuentas que hicimos antes obtenemos la siguiente composición intervalica:

Tercera menor + Tercera mayor + Tercera menor = Acorde menor séptima (m7).

O bien, en relación a la fundamental:

1 – b3 – 5 – b7

En nuestro caso, sobre Re, Dm7.

3) Acorde sobre el tercer grado:

E – G – B – D

Tercera menor + Tercera mayor + Tercera menor : Acorde menor séptima (m7), como antes.

1 – b3 – 5 – b7

Con fundamental en Mi, Em7.

4) Acorde sobre el cuarto grado:

F – A – C – E

Tercera mayor + Tercera menor + Tercera mayor = acorde de séptima mayor (maj7 o 7M), el mismo tipo que sobre el primer grado.

1 – 3 – 5 – 7

Con fundamental en Fa, Fmaj7.

5) Acorde sobre el quinto grado:

G – B – D – F

Tercera mayor + Tercera menor + Tercera menor = acorde de séptima (7).

Calculando los intervalos en relación a la fundamental:

1 – 3 – 5 – b7

Observa que la séptima, a diferencia de lo que sucedía sobre el primer o cuarto grado, es menor. Ten presente que, a la hora de formar acordes, si no se especifica de qué tipo es la séptima, se está sobreentiendo que es menor. Sobre el primer y cuarto grados especificamos que la séptima es mayor, de ahí el nombre de los acordes: Do séptima mayor y Fa séptima mayor. Pero sobre el quinto grado la séptima es menor, y por eso decimos sólo Sol séptima, sin más calificativos.

Sobre Sol, pues, G7.

6) Acorde sobre el sexto grado:

A – C – E – G

Tercera menor + Tercera mayor + Tercera menor : Acorde menor séptima (m7), del mismo tipo que sobre los grados 2 y 3.

1 – b3 – 5 – b7

Sobre La, Am7.

En relación al comentario anterior, observa que no especificamos más que séptima, sin el adjetivo menor (el menor que precede al siete hace referencia a que la tercera es menor, propia de los acordes menores, y no califica la séptima, pues por defecto ya lo es). Existe un acorde menor semejante, pero con la séptima mayor, en lugar de menor, Am maj7 y se denomina La menor con séptima mayor. Lo veremos aparecer cuando armonicemos otro tipo de escalas.

7) Acorde sobre el séptimo grado:

B – D – F – A

Tercera menor + Tercera menor + Tercera mayor = Acorde menor séptima con quinta disminuida, conocido también como semidisminuido: m7(b5).

A veces, podrás encontrarte este acorde escrito de un modo diferente: el mismo circulito que empleábamos para los disminuidos, pero con una línea partiéndolo por la mitad: ∅

En relación a la fundamental,

1 – b3 – b5 – b7

Sobre Si, Bm7(b5).

Ya tenemos nuestros siete acordes buscados. Agrupémoslos:

Cmaj7 – Dm7 – Em7 – Fmaj7 – G7 – Am7 – Bm7(b5)

Generalizar al resto de tonalidades mayores es inmediato:

Imaj7 – IIm7 – IIIm7 – IVmaj7 – V7 – VIm7 – VIIm7(b5)

Conclusión: acordes de séptima mayor sobre los grados 1 y 4, menores séptima, sobre el 2, 3 y 6, séptima sobre el 5 (grado conocido como dominante, de ahí la forma común de referirse al acorde de séptima como acorde de séptima de dominante) y menor séptima con quinta bemol sobre el 7.

Al igual que con las tríadas, apréndete bien estos acordes, ingredientes con los que todo compositor prepara sus recetas mágicas.

Javier Montero Gabarró


http://elclubdelautodidacta.es/wp/2013/05/armonizacion-de-la-escala-mayor-6-las-tetradas/


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta


Índice de todos los artículos de armonía.

Java: Un programa para probar las clases

lasecreObjetivo: desarrollar un programa completo en Java que permita poner a prueba las clases que hemos definido en los artículos anteriores.

Hagamos una breve recopilación de lo que llevamos hasta ahora: hemos definido los conceptos de clase y de objeto, pilares sobre los que se edifica la metodología de la programación orientada a objetos. Sabemos que las clases encapsulan atributos, elementos que indican las características de los objetos, y métodos, conjunto de funciones que definen su comportamiento. Aprendimos a crear objetos nuevos con new y mostramos cómo acceder a los atributos y métodos mediante la notación punto.

Definimos varias clases; entre ellas, Persona y Coche. Cada una reside en su propio fichero de código fuente .java y ha sido compilada en su respectivo fichero .class.

Va a entrar en escena una nueva clase que contendrá el programa principal desde el que probaremos la operatividad de las anteriores.

// ProbandoClases.java

public class ProbandoClases
{
  public static void main(String[] args)
  {
    // Aquí introduciremos el código para probar nuestras clases
  }
}

Esta nueva clase la mantendremos en el mismo directorio en el que se encuentran las restantes y en un fichero independiente denominado ProbandoClases.java. El nombre del fichero debe coincidir con el de la clase, teniendo en cuenta, además, que se diferencian las mayúsculas de las minúsculas.

La razón de ubicar el programa y las clases en el mismo directorio no es otra sino para tener acceso a ellas desde el programa principal. En breve, cuando definamos el concepto de paquete , veremos otros modos de definir las clases y agruparlas de un modo más práctico que facilite la reutilización de código entre programas diferentes. Todo a su momento; vayamos concepto a concepto.

Fíjate en el esqueleto del programa principal: es la misma estructura que presentamos en el Hola Mundo. Con lo que ya sabemos sobre las clases podemos aportar algo más de luz.

public class ProbandoClases

Olvídate por el momento del public. Si te das cuenta, el programa en sí mismo también es una clase, caracterizada por la palabra reservada class. Como tal, podrá tener también sus atributos y métodos.

Fíjate ahora en la siguiente línea:

public static void main(String[] args)

Dejemos el public static para otra ocasión. Lo que vemos después no es más sino la definición de un método, denominado main, que acepta una serie de parámetros entre paréntesis (de los que hablaremos a su debido momento), y que no devuelve ningún valor (void).

Todos los programas en Java han de disponer de un método llamado main, definido del mismo modo que en nuestro ejemplo. Es el punto donde comenzará la ejecución del programa.

Si has programado en C esto no te resultará muy sorprendente, pues en ese lenguaje de programación todo comienza en main también. Lo particular de Java, donde prácticamente todo es un objeto, es que main, en sí mismo, está encapsulado dentro de una clase.

Para que nos sirva de referencia y por comodidad, repito aquí el código de las clases Coche y Persona.

// Coche.java

class Coche
{
  String marca;
  String modelo;
  String color;
  int numeroDePuertas;
  int cuentaKilometros;
  int velocidad;
  boolean arrancado;
  
  void arrancar()
  {
    arrancado = true;
  }
  
  void parar()
  {
    arrancado = false;
  }
  
  void acelerar()
  {
    velocidad = velocidad + 1;
  }
  
  void frenar()
  {
    velocidad = velocidad - 1;
  }
  
  void pitar()
  {
    System.out.println("Piiiiiiiiiiiiiiiiii");
  }
  
  int consultarCuentaKilometros()
  {
    return cuentaKilometros;
  }
}

// Persona.java

class Persona
{
  char sexo;
  String nombre;
  int edad;
  Coche coche;
  
  void saludar()
  {
    System.out.println("Hola, me llamo " + nombre);
  }
  
  void dormir()
  {
    System.out.println("Zzzzzzzzzzz");
  }
  
  int obtenerEdad()
  {
    return edad;
  }
}

He numerado las líneas del código del programa principal para poder referenciarlas después en la explicación. Obviamente, esa numeración no debe aparecer en el fichero real.

1  public class ProbandoClases
2  {
3    public static void main(String[] args)
4    {
5      // Aquí introduciremos el código para probar nuestras clases
6      
7      Coche coche1 = new Coche();
8      Persona persona1 = new Persona();
9      Persona persona2 = new Persona();
10    
11    
12      coche1.marca = "Seat";
13      coche1.modelo = "Panda";
14      coche1.color = "Beige";
15      coche1.numeroDePuertas = 3;
16      coche1.cuentaKilometros = 215000;
17      coche1.velocidad = 0;
18      coche1.arrancado = false;
19    
20      persona1.sexo = 'F';
21      persona1.nombre = "Marta";
22      persona1.edad = 32;
23      persona1.coche = coche1;
24    
25      persona2.nombre = "Raimundo";
26        
27      System.out.println(coche1.marca);
28      System.out.println(coche1.modelo);
29      System.out.println(coche1.color);
30      System.out.println(coche1.numeroDePuertas);
31      System.out.println(coche1.cuentaKilometros);
32      System.out.println(coche1.velocidad);
33      System.out.println(coche1.arrancado);
34    
35      System.out.println(persona1.sexo);
36      System.out.println(persona1.nombre);
37      System.out.println(persona1.edad);
38      System.out.println(persona1.coche);
39      System.out.println(persona1.coche.marca);
40      System.out.println(persona1.coche.modelo);
41    
42      System.out.println(persona2.sexo);
43      System.out.println(persona2.nombre);
44      System.out.println(persona2.edad);
45      System.out.println(persona2.coche);
46    
47      coche1.arrancar();
48      System.out.println(coche1.arrancado);
49      coche1.acelerar();
50      System.out.println(coche1.velocidad);
51      coche1.acelerar();
52      System.out.println(coche1.velocidad);    
53      coche1.acelerar();
54      System.out.println(coche1.velocidad);    
55      coche1.frenar();
56      System.out.println(coche1.velocidad);    
57      coche1.frenar();
58      System.out.println(coche1.velocidad);    
59      coche1.frenar();
60      System.out.println(coche1.velocidad);
61      coche1.parar();
62      System.out.println(coche1.arrancado);
63      coche1.pitar();
64      coche1.consultarCuentaKilometros();
65    
66      persona1.saludar();
67      persona1.obtenerEdad();
68      persona2.saludar();
69      persona2.obtenerEdad();
70      persona1.dormir();
71      persona2.dormir();  
72    
73    }
74  }

Si no has modificado las clases y ya tienes los respectivos ficheros .class generados, sólo necesitarás compilar el nuevo fichero:

javac ProbandoClases.java

En caso contrario, si tienes que compilar todo, puedes proceder así:

javac *.java

Para ejecutar el programa, basta con invocar la máquina virtual Java facilitando el nombre de la clase que contiene al método main():

java ProbandoClases

Esta es la salida generada, numerada por mí también para seguir mejor la explicación:

1  Seat
2  Panda
3  Beige
4  3
5  215000
6  0
7  false
8  F
9  Marta
10  32
11  Coche@8814e9
12  Seat
13  Panda
14
15  Raimundo
16  0
17  null
18  true
19  1
20  2
21  3
22  2
23  1
24  0
25  false
26  Piiiiiiiiiiiiiiiiii
27  Hola, me llamo Marta
28      32
29  Hola, me llamo Raimundo
30      0
31  Zzzzzzzzzzz
32  Zzzzzzzzzzz

En las líneas 7-9 del programa nos ocupamos de la creación de los tres objetos con los que trabajaremos, un coche y dos personas. Observa cómo, en la misma instrucción, declaramos cada objeto y lo creamos.

Establecemos valores para los atributos de estos objetos en las líneas 12-25. Al contrario de lo que sucede con persona1, a quien le hemos definido todos sus atributos, persona2 sólo recibe valor (por nuestra parte) del nombre.

En 27-45 realizamos una impresión de todos los atributos de los tres objetos. Podemos observarlo en las salidas 1-17. Merece la pena prestar atención a algunos detalles:

En un momento dado (línea 38 del programa) tratamos de imprimir el valor de persona1.coche. Ese atributo, si prestas atención a la definición de la clase, es de tipo Coche, es decir, es un objeto en sí mismo. Por eso la respuesta rara que obtenemos en la impresión (línea 11), que en verdad es algo así como una referencia a la ubicación del objeto. Podemos tratar de profundizar en ese objeto si deseamos conocer sus atributos. Es precisamente lo que hacemos en las líneas 39-40, obteniendo la respuesta 12-13 en la salida. Presta mucha atención a la doble notación punto para preguntar por el atributo de un atributo.

Entre las líneas 42-45 preguntamos por los atributos de persona2, a la que sólo hemos facilitado su nombre. Sin embargo, Java ya ha hecho algo por nosotros.

Cada vez que se construye un nuevo objeto se invoca a un método especial que tienen todas las clases que se denomina el constructor que presentaremos formalmente en otro artículo. Entre sus funciones se encuentra la de inicializar todos los atributos del objeto. El constructor, cuando está definido explícitamente, suele incorporar en forma de argumentos valores con los que inicializar los miembros. La cuestión es que, si no hay una inicialización explícita en ese constructor, Java se ocupará de suministrar valores iniciales por su cuenta. Ese valor dependerá del tipo de variable. Por ejemplo, si es numérico le asignará el valor cero; si es un booleano, false, si es de tipo char, el carácter nulo (línea 14 de la salida, devuelta en blanco, en respuesta a la línea 42 del código) y si es un objeto (categoría entre la que se encuentran las cadenas de caracteres también), le asignará el valor null (línea 17 de la salida, en respuesta a la línea 45 del código), que es un modo que tiene Java de decirnos que es un objeto inexistente o indefinido.

A partir de la línea 47 comenzamos a probar los métodos de los objetos.

Arrancamos coche1, lo que ocasiona, si revisas el código de la clase, que la variable arrancado se establezca en true, hecho que comprobamos por medio de la línea 48, obteniendo la salida 18.

En las líneas siguientes jugamos a acelerar y a frenar el coche. Observa las salidas 19-24, en las que, después de acelerar gradualmente (incrementando en uno la velocidad) frenamos para volver a dejar el coche con velocidad cero.

Detenemos el motor del vehículo (línea 61) y hacemos sonar su claxon (línea 63, salida 26).

En las líneas de código 27-30 pedimos a persona1 y persona2 que se presenten y nos digan su nombre y edad. Observa que el método obtenerEdad() devuelve un valor numérico, al contrario de los restantes, que no retornan nada (void), de modo que para poder saber de qué valor se trata, obtenerEdad() ha de formar parte de una expresión imprimible (líneas 67 y 69).

Yo estoy cansado de tanto escribir y Marta y Raimundo de que haga el tonto con ellos. De modo que todo el mundo a dormir (líneas 70-71, salidas 31-32).

Javier Montero Gabarró


Java: Un programa para probar las clases


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta


Índice completo de artículos sobre Java.

La tirada larga del fin de semana

Solemos denominar tirada larga a cualquier salida mayor en tiempo o distancia que el entrenamiento típico. Es normal reservarla para el fin de semana, pues en esos días, al menos hipotéticamente, tenemos más tiempo para poder corretear por calles y caminos a nuestras anchas.

Es común encontrar el término en el contexto de la preparación de un maratón o medio maratón. No es normal entrenar la máxima distancia (42 o 21 Km) y a lo largo de la semana se reparten entrenamientos diversos relativamente cortos, haciendo uno especial, la tirada larga, cubriendo una mayor longitud, pero aún inferior al objetivo, que se reserva sólo para el día de la prueba.

En cualquier caso, el adjetivo larga es subjetivo y podrá significar, según para quién, 30, 15, 7 o incluso 3 Km. Lo que es indudable, en cambio, es que siempre será un entrenamiento excepcional, un desafío, más tiempo y kilómetros que lo habitual.

Mis tiradas largas no son demasiado ambiciosas y me gusta realizarlas a lo que denomino ritmo de crucero, esa velocidad que me permite correr durante mucho tiempo sin sensación de cansancio. Es un ritmo aeróbico en el que la mayor parte de la energia la aporta la combustión de las grasas.

En la práctica, aunque vaya sobrado de pulmón y corazón y crea que podría estar corriendo eternamente, suelen ser las rodillas, tobillos, o las plantas de los pies, los que imponen los límites.

Me gusta realizar la tirada larga como primera actividad del día, nada más me despierto y en ayunas. Me he acostumbrado a eso y mi cuerpo parece encajarlo bien. Después de todo, pese a que voy a estar más tiempo corriendo, lo haré a un ritmo aeróbico poco exigente.

Y la mañana nublada y fresquita de hoy era absolutamente propicia: 15,05 Km; 1h 32′; 6:07/Km; 1220 Kcal.

Javier Montero Gabarró


http://elclubdelautodidacta.es/wp/2013/05/la-tirada-larga-del-fin-de-semana/


Puedes consultar el índice completo de artículos pertenecientes a la categoría running.


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta

Motivación y Productividad: Diarios de Acción

Quisiera compartir contigo una metodología que me ayuda a estar motivado y a ser más productivo en mis diversas áreas de interés. Como incansable estructurador, me gusta poner nombre a todo y la he bautizado como los Diarios de Acción.

No cuento nada nuevo que probablemente no haya pasado por tu cabeza ya antes, pero el mero hecho de pararte a estructurar y sistematizar unos patrones de comportamiento puede ser inspirador de cambios importantes.

Con los Diarios de Acción no sólo encuentro divertidísimo producir, en el sentido más general y multidisciplinar de la palabra, sino que además mantengo a raya la ansiedad característica de quien tiene mil tareas por hacer y no sabe por dónde empezar.

El nombre del método resume la idea principal: mantén diarios (en plural) de tus actos.

Escribe un diario de cada una de las áreas de actividad en que te halles involucrado. Esto es muy importante: para lograr la transferencia de pasión de la que hablaba en el artículo Polifacetismo y Productividad, es necesario que desarrolles una capacidad de abstracción que casi permita creerte, cuando estés inmerso en alguna faceta específica (lo que yo denomino modo), que es la única existente en tu vida. Si, por ejemplo, estoy en modo Python, durante todo el tiempo que permanezco en él, sean veinte minutos o dos horas, no existe otra cosa para mí y tengo la plena sensación de que no he hecho otra cosa en mi vida más que programar en Python. Un diario único no me permitiría lograr ese nivel de abstracción.

Cuando al genial Alekhine, campeón del mundo de ajedrez, le preguntaron cómo era capaz de jugar partidas a ciegas (sin ver la piezas) simultáneamente contra varios rivales, contestó que en su mente ideaba una especie de archivador en el que cada cajón representaba una única partida. Una vez movía pieza, cerraba un cajón y abría otro diferente, concentrándose en él como si los demás no existieran.

Cuando cambio de modo, una simple lectura de su diario me sitúa rápidamente en contexto, me permite conocer dónde lo dejé la última vez y, sobre todo, cambia mi estado mental.

Escribe en él tu visión, tus objetivos, pero, fundamentalmente, que sea un diario de acción en el que figuren los pasos concretos que llevas a cabo día a día para alcanzar tus metas.

Cuenta una historia bonita y emotiva, haz que su lectura sea inspiradora y te dé fuerzas para continuar avanzando. Actúa, trabaja con pasión y que escribir en el diario sea un premio por cada tarea individual que realices.

Sé fiel a su escritura y, a no ser que no te sea posible en ese momento, documenta los hechos tan pronto sucedan o tengas noticias de ellos. Es fácil sucumbir a la tentación de dejarlo al final cuando otras tareas revolotean inquietando tu mente; en esos casos, respira con calma y no te dejes llevar por la ansiedad. Si lo que acabas de realizar es verdaderamente importante, demuéstralo haciéndolo merecedor de tus mejores palabras. Cuida la ortografía y la gramática, escribe sin prisas.

¿Cuántos diarios mantener? ¿Hasta qué nivel de detalle fragmentar nuestro polifacetismo? La respuesta es bastante personal pero, por lo general, que los diarios no sean tan genéricos que te impidan abstraerte plenamente en la actividad, ni tan específicos que sólo los visites de tarde en tarde. Encuentra tú mismo el punto de equilibrio.

Hay muchas herramientas que te pueden ayudar a gestionar estos diarios de acción. Recuerdo que, hace muchos años, cometí la estupidez de comprar más de treinta cuadernos, cada uno dedicado a un único diario. Obviamente, no llegué muy lejos con ellos.

Lo ideal es utilizar aplicaciones como Dropbox, Google Drive o Evernote, que permiten acceder a tus documentos y notas desde cualquier ordenador, incluso desde el propio móvil. En particular, para este cometido, estoy usando ahora la última por su extraordinaria agilidad para moverse entre notas y pasar de un diario a otro en apenas un par de segundos.

Te invito a que, si no estás haciendo ya algo semejante, pruebes el método durante un tiempo y juzgues por ti mismo si te ayuda a motivarte y ser más productivo sin estrés. Si te animas, recuerda ser cuidadoso y disfrutar con cada entrada que plasmes. Después de todo, son los diarios de tu vida, testimonio de tu paso por el mundo.

Javier Montero Gabarró


Motivación y Productividad: Diarios de Acción


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta


Índice completo de los artículos de la categoría Productividad.

Python: El producto cartesiano

Objetivo: mostrar una técnica eficiente para determinar el producto cartesiano de dos conjuntos empleando listas por comprensión.

Imagina que entre la equipación deportiva que incluye tu armario figuran camisetas de cuatro colores: blanco, verde, azul y amarillo. Dispones, además, de tres tipos de pantalones: largo, medio y corto.

¿De cuántas maneras distintas podrías vestirte para salir a correr?

La respuesta la facilita el concepto de producto cartesiano, que con certeza estudiaste en los primeros cursos de matemáticas. Un breve repaso…

Sean dos conjuntos independientes A y B, al conjunto de todas las agrupaciones posibles que se forman tomando un elemento de A y otro de B, se le denomina producto cartesiano de A y B y se denota como A x B.

Además, el número de elementos de que consta A x B es el número de elementos de A multiplicado por el número de elementos de B.

Para referirnos al número de elementos de un conjunto recurrimos al término cardinal, de modo que:

card(A x B) = card(A) x card(B)

Este concepto es extensible a más de dos conjuntos: el cardinal del producto cartesiano de varios conjuntos es el producto de los cardinales individuales.

En nuestro ejemplo, si tenemos cuatro tipos de camisetas y tres de pantalones, dispondremos de 12 maneras diferentes de vestirnos.

Nuestra labor pythonesca va a ser listar todos estos pares y para ello recurriremos a la técnica de las listas por comprensión que presentamos en los últimos artículos y que ahora refinaremos de un modo particular.

Comencemos definiendo las estructuras:

>>> camisetas = {'blanca', 'verde', 'azul', 'amarilla'}
>>> pantalones = {'largo', 'medio', 'corto'} 

He elegido conjuntos por mayor similitud conceptual, pero, naturalmente, puedes emplear cualquier tipo de secuencia como las listas o las tuplas.

Creemos nuestra lista por comprensión:

1) Recorremos el iterable:

for c in camisetas for p in pantalones

Esta es el punto crítico al que quería llegar. En las listas por comprensión podemos anidar tantos for como deseemos.

2) A la izquierda de lo anterior escribimos lo que deseamos obtener:

(c, p) for c in camisetas for p in pantalones

He optado por agrupar cada par en una tupla.

3) A la derecha del todo escribimos la condición de filtrado.

En este ejemplo no hay ninguna, por lo que no es aplicable.

4) Rodeamos toda la expresión entre llaves y ya tenemos creada la lista por comprensión.

>>> [(c, p) for c in camisetas for p in pantalones]
[('verde', 'corto'), ('verde', 'medio'), ('verde', 'largo'), 
('amarilla', 'corto'), ('amarilla', 'medio'), ('amarilla', 'largo'), 
('azul', 'corto'), ('azul', 'medio'), ('azul', 'largo'), 
('blanca', 'corto'), ('blanca', 'medio'), ('blanca', 'largo')]

Programar con eficacia y eficiencia supone armarse con una buena colección de usos típicos para resolver problemas frecuentes, como por ejemplo hallar el producto cartesiano. Las listas por comprensión, sin duda, figurarán en muchos de esos usos.

Javier Montero Gabarró


Python: El producto cartesiano


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta


Consulta el índice completo de artículos relacionados con Python.

Armonización de la escala mayor – 5

Objetivo: mostrar ejemplos prácticos del cálculo de la familia de acordes tríada diatónicos.

Hemos llegado a una importante conclusión: en una tonalidad mayor cualquiera la familia de acordes tríadas diatónicos, es decir, los acordes de tres notas que nos aparecen utilizando los grados de la escala, responde a la siguiente estructura:

I – IIm – IIIm – IV – V – VIm – VIIº

O bien, empleando minúsculas para los acordes menores:

I – ii – iii – IV – V – vi – viiº

Memorizando esta relación y conociendo cómo se construye la escala mayor, es prácticamente inmediata la deducción de acordes diatónicos en cualquier tonalidad. Veamos algunos ejemplos.

Supongamos que quiero componer una canción en Re mayor, ¿qué acordes tríada inmediatos tengo a mi disposición?

Comenzamos construyendo la escala de Re mayor:

Re mayor: D – E – F# – G – A – B – C# – D

De modo que los acordes buscados son:

D – Em – F#m – G – A – Bm – C#º

No hay más misterio, así de sencillo.

Otro ejemplo: deduzcamos los acordes diatónicos de Fa mayor.

Fa mayor: F – G – A – Bb – C – D – E – F

F – Gm – Am – Bb – C – Dm – Eº

A veces las preguntas pueden tomar formas distintas…

Has compuesto una canción para tu banda en Mi bemol mayor y el bajista te pregunta si el Do es mayor o menor.

Construímos la escala de Mi bemol mayor:

Mi bemol mayor: Eb – F – G – Ab – Bb – C – D – Eb

De modo que los acordes diatónicos son:

Eb – Fm – Gm – Ab – Bb – Cm – Dº

Contéstale al bajista que el acorde es Do menor; que cuide la tercera en su groove sobre ese acorde. Recomiéndale también que estudie algo de armonía.

En la siguiente entrega extenderemos nuestra querida familia de acordes diatónicos deduciendo las tétradas o cuatríadas, acordes de cuatro notas. Eso ampliará tu abanico de opciones ofreciéndote la posibilidad de enriquecer y dar otro colorido a tus creaciones.

Javier Montero Gabarró


http://elclubdelautodidacta.es/wp/2013/05/armonizacion-de-la-escala-mayor-5/


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta


Índice de todos los artículos de armonía.

Inserción de documentos PDF en LaTeX

Objetivo: aprender a insertar documentos PDF en nuestros ficheros creados en \LaTeX.

Con frecuencia puede resultarnos conveniente la posibilidad de insertar otros ficheros externos en la estructura de un documento que creemos empleando \LaTeX. El formato de salida más frecuéntemente elegido a la hora de compilar un fichero .tex es PDF, de modo que parece natural que \LaTeX pueda trabajar sin excesiva dificultad con otros ficheros creados en ese formato.

Para poder agregar otros archivos PDF a nuestro documento necesitamos hacer uso del paquete pdfpages:

\usepackage{pdfpages}

Esa es la magia de \LaTeX que una y otra vez me fascina: su capacidad para realizar tareas sorprendentes ampliando su funcionalidad mediante el uso de paquetes.

Los PDF que insertemos no tienen que ser necesariamente generados en \LaTeX; todos sirven.

En el punto del documento en el que deseemos que se realice la inserción utilizamos el comando:

\includepdf[pages=inicial-final]{nombre_del_documento}

Si el punto de inserción está en mitad de una página, \LaTeX forzará un salto de página llegado ese punto para que el PDF se agregue al comienzo de una nueva.

Observa que el primer parámetro es opcional (escrito entre corchetes). Si lo omites sólo se agregará la primera página del PDF.

El rango de páginas se indica mediante dos cifras separadas por un guión.

Por ejemplo:

[pages=3-7] Agrega sólo las páginas comprendidas entre la 3 y 7, ambas incluidas.

Si no especificamos un valor inicial \LaTeX asumirá que quieres insertar desde el principio:

[pages=-10] Agrega desde el comienzo hasta la página 10.

Del mismo modo, si no indicamos un valor final sobreentederá que es hasta el final del documento:

[pages=5-] Agrega desde la página 5 hasta la última.

Si queremos que se inserte el documento completo, omitimos los valores inicial y final, pero aún así debemos incluir el guión:

[pages=-] Agrega el documento completo, de principio a fin.

El parámetro obligatorio, el nombre del fichero, se indica entre llaves. Puedes omitir, si lo deseas, la extensión, pues se da por supuesto que estamos lidiando con PDFs.

Eso sí, si el PDF no está en el mismo directorio que el .tex asegúrate de incluir también la ruta (absoluta o relativa). Presta mucha atención y, aunque estés trabajando en una máquina Windows, usa como separador de directorio la barra al estilo Unix, /, y no \, pues esta última es un símbolo reservado de \LaTeX (el indicador de comando).

Veamos algunos ejemplos:

\includepdf{comparativa}

Agrega la primera página del fichero comparativa.pdf.

\includepdf[pages=25-27]{comparativa}

Inserta las páginas 25, 26 y 27 del fichero comparativa.pdf.

\includepdf[pages=-]{running/clasificacion}

Inserta la totalidad del documento clasificacion.pdf, almacenado en el directorio running, presente en la misma carpeta que el fichero .tex.

He esbozado aquí un uso básico de pdfpages, aunque, por lo general, suficiente en la mayor parte de las ocasiones. No obstante, hay muchas más cosas que el paquete puede hacer y te invito a consultar su documentación si deseas conocerlas.

Incluye pdfpages en tu kit de recursos. Disfruta de su potencia y eleva a un nuevo nivel la calidad de los documentos que generes en \LaTeX.

Javier Montero Gabarró


Inserción de documentos PDF en LaTeX


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta


Índice completo de artículos relacionados con \LaTeX.

Java: El concepto de objeto

lasecreObjetivo: comprender el concepto de Objeto, diferenciándolo del de Clase y presentar la notación punto.

Una vez hemos entendido el concepto de Clase en el paradigma de la Programación Orientada a Objetos, es momento de matizar que es un Objeto en su sentido más práctico.

Una Clase, como hemos visto, no es más que una especificación que define las características y el comportamiento de un determinado tipo de objetos. Piensa en ella como si se tratara de una plantilla, molde o esquema a partir del cual podremos construir objetos concretos.

Consideremos la clase Coche que definimos en el artículo anterior:

class Coche
{
  String marca;
  String modelo;
  String color;
  int numeroDePuertas;
  int cuentaKilometros;
  int velocidad;
  boolean arrancado;
  
  void arrancar()
  {
    arrancado = true;
  }
  
  void parar()
  {
    arrancado = false;
  }
  
  void acelerar()
  {
    velocidad = velocidad + 1;
  }
  
  void frenar()
  {
    velocidad = velocidad - 1;
  }
  
  void pitar()
  {
    System.out.println("Piiiiiiiiiiiiiiiiii");
  }

  int consultarCuentaKilometros()
  {
    return cuentaKilometros;
  }
}

Con este esquema en nuestras manos, vamos a crear coches concretos de la marca, modelo y color que nos apetezca. Cada uno que creemos será un objeto, o instancia, de la clase Coche. Fíjate, en esta terminología, en la equivalencia de los términos objeto e instancia para referirnos, ahora sí, a entidades concretas de una determinada clase.

Fabriquemos, entonces, nuestro primer coche…

Cada objeto, como todas las variables en Java, ha de ser declarado antes de ser utilizado:

Coche coche1;

Con esta instrucción declaramos la variable coche1 de tipo Coche. En cuanto creemos, con el comando que escribiremos a continuación, el objeto concreto, coche1 contendrá una referencia a ese objeto, es decir, almacenará la dirección de memoria en la que realmente se halla el objeto propiamente dicho. Esto es muy importante: coche1 no contendrá el objeto en sí, sino una dirección de memoria que apunta a él.

Materialicemos nuestro primer coche del siguiente modo:

coche1 = new Coche();

La palabra reservada new se emplea para crear nuevos objetos, instancias de una determinada clase que indicamos a continuación seguida de un par de paréntesis.

Veremos esto a su debido momento, pero por ahora debe bastarte retener que se está invocando a un método especial que tienen todas las clases que sirve para construir el objeto en cuestión facilitándole sus valores iniciales. A este método se le conoce como constructor de la clase.

Podríamos habernos ocupado de la declaración y la creación en una sola instrucción:

Coche coche1 = new Coche();

Otro trasto más contaminando nuestras ciudades. Hagamos, al menos, que no consuma mucho:

coche1.marca = "Seat";
coche1.modelo = "Panda";

Consulta el cuadro de arriba con la definición de la clase y observa que tanto marca como modelo son dos atributos de tipo String, por lo que referencian cadenas de caracteres que escribimos entre comillas.

Observa con cuidado la notación punto. Separamos el nombre de la variable que referencia al objeto del atributo empleando un punto como separador.

Pintemos de azul nuestro flamante vehículo:

coche1.color = "Azul";

Además tiene tres puertas, el cuenta kilómetros indica 250.000 Km (bueno, algo viejo parece que es) y su velocímetro refleja 0 Km/h. Valores correspondientes a los atributos numeroDePuertas, cuentaKilometros y velocidad, respectivamente, todos de tipo entero.

coche1.numeroDePuertas = 3;
coche1.cuentaKilometros = 250000;
coche1.velocidad = 0;

Su motor está detenido, hecho que representamos a través de la variable booleana arrancado:

coche1.arrancado = false;

Cuando nos cansemos de enredar con los atributos podemos jugar con los métodos. Arranquemos el Panda:

coche1.arrancar();

De nuevo, empleamos también la notación punto para separar la variable del método.

Si observas el código verás que este método se limita a hacer que la variable booleana arrancado valga ahora true. Podrías decir que hubiéramos logrado el mismo resultado actuando sobre el atributo directamente, en lugar de invocar al método:

coche1.arrancado = true;

En efecto, es así; pero, como comprenderás más adelante, no suele ser buena idea dejar que los programas campen a sus anchas y modifiquen arbitrariamente los atributos de un objeto, siendo preferible que sean los métodos los que se ocupen de esa labor. Imagina que el programa intenta hacer que el cuenta kilómetros marque una cantidad negativa, o que el número de puertas sea igual a cincuenta. Un método correctamente diseñado podría gestionar que los valores estuvieran dentro del rango adecuado y asegurarse de que se cumplen las condiciones que permitirían la modificación del atributo.

La Programación Orientada a Objetos implementa un mecanismo, denominado encapsulación, que nos permite ocultar determinadas facetas de nuestro objeto y dejar sólo accesibles aquellas partes que nos interesen. Pero vayamos por orden, todo a su momento…

Sigamos jugando con nuestro viejo cacharro azul:

coche1.acelerar();

Lo que provocará, si consultas el código, que el velocímetro incremente en una unidad su valor.

coche1.pitar();

Lo que ocasionará un estridente pitido.

Puedes crear todos los objetos de la clase Coche que desees:

Coche coche2 = new Coche();

Cada uno con su propia colección de atributos:

coche2.marca = "Ford";
coche2.modelo = "Fiesta";
coche2.color = "Negro";

Incluso podrías crear otros Seat Pandas, por supuesto. Aunque, en un instante dado, compartieran los mismos valores en sus atributos, se trataría de objetos distintos, ubicados en direcciones de memoria diferentes y cada uno podría seguir su propia trayectoria vital.

En el próximo artículo aprenderemos a crear un programa que nos permita probar nuestra clase Coche y en el que veremos en acción las líneas de código que hoy hemos esbozado.

Javier Montero Gabarró


Java: El concepto de objeto


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta


Índice completo de artículos sobre Java.

Armonización de la escala mayor – 4

Objetivo: observar que el tipo de acorde que se obtiene al armonizar la escala mayor depende del grado concreto y no de la tonalidad.

En el anterior artículo descubrimos los acordes que aparecían al armonizar la escala de Do mayor:

C – Dm – Em – F – G – Am – B°

Esto es, obtenemos acordes mayores en los grados primero, cuarto y quinto, menores en el segundo, tercero y sexto y disminuido en el séptimo grado.

Voy a plantearte una cuestión que probablemente podrás responder ya. Imagínate que realizamos la misma operación sobre otra escala mayor diferente a Do mayor como, por ejemplo, La mayor. ¿De qué tipo crees que serán los acordes que nos aparecerán?

Todas las escalas mayores comparten una característica común, que es su estructura interválica. Recuerda su fórmula:

T – T – S – T – T – T – S

La distancia que cada grado mantiene respecto al primero (denominado tónica), comparando entre otras escalas mayores, es siempre la misma, tanto si se trata de Do mayor, La mayor o Mi bemol mayor. Es de esperar, por lo tanto, que los acordes que obtengamos al armonizar sean de la misma especie también.

Calculemos los acordes que se derivan de la escala La mayor aplicando la metodología que empleamos para Do mayor.

Si aplicamos la fórmula interválica de la escala mayor partiendo de la nota La (A), obtenemos:

La mayor: A – B – C# – D – E – F# – G# – A

Si armonizamos por terceras nos aparecen los siguientes acordes de tres notas (tríadas):

A –> A – C# – E –> tercera mayor + tercera menor –> A

B –> B – D – F# –> tercera menor + tercera mayor –> Bm

C# –> C# – E – G# –> tercera menor + tercera mayor –> C#m

D –> D – F# – A –> tercera mayor + tercera menor –> D

E –> E – G# – B –> tercera mayor + tercera menor –> E

F# –> F# – A – C# –> tercera menor + tercera mayor –> F#m

G# –> G# – B – D –> tercera menor + tercera menor –> G#°

Comparemos esta nueva familia de acordes con la que obtuvimos de Do mayor:

Do mayor: C – Dm – Em – F – G – Am – B°

La mayor: A – Bm – C#m – D – E – F#m – G#°

Como puedes ver, pese a ser, naturalmente, diferentes, mantienen el tipo, como campeones, grado a grado: mayores sobre el primero, cuarto y quinto, menores sobre el segundo, tercero y sexto, y disminuido sobre el séptimo.

Esta importante conclusión podemos reflejarla así, indicando cada grado por números romanos:

I – IIm – IIIm – IV – V – VIm – VII°

Memorízala bien, pues te ayudará a manejarte con soltura cuando tengas que lidiar con tonalidades distintas.

En muchas publicaciones esta misma relación aparece escrita del siguiente modo:

I – ii – iii – IV – V – vi – vii°

Conviene que te familiarices también con ella.

La diferencia estriba en que los acordes menores los indicamos directamente con el grado escrito en minúsculas, sin necesidad de recurrir al sufijo m. El acorde sobre el séptimo grado también está en minúsculas, pese a que no sea estrictamente menor, pues la distancia entre su fundamental y tercera es una tercera menor, intervalo característico de todos los acordes menores.

Todo lo escrito hasta ahora en esta serie no tenía otra misión sino llegar a la conclusión fundamental que acabamos de deducir, herramienta imprescindible para todo compositor o arreglista. En el próximo artículo realizaremos algunos ejercicios prácticos que ilustrarán su aplicación.

Javier Montero Gabarró


http://elclubdelautodidacta.es/wp/2013/05/armonizacion-de-la-escala-mayor-4/


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta


Índice de todos los artículos de armonía.

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies