Armonización de la escala menor melódica en las 12 tonalidades

Objetivo: cuadro con la armonización de la escala menor melódica en las doce diferentes tonalidades.

Al igual que hicimos hace unos días con la escala mayor, vamos a presentar un cuadro resumen que muestre la armonización de la escala menor melódica en las 12 tonalidades posibles.

Recordemos, en primer lugar, algunos conceptos y conclusiones importantes que en su día trabajamos:

Escala menor melódica: 1 – 2 – b3 – 4 – 5 – 6 – 7

Armonización de la escala menor melódica en tríadas:
Im – IIm – bIII+ – IV – V – VI° – VII°

Armonización de la escala menor melódica en tétradas:
Im(maj7) – IIm7 – bIII+(maj7) – IV7 – V7 – VIm7(b5) – VIIm7(b5)

Recuerda que, a la hora de nombrar los acordes, elegimos el enarmónico que evite la duplicidad de nombres en las fundamentales de cada sucesión. No te sorprenda encontrar, entonces, notas como Fa bemol (en lugar de Mi) o Si doble bemol (en lugar de La).

Dicho esto, he aquí la tabla para acordes de tres notas:

armoniz-m-melodica-12-1

He elegido como referencia de tonalidad mis doce nombres favoritos, que son los que (al menos en las tonalidades mayores), proporcionan nombres de notas más simples y son de uso más común. En el centro tritonal me gusta dejar tanto F# como Gb, pues tanto monta, monta tanto…

Prosigamos con los de cuatro notas:

armoniz-m-melodica-12-2

Para reducir la representación, he optado por la notación alternativa mM7 para el acorde m(maj7) (menor con séptima mayor) y +M7, en lugar de +(maj7) (séptima mayor con quinta aumentada).

Ten a mano estas tablas, como guía de referencia rápida, tanto si trabajas habitual u ocasionalmente con la escala menor melódica o sus modos, pero asegúrate bien de ser capaz de deducirlas por ti mismo.

Javier Montero Gabarró


Armonización de la escala menor melódica en las 12 tonalidades


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


Tabla de referencia de construcción de acordes.


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


Índice de lectura recomendado de la categoría Armonía.

Python – Una tortuga de brocha fina

Objetivo: presentar el módulo turtle para la creación de gráficos en Python.

Python no sólo es un lenguaje versátil, potente y elegante. Programar en Python es, desde mi opinión, una labor usualmente más gratificante y divertida que hacerlo con otros lenguajes. El artículo de hoy explora una de sus facetas particularmente lúdica, pero no por ello menos interesante y práctica.

He aprovechado para matar dos pájaros de un tiro: por un lado, tenía previsto que la siguiente entrada del blog estuviera dedicada a Python, a la par que estoy empezando a preparar otras, relacionadas con la música, que expliquen el concepto y utilidades del círculo de quintas. Para ello, requería hacer uso del siguiente gráfico:

circulo-quintas-python

Al final del artículo presentaré el código Python que genera este diagrama.

Vamos a introducirnos en el modo gráfico presentando una sencilla herramienta: una tortuga artista que podemos manejar a nuestra conveniencia y que va dejando rastro allá por donde pisa.

El módulo turtle es, además, un excelente medio para explicar a un niño en qué consiste la programación de ordenadores, pues propone una forma visual y divertida de comprobar las relaciones causa-efecto que suceden a lo largo de un programa.

Para introducir en escena a nuestra tortuguita de brocha fina necesitamos invocar, en primer lugar, al módulo turtle:

>>> import turtle

A continuación le pedimos que se muestre en la pantalla:

>>> turtle.showturtle()

Aparece una nueva ventana gráfica en la que, posicionado en su centro, se muestra un cursor con forma de punta de flecha: la tortuga pintadora.

turtle-1

Ciertamente, este cursor no se asemeja mucho a una tortuga, pero quizás este otro sí:

>>> turtle.shape("turtle")

turtle-2

Graciosa, ¿verdad? A un niño le encantaría.

Si ya has dejado atrás tu lado infantil (qué triste es decir eso), puedes restablecer su aspecto nuevamente, más discreto y menos aparatoso:

>>> turtle.shape("classic")

Lo curioso de esta tortuga es que lleva una brocha encima con la que va dejando rastro allá donde se mueve.

Para ilustrar esto, mostremos, por ejemplo, la función forward(), encargada de desplazar la tortuga hacia adelante el número de píxeles que le indiquemos, en el sentido en que apunta la flecha:

>>> turtle.forward(150)

turtle-3

Observa que hemos desplazado la tortuga 150 píxeles a la derecha (que es hacia donde apunta la flecha). En su camino, ha trazado una recta.

Una función similar, backward(), permite a la tortuga andar hacia atrás, de espaldas.

Podemos modificar la dirección en la que apunta. Las funciones left() y right(), respectivamente, giran la tortuga hacia la izquierda o la derecha el ángulo en grados que indiquemos:

>>> turtle.left(120)
>>> turtle.forward(200)

turtle-4

Hemos combinado un giro de 120 grados con un avance de 200 pixeles, provocando el trazado del segundo tramo.

Los giros de left() y right() son siempre relativos, en relación a la orientación actual. Por ejemplo, giremos otros noventa grados a la izquierda y avancemos 50 pixels en esa dirección:

>>> turtle.left(90)
>>> turtle.forward(75)

turtle-5

También podemos indicar el ángulo que forma la tortuga de una manera absoluta, es decir, no relativa a la posición actual. Para ello disponemos de la función setheading():

>>> turtle.setheading(-180)
>>> turtle.forward(100)

turtle-6

Si lo que queremos es desplazar la tortuga a un punto determinado de la ventana, utilizamos la función goto(), a la que facilitamos las coordenadas en píxeles del destino (horizontal, vertical). Ten en cuenta que el punto (0, 0), ubicado en el centro de la ventana, lugar donde se posiciona inicialmente la tortuga, representa el origen de coordenadas:

>>> turtle.goto(-25, 100)

turtle-7

Observa que la tortuga se ha desplazado directamene al punto especificado. Presta atención a la punta de la flecha: continúa apuntando a donde lo hacía antes del último tramo.

Para regresar al lugar de origen puedes hacer un goto(0, 0) o decirle directamente que se marche a casa:

>>> turtle.home()

turtle-8

La función home(), a diferencia de goto(), restablece además el sentido original con el que comenzó la tortuga su andadura.

Si estamos usando turtle para pintar interactivamente un gráfico, hay dos funciones que te vendrán de maravilla:

turtle.undo() deshace la última maniobra efectuada.

turtle.reset() limpia la ventana y restablece la tortuga a su posición de origen.

Para trazar círculos disponemos del comando circle():

>>> turtle.reset()
>>> turtle.circle(100)

turtle-9

Hemos limpiado previamente la ventana, regresando a las condiciones iniciales.

Pintar círculos tiene su pequeño truco. Es importante comprender dónde se localiza el centro de la circunferencia que dibuja la tortuga. Se halla justo al oeste de donde está mirando, es decir, noventa grados a la izquierda, y a una distancia determinada por el radio que indiquemos en la llamada a la función. En el ejemplo, con la tortuga ubicada en (0,0) y mirando exactamente hacia la derecha, es fácil entender que su centro se halla en el punto (0, 100). En ocasiones, según donde esté ubicada y dependiendo de hacia dónde mire, puede ser necesario algún sencillo cálculo trigonométrico si necesitamos determinar el centro.

La tortuguita no nos sería de mucha utilidad práctica si siempre que se moviera estuviera pintando. Necesitamos un modo de lograr que «levante» la brocha de cuando en cuando para poder desplazarla al lugar que deseemos sin emborronar la pantalla.

Para levantar la brocha de la pantalla disponemos de la función penup(). Una vez ejecutada, los movimientos de la tortuga no dejarán trazos en la ventana. Si queremos volver a pintar, basta con bajarla de nuevo con la función pendown().

Observa en el siguiente ejemplo cómo desplazamos la tortuga 100 píxeles, sin el trazo oportuno, antes de dibujar la segunda circunferencia:

>>> turtle.penup()
>>> turtle.forward(100)
>>> turtle.pendown()
>>> turtle.circle(100)

turtle-10

Podemos insertar también textos en nuestro gráfico. La función write(), a la que pasamos una cadena de caracteres, imprime texto en la posición en la que se halla la tortuga, que no se ve afectada por esta impresión, permaneciendo en el mismo lugar:

>>> turtle.reset()
>>> turtle.left(45)
>>> turtle.forward(100)
>>> turtle.write("La casa de la pradera")

turtle-11

Disponemos ya de los conocimientos necesarios para dibujar el círculo de quintas que presentamos al comienzo del artículo. Ejecuta el siguiente programa Python y observa a la tortuga dicharachera trazarlo con gracilidad:

import turtle as t

radio = 150
quintas = ("C", "G", "D", "A", "E", "B",
           "F#/Gb", "Db", "Ab", "Eb", "Bb", "F")
correccion = (20, 20, 21, 25, 29, 31,
              31, 36, 33, 31, 25, 20)

t.penup()
t.goto(0, -radio) # para que el círculo quede centrado en (0, 0)
t.pendown()
t.circle(radio)
t.penup()
t.goto(0, 0) # regresamos al centro
t.left(90)
t.pendown()

for quinta in range(12):
    t.forward(radio)
    t.penup()
    t.forward(correccion[quinta]) # separamos del círculo el punto de escritura
    t.write(quintas[quinta], font=("Arial", 10, "bold")) # negrita
    t.goto(0, 0)
    t.right(30) # giramos 30 grados (360 dividido entre 12)
    t.pendown()

t.hideturtle() #para que no se vea la tortuga en la imagen final

El primer bloque de código, justo debajo de la declaración de las tuplas, simplemente traza una circunferencia centrada en el origen de coordenadas y deja la tortuga mirando al norte.

El bucle for se ocupa, en cada iteración, de trazar cada radio, escribir la nota correspondiente, regresar al origen y girar 30 grados, dejando la tortuga en la orientación oportuna para el dibujo de otro radio en la siguiente iteración.

Las tupla quintas contiene todas las notas musicales ordenadas por quintas justas, en la secuencia en la que deberán ser pintadas por la tortuga en cada iteración. La tupla correccion no es más que una separación adicional para que el texto de cada nota quede decentemente separado del círculo a una distancia visualmente parecida. Inicialmente partí de 20 píxeles para todas las notas, reajustando a simple vista después una a una para obtener una mejor presentación. Observa también un uso más avanzado de la función write(), indicando, además del texto, las características del tipo de letra (familia, tamaño y aspecto).

Finalmente, escondemos la tortuga para poder realizar una captura de pantalla sin que aparezca incordiando entre medias.

Esta ha sido sólo una pequeña introducción a la tortuga de Python. En otros artículos exploraremos otras funciones que nos permitirán nuevas posibilidades creativas. Que no te confunda su sencillez y aspecto lúdico: puedes dibujar con ella virtualmente cualquier cosa y, con los algoritmos adecuados, puedes realizar gráficos sumamente sofisticados con muy poco código.

Javier Montero Gabarró


Python – Una tortuga de brocha fina


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.

El acorde suspendido (sus4) en la guitarra

Objetivo: mostrar cómo construir en la guitarra el acorde suspendido, sus4.

Podemos enfrentarnos de varias formas a la construcción física de acordes. La primera, que no recomiendo a nadie, es la burda memorización de posiciones sin entender su constitución. La segunda, infinitamente más instructiva y práctica, consiste en conocer la estructura armónica de cada acorde y su aplicación en el instrumento, sea éste una guitarra, un piano o cualquier otro capaz de producir armonías.

Porque si sabes construir acordes teóricamente, te será muy fácil su deducción práctica. No sólo serás capaz de configurar cualquier acorde, por compleja que sea su fórmula (dentro de las limitaciones físicas que impongan tus manos y el instrumento, naturalmente), sino que, además, podrás descubrir posiciones diferentes a las típicas, lo que te permitirá ampliar tus recursos expresivos.

Para montar en la guitarra el acorde de hoy, de cuarta suspendida, sus4, o simplemente suspendido hay que comenzar entendiendo que es un acorde suspendido.

Un acorde suspendido es como un acorde mayor en el que la tercera se sustituye por la cuarta. Ya sabes que entre la tercera y la cuarta existe una distancia de un semitono.

Tríada mayor: 1 – 3 – 5
Tríada suspendida (sus4): 1 – 4 – 5

Toma entonces cualquier forma que conozcas de acorde mayor, localiza dónde está la tercera y, simplemente, agrégale un semitono, situándola un traste más abajo (en dirección al puente). No tiene más misterio.

El término «suspendido» hace referencia a la tensión que genera la cuarta pidiendo su resolución, regresando a la tercera, en el acorde mayor. Este es, en efecto, uno de los usos comunes de este tipo de acordes: crear un instante de suspensión, para regresar inmediatamente a la estabilidad del acorde mayor del que deriva.

Vamos a ver aquí unos cuantos ejemplos, pero siéntete libre de experimentar con cualquier posición de acorde mayor que conozcas.

En cada uno de los gráficos que siguen verás dos acordes, el primero mayor y el segundo suspendido. En la parte inferior he indicado la estructura de las voces. Observa el incremento de semitono en la tercera para alcanzar la cuarta suspendida.

Comencemos por algunas formás simples al aire:

sus4-a

sus4-b

sus4-c

Algunas figuras requerirán algo más de dificultad técnica:

sus4-d

Otra variante consiste en prescindir de la cejilla final en Csus4, silenciando la primera cuerda al rozarla con el mismo dedo índice que se apoya sobre la segunda. Después de todo, ya estás obteniendo la nota Fa en la cuarta cuerda.

Gsus4 también tiene un pequeño truco:

sus4-e

En esta ocasión, el dedo que se apoye sobre la sexta cuerda (típicamente el índice o el anular) debe ocuparse de silenciar la quinta, rozándola ligeramente.

Una vez controladas las formas al aire puedes investigar los acordes con cejilla. En estos casos, recuerda siempre tener claro dónde se halla la fundamental para poder trazar el acorde a la altura adecuada del mástil. Por ejemplo:

sus4-f

sus4-g

Permítete también enredar con las tríadas simples (en muchos contextos son la mejor opción). Al igual que con los acordes con cejilla, presta atención a la localización de la fundamental:

sus4-h

sus4-i

Juega también con sus inversiones (es decir, con nota más grave distinta de la fundamental). Por ejemplo:

sus4-j

Tú mismo: experimenta con las formas de acordes mayores que conozcas y trata de deducir los suspendidos correspondientes. Quédate con aquellos que más te gusten.

Javier Montero Gabarró


http://elclubdelautodidacta.es/wp/2014/12/el-acorde-suspendido-sus4-en-la-guitarra/


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 la categoría Guitarra.

Índice de la categoría Armonía.

Armonización de la escala mayor en las 12 tonalidades

Para que sirva de material de referencia cómodo, facilito a continuación unas tablas con los acordes que aparecen al armonizar la escala mayor en cualquier tonalidad, tanto en su versión tríada como tétrada.

Conocer los acordes propios de una tonalidad es algo imprescindible a la hora de componer, arreglar, o simplemente descubrir la armonía subyacente en cualquier canción, pues estos acordes son los que utilizaremos con mayor probabilidad.

La burda memorización es ridícula. Estos acordes sólo terminan de aprenderse mediante su uso repetido al estudiar una tonalidad determinada: no hay mejor forma de conocer los acordes propios de La mayor que tocando piezas en La mayor. Pero eso no excluye tu deber de aprender su deducción. Debes ser capaz de construir estas tablas por ti mismo y en este blog tienes todas las claves para poder hacerlo. Si aún no posees esa habilidad, no lo dejes por más tiempo y ponte manos a la obra cuanto antes, pues son conocimientos imprescindibles para cualquier músico que se tome la armonía en serio.

He simplificado las tablas eligiendo sólo los enarmónicos principales. Esto es, indico la tonalidad de Re bemol, pero no la de Do sostenido, su enarmónico equivalente, pues a efectos prácticos tienen la misma construcción física en el instrumento. El criterio seguido, en estos casos, ha sido optar por la tonalidad de escritura más simple, evitando dobles sostenidos o notas como Si sostenido (enarmónico de Do). En el caso de los enarmónicos Fa sostenido / Sol bemol, he preferido dejar ambas para matizar el hecho de que las dos gozan de la misma importancia «estética» y en ninguna de ellas ha sido posible evitar un nombre de nota feo (E# en la primera y Cb en la segunda).

Estas tablas también pueden ser prácticas para determinar los acordes propios de las tonalidades menores si eres capaz de deducir cuál es la tonalidad relativa mayor correspondiente. No obstante, ten en cuenta que las tonalidades menores son más propensas, por lo general, a la aparición de otros acordes ajenos a la propia escala menor natural. Sin ir más lejos, piensa por ejemplo que existen otras escalas menores de uso habitual, como la armónica y la melódica, y cada una de ellas presenta su propia armonización.

Sin más demora, he aquí las tablas. Comencemos por los acordes de tres notas, las tríadas:

armo1

Las tétradas, acordes de cuatro notas:

armo2

Javier Montero Gabarró


http://elclubdelautodidacta.es/wp/2014/11/armonizacion-de-la-escala-mayor-en-las-12-tonalidades/


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


Tabla de referencia de construcción de acordes.


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


Índice de lectura recomendado de la categoría Armonía.

Armonía – Índice de lectura recomendado

Última actualización: 21 de junio de 2016
Una de las peticiones que más encuentro entre los comentarios del blog o a través del correo electrónico es la creación de un índice especial de lectura recomendado. Entiendo que, especialmente para alguien que empieza a estudiar armonía, pueda resultar complicado forjarse por sí mismo un plan de formación y no se encuentre otra opción mejor que abandonarse a una lectura lineal.

Nunca he pretendido hacer de esta sección un curso de armonía. Más bien mi interés ha sido siempre dejar piezas sueltas de un puzle que sólo tú, lector, puedes construir, tratando de conectarlas con las que ya tienes bien colocadas o quizás permitiéndote descubrir aquellas mal encajadas que te imposibilitan a seguir colocando otras nuevas.

Por otro lado, intento que los artículos puedan resultar interesantes no sólo al que comienza, sino también al que ya tiene cierta experiencia en estos asuntos, lo cual tardaría mucho en lograr si sólo me limitara a escribir linealmente partiendo desde cero.

Aunque soy un apasionado defensor del aprendizaje aleatorio (me reservo para otra ocasión un artículo expresando los que creo son sus beneficios), he preparado a continuación el que puede ser un orden de lectura recomendado, de menos a más. Hay, naturalmente, muchas lagunas entre medias aún que espero, poco a poco, ir cubriendo con el tiempo. Recojo cuidadosamente cuantas sugerencias o dudas se registran en los comentarios, que aunque ocasionalmente quedan respondidas allí mismo, me permiten ir anotando las cuestiones que pudieran ser más relevantes para el interés general.

El artículo de hoy es un artículo dinámico, en el sentido de que iré actualizándolo conforme aparezcan nuevos contenidos en la categoría Armonía, encajándolos en el lugar que estime más adecuado de acuerdo a su nivel. Procuraré dejar algún tipo de señal que de un vistazo permita localizar el material más reciente.

Y ahora sí, esta es la secuencia de lectura recomendada. Podría haber sido organizada de otra forma, desde luego, pero creo que así puede cumplir bien su función:

La notación anglosajona
Las notas musicales: las teclas blancas
Las notas musicales: las teclas negras
Tonos y semitonos
La fórmula secreta de la escala mayor
La escala mayor en cualquier tonalidad
La escala mayor en las 12 tonalidades – Cuadro
Intervalos sin secretos – 1 de 2
Intervalos sin secretos – 2 de 2
Intervalos sin secretos: Tabla de Referencia y el Modelo del Muelle
Intervalos sin secretos: Ejercicios resueltos I
Intervalos sin secretos: Ejercicios resueltos II
Intervalos sin secretos – Ejercicios resueltos III
Intervalos sin secretos – Ejercicios resueltos IV
La fórmula absoluta de una escala musical
La fórmula absoluta – Ejercicios prácticos de escalas
La fórmula relativa de una escala musical
Escalas: pasar de la fórmula absoluta a la relativa y viceversa
La escala menor natural
La escala menor armónica
La escala menor melódica
El mundo de las tonalidades relativas
Introducción a los modos de la escala mayor
Los modos de la escala mayor – Ejercicios prácticos
La fórmula absoluta de los modos de la escala mayor
La fórmula relativa de los modos de la escala mayor
La escala dórica
La escala mixolidia
La escala de tonos enteros
Los modos de la escala menor melódica – 1
Los modos de la escala menor melódica – 2
Los modos de la escala menor melódica – 3
Los modos de la escala menor armónica – 1
Los modos de la escala menor armónica – 2
Construcción de acordes: Tabla de referencia
Construcción de acordes – 1
Construcción de acordes – 2: Las triadas
Construcción de acordes – 3: Suspendidos
Construcción de acordes – 25: Power Chords
Construcción de acordes – 4: Séptima
Construcción de acordes – 5: Séptima mayor
Construcción de acordes – 6: Sexta y menor sexta
Construcción de acordes – 7: menor séptima
Construcción de acordes – 8: menor séptima quinta bemol (semidisminuido)
Construcción de acordes – 9: séptima disminuido
Construcción de acordes – 10: novena añadida
Construcción de acordes – 11: menor con séptima mayor
Construcción de acordes – 12: Séptima mayor con quinta aumentada
Construcción de acordes – 13: Séptima con quinta aumentada
Construcción de acordes – 14: Séptima con quinta disminuida
Construcción de acordes – 15: Séptima mayor con novena
Construcción de acordes – 16: Séptima con novena
Construcción de acordes – 17: Menor séptima con novena
Construcción de acordes – 18: Séptima con novena aumentada
Construcción de acordes – 19: Séptima con novena menor
Construcción de acordes – 20: Sexta con novena
Construcción de acordes – 21: 7ma mayor con novena y oncena
Construcción de acordes – 22: mayor con oncena aumentada
Construcción de acordes – 23: menor séptima, novena y oncena
Construcción de acordes – 24: séptima mayor con 9, 11 y 13
Construcción de acordes – 26: Oncena de dominante
La Notación Estructural de Voces
Inversión de acordes
Acordes en disposición Drop 2
Acordes en disposición Drop 3
Armonización de la escala mayor – 1
Armonización de la escala mayor – 2
Armonización de la escala mayor – 3
Armonización de la escala mayor – 4
Armonización de la escala mayor – 5
Armonización de la escala mayor – 6: las tétradas
Armonización de la escala mayor – 7: Ejercicios finales
Introducción a la armonización de la escala menor
Armonización de la escala menor natural
Armonización de la escala dórica
Armonización de la escala menor melódica
Armonización de la escala menor armónica
Armonización de la escala mayor en las 12 tonalidades
Armonización de la escala menor melódica en las 12 tonalidades
Armonización de la escala menor armónica en las 12 tonalidades ¡NUEVO! (21 de junio de 2016)
Extendiendo acordes a través de triadas simples
Cómo se compuso Nostalgia, de Viciosfera
Cálculo de la frecuencia de nuestras notas musicales
Los cents, la calderilla tonal
Do central, ¿C3 o C4?

Javier Montero Gabarró


Armonía – Índice de lectura recomendado


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


Tabla de referencia de construcción de acordes.


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

Python – El poderoso inicializador


Objetivo: presentar el inicializador de objetos en Python, invocado automáticamente por el constructor para facilitar las características iniciales del objeto.

Hemos comenzado nuestra andadura en el mundo de la POO en Python presentando los conceptos esenciales de clase y objeto. La clase representa el modelo, la plantilla con la que después crearemos los objetos concretos.

Regresemos a la sencilla clase Coche con la que hemos estado trabajando en las últimas entregas:

class Coche:
    
    marca = ''
    modelo = ''
    color = ''
    numero_de_puertas = 0
    cuenta_kilometros = 0
    velocidad = 0
    arrancado = False

    def arrancar(self):
        if not self.arrancado:
            print('Roarrrr')
            self.arrancado = True
        else:
            # Dale al encendido estando el coche arrancado y escucha...
            print('Kriiiiiiiiiiicccc')
  
    def parar(self):
        self.arrancado = False
  
    def acelerar(self):
        if self.arrancado:
            self.velocidad = self.velocidad + 1

    def frenar(self):
        if self.velocidad > 0:
            self.velocidad = self.velocidad - 1

    def pitar(self):
        print('Bip Bip Bip')

    def consultar_velocimetro(self):
        return self.velocidad

    def consultar_cuenta_kilometros(self):
        return self.cuenta_kilometros

Para fabricar coches a partir de este esquema, invocamos al constructor:

>>> coche1 = Coche()

Como puedes comprobar, el valor de los atributos de datos del objeto recién creado son los que aparecen en la definición de la clase. Por ejemplo:

>>> coche1.marca
''

De modo que, para poder montarte en el coche, lo primero que habría que hacer es darle algo de forma y color:

>>> coche1.marca = "Seat"
>>> coche1.modelo = "Ibiza"
>>> coche1.color = "Blanco"
>>> coche1.numero_de_puertas = 3

Los demás campos podemos dejarlos con sus valores iniciales, no parece muy apropiado que nada más fabricar el coche se nos estampe a toda pastilla contra una pared.

Esta manera de proceder, que habría que repetir con cada coche que fabricáramos, no es, obviamente, ni práctica, ni elegante ni inteligente.

¿Por qué no facilitamos estos valores iniciales en la propia invocación al constructor?

Es decir, algo así como:

coche1 = Coche("Seat", "Ibiza", "Blanco", 3)

Mucho más elegante, menos propenso a errores y, como veremos, permitiéndonos además un mayor control sobre los valores que pueden tomar los atributos.

Para poder comunicarnos de este modo con la clase Coche necesitamos ampliar su definición incorporando un nuevo método: el inicializador.

El inicializador es un método particular cuya función es obvia: ocuparse de los rudimentos iniciales necesarios a la hora de construir el objeto. Toma la forma siguiente, obsérvala con atención:

def __init__(self, argumento1, argumento2, ..., argumentoN):
    código

La palabra init va precedida y seguida por dos símbolos de subrayado (dos delante y dos detrás). Esto, que puede parecer algo esotérico, es una buena convención práctica de Python para evitar posibles conflictos de nombres.

Observa que el primer argumento es self, como en cualquier otro método, que ya sabes que referencia al objeto actual (enseguida lo verás en acción). Los demás argumentos deberán cuadrar con la invocación en el constructor:

coche1 = coche(argumento1, argumento2, ..., argumentoN)

Recuerda que self no se indica dentro del constructor.

Estamos en condiciones de introducir código en el inicializador que, en este caso, es bien simple:

    def __init__(self, marca, modelo, color, puertas):
        self.marca = marca
        self.modelo = modelo
        self.color = color
        self.numero_de_puertas = puertas

En la declaración de parámetros he empleado puertas en lugar de numero_de_puertas simplemente para ilustrar la flexibilidad que tenemos a la hora de elegir nombres de parámetros en las funciones. Naturalmente, en la última línea del código hay que utilizar el nombre real del atributo para que éste se nutra del valor facilitado.

La clase Coche quedaría entonces así:

class Coche:
    
    marca = ''
    modelo = ''
    color = ''
    numero_de_puertas = 0
    cuenta_kilometros = 0
    velocidad = 0
    arrancado = False

    def __init__(self, marca, modelo, color, puertas):
        self.marca = marca
        self.modelo = modelo
        self.color = color
        self.numero_de_puertas = puertas

    def arrancar(self):
        if not self.arrancado:
            print('Roarrrr')
            self.arrancado = True
        else:
            # Dale al encendido estando el coche arrancado y escucha...
            print('Kriiiiiiiiiiicccc')

etcétera, ...

En breve la mejoraremos aún más, pero vayamos asegurando los conceptos paso a paso.

Con esta definición, la siguiente llamada al constructor ya es lícita:

>>> coche1 = Coche("Seat", "Ibiza", "Blanco", 3)

Los IDEs (aquí IDLE) nos facilitan la vida
Los IDEs (en la imagen, IDLE) nos facilitan la vida

Lo que sucede a continuación no debe sorprenderte ahora: los argumentos «Seat», «Ibiza», «Blanco» y 3 son facilitados, respectivamente, a marca, modelo, color y puertas de __init__.

Una vez dentro de __init__, self referencia al objeto actual que se crea al invocar al constructor, es decir, coche1. De modo que interiormente __init__ realiza esto:

coche1.marca = "Seat"
coche1.modelo = "Ibiza"
coche1.color = "Blanco"
coche1.numero_de_puertas = 3

Puedes comprobar que coche1 ha sido inicializado correctamente. Por ejemplo:

>>> coche1.color
'Blanco'
>>> coche1.numero_de_puertas
3

Otro ejemplo de la inteligencia de IDLE
Otro ejemplo de la inteligencia de IDLE

Ahora sí, nuestra clase Coche empieza a tener clase de verdad. Pero aún podemos hacerla más fina…

Sabemos que las variables en Python no necesitan declararse y que se construyen en el momento en que reciben un valor. Este hecho nos permite simplificar nuestra clase. Si los atributos de datos van a ser inicializados dentro de __init__, ¿por qué molestarnos siquiera en dar valores iniciales al definir la clase? Simplifiquemos, entonces:

class Coche:
    
    cuenta_kilometros = 0
    velocidad = 0
    arrancado = False

    def __init__(self, marca, modelo, color, puertas):
        self.marca = marca
        self.modelo = modelo
        self.color = color
        self.numero_de_puertas = puertas

    def arrancar(self):
        if not self.arrancado:
            print('Roarrrr')
            self.arrancado = True
        else:
            # Dale al encendido estando el coche arrancado y escucha...
            print('Kriiiiiiiiiiicccc')

etcétera, ...

Hemos dejado sólo los atributos que expresamente no establecemos en __init__.

Aún podemos ir más allá. ¿Por qué no incluir toda la inicialización en __init__, incluso la de aquellos miembros que no se faciliten explícitamente en la invocación al constructor?

class Coche:
    
    def __init__(self, marca, modelo, color, puertas):
        self.marca = marca
        self.modelo = modelo
        self.color = color
        self.numero_de_puertas = puertas
        self.cuenta_kilometros = 0
        self.velocidad = 0
        self.arrancado = False

    def arrancar(self):
        if not self.arrancado:
            print('Roarrrr')
            self.arrancado = True
        else:
            # Dale al encendido estando el coche arrancado y escucha...
            print('Kriiiiiiiiiiicccc')

etcétera, etcétera...

Los atributos de datos, objetos también en sí (en Python, todo lo es), serán construidos en el momento de la inicialización.

Por lo general, bien sea a la hora de inicializar un objeto, o bien llegado el momento de modificar cualquiera de sus atributos de datos, es buena práctica dejar que sean los métodos quienes se encarguen de ello, en lugar de atacar a las variables miembro directamente. Dentro de un método podemos analizar el valor facilitado, comprobar que sea legítimo, corregirlo o incluso rechazarlo si no procede.

No sería muy sensato escribir código como el siguiente:

coche1.velocidad = 1000

No hay coche que pueda alcanzar 1000 Km/h. Tampoco podría estar parado y, en el instante siguiente, circular a 100 Km/h. Usando los métodos acelerar y frenar que hemos definido en la clase se garantiza un incremento o decremento de la velocidad gradual. Estos métodos, además, podrían asegurarse de que no se excediera en ningún caso un valor máximo por mucho que pisáramos el acelerador (ni mínimo cuando frenásemos, algo que ya hace el método frenar).

Tienes ya las bases suficientes para empezar a utilizar la Programación Orientada a Objetos en tus programas. Te advierto, es una vía casi sin retorno: una vez escribes tu primer programa POO, apetece poco volver a la programación estructurada tradicional.

Pero esto apenas ha empezado, aún queda mucho camino por descubrir…

Javier Montero Gabarró


Python – El poderoso inicializador


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.

Do central, ¿C3 o C4?


Objetivo: Presentar el convenio más aceptado para la diferenciación de notas según la octava en la que se encuentren.

Imagina, por un momento, que te pido que hagas sonar la nota Fa en tu instrumento. Supongamos que se trata de un piano, aunque la cuestión sería la misma si fuera cualquier otro instrumento que permita la ejecución de notas en distintas octavas.

De un vistazo localizas inmediatamente una tecla blanca justo a la izquierda de alguno de los patrones repetitivos de tres teclas negras. Haces sonar la nota y me preguntas: «¿te sirve éste o lo quieres tal vez más grave o agudo?»

Para diferenciar un Fa de otro podría decirte: «no, ese no, el que suena a 87,31 Hz».

Desde luego, ya no habría ambigüedad posible, aunque probablemente te quedaras un tanto perplejo.

Sería mucho más práctico y apropiado indicar simplemente, de un modo u otro, a qué octava concreta pertenece ese Fa.

El siguiente gráfico representa un piano completo de 88 teclas que abarca desde una nota La muy grave hasta otra Do muy aguda (haz clic sobre la imagen para ampliarla).

Imagen: Wikimedia Commons, Artur Jan Fijalkowski - CC-BY-SA
Imagen: Wikimedia Commons, Artur Jan Fijalkowski – CC-BY-SA

Vemos siete octavas completas (de DO a SI) más dos incompletas (tres notas a la izquierda y una a la derecha).

Para numerar las octavas tendremos que llegar a un acuerdo. Supongamos que por primera octava me refiero a la primera que aparece completa en el piano, segunda la siguiente y así sucesivamente.

Con este criterio acordado, podría replantearte la pregunta con más precisión pidiéndote que hicieras sonar un Fa2 (el Fa de la segunda octava), que es precisamente el que tiene por frecuencia 87,31 Hz, y no te supondría el mínimo problema su localización.

El índice de octava, denominado por algunos índice acústico o registral, puedes encontrarlo escrito de diversos modos: Fa2, Fa2, Fa(2) o Fa[2]. O bien, con notación anglosajona: F2, F2, F(2) o F[2].

Observa que, de acuerdo a este esquema, las tres notas del teclado que hay a la izquierda del primer Do pertenecen a la octava cero, de modo que la primera nota del teclado, La, se designa como A0. Te propongo como ejercicio interesante que calcules su frecuencia. Es precisamente en la octava cero donde comienza nuestro rango de frecuencias audibles.

Localiza en el teclado, a continuación, la cuarta octava completa. Fíjate que se halla en el centro, dejando tres completas a su izquierda y otras tres completas a su derecha. A la nota Do con la que comienza esa octava se la denomina, en justicia, Do central y se registra como C4, correspondiente a una frecuencia de 261,63 Hz. Unas pocas notas a la derecha, en la misma cuarta octava, se encuentra el A4, 440Hz, frecuencia de referencia más común en nuestro sistema de afinación.

C4, el Do central
C4, el Do central

Esta manera de contar octavas, en la que la primera coincide con la primera completa en el piano de 88 teclas, ha sido adoptada por la Sociedad Americana de Acústica (ASA) en un intento de ser estandarizado. Puede entenderse también refiriéndose a la octava cero como aquella en la que comienza el rango auditivo del ser humano. Vinculada al mundo de la ciencia, muchos autores se refieren a este criterio como la notación científica, índice acústico científico o incluso, como he leído en alguna ocasión, sistema de los físicos.

Pero podríamos haber contado de otra forma. Imagina por ejemplo que partimos de un gran pentagrama, el sistema de pentagrama en dos partes utilizado para la notación musical de instrumentos de amplia tesitura, como el piano, el órgano o el arpa. Vamos a denominar primera octava a la primera que se introduce en el pentagrama inferior, es decir, la que comienza en el Do ubicado en la segunda línea adicional inferior. El siguiente Do, C2, estaría en el segundo espacio y el Do central, en la frontera entre ambos pentagramas, sería el C3.

C3, el Do central
C3, el Do central

Observa que, de acuerdo a esta manera de contar, lo que antes denominábamos octava uno ahora sería la octava cero, y lo que antes era la octava cero ahora correspondería a la octava ¡menos uno!

Este modo de registro de octavas, conocido como sistema franco-belga, sigue siendo común en determinadas zonas de Europa, aunque cada vez está más extendido el sistema científico americano, al que algunos se refieren ya como el sistema internacional.

Para complicar aún más las cosas, llegan los sintetizadores, el MIDI y el software musical. Fabricantes y desarrolladores de software siguen su propio criterio a la hora de referirse a las octavas, de modo que la confusión está servida (he visto incluso un C5 como Do central).

Respondiendo entonces a la pregunta que da título a este artículo: Do central, ¿C3 o C4? Ambas formas son válidas, depende del criterio que sigas.

Yo siempre me referiré al Do central como C4, pero me cuidaré de que, cuando pueda existir algún tipo de confusión, aparezca explícitamente alguna mención que lo indique con claridad. Por ejemplo, podré decir lo siguiente: la sexta cuerda de la guitarra, afinada de modo normal, da al aire un E2 (considerando C4 como Do central). No cuesta nada escribirlo, dejarlo claro una vez, evitando así quebraderos de cabeza.

Y a la inversa igual: cuando te encuentres con el piano roll de tu secuenciador o leas un manual sobre un sintetizador, intenta de algún modo asegurarte de cuál es la correspondencia de notas. Nunca des nada por sentado.

Javier Montero Gabarró


Do central, ¿C3 o C4?


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 armonía.

Python – Fabricando objetos


Objetivo: presentar el concepto de Objeto o Instancia de una Clase en Python.

En el anterior artículo introdujimos las clases, auténticos pilares de la Programación Orientada a Objetos. Podemos pensar en ellas como diseños de moldes o plantillas para representar en Python (abstraer) una determinada realidad.

Aprendimos, por ejemplo, a modelar un coche:

class Coche:
    
    marca = ''
    modelo = ''
    color = ''
    numero_de_puertas = 0
    cuenta_kilometros = 0
    velocidad = 0
    arrancado = False

    def arrancar(self):
        if not self.arrancado:
            print('Roarrrr')
            self.arrancado = True
        else:
            # Dale al encendido estando el coche arrancado y escucha...
            print('Kriiiiiiiiiiicccc')
  
    def parar(self):
        self.arrancado = False
  
    def acelerar(self):
        if self.arrancado:
            self.velocidad = self.velocidad + 1

    def frenar(self):
        if self.velocidad > 0:
            self.velocidad = self.velocidad - 1

    def pitar(self):
        print('Bip Bip Bip')

    def consultar_velocimetro(self):
        return self.velocidad

    def consultar_cuenta_kilometros(self):
        return self.cuenta_kilometros

En la definición de clase nos encontramos sus características o atributos, que toman forma de variables (marca, modelo, color, etc…) y la funcionalidad propia de la clase o métodos, que nos indican qué cosas podemos hacer con ella, representados mediante funciones (arrancar(), acelerar(), frenar(), etc.).

Pero esto no es más que un esquema, un molde. Lo que queremos ahora es fabricar coches concretos, como un Seat León de cinco puertas o un Ford Fiesta de tres.

Al hecho de «fabricar» objetos a partir de un molde de clase se le denomina instanciar, y al producto obtenido se le conoce como instancias o, simplemente, objetos de esa clase.

De modo que vamos a asegurarnos que tenemos los conceptos claros: las clases son los moldes a los que recurrimos después para crear objetos concretos.

Para poner en marcha nuestra fábrica de coches virtual no necesitaremos una gran inversión en infraestructura y personal; nos bastará con ejecutar el intérprete de Python.

Para mayor comodidad, supongamos que hemos preparado ya todo el código con la definición de la clase Coche y lo hemos incluido en un fichero tal como coche.py.

La primera labor consistirá, por lo tanto, en ejecutar dicho código. En mi caso, lo abro en Idle y lo ejecuto con Run, pero tú puedes elegir cualquier otra forma de hacerlo. La cuestión es tener el intéprete interactivo con toda la definición de la clase cargada ya en memoria.

Comprobemos su existencia:

>>> Coche
<class '__main__.Coche'>

Para fabricar coches concretos necesitamos invocar a lo que se conoce como el constructor de clase, que se ocupará de crear el objeto en memoria. El rito para que haga acto de presencia es muy simple: basta con escribir el nombre de la clase seguido de un par de paréntesis.

Construyamos un primer coche:

>>> coche1 = Coche()

Típicamente los paréntesis los utilizaremos para definir valores iniciales del objeto. Más adelante, cuando presentemos el inicializador, aprenderás a usar esa característica.

Parémonos un instante a contemplar nuestra primera fabricación:

>>> coche1
<__main__.Coche object at 0x0234B7D0>

Lo que nos está diciendo el intérprete es que coche1 es un objeto de tipo Coche y está ubicado en la dirección de memoria 0x0234B7D0.

Cada objeto posee en Python un identicador único que podemos consultar con la función id():

>>> id(coche1)
37009360

En CPython, la implementación más común de Python, este identificador coincide con la dirección de memoria anterior, como podrás comprobar si te tomas la molestia de pasarlo a hexadecimal.

Ya que nos ha ido tan bien, probemos a fabricar un segundo automóvil:

>>> coche2 = Coche()

Aunque de la misma clase, se trata en efecto de un objeto diferente:

>>> id(coche2)
37634800

Para acceder a los atributos y métodos del objeto recurrimos a la notación punto, separando el nombre del objeto del atributo o método mediante un punto.

Establezcamos algunos atributos de coche1:

<code>>>> coche1.marca = "Seat"
>>> coche1.modelo = "León"
>>> coche1.color = "negro"

Y otros tantos de coche2:

coche2.marca = "Ford"
coche2.modelo = "Fiesta"
coche2.numero_de_puertas = 3

Esta forma de proceder, que puede parecer natural, no es la común. Tal como ya hemos apuntado, para dar valores iniciales a los objetos suele emplezarse la figura del inicializador, como veremos más adelante. Lo importante ahora es comprender bien el concepto.

Comprobemos los atributos de coche1:

>>> coche1.marca
'Seat'
>>> coche1.modelo
'León'
>>> coche1.color
'negro'
>>> coche1.numero_de_puertas
0
>>> coche1.cuenta_kilometros
0
>>> coche1.velocidad
0
>>> coche1.arrancado
False

Aprecia como los atributos que no hemos inicializado expresamente toman los valores que tenían en la definición de la clase.

Juguemos ahora un poco con los métodos, funciones que definen lo que podemos hacer con los objetos.

Traigamos a la palestra el primero de ellos. Lo reescribo aquí por comodidad:

    def arrancar(self):
        if not self.arrancado:
            print('Roarrrr')
            self.arrancado = True
        else:
            # Dale al encendido estando el coche arrancado y escucha...
            print('Kriiiiiiiiiiicccc')

El parámetro self, tal como explicamos en el artículo anterior, es obligatorio y debe figurar el primero en la declaración del método. Hace referencia al objeto en cuestión sobre el que se aplicará el método.

Para invocar el método, recurrirmos nuevamente a la notación punto, pasando entre paréntesis los argumentos que requiere el método en particular sin contar a self. Como en arrancar sólo existe self, a efectos prácticos es como si no tuviera ninguno:

>>> coche1.arrancar()
Roarrrr

Aunque no esté presente en la invocación, se está pasando implícitamente como self el nombre del método que llama a arrancar(), en este caso, coche1. Observa el código del método. Lo primero que hace es comprobar que el coche no está arrancado, en cuyo caso imprime «Roarrr», cambiando a continuación el atributo arrancado a True. Verifiquemos que en efecto se ha realizado esto último:

>>> coche1.arrancado
True

Naturalmente, coche2 permanece completamente ajeno a estas operaciones, pues arrancar no ha actuado sobre él, sino sobre coche1. Comprobemos que sigue detenido:

>>> coche2.arrancado
False

Estando coche1 arrancado, si intentamos arrancarlo de nuevo obtendremos un chirriante y desagradable ruido propio de forzar el motor de arranque sin necesidad:

>>> coche1.arrancar()
Kriiiiiiiiiiicccc

Revisemos algunos métodos más de la definición de la clase Coche:

    def parar(self):
        self.arrancado = False
  
    def acelerar(self):
        if self.arrancado:
            self.velocidad = self.velocidad + 1

    def frenar(self):
        if self.velocidad > 0:
            self.velocidad = self.velocidad - 1

Experimentemos con ellos. Cada vez que aceleramos, la velocidad del vehículo se incrementa en una unidad:

>>> coche1.acelerar()
>>> coche1.velocidad
1
>>> coche1.acelerar()
>>> coche1.velocidad
2

Para detener el vehículo, primero lo frenamos completamente:

>>> coche1.frenar()
>>> coche1.frenar() # Al tener velocidad 2 aplicamos dos veces el método
>>> coche1.velocidad
0

Y, a continuación, sacamos la llave de contacto:

>>> coche1.parar()
>>> coche1.arrancado
False

Es muy importante que estudies con cuidado en estos ejemplos cómo hemos accedido desde los métodos a los atributos del objeto a través de self. En la siguiente lección, cuando presentemos el inicializador, le daremos a esta operatividad un carácter esencial.

Javier Montero Gabarró


Python – Fabricando objetos


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.

Guitarra – El método CAGED y los acordes menores

Objetivo: introducir la formación de acordes menores en la guitarra en posiciones CAGED.

A lo largo de los últimos artículos hemos esbozado las formas móviles de acordes basadas en las cinco posiciones CAGED. En la serie que comienza hoy realizaremos un estudio similar centrado en los acordes menores.

Nuestra punto de partida, al igual que hicimos con los acordes mayores, es el estudio de las posiciones con cuerdas al aire.

A continuación se presentan los cinco acordes mayores CAGED, C, A, G, E y D con cuerdas al aire. El primer conjunto de valores muestra los trastes específicos que hay que pisar; el segundo las notas efectivas que suenan y el tercero su estructura armónica:

C: x32010 / xCEGCE / x13513
A: x02220 / xAEAC#E / x15135
G: 320003 / GBDGBG / 135131
E: 022100 / EBEG#BE / 151351
D: xx0232 / xxDADF# / xx1513

Los acordes menores se diferencian de los mayores en el uso que hacen de la tercera. En efecto, observa sus fórmulas respectivas:

Acorde mayor: 1 – 3 – 5
Acorde menor: 1 – b3 – 5

Si esto te suena extraño permíteme recomendarte la lectura de la serie dedicada a la construcción de acordes dentro de la categoría Armonía del blog.

En los acordes mayores la tercera es mayor (dista 4 semitonos de la fundamental), mientras que en los menores es menor (distando 3 semitonos de la fundamental). Esto es, para pasar de un acorde mayor al respectivo menor simplemente hay que bajar un semitono la tercera.

Apliquemos este importante concepto a nuestros acordes mayores CAGED para transformarlos en menores.

Tomaremos un orden diferente. Comencaremos por los acordes A, E y D, dejando C y G para el final. Enseguida comprenderás por qué.

Este es el acorde de La mayor (A):

A: x02220 / xAEAC#E / x15135

Si te fijas, la tercera es el C# que se obtiene al tocar la segunda cuerda pisada en el segundo traste.

Para convertir este acorde en La menor (Am) basta con bajar un semitono esa tercera, lo que equivale a pisar la segunda cuerda un traste más abajo, es decir, el primero, obteniendo la nota C.

Am: x02210 / xAEACE / x151b35

La menor (Am)
La menor (Am)

Los números que aparecen en el gráfico sugieren la digitación más adecuada.

Para obtener Mi menor (Em) realizamos la misma operación; localizamos la tercera y la bajamos un semitono:

E: 022100 / EBEG#BE / 151351
Em: 022000 / EBEGBE / 151b351

Mi menor (Em)
Mi menor (Em)

Del mismo modo, pasar de Re mayor (D) a Re menor es sumamente sencillo:

D: xx0232 / xxDADF# / xx1513
Dm: xx0231 / xxDADF / xx151b3

Re menor (Dm)
Re menor (Dm)

Para pasar de Do mayor (C) a Do menor (Cm) tenemos un pequeño problema técnico:

C: x32010 / xCEGCE / x13513

La tercera, nota MI (E), además de figurar en la cuarta cuerda, está presente también en la primera cuerda ¡al aire! ¿Cómo bajamos un semitono una nota que ya está al aire?

Sencillamente, no podemos, de modo que debemos renunciar a utilizar esa cuerda si queremos aprovechar, al menos, otras partes del acorde, que ya habrá perdido su gran atractivo de formación al aire.

Es cierto que, al transponerlo usando una cejilla, poco nos importan las cuerdas al aire, pero la realidad es que el acorde que se obtiene es de escasa utilidad práctica.

Lo mismo, si no peor, sucede con Sol menor (Gm) si lo tratamos de derivar de Sol mayor (G) al aire:

G: 320003 / GBDGBG / 135131

En Sol mayor, como ves, la tercera (nota SI, B) se encuentra, además de en la quinta cuerda, en la segunda al aire. No podemos bajar un semitono esa nota porque nos hemos quedado sin guitarra, como en Do menor.

De modo que, a efectos prácticos, en este estudio CAGED para acordes menores descartaremos las posiciones C y G, quedándonos exclusivamente con las formas A, E y D.

Una terminología que, a estas alturas, debe quedarte ya clara:

Denominamos acorde menor en segunda posición CAGED al acorde con cejilla (o sin ella, si se monta al aire) que se obtiene empleando la forma Am (A es la segunda letra de CAGED).

Re menor (Dm) con forma de La menor (Am)
Re menor (Dm) con forma de La menor (Am)

¿Por qué este acorde es Re menor?

Para responder a la pregunta hay que localizar la fundamental del acorde. En la forma A, si revisas la estructura del acorde, ésta se encuentra en la quinta cuerda. En el gráfico, hemos trazado una cejilla en el quinto traste, de modo que nuestra fundamental se halla en el quinto traste de la quinta cuerda. Una sencilla cuenta te lleva hasta la nota Re, de modo que el acorde representado es Re menor (Dm).

Es muy importante, a la hora de transponer con agilidad los acordes CAGED usando cejillas, que tengas bien aprendidas las notas en la sexta, quinta y cuarta cuerdas, pues eso te permitirá localizar las fundamentales rápidamente. Si aún no tienes esa habilidad, no lo demores un solo día más y comienza a practicar ya.

Denominamos acorde menor en cuarta posición CAGED (cuarta letra, E), al acorde con cejilla que se obtiene empleando la forma Em, Mi menor al aire:

La menor (Am) en forma de Mi menor (Em)
La menor (Am) en forma de Mi menor (Em)

En este caso, nuestra referencia se halla en la sexta cuerda, como puedes apreciar si revisas la estructura del acorde. La sexta cuerda, pisada en el quinto traste, genera la nota LA (A), y por eso el acorde del gráfico se denomina La menor (Am).

Denominamos acorde menor en quinta posición CAGED (letra D, quinta en la palabra CAGED) al acorde que se obtiene empleando con cejilla la forma de Re menor (Dm) al aire:

Sol menor (Gm) con forma de Re menor (Dm)
Sol menor (Gm) con forma de Re menor (Dm)

Puedes elegir entre hacer la cejilla parcial, cubriendo las 4 primeras cuerdas, o bien dejar el dedo 1 sobre la cuarta cuerda, como aparece en la figura. El resultado es el mismo. Es un Sol menor (Gm) porque, en el acorde Re menor (Dm) al aire, la fundamental está localizada en la cuarta cuerda que, pisada en el quinto traste, nos lleva a la nota SOL (G).

Por lo general, no es común que la gente se refiera a estos acordes como segunda, cuarta o quinta posición CAGED. Se dice, simplemente, acorde en forma de La menor, Mi menor o Re menor. Pero considero importante que comprendas esta nomenclatura, a la que recurriré con frecuencia, pues te permite comprender como encajan estas piezas en el sistema CAGED.

En sucesivos artículos profundizaremos en los tres acordes presentados hoy, realizaremos más ejercicios prácticos y mostraremos algunas simplificaciones interesantes derivadas de estas posiciones.

Javier Montero Gabarró


http://elclubdelautodidacta.es/wp/2014/09/guitarra-el-metodo-caged-y-los-acordes-menores/


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 la categoría Guitarra.

Índice de la categoría Armonía.

Python – El concepto de Clase

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

Ha llegado el momento de que introduzcamos la Programación Orientada a Objetos en Python. Supondremos que esta es la primera vez que te acercas a esta metodología y que desconoces completamente o tienes nociones imprecisas de lo que son las clases y los objetos, de modo que comenzaremos por lo esencialmente básico para que no arrastres lagunas conforme el tema vaya adquiriendo más complejidad.

Por cuestiones de economía me he permitido autoplagiarme empleando los ejemplos, e incluso las mismas palabras, que utilicé en la introducción a la POO que escribí en la serie dedicada a Java. Naturalmente, nuestros caminos divergirán tan pronto como comencemos a picar código concreto en Python.

El tratamiento empleado por Python para la POO difiere de manera importante en algunos aspectos al utilizado en otros lenguajes como Java, C++ o C#. Aunque podríamos habernos acercado a este tema directamente de un modo más pythonista, he preferido que nuestros primeros pasos sean sólidos, apoyados en un marco conceptualmente universal, como el compartido por los lenguajes de programación anteriormente citados.

¿Preparado para una nueva manera de resolver problemas?

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.

Empleando un lenguaje puramente pythonista, tanto a los atributos como a los métodos aquí descritos se les conoce como simplemente atributos. Para diferenciar unos de otros, Python emplea el término atributos de datos para referirse a los datos característicos de la clase. No obstante, al menos mientras continuemos presentando los conceptos básicos, seguiremos distinguiendo aquí entre atributos y métodos.

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

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

Para crear en Python la clase Coche comenzamos usando la palabra reservada class, seguida del nombre de la clase y del símbolo de dos puntos:

class Coche:
    instrucción 1
    instrucción 2
    ...
    instrucción n

La clase más simple de todas no haría nada:

class Coche:
    pass

La sentencia pass pasa completamente, no hace absolutamente nada. Es útil en contextos en los que se requiere la presencia de al menos una instrucción, hasta que la inspiración acuda y coloquemos código sustituto.

Típicamente, indentados en la definición, introduciremos los atributos y métodos de que consta la clase Coche.

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

Introduzcamos algunos atributos:

class Coche:

    marca = ''
    modelo = ''
    color = ''
    numero_de_puertas = 0
    cuenta_kilometros = 0
    velocidad = 0
    arrancado = False

Hemos utilizado, provisionalmente, valores iniciales para los atributos: la cadena vacía para los tipo string, cero para los numéricos y False para el booleano, pero podrían haber sido otros cualesquiera. En el momento en que comencemos a fabricar objetos de esta clase todos estos atributos podrán recibir su valor concreto y particular.

Definamos ahora los métodos de la clase Coche:

class Coche:
    
    marca = ''
    modelo = ''
    color = ''
    numero_de_puertas = 0
    cuenta_kilometros = 0
    velocidad = 0
    arrancado = False

    def arrancar(self):
        pass
  
    def parar(self):
        pass
  
    def acelerar(self):
        pass

    def frenar(self):
        pass

    def pitar(self):
        pass

    def consultar_velocimetro(self):
        pass

    def consultar_cuenta_kilometros(self):
        pass

Observa que los métodos se implementan exactamente igual que las funciones. Como tales, junto a la palabra clave def aparece el nombre del método seguido de unos paréntesis con la declaración de parámetros formales, finalizando con dos puntos e indentando el cuerpo del método a continuación. Al igual que las funciones ordinarias, los métodos podrán o no devolver un valor.

Fíjate en self, un parámetro que debe figurar siempre al comienzo de todo método. Su significado quedará completamente claro en el siguiente artículo, cuando expliquemos el concepto de Objeto. Por el momento, como primera toma de contacto, que te vaya sonando que self hace referencia al objeto concreto sobre el que se está invocando el método.

La elección de self como nombre del parámetro es arbitraria, podría servir cualquier otro término. Aquí nos sumaremos a la denominación favorita entre la comunidad pythonista.

Hemos rellenado el cuerpo de los métodos con la instrucción nula pass, pero seamos algo atrevidos y escribamos algo de código:

class Coche:
    
    marca = ''
    modelo = ''
    color = ''
    numero_de_puertas = 0
    cuenta_kilometros = 0
    velocidad = 0
    arrancado = False

    def arrancar(self):
        if not self.arrancado:
            print('Roarrrr')
            self.arrancado = True
        else:
            # Dale al encendido estando el coche arrancado y escucha...
            print('Kriiiiiiiiiiicccc')
  
    def parar(self):
        self.arrancado = False
  
    def acelerar(self):
        if self.arrancado:
            self.velocidad = self.velocidad + 1

    def frenar(self):
        if self.velocidad > 0:
            self.velocidad = self.velocidad - 1

    def pitar(self):
        print('Bip Bip Bip')

    def consultar_velocimetro(self):
        return self.velocidad

    def consultar_cuenta_kilometros(self):
        return self.cuenta_kilometros

Intenta comprender el código aunque aún no hayamos explicado la notación punto ni el uso de self. No te preocupes, en absoluto, si te surgen dudas, pues todo quedará claro en el siguiente artículo. Lo importante ahora es que te quedes con los conceptos de clase, atributo y método.

La siguiente podría ser una primera aproximación simple al modelado de una persona:

class Persona:
    
    sexo = ''
    nombre = ''
    edad = 0
    coche = Coche()   # El coche que conduce esa persona
  
    def saludar(self):
        print('Hola, me llamo', self.nombre)

    def dormir(self):
        print('Zzzzzzzzzzz')

    def obtener_edad(self):
        return self.edad

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

coche = Coche() # El coche que conduce esa persona

No confundas el nombre del atributo (coche, en minúsculas), con el nombre de la clase (Coche, con la primera en mayúsculas). Recuerda que para Python son identificadores distintos. Nuevamente, no te preocupes si no comprendes la sentencia, que hace mención a la construcción explícita de un objeto de tipo Coche. El propósito es simplemente ilustrar que entre los atributos de una clase, además de tipos comunes (números, strings, listas, etc…), pueden figurar objetos de cualquier clase, incluso de las creadas por nosotros mismos.

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

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

class Emocion:
    emocion = ''
  
    def obtener_emocion(self):
        return self.emocion
    
    def cambiar_emocion(self, nueva_emocion):
        self.emocion = nueva_emocion

Observa el método cambiar_emocion(), que además de self define un nuevo parámetro.

En el próximo artículo explicaremos el concepto de Objeto, gracias al cual materializaremos nuestras clases en entidades concretas, coches rugientes, personas de carne y hueso o sentidas emociones. Hasta entonces, bienvenido al apasionante mundo de la programación orientada a objetos.

Javier Montero Gabarró


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


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

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