Tonleiter

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Freumel
User
Beiträge: 46
Registriert: Donnerstag 25. Januar 2018, 13:47

Mittwoch 25. April 2018, 18:23

Hallo zusammen,

mit diesem Programm werde ich keinen Weitpinkelwettbewerb dieser Welt gewinnen, aber ein kurzes Feedback bezüglich "Bad Practice" wäre echt nett!

Im Prinzip möchte ich ein Programm schreiben, welches bestimmte Tonleitern ausspuckt.
Unterteilt wird die 12-Ton Skala in Dur und Moll Tönen.

Besonders unsicher bin ich mir beim leeren Array

Code: Alles auswählen

scale=['','','','','','','']
Gibt es dazu eventuell eine Alternative?

Natürlich gibt es noch ein paar mehr Tonleitern, aber ich denke diese eine macht das Prinzip sehr deutlich - die anderen sind schnell und äquivalent zu dieser in entsprechenden Funktionen untergebracht.

Code: Alles auswählen

vol_dur=['C','C#','D','D#','E','F','F#','G','G#','A','A#','H']
vol_moll=['C','Db','D','Eb','E','F','Gb','G','Ab','A','b','H']



def dur_ionisch(vol_dur,gt):		#gt: Grundton (Startpunkt der Tonleiter)
	i=0
	scale=['','','','','','','']			#(noch leerer) Array der Tonleiter

	while i<7:	
		scale[i]=vol_dur[gt] 
		i=i+1
		if i!=3:				#Bis auf den dritten und letzten Ton in der Tonleiter geht die ionische Tonleiter immer in 
							#Ganztonschritten. Der Letzte Ton ist aber nicht wichtig, da die Tonleiter dort ohnehin zu Ende ist
			gt=gt+2

			if gt==12:		
				gt=0
			if gt==13:
				gt=1

		else:
			gt=gt+1

			if gt==12:
				gt=0
			if gt==13:
				gt=1

	return scale

print dur_ionisch(vol_dur,6)
Sirius3
User
Beiträge: 10360
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 25. April 2018, 19:04

@Freumel: eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht 3. Statt eine Liste mit Dummy-Werten vorzubelegen, erzeugt man einfach eine Liste mit gleich mit den richtigen Werten. Statt einer while-Schleife benutzt man eine hier for-Schleife:

Code: Alles auswählen

def dur_ionisch(vol_dur, gt):
    """ gt: Grundton (Startpunkt der Tonleiter)
    """
    scale = []
    for i in range(1, 8):
        scale.append(vol_dur[gt]) 
        if i!=3:
            # Bis auf den dritten und letzten Ton in der Tonleiter
            # geht die ionische Tonleiter immer in Ganztonschritten.
            # Der Letzte Ton ist aber nicht wichtig, da die Tonleiter
            # dort ohnehin zu Ende ist
            gt=gt+2
            if gt==12:      
                gt=0
            if gt==13:
                gt=1
        else:
            gt=gt+1
            if gt==12:
                gt = 0
            if gt==13:
                gt = 1
    return scale
Jetzt sieht die Berechnung von `gt` noch ziemlich kompliziert aus. Zuerst fällt auf, dass etliche Zeilen Code sowohl im if- als auch else-Block vorkommen. Die kann man einfach danach schreiben.

Code: Alles auswählen

        if i!=3:
            gt=gt+2
        else:
            gt=gt+1
        if gt==12:
            gt = 0
        if gt==13:
            gt = 1
Für die if-Abfrage kann man noch nutzen, dass es das inline-if gibt:

Code: Alles auswählen

        gt = 2 if i != 3 else 1
        if gt==12:
            gt = 0
        if gt==13:
            gt = 1
Jetzt gibt es noch die magischen Zahlen 12 und 13, die einfach durch die Länge der Liste `vol_dur` ersetzt werden kann.

Code: Alles auswählen

def dur_ionisch(vol_dur, gt):
    """ gt: Grundton (Startpunkt der Tonleiter)
    """
    scale = []
    for i in range(1, 8):
        scale.append(vol_dur[gt % len(vol_dur)])
        gt += 2 if i != 3 else 1
    return scale
Aber da das, was auf gt addiert wird immer fix ist, kann man das auch in eine Liste schreiben:

Code: Alles auswählen

def dur_ionisch(vol_dur, gt):
    """ gt: Grundton (Startpunkt der Tonleiter)
    """
    add_gt = [0, 2, 4, 5, 7, 9, 11]
    return [vol_dur[(gt+ a) % len(vol_dur)] for a in add_gt]
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Donnerstag 26. April 2018, 10:32

B-Dur?
A# != B

Umständlich

Code: Alles auswählen

gt=gt+1
if gt==12:
    gt=0
if gt==13:
    gt=1
Mit Modulo brauchst du keine if-Abfragen dafür

Code: Alles auswählen

gt=(gt+1) % 12
Sirius3 hat geschrieben:Jetzt gibt es noch die magischen Zahlen 12 und 13,
12 ist eine magische Zahl in der Musik.
a fool with a tool is still a fool, www.magben.de, YouTube
Freumel
User
Beiträge: 46
Registriert: Donnerstag 25. Januar 2018, 13:47

Donnerstag 26. April 2018, 23:26

MagBen hat geschrieben:B-Dur?
A# != B
Ich denke eigentlich immer in Rauten.
Aber H einen Halbton tiefer (also A#) ist im Jazz glaube ich einfach ein b anstelle Hb (und Bb gibt es im englischen doch gar nicht)

Off-Topic ende.

Der Tipp mit dem % Operator ist Gold wert!
Ich skripte jetzt erstmal alle meine bisherigen Programme um. :o :lol:
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Freitag 27. April 2018, 10:59

Freumel hat geschrieben:Aber H einen Halbton tiefer (also A#) ist im Jazz glaube ich einfach ein b anstelle Hb (und Bb gibt es im englischen doch gar nicht)
Ich stelle mir das ganze als Noten vor.
a fool with a tool is still a fool, www.magben.de, YouTube
Antworten