Analizando la estructura musical del rock nacional con información de lacuerda

Teniendo hojas con acordes (también tablaturas y otros pero no se trendrán en cuenta) para miles de canciones de rock nacional, voy a tratar de hacer un análisis usando estos datos y el poder de Python y sus librerías

Se tratará de responder preguntas como estas:

  • ¿Qué acordes son más utilizados?
  • ¿Qué tipo de acordes son más utilizados (mayor, menor, séptima, etc.)
  • ¿Cuáles son las "frases" más comunes? (secuencias de acordes que se repiten)
  • ¿Cuáles son las tonalidades de acordes más frecuentes?
  • ¿Con qué frecuencia se violan estas tonalidades?

Se parte con la base de datos sqlite generada por el crawler de lacuerda para analizar todos los datos. Se utilizarán como librerías externas:

  • sqlite y mongo para analizar datos
  • matplotlib para graficar
  • mingus para utilizar algunos conceptos de teoría musical
  • requests para hacer consultas HTTP

In [29]:
# Primera línea con todos los imports que se utilizaran
import collections
import operator
import re
import sqlite3
import unicodedata
import random
import requests
from pprint import pprint

In [ ]:

Lo primero que voy a hacer es generar mi dataset de canciones a utilizar. Para esto voy a tomar los textos que muestren los acordes de las canciones. Se utilizará siempre la mejor versión posible, una por canción. Solamente voy a utilizar artistas de rock nacional populares sacados de estas listas: https://es.wikipedia.org/wiki/Anexo:Las_100_canciones_m%C3%A1s_destacadas_del_rock_argentino_seg%C3%BAn_Rolling_Stone_y_MTV https://es.wikipedia.org/wiki/Anexo:Los_100_mejores_%C3%A1lbumes_del_rock_argentino_seg%C3%BAn_Rolling_Stone http://www.rollingstone.com.ar/1250916


In [2]:
# Scrapeando bandas de wikipedia
def get_textarea_content(url):
    text = requests.get(url).text
    match = re.search(r'<textarea .*?>(.*)</textarea>',
                      text,
                      re.MULTILINE|re.DOTALL)
    assert match is not None, "no se encontró textarea"
    return match.group(1)

print(get_textarea_content('https://es.wikipedia.org/w/index.php?title=Anexo:Las_100_canciones_m%C3%A1s_destacadas_del_rock_argentino_seg%C3%BAn_Rolling_Stone_y_MTV&action=edit&section=1'))


== Lista ==

{| style="background:#ffffff" align="top" class="sortable wikitable"
|+ align="center" style="background:DarkSlateBlue; color:white" |'''100 mejores canciones'''
|-
! width="20 px" style="background:Lavender; color:Black"|Posición
! width="350 px" style="background:Lavender; color:Black"|Título
! width="350 px" style="background:Lavender; color:Black"|Cantante o grupo
! width="350 px" style="background:Lavender; color:Black"|Año de publicación
|-
| 1 || [[Canción para mi muerte]] || [[Sui Generis]] || [[1972]]
|-
| 2 || [[La Balsa]] || [[Los Gatos]] || [[1967]]
|-
| 3 || [[Rasguña las piedras]] || [[Sui Generis]] || [[1973]]
|-
| 4 || [[De música ligera]] || [[Soda Stereo]] || [[1990]]
|-
| 5 || [[Ji ji ji]] || [[Patricio Rey Y Sus Redonditos De Ricota]] || [[1986]]
|-
| 6 || [[Sólo le pido a Dios]] || [[León Gieco]] || [[1978]]
|-
| 7 || [[Presente (El momento en que estás)]] || [[Vox Dei]] || [[1970]]
|-
| 8 || [[Seminare]] || [[Serú Girán]] || [[1978]]
|-
| 9 || [[Y dale alegría a mi corazón]] || [[Fito Páez]] || [[1990]]
|-
| 10 || [[Matador (canción de Los Fabulosos Cadillacs)|Matador]] || [[Los Fabulosos Cadillacs]] || [[1993]]
|-
| 11 || [[Muchacha (Ojos de papel)]] || [[Almendra]] || [[1970]]
|-
| 12 || [[La rubia tarada]] || [[Sumo]] || [[1985]]
|-
| 13 || [[El oso (canción)|El Oso]] || [[Moris]] || [[1970]]
|-
| 14 || [[Costumbres Argentinas (canción)|Costumbres Argentinas]] || [[Los Abuelos de la Nada]] || [[1985]]
|-
| 15 || [[Tengo]] || [[Sandro]] || [[1968]]
|-
| 16 || [[Demoliendo hoteles]] || [[Charly García]] || [[1984]]
|-
| 17 || [[Ciudad de pobres corazones]] || [[Fito Páez]] || [[1987]]
|-
| 18 || [[Nada que perder]] || [[Los Pericos]] || [[1987]]
|-
| 19 || [[Qué ves?]] || [[Divididos]] || [[1993]]
|-
| 20 || [[Jugo de tomate frío]] || [[Manal]] || [[1970]]
|-
| 21 || [[Imagenes paganas]] || [[Virus]] || [[1986]]
|-
| 22 || [[Los viejos vinagres]] || [[Sumo]] || [[1986]]
|-
| 23 || [[Los Dinosaurios]] || [[Charly García]] || [[1983]]
|-
| 24 || [[Flaca]] || [[Andres Calamaro]] || [[1997]]
|-
| 25 || [[El rebelde]] || [[La Renga]] || [[1998]]
|-
| 26 || [[Verano del 92]] || [[Los Piojos]] || [[1996]]
|-
| 27 || [[Se viene]] || [[Bersuit Vergarabat]] || [[1998]]
|-
| 28 || [[Tira para arriba]] || [[Miguel Mateos]] || [[1984]]
|-
| 29 || [[11 y 6]] || [[Fito Páez]] || [[1985]]
|-
| 30 || [[Tu eres su seguridad]] || [[Hermética (banda)|Hermetica]] || [[1989]]
|-
| 31 || [[Persiana Americana]] || [[Soda Stereo]] || [[1986]]
|-
| 32 || [[La Bestia Pop]] || [[Patricio Rey y sus Redonditos de Ricota]] || [[1985]]
|-
| 33 || [[Seguir viviendo sin tu amor]] || [[Luis Alberto Spinetta]] || [[1991]]
|-
| 34 || [[Para siempre (canción de Andrés Calamaro y los Ratones Paranoicos)|Para siempre]] || [[Andrés Calamaro]] y [[Los Ratones Paranoicos]] || [[2001]]
|-
| 35 || [[Abarájame]] || [[Illya Kuryaki and the Valderramas]] || [[1995]]
|-
| 36 || [[Mi enfermedad]] || [[Los Rodríguez]] || [[1991]]
|-
| 37 || [[Y lo que quiero es que me pises sin el suelo]] || [[Catupecu Machu]] || [[2000]]
|-
| 38 || [[Sólo se trata de vivir]] || [[Litto Nebbia]] || [[1981]]
|-
| 39 || [[Spaguetti del Rock]] || [[Divididos]] || [[2000]]
|-
| 40 || [[Mirta, de regreso]] || [[Juan Carlos Baglietto]] || [[1982]]
|-
| 41 || [[Uno, dos, ultraviolento]] || [[Los Violadores]] || [[1985]]
|-
| 42 || [[Sin documentos]] || [[Los Rodríguez]] || [[1993]]
|-
| 43 || [[Yo no quiero volverme tan loco]] || [[Seru Giran]] || [[1981]]
|-
| 44 || [[La musica]] || [[El otro yo]] || [[1999]]
|-
| 45 || [[Hacelo por mí]] || [[Attaque 77]] || [[1990]]
|-
| 46 || [[El amor despues del amor]] || [[Fito Páez]] || [[1992]]
|-
| 47 || [[El extraño de pelo largo]] || [[La joven guardia]] || [[1969]]
|-
| 48 || [[En la ciudad de la furia]] || [[Soda Stereo]] || [[1988]]
|-
| 49 || [[El tren de las 16]] || [[Pappo]] || [[1993]]
|-
| 50 || [[Himno de mi corazón]] || [[Los Abuelos de la Nada]] || [[1984]]
|-
| 51 || [[Vasos vacios]] || [[Los Fabulosos Cadillacs]] || [[1988]]
|-
| 52 || [[El anillo del capitan Beto]] || [[Invisible]] || [[1976]]
|-
| 53 || [[No llores por mi, Argentina]] || [[Seru Giran]] || [[1982]]
|-
| 54 || [[Un poco de amor frances]] || [[Patricio Rey y sus Redonditos de Ricota]] || [[1991]]
|-
| 55 || [[Loco]] || [[Andres Calamaro]] || [[1997]]
|-
| 56 || [[Pense que se trataba de cieguitos]] || [[Los Twist]] || [[1983]]
|-
| 57 || [[Me gusta ese tajo]] || [[Pescado Rabioso]] || [[1972]]
|-
| 58 || [[Vos Sabes]] || [[Los Fabulosos Cadillacs]] || [[1999]]
|-
| 59 || [[Puente]] || [[Gustavo Cerati]] || [[1999]]
|-
| 60 || [[Mañana campestre]] || [[Arco Iris (banda)|Arco Iris]] || [[1971]]
|-
| 61 || [[El rock del gato]] || [[Los Ratones Paranoicos]] || [[1989]]
|-
| 62 || [[Una Luna de Miel en la Mano]] || [[Virus]] || [[1985]]
|-
| 63 || [[Pupilas lejanas]] || [[Los Pericos]] || [[1998]]
|-
| 64 || [[Mañana en el abasto]] || [[Sumo]] || [[1987]]
|-
| 65 || [[Gente del futuro]] || [[Miguel Cantilo]] || [[1981]]
|-
| 66 || [[Avanti morocha]] || [[Los Caballeros de la Quema]] || [[1998]]
|-
| 67 || [[La colina de la vida]] || [[León Gieco]] || [[1976]]
|-
| 68 || [[Cuando pase el temblor]] || [[Soda Stereo]] || [[1985]]
|-
| 69 || [[La muralla verde]] || [[Los Enanitos Verdes]] || [[1986]]
|-
| 70 || [[Silencio marginal]] || [[Aquelarre]] || [[1974]]
|-
| 71 || [[Genesis]] || [[Vox Dei]] || [[1971]]
|-
| 72 || [[Trátame suavemente]] || [[Daniel Melero]] || [[1984]]
|-
| 73 || [[Es la vida que me alcanza]] || [[Celeste Carballo]] || [[1982]]
|-
| 74 || [[Mujer Amante]] || [[Rata Blanca]] || [[1990]]
|-
| 75 || [[Malón diabólico]] || [[Babasónicos]] || [[1994]]
|-
| 76 || [[Tu forma de ser]] || [[Los Autenticos Decadentes]] || [[1989]]
|-
| 77 || [[El nuevo camino del hombre]] || [[A.N.I.M.A.L.]] || [[1996]]
|-
| 78 || [[La calle es un lugar]] || [[GIT]] || [[1984]]
|-
| 79 || [[Maribel se durmio]] || [[Luis Alberto Spinetta]] || [[1983]]
|-
| 80 || [[La bifurcada]] || [[Memphis la Blusera]] || [[1988]]
|-
| 81 || [[Chipi chipi]] || [[Charly Garcia]] || [[1994]]
|-
| 82 || [[El el bar de la calle Rodney]] || [[La Portuaria]] || [[1991]]
|-
| 83 || [[Puerto pollenza]] || [[Sandra Mihanovich]] || [[1982]]
|-
| 84 || [[Hola que tal]] || [[Las Pelotas]] || [[1995]]
|-
| 85 || [[Todo a pulmon]] || [[Alejandro Lerner]] || [[1983]]
|-
| 86 || [[Kanishka]] || [[Los Brujos]] || [[1992]]
|-
| 87 || [[Tan solo]] || [[Los Piojos]] || [[1993]]
|-
| 88 || [[Escafandra]] || [[Peligrosos Gorriones]] || [[1993]]
|-
| 89 || [[Ya no soy igual]] || [[Dos Minutos]] || [[1994]]
|-
| 90 || [[Todo Cambia]] || [[Man Ray]] || [[1994]]
|-
| 91 || [[Playas oscuras]] || [[Los Visitantes]] || [[1993]]
|-
| 92 || [[Susy Cadillac]] || [[RIFF]] || [[1982]]
|-
| 93 || [[Ella vendra]] || [[Don Cornelio y la Zona]] || [[1987]]
|-
| 94 || [[Masticar]] || [[Fun People]] || [[1996]]
|-
| 95 || [[Loco un poco]] || [[Turf (banda)|Turf]] || [[2001]]
|-
| 96 || [[Héroes anonimos]] || [[Metropoli]] || [[1986]]
|-
| 97 || [[Gente que no]] || [[Todos tus Muertos]] || [[1988]]
|-
| 98 || [[Lollipop]] || [[Viuda e Hijas de Roque Enroll]] || [[1985]]
|-
| 99 || [[Me gustas mucho]] || [[Viejas Locas]] || [[1999]]
|-
| 100 || [[Morrisey]] || [[Leo Garcia]] || [[2001]]
|}


In [3]:
# Busco los artistas de las 100 mejores canciones
text = get_textarea_content('https://es.wikipedia.org/w/index.php?title=Anexo:Las_100_canciones_m%C3%A1s_destacadas_del_rock_argentino_seg%C3%BAn_Rolling_Stone_y_MTV&action=edit&section=1')
re_link = r'\[\[(?!\d+)(?:[^|\]]+\|)?([^\]]+)\]\]'
artistas = []
for line in text.splitlines():
    links = re.findall(re_link, line)
    artistas.extend(links[1:])  # El primer elemento es el título de la canción
artistas = set(artistas)
#pprint(artistas)

In [4]:
# Busco los artistas de los 100 mejores álbumes
text = get_textarea_content('https://es.wikipedia.org/w/index.php?title=Anexo:Los_100_mejores_%C3%A1lbumes_del_rock_argentino_seg%C3%BAn_Rolling_Stone&action=edit&section=4')
artistas_albumes = set()
for line in text.splitlines():
    links = re.findall(re_link, line)
    if not links:
        continue
    artistas_albumes.add(links[0])  # El primer enlace linkea a la banda
#print(len(artistas_albumes), artistas_albumes)
artistas.update(artistas_albumes)  # Añado al set global de artistas

In [5]:
print('Con esto tenemos una lista de', len(artistas), 'artistas para analizar')


Con esto tenemos una lista de 108 artistas para analizar

Ya tenemos los nombres de los artistas. Ahora necesitamos para cada uno obtener el slug que le asignó lacuerda. Por ejemplo, si un artista es "Pescado Rabioso" el slug correcto es "pescado_rabioso". Generalmente tienen esta forma, aunque en algunos casos (ej: "Los auténticos decadentes" -> "autenticos") va a ser necesario cargarlo manualmente.

Voy a tratar de generar por cada artista un slug comun (uso el alfabeto ascii, convierto a minúscula y reemplazo espacios por guiones bajos). Si existe en la base de datos utilizo ese. Sino le doy la posibilidad al usuario de que lo introduzca manualmente.


In [6]:
# Obtengo el set de slugs de artistas que hay en la base de datos
conn = sqlite3.connect('lacuerda.db')
artistas_lacuerda = {row[0] for row in conn.execute('select slug from artista')}
print('Artistas en la DB:', len(artistas_lacuerda))


Artistas en la DB: 9622

In [14]:
def elimina_tildes(s):
    # Fuente: http://www.leccionespracticas.com/uncategorized/eliminar-tildes-con-python-solucionado
    return ''.join((c for c in unicodedata.normalize('NFD', s) if unicodedata.category(c) != 'Mn'))

def generar_slug(nombre):
    return re.sub(r'\W+', '', elimina_tildes(nombre.lower().replace(' ', '_').replace('-', '_')))

In [15]:
slugs_a_probar = set(map(generar_slug, artistas))
print(len(slugs_a_probar), 'generados de', len(artistas), 'nombres de artistas')
slugs_correctos = artistas_lacuerda.intersection(slugs_a_probar)
print(len(slugs_correctos), 'de', len(slugs_a_probar), 'slugs encontrados automáticamente')


98 generados de 108 nombres de artistas
64 de 98 slugs encontrados automáticamente

In [16]:
slugs = {}
for artista in artistas:
    slug_a_probar = generar_slug(artista)
    if slug_a_probar in artistas_lacuerda:
        slugs[slug_a_probar] = artista  # Asocio el slug al nombre de la banda
    else:
        # Entrada de datos manual
        while True:
            slug = input('Nombre para %s (dejar en blanco para ignorar): ' % artista)
            if not slug:
                break
            if slug == 'quit':
                raise KeyboardInterrupt()  # No tengo ^C
            if slug not in artistas_lacuerda:
                print('El slug', slug, 'no pertenece a la base datos. Ingrese uno correcto')
            else:
                slugs[slug] = artista
                break
                
pprint(slugs)


Nombre para Los Gatos (dejar en blanco para ignorar): gatos
Nombre para La Máquina de Hacer Pájaros (dejar en blanco para ignorar): maquina_de_hacer_pajaros
Nombre para El otro yo (dejar en blanco para ignorar): otro_yo
Nombre para Los Piojos (dejar en blanco para ignorar): piojos
Nombre para Los Twist (dejar en blanco para ignorar): teis
El slug teis no pertenece a la base datos. Ingrese uno correcto
Nombre para Los Twist (dejar en blanco para ignorar): twist
Nombre para Patricio Rey Y Sus Redonditos De Ricota (dejar en blanco para ignorar): patricio_rey
Nombre para Los Violadores (dejar en blanco para ignorar): violadores
Nombre para Juan Carlos Baglietto (dejar en blanco para ignorar): baglietto
El slug baglietto no pertenece a la base datos. Ingrese uno correcto
Nombre para Juan Carlos Baglietto (dejar en blanco para ignorar): j_c_baglietto
Nombre para Los Abuelos de la Nada (dejar en blanco para ignorar): abuelos
Nombre para Pappo’s Blues (dejar en blanco para ignorar): pappo
Nombre para Illya Kuryaki and the Valderramas (dejar en blanco para ignorar): ikv
El slug ikv no pertenece a la base datos. Ingrese uno correcto
Nombre para Illya Kuryaki and the Valderramas (dejar en blanco para ignorar): illya_kuriaki
Nombre para Cerati-Melero (dejar en blanco para ignorar): gustavo_cerati
Nombre para Luis Alberto Spinetta (dejar en blanco para ignorar): l_a_spinetta
El slug l_a_spinetta no pertenece a la base datos. Ingrese uno correcto
Nombre para Luis Alberto Spinetta (dejar en blanco para ignorar): luis_a_spinetta
Nombre para Los Encargados (dejar en blanco para ignorar): encargados
Nombre para Los Caballeros de la Quema (dejar en blanco para ignorar): caballeros_de_la_quema
Nombre para La Renga (dejar en blanco para ignorar): renga
Nombre para La joven guardia (dejar en blanco para ignorar): joven_guardia
Nombre para El Otro Yo (dejar en blanco para ignorar): otro_yo
Nombre para Los Autenticos Decadentes (dejar en blanco para ignorar): autenticos
Nombre para Los Cafres (dejar en blanco para ignorar): cafres
Nombre para Los Pericos (dejar en blanco para ignorar): pericos
Nombre para Los Visitantes (dejar en blanco para ignorar): visitantes
Nombre para Los Fabulosos Cadillacs (dejar en blanco para ignorar): fabulosos
Nombre para Billy Bond y La Pesada del Rock and Roll (dejar en blanco para ignorar): billy_bond
Nombre para Ratones Paranoicos (dejar en blanco para ignorar): ratones
Nombre para El Mató a un Policía Motorizado (dejar en blanco para ignorar): falso
El slug falso no pertenece a la base datos. Ingrese uno correcto
Nombre para El Mató a un Policía Motorizado (dejar en blanco para ignorar): mato_a_un_policia_motorizado
Nombre para Patricio Rey y sus Redonditos de Ricota (dejar en blanco para ignorar): 
Nombre para La Portuaria (dejar en blanco para ignorar): portuaria
Nombre para Los Rodríguez (dejar en blanco para ignorar): rodriguez
Nombre para Los Brujos (dejar en blanco para ignorar): brujos
Nombre para Los Enanitos Verdes (dejar en blanco para ignorar): enanitos_verdes
El slug enanitos_verdes no pertenece a la base datos. Ingrese uno correcto
Nombre para Los Enanitos Verdes (dejar en blanco para ignorar): enanitos
Nombre para Los Ratones Paranoicos (dejar en blanco para ignorar): ratones
Nombre para Spinetta-Páez (dejar en blanco para ignorar): fito_paez
Nombre para Illya Kuryaki &amp; the Valderramas (dejar en blanco para ignorar): 
Nombre para Los Auténticos Decadentes (dejar en blanco para ignorar): 
Nombre para Las Pelotas (dejar en blanco para ignorar): pelotas
Nombre para Bersuit Vergarabat (dejar en blanco para ignorar): bersuit
{'abuelos': 'Los Abuelos de la Nada',
 'alejandro_lerner': 'Alejandro Lerner',
 'almendra': 'Almendra',
 'andres_calamaro': 'Andrés Calamaro',
 'animal': 'A.N.I.M.A.L.',
 'aquelarre': 'Aquelarre',
 'arco_iris': 'Arco Iris',
 'attaque_77': 'Attaque 77',
 'autenticos': 'Los Autenticos Decadentes',
 'babasonicos': 'Babasónicos',
 'bersuit': 'Bersuit Vergarabat',
 'billy_bond': 'Billy Bond y La Pesada del Rock and Roll',
 'brujos': 'Los Brujos',
 'caballeros_de_la_quema': 'Los Caballeros de la Quema',
 'cafres': 'Los Cafres',
 'catupecu_machu': 'Catupecu Machu',
 'celeste_carballo': 'Celeste Carballo',
 'charly_garcia': 'Charly García',
 'cienfuegos': 'Cienfuegos',
 'color_humano': 'Color Humano',
 'daniel_melero': 'Daniel Melero',
 'david_lebon': 'David Lebón',
 'divididos': 'Divididos',
 'don_cornelio_y_la_zona': 'Don Cornelio y la Zona',
 'dos_minutos': 'Dos Minutos',
 'enanitos': 'Los Enanitos Verdes',
 'encargados': 'Los Encargados',
 'estelares': 'Estelares',
 'fabiana_cantilo': 'Fabiana Cantilo',
 'fabulosos': 'Los Fabulosos Cadillacs',
 'fito_paez': 'Spinetta-Páez',
 'flopa_manza_minimal': 'Flopa-Manza-Minimal',
 'friccion': 'Fricción',
 'fun_people': 'Fun People',
 'gatos': 'Los Gatos',
 'git': 'GIT',
 'gustavo_cerati': 'Gustavo Cerati',
 'hermetica': 'Hermetica',
 'illya_kuriaki': 'Illya Kuryaki and the Valderramas',
 'intoxicados': 'Intoxicados',
 'invisible': 'Invisible',
 'j_c_baglietto': 'Juan Carlos Baglietto',
 'joven_guardia': 'La joven guardia',
 'leo_garcia': 'Leo García',
 'leon_gieco': 'León Gieco',
 'litto_nebbia': 'Litto Nebbia',
 'lucas_marti': 'Lucas Martí',
 'luis_a_spinetta': 'Luis Alberto Spinetta',
 'man_ray': 'Man Ray',
 'manal': 'Manal',
 'maquina_de_hacer_pajaros': 'La Máquina de Hacer Pájaros',
 'massacre': 'Massacre',
 'mato_a_un_policia_motorizado': 'El Mató a un Policía Motorizado',
 'memphis_la_blusera': 'Memphis la Blusera',
 'metropoli': 'Metropoli',
 'miguel_abuelo': 'Miguel Abuelo',
 'miguel_cantilo': 'Miguel Cantilo',
 'miguel_mateos': 'Miguel Mateos',
 'mimi_maura': 'Mimí Maura',
 'miranda': 'Miranda!',
 'moris': 'Moris',
 'otro_yo': 'El Otro Yo',
 'pappo': 'Pappo',
 'patricio_rey': 'Patricio Rey Y Sus Redonditos De Ricota',
 'pedro_y_pablo': 'Pedro y Pablo',
 'peligrosos_gorriones': 'Peligrosos Gorriones',
 'pelotas': 'Las Pelotas',
 'pericos': 'Los Pericos',
 'pescado_rabioso': 'Pescado Rabioso',
 'piojos': 'Los Piojos',
 'portuaria': 'La Portuaria',
 'rata_blanca': 'Rata Blanca',
 'ratones': 'Los Ratones Paranoicos',
 'renga': 'La Renga',
 'riff': 'Riff',
 'rodriguez': 'Los Rodríguez',
 'sandra_mihanovich': 'Sandra Mihanovich',
 'sandro': 'Sandro',
 'seru_giran': 'Serú Girán',
 'soda_stereo': 'Soda Stereo',
 'sui_generis': 'Sui Generis',
 'sumo': 'Sumo',
 'tanguito': 'Tanguito',
 'todos_tus_muertos': 'Todos tus Muertos',
 'turf': 'Turf',
 'twist': 'Los Twist',
 'v8': 'V8',
 'viejas_locas': 'Viejas Locas',
 'violadores': 'Los Violadores',
 'virus': 'Virus',
 'visitantes': 'Los Visitantes',
 'viuda_e_hijas_de_roque_enroll': 'Viuda e Hijas de Roque Enroll',
 'vox_dei': 'Vox Dei'}

Una vez que tengo los slugs de los artistas a utilizar obtengo sus canciones y almaceno sus letras y acordes en una estructura de datos (en mi caso voy a usar una simple namedtuple).


In [25]:
Cancion = collections.namedtuple('Cancion', ('artista', 'slug', 'titulo', 'contenido'))

# Selecciono la version de acordes mas votada de cada cancion de un conjunto de artistas
query = """ 
select a.slug, c.slug, c.titulo, v.contenido
from version as v
join 
	(select
	     id_cancion, max(puntaje) as max_puntaje
            from version
	 where formato="R"
	 group by id_cancion) as vj
	on v.id_cancion=vj.id_cancion and v.puntaje=vj.max_puntaje
join cancion as c on v.id_cancion=c.rowid
join artista as a on c.slug_artista=a.slug
where formato="R" and a.slug in (%s)""" % ','.join('?'*len(slugs))
canciones = [Cancion(*row) for row in conn.execute(query, tuple(slugs))]
print(len(canciones), 'canciones a analizar')


5314 canciones a analizar

In [28]:
print(next(filter(lambda c: c.slug=='flaca', canciones)).contenido)


=====================================================================
|             TABLATURAS Y ACORDES DE MÚSICA EN ESPAÑOL             |
+-------------------------- lacuerda.net ---------------------------+
| ARTISTA: Andrés Calamaro                                          |
| CANCION: FLACA                                                    |
| AUTOR:   Andrés Calamaro                                          |
| ALBUM:   Alta Suciedad (19??)                                     |
+------------------------------------------------------ACO-acal0232-+
| TRANS:   María                                                    |
=====================================================================

G              B7
Flaca, no me claves
      Em               C
tus puñales, por la espalda
      G               D
tan profundo, no me duelen
             G    D
no me hacen mal.

G              B7
Lejos, en el centro
        Em          C
de la tierra, las raíces
      G            D
del amor, donde estaban
      G    D
quedarán.

G                        B7
Entre no me olvides me dejé nuestros abriles
       Em                     C
olvidados, en el fonde del placard
                  G                        D
en el cuarto de invitados, eran tiempos dorados
           G      D
un pasado mejor.

G                             B7
Aunque casi me equivoco y te digo poco a poco
         Em                     C
no me mientas, no me digas la verdad
                G                     D
no te quedes callada, no levantes la voz
              G       D
ni me pidas perdón.

G                            B7
Aunque casi te confieso yo también he sido un
          Em                C
perro compañero, un perro ideal
                 G                    D
que aprendió a ladrar y a volver al hogar
             G      D
para poder comer.

---------------------------------------------------
GiOrGi_RoLLiNgA*

Y QUE SEA ROCK !!!!!


=========================== lacuerda.net ============================
Este fichero es trabajo propio de su transcriptor y representa su    
interpretación personal de la canción. El material contenido en      
esta página es para exclusivo uso privado, por lo que se prohibe su  
reproducción o retransmisión, así como su uso para fines comerciales.
=========================== lacuerda.net ============================


In [48]:
print(random.choice(canciones).contenido)


=====================================================================
|             TABLATURAS Y ACORDES DE MÚSICA EN ESPAÑOL             |
+-------------------------- lacuerda.net ---------------------------+
| ARTISTA: Charly García                                            |
| CANCION: CANCION DEL DOS POR TRES                                 |
| AUTOR:   Charly García                                            |
| ALBUM:   Yendo de la cama al living (1982)                        |
+------------------------------------------------------ACO-cgar0741-+
| TRANS:   EACS                                                     |
=====================================================================

D                   A/G 
No tengo nada que hacer 
                    D9/F# 
no tengo nada que dar 
                  Am7 
no encuentro la magia 
         D7         Cmaj7 
en mi manera de hablar 
                        Em7/9/11 
no quiero volver nunca mas 
Todos podemos perder 
todos podemos ganar 
entre las sogas del circo 
y las tiejeras del mal 
no quiero olvidarme de hablar 

               Gmaj7 
Las palidas figuras 
        A(#5)       B7/sus4 
se acercaron hasta mi 
    B7         Csus4 
mi mente tuvo dudas 
     A/C#           D 
y fingi que no las vi 

        Dmaj7 
Ya no quiero vivir asi 
     Cmaj7          B7/sus4 
repitiendo las agonias 
B7       E 
del pasado 
          G7              A(#5) A 
con los hermanos de mi niñez 

es muy duro sobrevivir 
y aunque el tiempo 
ya nos ha vuelto desconfiados 
tenemos algo para decir 
no es la misma cancion de dos por tre 
las cosas ya no son como las ves


=========================== lacuerda.net ============================
Este fichero es trabajo propio de su transcriptor y representa su    
interpretación personal de la canción. El material contenido en      
esta página es para exclusivo uso privado, por lo que se prohibe su  
reproducción o retransmisión, así como su uso para fines comerciales.
=========================== lacuerda.net ============================