Python – Listas por comprensión – 2

Objetivo: presentar la sintaxis extendida de la generación de listas por comprensión en Python.

En el artículo anterior mostramos la elegancia de Python en la forma de las listas por comprensión, mecanismo que nos permitía, con una única instrucción, generar una lista a través de la transformación de los elementos de un iterable.

Vamos a dar un pase adelante y refinemos la creación de esa lista mediante la introducción de un filtro selectivo.

Dado el siguiente listado de alumnos de una clase:

>>> alumnos = ['Ana', 'Luis', 'Pedro', 'Marta', 'Nerea', 'Pablo']

Supongamos que queremos obtener las iniciales de todas las chicas del grupo.

Obtener simplemente las iniciales no debería plantearte mucho problema con las técnicas que ya conoces:

>>> [alumno[0] for alumno in alumnos]
['A', 'L', 'P', 'M', 'N', 'P']

Recorremos la lista alumnos de alumno en alumno y nos quedamos con la primera letra de cada uno (alumno[0]).

Pero, ¿podemos realizar el filtrado de sexo manteniendo la elegancia de las listas por comprensión?

Es preciso recurrir a la sintaxis extendida:

– Comenzamos recorriendo el iterable.

– Escribimos a la izquierda la transformación deseada.

– Escribimos a la derecha la condición de filtrado.

– Encerramos todo el conjunto entre corchetes.

He aquí la solución buscada:

>>> [alumno[0] for alumno in alumnos if alumno[-1] == 'a']
['A', 'M', 'N']

Observa que alumno[-1] representa a la última letra de cada nombre. Naturalmente, nos hemos permitido simplificar el problema presuponiendo que los nombres de mujer son aquellos que terminan en a.

Recuerda que las listas por comprensión no modifican la lista original sino que crean otra nueva.

El primer término no tiene que implicar necesariamente una transformación. Por ejemplo, si en vez de la inicial queremos el nombre completo, podríamos haber procedido así, obviamente:

>>> [alumno for alumno in alumnos if alumno[-1] == 'a']
['Ana', 'Marta', 'Nerea']

Vamos a complicarlo algo más. El siguiente diccionario contiene las calificaciones de esos alumnos:

>>> notas = {'Ana':9, 'Luis':7, 'Pedro':2, 'Marta':5, 'Nerea':4, 'Pablo':6}

Debemos obtener los nombres de todos aquellos que hayan aprobado:

Desglosemos la lista por comprensión en sus tres términos. Comenzamos por el central, correspondiente a la iteración:

for nombre, nota in notas.items()

Fíjate en el uso del método items() para poder iterar simultáneamente sobre las claves y los valores del diccionario.

En el primer término indicamos lo que queremos extraer:

nombre

Y en el tercero realizamos el filtrado:

if nota >= 5

Todo junto, entre corchetes, nos devuelve la lista buscada:

>>> [nombre for nombre, nota in notas.items() if nota >= 5]
['Ana', 'Luis', 'Pablo', 'Marta']

No te costará mucho habituarte a las listas por comprensión. Código limpio y eficiente, ¡Python es esto, quién podría resistirse?

Javier Montero Gabarró


Python – Listas por comprensión – 2


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 – 3

Objetivo: nombrar los acordes tríadas resultado de armonizar por terceras la escala de Do mayor.

En la segunda entrega de la serie aprendimos a deducir los acordes de tres notas (tríadas) que se obtenían al apilar terceras sobre las notas de la escala de Do mayor. En el artículo de hoy nos ocuparemos de ponerles nombre.

Recuperemos, en primer lugar, la tabla que obtuvimos al armonizar Do mayor:

DO: DO – MI – SOL (C – E – G)

RE: RE – FA – LA (D – F – A)

MI: MI – SOL – SI (E – G – B)

FA: FA – LA – DO (F – A – C)

SOL: SOL – SI – RE (G – B – D)

LA: LA – DO – MI (A – C – E)

SI: SI – RE – FA (B – D – F)

Pese a que todos los acordes los hemos obtenido apilando terceras, no todos mantienen la misma distancia entre sus notas (intervalos).

Observa, por ejemplo, el primero, construido sobre la nota DO:

DO – MI – SOL

Entre DO y MI, ¿cuántos semitonos hay? Contemos:

DO#, RE, RE#, MI; 4 semitonos (a la hora de contar semitonos NO incluimos la nota inicial).

Una tercera con una distancia de 4 semitonos se denomina tercera mayor.

Toma ahora el siguiente intervalo de tercera del mismo acorde. Veamos qué distancia hay entre MI y SOL.

FA, FA#, SOL; 3 semitonos

A este tipo de tercera, con una distancia de 3 semitonos, se la conoce como tercera menor.

Podemos concluir, por lo tanto, que el acorde DO – MI – SOL es el resultado de superponer sobre la nota DO una tercera mayor seguida de otra menor.

Analicemos el siguiente acorde de la lista y comprobemos que la situación es la opuesta:

RE – FA – LA

¿Qué distancia hay entre RE y FA?

RE#, MI, FA; 3 semitonos. Entre RE y FA hay una tercera menor.

¿Y entre FA y LA?

FA#, SOL, SOL#, LA; 4 semitonos. Entre FA y LA hay una tercera mayor.

De modo que el acorde RE – FA – LA se obtiene de superponer, sobre la nota RE, una tercera menor seguida de otra mayor.

Justo lo contrario de lo que ocurría en el primer acorde. Es precisamente esa diferencia la que determina el nombre del acorde.

A la hora de apilar terceras nos pueden suceder los siguientes casos:

tercera mayor + tercera menor = acorde mayor
tercera menor + tercera mayor = acorde menor
tercera menor + tercera menor = acorde disminuido
tercera mayor + tercera mayor = acorde aumentado

Naturalmente, cuando usamos la palabra acorde, nos estamos refiriendo al acorde tríada, compuesto de tres notas. Más adelante realizaremos el estudio para las tétradas o cuatríadas.

Con este sencillo esquema podemos ya nombrar cada acorde:

DO: DO – MI – SOL; tercera mayor + tercera menor

Por lo tanto, se trata del acorde Do mayor, que en cifrado moderno se representa por C (la nota fundamental del acorde sin ningún calificativo más).

RE: RE – FA – LA; tercera menor + tercera mayor

Estamos ante RE menor, representado por Dm (la fundamental D, seguida del calificativo m o min).

MI: MI – SOL – SI

Distancia entre MI y SOL, 3 semitonos; distancia entre SOL y SI, cuatro semitonos.

Tercera menor + tercera mayor; acorde menor. Mi menor, Em

FA: FA – LA – DO

Distancia entre FA y LA, 4 semitonos. Entre LA y DO, 3 semitonos.

Tercera mayor + tercera menor; acorde mayor: F

SOL: SOL – SI – RE

Distancia entre SOL y SI, 4 semitonos. Entre SI y RE, 3 semitonos. Acorde mayor, nuevamente: G

LA: LA – DO – MI

Distancia entre LA y DO, 3 semitonos. Entre DO y MI, 4 semitonos. Acorde menor, Am

SI: SI – RE – FA

Distancia entre SI y RE, 3 semitonos. Entre RE y FA, 3 semitonos también.

Tercera menor + tercera menor; acorde disminuido: B dim, o bien,

Ya tenemos nuestra flamante colección de tríadas resultado de armonizar por terceras la escala de Do mayor:

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

Estos son nuestros siete acordes diatónicos buscados. La gran, gran mayoría de las canciones escritas en Do mayor contienen exclusivamente estos acordes. Y si hay alguno ajeno a esta relación suele ser en pinceladas controladas que aportan un toque peculiar a la composición. Date cuenta de que cualquier otro acorde tríada que no sea uno de estos siete contendrá, al menos, una nota no diatónica, es decir, una nota que no pertenecerá a la escala de Do mayor.

En la siguiente entrega analizaremos otra tonalidad cualquiera y generalizaremos las conclusiones.

Javier Montero Gabarró


http://elclubdelautodidacta.es/wp/2013/04/armonizacion-de-la-escala-mayor-3/


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.

Ajedrez y LaTeX: Anotación de una partida

Objetivo: utilización del paquete skak para anotar una partida de ajedrez en LaTeX.

En el anterior artículo de esta serie introdujimos el paquete skak como herramienta para la generación de textos relacionados con el ajedrez en LaTeX y aprendimos a dibujar un sencillo tablero y a colocar las piezas sobre él en su posición original. Hoy moveremos pieza y realizaremos la transcripción de una partida completa.

He elegido como ejemplo un clásico que, sin duda, todo ajedrecista conocerá y que para mí tiene un significado especial, pues es la primera partida que tengo conciencia de haber reproducido de un libro que teníamos en mi casa cuando yo era muy pequeño. El primero de una colección de más de un centenar de libros de ajedrez que le seguirían después.

Lamentablemente, en algún momento debí de perderle el rastro. No sé si se quedó en casa de mis padres o lo cogió mi hermano tras el reparto de libros que hicimos cuando, con nuestras oposiciones recién aprobadas, tuvimos que abandonar el hogar y separarnos más de mil kilómetros el uno del otro para ganarnos la vida.

Pero recuerdo que aquel libro me ayudó a dar mis primeros pasos ajedrecísticos. Con él aprendí a realizar los mates sencillos, las aperturas básicas… Entre la colección de partidas de ejemplo figuraba una especialmente bella y que quedó marcada para siempre en mi memoria.

Me refiero a la mítica partida celebrada en 1858 en París, durante una representación de «El barbero de Sevilla», entre Paul Morphy y dos aficionados locales en consulta, el Dunque de Brunswick y el Conde Isouard.

El paquete skak nos ofrece el comando \mainline para la introducción de la línea principal de la partida. Su nombre nos sugiere la existencia de otro comando específico para la introducción de variantes del que nos ocuparemos próximamente.

Facilitamos, entre llaves, las jugadas de la partida escritas en notación algebraica corta (el libro, naturalmente, empleaba la notación descriptiva; tardamos muchos años en hacer obligatorio en España el sistema algebraico en las competiciones).

Es importante tener en cuenta que las piezas deben ser indicadas en terminología inglesa. Esto es:

K – Rey (King)
Q – Dama (Queen)
R – Torre (Rook)
N – Caballo (Knight)
B – Alfil (Bishop)

Más adelante veremos cómo personalizar la entrada para nuestro idioma.

Por la salida no debemos preocuparnos, pues skak adopta la representación universal basada en figurines popularizada por el Informator.

Que comience el espectáculo:

\mainline{1. e4 e5 2. Nf3 d6}

Asegúrate de que tras el número de cada jugada haya siempre un punto (aunque luego no aparecerá en la salida), de lo contrario no te compilará el código.

Cierra las llaves en el momento que quieras para introducir comentarios o para representar un diagrama con la posición actual empleando \showboard.

\newgame
\mainline{1. e4 e5 2.  Nf3 d6} 

\showboard

La  Defensa Philidor, muy popular en la época.

morphy

Este es el código completo, incluido el preámbulo, de la transcripción de la partida. Observa como, tras cada interrupción, continuamos la línea principal con sucesivos comandos \mainline.

\documentclass{article}
\usepackage[spanish]{babel}
\usepackage[utf8]{inputenc}
\usepackage{parskip}
\usepackage{skak}  

\begin{document}

\textbf{Blancas:} Morphy

\textbf{Negras:} Duque de Brunswick y Conde Isouard

\textit{Paris, 1858}

\newgame
\mainline{1. e4 e5 2. Nf3 d6} 

\showboard

La  Defensa Philidor, muy popular en la época.

\mainline{3. d4 Bg4 4.dxe5 Bxf3 5.Qxf3 dxe5 6.Bc4 Nf6 7.Qb3 Qe7 8.Nc3 c6 9.Bg5 b5}

\showboard

\mainline{10.Nxb5 cxb5 11.Bxb5+ Nbd7 12. O-O-O}

\showboard

\mainline{12... Rd8 13. Rxd7  Rxd7 14. Rd1 Qe6 15. Bxd7+ Nxd7 16. Qb8+ Nxb8 17. Rd8#}

\showboard

Un elegante remate.

\end{document}

Presta atención a cómo hemos continuado la partida tras la jugada 12 del blanco. Observa también el uso de la O mayúscula en vez del cero para el enroque, así como el símbolo # para el jaque mate.

morphy-2

morphy-3

Partidas como esta pueden causar profunda impresión en quien empieza a interesarse por el ajedrez. Poco después llegarían la «Siempreviva» y la «Inmortal», ambas producto del genio combinativo de Anderssen. Una ventana a un mundo mágico se descubría ante mí.

Javier Montero Gabarró


Ajedrez y LaTeX: Anotación de una partida


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.

Armonización de la escala mayor – 2

Objetivo: armonizar la escala de Do mayor y deducir las tríadas diatónicas que se generan.

En el primer artículo de esta serie concluímos que nuestra primera opción a la hora de armonizar una melodía escrita en una tonalidad mayor era emplear acordes diatónicos, es decir, con notas pertenecientes a la propia tonalidad.

Dijimos que la gran mayoría de las composiciones estaban basadas en progresiones de acordes diatónicos, que ocasionalmente se complementaban con otros ajenos que contribuían a darle un carácter peculiar a la creación.

Vamos a descubrir ahora qué acordes son esos, comenzando, en primer lugar, por las estructuras más simples: los acordes de tres notas, las tríadas. Una vez entendidas estas ampliaremos el estudio a los acordes de cuatro notas (cuatríadas o tétradas).

Por sencillez, comenzaremos armonizando la escala diatónica por excelencia, Do mayor. Sus notas se hallan en las teclas blancas de un piano, de modo que no tiene alteraciones (los bemoles o sostenidos que representan las teclas negras). Como veremos, las conclusiones a las que lleguemos armonizando esta escala serán perfectamente aplicables a otras tonalidades mayores.

Tomemos nuestra escala de Do mayor, la secuencia universal

DO – RE – MI – FA – SOL – LA – SI – DO

y construyamos acordes (armonicemos) sobre cada una de esas notas.

La forma más común de armonizar una escala consiste en superponer terceras diatónicas. Existen otros modos más exóticos de hacerlo, pero son mucho menos habituales y no hablaremos de ellos en esta serie.

Superponer terceras no significa otra cosa que ir añadiendo notas que estén a una distancia sucesiva de una tercera una de otra.

[Si no tienes claro el concepto de tercera te sugiero que leas la serie de siete artículos dedicados al cálculo de intervalos, exhaustiva y con numerosos ejemplos prácticos. No obstante, procuraré referir aquí los puntos más esenciales, de modo que puedas seguir avanzando en la lectura aunque no dispongas de esos fundamentos básicos.]

Comencemos por la primera nota de la escala, DO, la tónica.

Para contar una tercera diatónica, contamos secuencialmente tres notas, incluyendo la inicial, y usando sólo notas de esa escala (de ahí la denominación diatónica): DO (1), RE(2), MI(3). La nota buscada es MI.

Agreguemos ahora una nueva tercera a partir de MI: MI(1) – FA(2) – SOL(3); es decir, SOL.

De modo que sobre la primera nota, DO, hemos construido nuestro primer acorde:

DO – MI – SOL

Aunque te anticipo que este acorde se denomina Do mayor, prefiero demorar la nomenclatura hasta que hayamos desglosado la composición de los restantes.

Realicemos la misma operación en las demás notas de la escala. La siguiente tabla resume el cálculo (las notas escritas en mayúsculas resaltan las terceras):

DO: DO – re – MI – fa – SOL —> DO – MI – SOL (C – E – G, en notación anglosajona)

RE: RE – mi – FA – sol – LA —> RE – FA – LA (D – F – A)

MI: MI – fa – SOL – la – SI —> MI – SOL – SI (E – G – B)

FA: FA – sol – LA – si – DO —> FA – LA – DO (F – A – C)

SOL: SOL – la – SI – do – RE —> SOL – SI – RE (G – B – D)

LA: LA – si – DO – re – MI —> LA – DO – MI (A – C – E)

SI: SI – do – RE – mi – FA —> SI – RE – FA (B – D – F)

Asegúrate de que entiendes perfectamente el proceso realizado. Te propongo, como ejercicio, que realices estos mismos cálculos en otras tonalidades. Por ejemplo, toma Fa mayor (F – G – A – Bb – C – D – E – F) y deduce qué notas constituyen los acordes tríadas que aparecen al armonizar.

La siguiente imagen muestra gráficamente la armonización de Do mayor en un pentagrama. Es útil, aunque no conozcas nada de solfeo, visualizar espacialmente esta apilación de notas.

armonizacion-escala-mayor-1

Ya tenemos la composición de cada acorde; ahora tan sólo nos falta nombrarlos adecuadamente. ¿De qué tipo son? ¿Cuáles son mayores y cuáles menores? En breve estaremos en condiciones de responder a estas preguntas.

Javier Montero Gabarró


Armonización de la escala mayor – 2


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.

Python – Listas por comprensión – 1

Objetivo: introducir formalmente una técnica poderosa para la creación y modificación de listas: las listas por comprensión.

En un artículo reciente presentamos varios modos de abordar la necesidad de modificar una lista iterando sobre ella.

Échale un vistazo para situarte en contexto si no lo recuerdas; te llevará apenas un minuto.

Tras presentar las técnicas de modificación con la creación de una nueva lista temporal y mediante el acceso a través del índice, soltamos, a modo de aperitivo, un bombazo en perfecto estilo pythonesco:

>>> lista = [1, 2, 3, 4, 5]
>>> lista = [elemento * elemento for elemento in lista]
>>> lista
[1, 4, 9, 16, 25]

Nos ha bastado una única instrucción para transformar la lista por otra con sus elementos elevados al cuadrado.

Las listas por comprensión no sólo suponen un modo más elegante y rápido de escribir código, sino que además se ejecutan más rápidamente también, al estar implementadas directamente en lenguaje C.

Supongamos que tenemos una lista compuesta de cadenas de caracteres que queremos transformar en mayúsculas:

>>> alioli = ['ajo', 'aceite']

Para generar la lista por comprensión procedemos del siguiente modo:

1) Escribimos una iteración que recorra la lista:

for s in alioli

2) Agregamos a la izquierda lo que queremos que suceda con cada elemento:

s.upper() for s in alioli

3) Finalmente, rodeamos toda la expresión entre corchetes:

[s.upper() for s in alioli]

Observémoslo en acción:

>>> [s.upper() for s in alioli]
['AJO', 'ACEITE']

Es muy importante comprender que este procedimiento no modifica la lista original, que mantiene su valor.

>>> alioli
['ajo', 'aceite']

Se ha creado, por el contrario, un nuevo objeto lista que podría ser referenciado por cualquier otra variable.

Por supuesto, si lo que deseábamos era transformar la lista original podríamos haber hecho directamente la siguiente asignación:

>>> alioli = [s.upper() for s in alioli]

Ahora sí: alioli está referenciando la nueva lista por comprensión generada en lugar de la antigua:

>>> alioli
['AJO', 'ACEITE']

Una señora salsa en mayúsculas…

La iteración podemos realizarla sobre cualquier estructura susceptible de ser iterada, no necesariamente sobre una lista.

El siguiente ejemplo toma una cadena de caracteres y construye una lista con el código de cada carácter individual de la cadena:

>>> s = 'Me tomaría ahora una buena ración de papas al alioli'
>>> codigos = [ord(caracter) for caracter in s]
>>> codigos
[77, 101, 32, 116, 111, 109, 97, 114, 237, 97, 32, 97, 104, 111, 
114, 97, 32, 117, 110, 97, 32, 98, 117, 101, 110, 97, 32, 114, 
97, 99, 105, 243, 110, 32, 100, 101, 32, 112, 97, 112, 97, 115, 
32, 97, 108, 32, 97, 108, 105, 111, 108, 105]

Como ejercicio te propongo que realices la misma operación empleando la metodología tradicional.

Me ha entrado mucha hambre escribiendo esto, de modo que continuaremos hablando otro día de las listas por comprensión y presentaremos una nueva sintaxis ampliada que las hará más potentes aún.

Javier Montero Gabarró


Python – Listas por comprensión – 1


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 – 1

Objetivo: presentar la serie dedicada a la armonización de la escala mayor y entender el concepto de acorde diatónico.

En la vida de todo músico, particularmente si se tiene interés en la composición, hay un hito formativo que marca un claro antes y después: el conocimiento de la armonización de la escala mayor.

Recuerdo mis primeros pinitos en la guitarra tratando de descubrir los acordes de las canciones que me gustaban. En buena parte se trataba de una cuestión de ensayo y error entre todos los acordes que me conocía hasta que encontraba alguno que parecía atinar.

Mis primeras composiciones también eran un tanto caóticas. Mezclaba acordes sin ton ni son y trataba de encontrar melodías que se ajustaran a ellos. Mis únicas guías eran la intuición y ver cómo lo hacían otros y, aunque en música la intuición es siempre la mejor de las guías, tener cierta conciencia de lo que uno está haciendo facilita las cosas y puede ayudarte en el proceso creativo.

Tal vez te hayas planteado en alguna ocasión cuestiones como estas:

«Quiero escribir una canción en Sol menor, ¿qué acordes puedo utilizar?»

«Estando en la tonalidad de Fa mayor, ¿puedo usar un acorde de La mayor?»

Estas preguntas tienen truco, desde luego… En música puedes usar las notas y acordes que te dé la gana. El gran músico y profesor Jamie Aebersold solía decir que no hay notas equivocadas, sólo pobres elecciones. Lo cierto es que debes hacerte responsable de tus decisiones y, hasta cierto punto, del efecto que estas provoquen en quien te escuche.

El hecho de optar por una tonalidad concreta ya lleva implícito un conjunto de notas «seguras» sobre las que nos apoyaremos para construir la melodía y armonía. Son seguras en el sentido de que son las que nuestros oídos, educados durante tanto tiempo en nuestro sistema tonal occidental, aceptarán sin discusión.

Si, por ejemplo, vamos a componer una canción en Fa mayor, esas notas seguras no son otras sino las que corresponden a la escala del mismo nombre:

Fa mayor: Fa – Sol – La – Si bemol – Do – Re – Mi – Fa

[Si no sabes construir esta escala, permíteme que te sugiera la lectura del artículo del blog en el que explico cómo construir la escala mayor en cualquier tonalidad.]

De entre las doce notas existentes en nuestro sistema musical, hemos elegido un subconjunto de siete concretas. Una melodía escrita en Fa mayor está centrada en una nota principal, Fa, denominada la tónica, alrededor de la cual bailan las restantes de la escala.

¿Qué acordes debo utilizar, por lo tanto, si quiero armonizar una melodía escrita en Fa mayor?

La respuesta es muy sencilla: aquellos que están compuestos de notas que pertenecen a la escala de Fa mayor.

La mayoría de nuestra música occidental está escrita así, empleando una escala diatónica de 7 notas armonizada por acordes derivados de la misma escala.

Estos acordes, a los que nos referiremos de ahora en adelante como diatónicos, son los que funcionan, la apuesta segura si queremos que nuestra música sea aceptada con facilidad.

Ahora bien, limitar la creación musical a únicamente el empleo de escalas y acordes diatónicos es ponerle rejas a nuestra creatividad. Como niños desobedientes, nos gusta desafiar al sistema tonal introduciendo notas y acordes non gratos en nuestras melodías y armonías. Eso nos hace sentirnos más libres (aunque, en el fondo, sigamos siendo prisioneros) y nuestras composiciones pueden resultar más interesantes.

Hace mucho que no escribo una canción con acordes completamente diatónicos (aunque siempre supone un buen reto hacerlo) y, camuflado entre la mafia de acordes de la tonalidad, suelo colar algún que otro infiltrado, buscando hacer sentir algo especial al oyente.

A lo largo de la serie de Armonía del blog aprenderemos algunas categorías de acordes no diatónicos que podemos infiltrar fácilmente y que, con el paso del tiempo, han sabido ganarse ya el respeto de nuestros oídos y son aceptados como si fueran de la familia. Pero antes de eso has de invertir tiempo conociendo el universo diatónico.

De modo que tu primera labor como compositor no es otra sino conocer cuáles son esos acordes diatónicos pues, a no ser que tires por otros derroteros, como por ejemplo la música atonal, constituirán la gran mayoría de los acordes que utilizarás en tus creaciones. De ellos hablaremos precisamente en la saga de artículos que hoy comienza.

Antes de aprender qué acordes son esos, conviene que te familiarices con el ejercicio inverso y realices algunos ejercicios como los siguientes:

– Estando en la tonalidad de Fa mayor, ¿puedo usar el acorde La mayor?

Ya hemos visto que la pregunta, tal como está planteada, es poco afortunada, de modo que replanteémosla:

¿Es el acorde La mayor diatónico de la tonalidad de Fa mayor?

Para responder a esa pregunta basta con descomponer el acorde La mayor en sus notas simples y comprobar si pertenecen a la escala Fa mayor, es decir, a la escala

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

El acorde tríada La mayor es:

La mayor: A – C# – E

Como ves, la tercera del acorde, C# no forma parte de la escala. Por lo tanto La mayor no es un acorde diatónico en esa tonalidad.

Sin embargo, La menor (A – C – E) sí que lo sería. En un tema escrito en Fa mayor el acorde La menor siempre sonará de perlas.

[Si no sabes descomponer un acorde en sus notas constituyentes, puedes echarle un vistazo a la serie Construcción de acordes, en la que se desgrana cada tipo de acorde, desde los más simples como las tríadas hasta los más complejos con cinco o más notas.]

– En la tonalidad de Do mayor, ¿es Fmaj7 un acorde diatónico?

La escala:

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

El acorde:

Fmaj7: F – A – C – E

Todas sus notas están incluidas en la escala de Do mayor, de modo que le ponemos la pegatina con el visto bueno.

En cambio, un acorde de séptima, F7, ya no lo sería, pues incorpora un Eb en lugar de E.

Ejercítate tú mismo con otras escalas y acordes.

En el próximo artículo descubriremos qué acordes, en su versión más simple, las tríadas, son los diatónicos de Do mayor (la más fácil de las escalas mayores) y extraeremos conclusiones extrapolables al resto de las tonalidades mayores.

Javier Montero Gabarró


http://elclubdelautodidacta.es/wp/2013/04/armonizacion-de-la-escala-mayor-1/


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: El concepto de clase

lasecreObjetivo: presentar el concepto de clase, pilar sobre el que está construido todo el paradigma de la programación orientada a objetos.

Voy a proponerte un sencillo juego. Sal a la calle, mira a tu alrededor y contempla el mundo de un modo particular.

Veo veo… ¿Qué ves?
Una cosita… ¿Y qué cosita es?

Para empezar, quiero que identifiques qué tipos de objetos ves…

Puedes, por ejemplo, encontrarte coches, bares, semáforos o personas, por citar sólo unos cuantos tipos. Date cuenta de que, cuando digo tipos de objetos, hablo de un modo conceptual y general. Si te resulta chocante referirte a una persona como un objeto, prueba a sustituir la expresión por tipos de entidades, en su lugar.

Tipo y clase son dos términos sinónimos, de modo que vamos a cambiar «tipos de objetos» por «clases de objetos», aproximándonos un poco más al concepto que da pie al artículo de hoy.

¿Qué clases de objetos vemos? Coches, bares, semáforos, personas…

La siguiente transformación lingüística consiste en simplificar clases de objetos por simplemente clases:

¿Qué clases vemos? Coches, bares, semáforos, personas…

Y ahora sí, nos sumergimos plenamente en la terminología de la programación orientada a objetos:

Tenemos la clase Coche, la clase Bar, la clase Semáforo, la clase Persona

Poco interesan ahora los detalles concretos. No importa si esa persona es Marta, está en el bar «Casa Manolo», si tiene un Seat Panda o si el semáforo está en rojo. Estamos pensando en términos clasificatorios.

Vamos a adentrarnos ahora en el interior de cada una de estas clases.

¿Cómo son los coches? ¿Qué características pueden diferenciar uno de otro?

Por ejemplo, podríamos indicar la marca, el modelo, el color, la cilindrada, etc.

A las características las vamos a denominar atributos, término muy utilizado en la programación orientada a objetos.

¿Qué atributos tiene la clase Bar?

Todo bar tiene un nombre, una ubicación, un estado (si está abierto o cerrado), una lista de precios,…

Como atributos de la clase Semáforo podríamos indicar su ubicación y estado (rojo, verde o ámbar).

La clase Persona podría definir como atributos el nombre, sexo, edad, estado civil, altura, etc.

A continuación pensemos en el comportamiento de estas clases. Preguntémonos qué cosas hacen, qué tipo de acciones pueden realizar.

Un coche puede arrancar, detenerse, girar a la izquierda, acelerar, frenar, encender sus luces. Un semáforo puede cambiar de estado. Un bar puede abrir, cerrar, servirte una cerveza, cobrarla, modificar la lista de precios. Una persona puede hablar, dormir, conducir un coche, tomarse una cerveza en un bar.

En terminología de la programación orientada a objetos, a estas funciones que determinan el comportamiento de una clase se las conoce como métodos.

Sabemos lo que es una clase y que está compuesta de atributos y métodos. Nuestra labor ahora consistirá en modelar en Java estas clases.

Modelar no es otra cosa sino crear una abstracción que represente de algún modo una determinada realidad.

Para crear en Java la clase Coche procederíamos del siguiente modo:

class Coche
{
}

Entre las llaves introduciremos los atributos y métodos de que consta la clase. Observa el uso de la palabra reservada class.

El nombre Coche lo escribimos con la primera letra en mayúsculas, pues es de común acuerdo entre los programadores en Java que los nombres de clases empiecen así.

Introduzcamos algunos atributos:

class Coche
{
  String marca;
  String modelo;
  String color;
  int numeroDePuertas;
  int cuentaKilometros;
  int velocidad;
  boolean arrancado;
}

Declarar atributos es algo similar a declarar una variable normal. El nombre del atributo se precede por su tipo. Así, en el ejemplo, tenemos tres atributos de tipo String que contendrán cadenas de caracteres; otros tres de tipo int para almacenar valores enteros; finalmente, el atributo arrancado, que utilizaremos para indicar si el coche está en marcha o no, es de tipo boolean, admitiendo como posibles valores true o false.

Los tipos int y boolean forman parte de los tipos básicos de Java, conocidos como tipos primitivos. Los presentaremos formalmente a su debido momento; por ahora es suficiente con que conozcas su existencia y cómo los utilizamos.

El tipo String, que escribimos con la primera letra en mayúsculas (lo que debería darte una pista), no es más que otra clase, como lo son las clases Coche y Persona. Es una clase muy importante en Java que encapsula un buen conjunto de métodos para trabajar con cadenas de caracteres.

El concepto importante que debes entender es que los atributos no necesariamente son siempre de tipos básicos, sino que también pueden ser de cualquier clase, incluso de una propia que nosotros mismos hayamos creado.

Por ejemplo, podríamos definir un nuevo atributo de la clase Coche, llamado conductor, en el que figure la persona (de tipo Persona) que lo conduce:

Persona conductor;

Fíjate también en la convención utilizada para nombres de variables compuestos de varias palabras. Se escriben todas juntas, pero iniciando cada palabra en mayúsculas, a excepción de la primera. Esto forma parte también del estilo de escritura Java. Es opcional, naturalmente.

Eso sí, ten siempre presente que Java distingue mayúsculas de minúsculas. No es lo mismo numeroDePuertas que numerodepuertas.

Definamos ahora los métodos de la clase Coche:


class Coche
{
  String marca;
  String modelo;
  String color;
  int numeroDePuertas;
  int cuentaKilometros;
  int velocidad;
  boolean arrancado;
  
  void arrancar()
  {
  }
  
  void parar()
  {
  }
  
  void acelerar()
  {
  }
  
  void frenar()
  {
  }

  void pitar()
  {
  }

  int consultarCuentaKilometros()
  {
  }
}

Vamos a comentar esto con cuidado…

El nombre de método viene seguido por un par de paréntesis, pues en ocasiones los métodos podrán recibir argumentos que luego se utilizarán en el cuerpo del método. Aunque el método no requiera argumentos los paréntesis son absolutamente necesarios.

Por otro lado, el nombre del método va precedido por el tipo del valor que devuelve. Hay que indicarlo incluso si el método no devuelve explicitamente ningún valor. Ese caso se indica con el tipo void.

Entre el par de llaves { } introduciremos el cuerpo del método, las instrucciones que indican su operatividad.

Escribamos algo de código básico en cada uno de ellos:

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;
  }
}

Es prácticamente autoexplicativo: los métodos arrancar() y parar() establecen el atributo booleano arrancado a true y false, respectivamente. Los métodos acelerar() y frenar() incrementan y decrementan en una unidad, respectivamente, el atributo velocidad. El método pitar() imprime en consola una cadena de caracteres. El método consultarCuentaKilometros() devuelve a quien lo invoca (fíjate en el return) lo que contiene el atributo cuentaKilometros. Observa que es el único que devuelve explícitamente un valor (de tipo entero); los restantes, aunque algunos modifican los atributos de la misma clase, no devuelven ningún valor a quien los llama.

Podríamos modelar la clase Persona del siguiente modo:

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

Fíjate que uno de los atributos es precisamente de la clase Coche que acabamos de definir:

Coche coche;

No confundas el nombre del atributo (coche, en minúsculas), con el nombre de la clase (Coche, con la primera en mayúsculas). Recuerda, nuevamente, que para Java son identificadore distintos.

Te propongo como ejercicio que te entretengas modelando las otras clases, u otras de tu elección, para asentar estos conceptos.

Las entidades no tienen por qué ser tangibles, necesariamente. El siguiente código modela nuestras emociones:

class Emocion
{
  String emocion;
  
  String obtenerEmocion()
  {
    return emocion;
  }
  
  void cambiarEmocion(String nuevaEmocion)
  {
    emocion = nuevaEmocion;
  }
}

El método obtenerEmocion() devuelve a quien lo invoca la cadena de caracteres referenciada en el atributo emocion. El método cambiarEmocion(), que requiere como argumento una cadena de caracteres, se ocupa de modificar el atributo con el argumento facilitado.

Lo verdaderamente importante es que comprendas el concepto de clase. No te preocupes si te resultan quizás algo oscuros algunos de los ejemplos; oportunamente profundizaremos en todas estas cuestiones.

¿Qué hacemos con nuestras flamantes clases recien creadas?

Típicamente las almacenaremos, cada una, en su propio fichero .java.

Créate una carpeta común y vuelca en ella los ficheros Coche.java, Persona.java y Emocion.java.

Podemos compilarlas, todas a la vez, del siguiente modo:

javac *.java

Obteniendo, si no hay errores, los ficheros Coche.class, Persona.class y Emocion.class.

En el próximo artículo utilizaremos estas clases, momento en el que introduciremos otro concepto esencial, el de objeto.

Javier Montero Gabarró


Java: El concepto de clase


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.

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