Mustersuche für Nur-Spanisch-VersteherInnen - Teil I

So sieht es am Ende aus:

G C Am Em F C Am Em G C Am Em F 

G C Am Em F C Am Em G C Am Em 

G C Am Em F C Am Em G C Am 

G C Am Em F C Am Em G C 

G C Am Em F C Am Em G 

G C Am Em F C Am Em 

G C Am Em F C Am 

G C Am Em F C 

G C Am Em F 

G C Am Em 

G C Am 

G C 

G 

C Am Em F C Am Em G C Am Em F 

C Am Em F C Am Em G C Am Em 

C Am Em F C Am Em G C Am 

C Am Em F C Am Em G C 

C Am Em F C Am Em G 

C Am Em F C Am Em 

C Am Em F C Am 

C Am Em F C 

C Am Em F 

C Am Em 

C Am 

C 

Am Em F C Am Em G C Am Em F 

Am Em F C Am Em G C Am Em 

Am Em F C Am Em G C Am 

Am Em F C Am Em G C 

Am Em F C Am Em G 

Am Em F C Am Em 

Am Em F C Am 

Am Em F C 

Am Em F 

Am Em 

Am 

Em F C Am Em G C Am Em F 

Em F C Am Em G C Am Em 

Em F C Am Em G C Am 

Em F C Am Em G C 

Em F C Am Em G 

Em F C Am Em 

Em F C Am 

Em F C 

Em F 

Em 

F C Am Em G C Am Em F 

F C Am Em G C Am Em 

F C Am Em G C Am 

F C Am Em G C 

F C Am Em G 

F C Am Em 

F C Am 

F C 

F 

C Am Em G C Am Em F 

C Am Em G C Am Em 

C Am Em G C Am 

C Am Em G C 

C Am Em G 

C Am Em 

C Am 

C 

Am Em G C Am Em F 

Am Em G C Am Em 

Am Em G C Am 

Am Em G C 

Am Em G 

Am Em 

Am 

Em G C Am Em F 

Em G C Am Em 

Em G C Am 

Em G C 

Em G 

Em 

G C Am Em F 

G C Am Em 

G C Am 

G C 

G 

C Am Em F 

C Am Em 

C Am 

C 

Am Em F 

Am Em 

Am 

Em F 

Em 

F 

Es lässt sich sagen: schön. Schön sieht das aus.

Aber das ist erst der Anfang, das dicke Ende wartet vermutlich nur darauf, später unerwartet zuschlagen zu können. Mer schau'n aber trotzdem mal ...

Aktueller + bisheriger Stand


#!/usr/bin/env python
# coding: utf-8

# In[1]:


# Datei öffnen und einlesen

template = open('/home/zarko/Dokumente/mma-Files/chord-templates/regular-templates/NeuesTemplate.mma','r')


# In[2]:


import re

chords = []

muster = re.compile('^[0-9].*')

for zeile in template:
    if muster.match(zeile):
        zeile_rstrp = zeile.rstrip()
        chord = re.sub(r'^[0-9]+[^a-zA-Z]+([a-zA-Z].*$)',r'\1',zeile_rstrp)
        print(chord)
        chords.append(chord)


# In[3]:


# Datei schließen

template.close()


# In[4]:


chords


# In[5]:


progression_fund = ""

for akkord in chords:
    progression_fund = progression_fund + akkord + "\t"
   
progression_fund = progression_fund.rstrip()
progression_fund


# In[9]:


# Alle möglichen Suchmuster erstellen

import time

suchmuster = []

chords_temp = chords.copy()
removes = len(chords_temp)

for n in range(removes):   
    newlist = chords_temp.copy()
    nl_removes = len(newlist)
    for m in range(nl_removes):
        suchmuster_temp = ""
        for akkord in newlist:
            suchmuster_temp = suchmuster_temp + akkord + "\t"
        suchmuster_temp = suchmuster_temp.rstrip()
        suchmuster.append(suchmuster_temp)
        newlist.pop()
    chords_temp.remove(chords_temp[0])


# In[10]:


type(suchmuster)


# In[11]:


chords


# In[12]:


for muster in suchmuster:
    print(muster,"\n")


Die große Frage ist, ob dieser Ansatz sinnvoll ist, oder ob es sinnvollere gibt (auch wenn er nicht unsinnvoll sein sollte [Grad der Sinnvolligkeit wäre evtl. auch noch zu definieren]).


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Diese Suchmuster entdubliziert und nummeriert (aber nicht sortiert):


suchmuster = list(set(suchmuster))

for musterno in range(len(suchmuster)):
    print("Muster-Nummero: ", musterno,"\n\n", suchmuster[musterno], "\n\n")

 Ergibt (Ende der Ausgabe):

Muster-Nummero:  4607 

 F C Am Em G C Am Em G C Am Em C Am Em G C Am Em G C Am Em F C Am Em 


Muster-Nummero:  4608 

 Em G C Am Em G C Am Em C Am Em G C Am Em G 


Muster-Nummero:  4609 

 Am Em G C Am Em C Am Em F C Am Em G C Am Em F C Am Em G C Am Em G C Am Em C Am Em G C Am Em G C Am Em F C Am Em G C Am Em F C Am Em G 


Muster-Nummero:  4610 

 C Am Em F C Am Em G C Am Em G C Am Em G C Am Em G C Am Em C Am Em F C Am Em G C Am Em F C Am Em G C Am Em G C Am Em C Am Em G C Am Em G C Am Em F C Am 
 
 

Wenn ohnehin alle Suchmuster durchprobiert werden sollen - und das ist das bisherige Vorhaben an dieser Stelle -, brauchen sie nicht vorsortiert zu werden. Es wird aber nicht dabei bleiben, alle Suchmuster für sinnvoll zu erachten. Zum Beispiel könnte ich mir vorstellen, daß mindestens alle Suchmuster, die länger als der Suchstring/2 sind, wegfallen können - ggf. bei Erhalt des Suchmusters, was genauso lang wie der Suchstring ist (jedenfalls für theoretisches Erörterli, oso; für die Praxis werden mutmaßlich nur Suchstrings interessant sein, die mindestens viermal vorkommen können ... mal schau'n ...).

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Update


Ist ja easy-peasy bis jetzt. Der folgende Code:


import pandas as pf

musterfunde = []

for suchstring in suchmuster:
    suchstring_regex = re.compile(suchstring)
    # print(suchstring_regex, "\n")
    fundzahl = len(re.findall(suchstring_regex,progression_fund))
    # print("Anzahl der gefundenen Muster: ", fundzahl, "\n")
    musterfunde.append([fundzahl,suchstring])
   
musterfunde_df = pd.DataFrame(musterfunde, columns=['fundzahl', 'muster'])

musterfunde_df.sort_values(by=['fundzahl'], ascending=False)


gibt das folgende aus (Ausschnitt!):



fundzahl muster
2514 27 Em
575 27 Am
1953 25 C\tAm
213 25 C
784 25 C\tAm\tEm
4599 25 Am\tEm
93 16 G
2487 14 Am\tEm\tG
4597 14 C\tAm\tEm\tG
161 14 Em\tG
1843 13 Em\tG\tC
4009 13 G\tC
1160 13 Am\tEm\tG\tC
1635 13 G\tC\tAm
3351 13 Em\tG\tC\tAm
753 13 G\tC\tAm\tEm
3048 9 C\tAm\tEm\tG\tC\tAm\tEm
4591 9 Am\tEm\tG\tC\tAm\tEm
2749 9 Am\tEm\tG\tC\tAm
4540 9 C\tAm\tEm\tG\tC\tAm
267 9 Em\tG\tC\tAm\tEm
731 9 C\tAm\tEm\tG\tC
3378 8 Am\tEm\tF
1525 8 Em\tF
550 8 C\tAm\tEm\tF
2430 8 F
1383 7 Am\tEm\tF\tC\tAm\tEm\tG
1269 7 C\tAm\tEm\tF\tC
273 7 F\tC\tAm\tEm\tG
609 7 Am\tEm\tF\tC\tAm\tEm
... ... ...
1578 1 Em\tC\tAm\tEm\tG\tC\tAm\tEm\tG\tC\tAm\tEm\tF\t...
1579 1 Em\tF\tC\tAm\tEm\tG\tAm\tDm\tG\tEm\tAm\tDm\tG\...


Von jetzt an wird's aber wohl schwierig ... mal guggeguccilii ...

...

Noch ein bissi weiter vorbereitet (jedenfalls denke - ohne es zu wissen - ich mir, dass es so besser ist als Ausgangslage ;-) ):

musterfunde_df = musterfunde_df.sort_values(by=['fundzahl'], ascending=False)
musterfunde_df.loc[musterfunde_df['fundzahl'] > 2]

143 rows × 2 columns

fundzahl muster
2514 27 Em
575 27 Am
1953 25 C\tAm
213 25 C
784 25 C\tAm\tEm
4599 25 Am\tEm
93 16 G
2487 14 Am\tEm\tG
4597 14 C\tAm\tEm\tG
161 14 Em\tG
1843 13 Em\tG\tC
4009 13 G\tC
1160 13 Am\tEm\tG\tC
1635 13 G\tC\tAm
3351 13 Em\tG\tC\tAm
753 13 G\tC\tAm\tEm
3048 9 C\tAm\tEm\tG\tC\tAm\tEm
4591 9 Am\tEm\tG\tC\tAm\tEm
2749 9 Am\tEm\tG\tC\tAm
4540 9 C\tAm\tEm\tG\tC\tAm
267 9 Em\tG\tC\tAm\tEm
731 9 C\tAm\tEm\tG\tC
3378 8 Am\tEm\tF
1525 8 Em\tF
550 8 C\tAm\tEm\tF
2430 8 F
1383 7 Am\tEm\tF\tC\tAm\tEm\tG
1269 7 C\tAm\tEm\tF\tC
273 7 F\tC\tAm\tEm\tG
609 7 Am\tEm\tF\tC\tAm\tEm
... ... ...
3742 3 F\tC\tAm\tEm\tG\tC\tAm\tEm\tF\tC
4360 3 C\tAm\tEm\tG\tC\tAm\tEm\tF\tC\tAm\tEm
1135 3 C\tAm\tEm\tF\tC\tAm\tEm\tG\tC\tAm\tEm\tF\tC
3314 3 C\tAm\tEm\tG\tC\tAm\tEm\tF\tC\tAm\tEm\tG\tC\tAm
1653 3 Am\tEm\tG\tC\tAm\tEm\tF\tC\tAm
4034 3 C\tAm\tEm\tG\tC\tAm\tEm\tG\tC\tAm
1470 3 Am\tEm\tG\tC\tAm\tEm\tC
874 3 C\tAm\tEm\tG\tC\tAm\tEm\tC
230 3 G\tC\tAm\tEm\tF\tC\tAm\tEm\tG\tC\tAm
1187 3 C\tAm\tEm\tG\tC\tAm\tEm\tF\tC\tAm\tEm\tG\tC\tA...
3200 3 C\tAm\tEm\tG\tC\tAm\tEm\tF\tC\tAm\tEm\tG
3175 3 C\tAm\tEm\tC
1738 3 C\tAm\tEm\tG\tC\tAm\tEm\tF\tC
3188 3 Am\tEm\tF\tC\tAm\tEm\tG\tC\tAm\tEm\tF\tC\tAm
690 3 Am\tEm\tG\tC\tAm\tEm\tC\tAm
3107 3 C\tAm\tEm\tG\tC\tAm\tEm\tF\tC\tAm
4255 3 F\tC\tAm\tEm\tG\tC\tAm\tEm\tF
2676 3 Am\tEm\tF\tC\tAm\tEm\tG\tC\tAm\tEm\tF\tC
2719 3 Am\tEm\tG\tC\tAm\tEm\tF\tC\tAm\tEm\tG\tC\tAm
1329 3 Am\tEm\tG\tC\tAm\tEm\tC\tAm\tEm
1796 3 G\tC\tAm\tEm\tC
2186 3 C\tAm\tEm\tF\tC\tAm\tEm\tG\tC\tAm\tEm\tF
378 3 Em\tG\tC\tAm\tEm\tC\tAm\tEm
4141 3 Am\tEm\tC\tAm
1543 3 C\tAm\tEm\tF\tC\tAm\tEm\tG\tC\tAm\tEm\tF\tC\tA...
979 3 Em\tF\tC\tAm\tEm\tG\tC\tAm\tEm\tF
1618 3 Em\tG\tC\tAm\tEm\tF\tC\tAm\tEm\tG
3117 3 Am\tEm\tG\tC\tAm\tEm\tF\tC\tAm\tEm
4263 3 C\tAm\tEm\tC\tAm\tEm
693 3 G\tC\tAm\tEm\tF\tC\tAm\tEm\tG\tC


Sackgasse! Ich habe es schon geahnt!


uniques = []

for fundzahl in range(max(musterfunde_df['fundzahl'])):
    list_2check = musterfunde_df.loc[musterfunde_df['fundzahl'] == fundzahl]
    print("Fundzahl = ", fundzahl)
    # time.sleep(11)
    if len(list_2check) > 0:
        string_2check = list_2check.sort_values(by=['musterlaenge'], ascending=False).head(1)['muster'].values[0]
        print(string_2check, "\n")
        uniques.append([string_2check,fundzahl])
        for object_2check in list_2check['muster']:
            print("Objekt ist: ", object_2check, "\n")
            if object_2check not in string_2check:
                print("Hippihippi-huuuraaayyy!!\n")
                uniques.append([object_2check,fundzahl])
               
uniques
uniques_df = pd.DataFrame(uniques, columns=['muster','fundzahl'])
uniques_df = uniques_df.sort_values(by=['fundzahl'], ascending=False)
uniques_df

117 rows × 2 columns

muster fundzahl
116 C\tAm\tEm 25
115 G 16
114 C\tAm\tEm\tG 14
113 G\tC\tAm 13
112 G\tC\tAm\tEm 13
111 Em\tG\tC\tAm 13
110 Am\tEm\tG\tC 13
109 C\tAm\tEm\tG\tC\tAm\tEm 9
108 C\tAm\tEm\tF 8
107 C\tAm\tEm\tF\tC\tAm\tEm\tG 7
104 F\tC\tAm\tEm\tG\tC\tAm 6
103 Am\tEm\tF\tC\tAm\tEm\tG\tC 6
105 F\tC\tAm\tEm\tG\tC\tAm\tEm 6
106 Em\tF\tC\tAm\tEm\tG\tC\tAm 6
102 C\tAm\tEm\tG\tC\tAm\tEm\tF 5
92 Em\tC\tAm\tEm 4
82 C\tAm\tEm\tF\tC\tAm\tEm\tG\tC\tAm\tEm 4
83 G\tC\tAm\tEm\tF\tC\tAm 4
84 Em\tG\tC\tAm\tEm\tG\tC 4
85 Em\tG\tC\tAm\tEm\tF\tC\tAm 4
86 G\tC\tAm\tEm\tG\tC 4
87 Am\tEm\tG\tC\tAm\tEm\tF\tC 4
89 Em\tG\tC\tAm\tEm\tG 4
90 Em\tG\tC\tAm\tEm\tF\tC 4
91 G\tC\tAm\tEm\tF\tC\tAm\tEm 4
88 Em\tC 4
93 G\tC\tAm\tEm\tG\tC\tAm\tEm 4
95 Em\tG\tC\tAm\tEm\tG\tC\tAm 4
96 Em\tC\tAm 4
97 G\tC\tAm\tEm\tG 4
... ... ...
7 C\tAm\tEm\tF\tC\tAm\tEm\tG\tC\tAm\tEm\tG\tC\tAm 2
6 Em\tC\tAm\tEm\tG\tC 2
22 C\tAm\tEm\tG\tC\tAm\tEm\tF\tC\tAm\tEm\tG\tC\tA... 2
4 Em\tG\tC\tAm\tEm\tG\tC\tAm\tEm\tC\tAm 2
3 Em\tC\tAm\tEm\tG\tC\tAm\tEm 2
2 G\tC\tAm\tEm\tG\tC\tAm\tEm\tC\tAm\tEm 2
21 Am\tEm\tF\tC\tAm\tEm\tG\tC\tAm\tEm\tG\tC\tAm\tEm 2
29 Em\tG\tC\tAm\tEm\tG\tC\tAm\tEm\tC\tAm\tEm 2
23 Am\tEm\tF\tC\tAm\tEm\tG\tC\tAm\tEm\tG\tC 2
24 G\tC\tAm\tEm\tF\tC\tAm\tEm\tG\tC\tAm\tEm\tF 2
44 Dm\tG\tEm 2
43 Em\tF\tC\tAm\tEm\tG\tC\tAm\tEm\tG\tC 2
42 C\tAm\tEm\tG\tC\tAm\tEm\tG\tC\tAm\tEm\tC\tAm 2
41 Em\tC\tAm\tEm\tG 2
40 Am\tDm\tG\tEm 2
39 Em\tF\tC\tAm\tEm\tG\tC\tAm\tEm\tG\tC\tAm 2
38 F\tC\tAm\tEm\tG\tC\tAm\tEm\tG\tC\tAm\tEm 2
37 Am\tEm\tF\tC\tAm\tEm\tG\tC\tAm\tEm\tG\tC\tAm 2
36 F\tC\tAm\tEm\tG\tC\tAm\tEm\tG\tC\tAm 2
35 Am\tEm\tG\tC\tAm\tEm\tG\tC\tAm\tEm\tC 2
34 C\tAm\tEm\tF\tC\tAm\tEm\tG\tC\tAm\tEm\tG 2
33 Em\tC\tAm\tEm\tG\tC\tAm 2
32 Am\tDm\tG 2
31 G\tC\tAm\tEm\tG\tC\tAm\tEm\tC 2
30 Am\tEm\tG\tC\tAm\tEm\tG\tC\tAm\tEm\tC\tAm 2
28 C\tAm\tEm\tF\tC\tAm\tEm\tG\tC\tAm\tEm\tG\tC 2
27 Am\tDm 2
26 Em\tF\tC\tAm\tEm\tG\tC\tAm\tEm\tG\tC\tAm\tEm 2
25 Em\tF\tC\tAm\tEm\tG\tC\tAm\tEm\tG 2
0 C\tAm\tEm\tF\tC\tAm\tEm\tG\tC\tAm\tEm\tG\tC\tA... 1


Zwar nicht ganz schlecht, nur: So komme ich nicht weiter!!!


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Update


import re

uniques_fc_onob = []  # Muster, die mit dem ersten Akkord beginnen und ungerade Taktzahl besitzen
uniques_fc_enob = []  # Muster, die mit dem ersten Akkord beginnen und gerade Taktzahl besitzen

fc = re.sub(r'^([^\t]+).*$', r'\1', progression_fund)

for index, row in uniques_df.iterrows():
    muster_tmp = row.muster
    nob_tmp = re.sub(r'[^\t]+', r'C', muster_tmp)
    nob_tmp = re.sub(r'[\t]', r'', nob_tmp)
    nob_tmp = len(nob_tmp)
    if muster_tmp.startswith(fc):
        print('Helau!\n')
        print(muster_tmp, "\n")
        print(nob_tmp, "\n")
        # Ist es eine ungerade Zahl an Takten?
        if nob_tmp % 2 != 0:
            uniques_fc_onob.append([muster_tmp, row.fundzahl])
        else:
            uniques_fc_enob.append([muster_tmp, row.fundzahl])



for chords in uniques_fc_enob:
    print(chords[1], "mal\t", chords[0], "\n")

bringt (Ausschnitt):

8 mal  F Em7 A7 Dm Dm Bb 

4 mal  F F 

4 mal  F Em7 A7 Dm Dm Bb C7 Bb F C Dm G7 Bb F 

4 mal  F Em7 A7 Dm Dm Bb Gm C 

2 mal  F Em7 A7 Dm Dm Bb C7 Bb F C Dm G7 Bb F Em7 A7 Dm Dm Bb Gm C F Em7 A7 Dm Dm 

2 mal  F Em7 A7 Dm Dm Bb Gm C F F Em7 A7 Dm Dm Bb C7 Bb F C Dm G7 Bb 

2 mal  F F Em7 A7 Dm Dm Bb C7 Bb F C Dm G7 Bb F Em7 A7 Dm Dm Bb Gm C F Em7 A7 Dm 

Und:


for chords in uniques_fc_enob:
    chordstring_tmp = chords[0]
    for wdh in range(11):       
        if chordstring_tmp in progression_fund:
            if wdh > 0:
                print(wdh, "mal Wiederholung. Aber Hallo!\n")
                print(chordstring_tmp, "\n")
        chordstring_tmp = chordstring_tmp + "\t" + chordstring_tmp

bringt:


1 mal Wiederholung. Aber Hallo!

F Em7 A7 Dm Dm Bb C7 Bb F C Dm G7 Bb F F Em7 A7 Dm Dm Bb C7 Bb F C Dm G7 Bb F 

1 mal Wiederholung. Aber Hallo!

F Em7 A7 Dm Dm Bb Gm C F Em7 A7 Dm Dm Bb Gm C 

1 mal Wiederholung. Aber Hallo!

F C Dm G7 Bb F Em7 A7 Dm Dm Bb Gm C F Em7 A7 Dm Dm Bb Gm C F F Em7 A7 Dm Dm Bb C7 Bb F C Dm G7 Bb F Em7 A7 Dm Dm Bb Gm C F Em7 A7 Dm Dm Bb Gm C F F Em7 A7 Dm Dm Bb C7 Bb 

1 mal Wiederholung. Aber Hallo!

F Em7 A7 Dm Dm Bb C7 Bb F C Dm G7 Bb F Em7 A7 Dm Dm Bb Gm C F Em7 A7 Dm Dm Bb Gm C F F Em7 A7 Dm Dm Bb C7 Bb F C Dm G7 Bb F Em7 A7 Dm Dm Bb Gm C F Em7 A7 Dm Dm Bb Gm C F 

1 mal Wiederholung. Aber Hallo!

F Em7 A7 Dm Dm Bb Gm C F Em7 A7 Dm Dm Bb Gm C F F Em7 A7 Dm Dm Bb C7 Bb F C Dm G7 Bb F Em7 A7 Dm Dm Bb Gm C F Em7 A7 Dm Dm Bb Gm C F F Em7 A7 Dm Dm Bb C7 Bb F C Dm G7 Bb 

1 mal Wiederholung. Aber Hallo!

F F Em7 A7 Dm Dm Bb C7 Bb F C Dm G7 Bb F Em7 A7 Dm Dm Bb Gm C F Em7 A7 Dm Dm Bb Gm C F F Em7 A7 Dm Dm Bb C7 Bb F C Dm G7 Bb F Em7 A7 Dm Dm Bb Gm C F Em7 A7 Dm Dm Bb Gm C 
 
 

Sowie:

for chords in uniques_fc_onob:
    chordstring_tmp = chords[0]
    for wdh in range(11):        
        if chordstring_tmp in progression_fund:
            if wdh > 0:
                print(wdh, "mal Wiederholung. Aber Hallo!\n")
                print(chordstring_tmp, "\n")
        chordstring_tmp = chordstring_tmp + "\t" + chordstring_tmp
 
 

bringt:

 
1 mal Wiederholung. Aber Hallo!

F F 
 
 
Wir sind damit übrigens bei Yesterday von Paul McCartney gelandet.
 
Ich glaube, ein bisschen ist es damit dann doch noch weitergegehet, oso.

Kommentare

Beliebte Posts aus diesem Blog

·

Es brennt.

Bye, bye Nord Stream 2!