# -*- coding: ISO-8859-1 -*- """ capellaScript -- >>> GENERALBASS aussetzen (Version 8.2 - 09.07.10) Die Bezifferung ist generell mittels LIEDTEXT.| Die Harmonisierung für die rechte Hand erfolgt überwiegend in der eingestrichenen Oktave.|| Bitte beachten Sie die detaillierten Informationen unter "Dokumentation" (unten anklicken).| Die Dokumentationsdatei "Generalbass.chm" muss sich dafür in dem "scripts"-Ordner des "persönlicher capella-Ordners" befinden.|| Anmerkung: Die Laufzeit dieses Python-Skripts kann bei größeren Partituren recht lang sein - bitte haben Sie ein wenig Geduld!|| Rückmeldungen bitte an Hans H. Lampe:|HansHermann.Lampe@t-online.de <<< Neu in Version 6: ----------------- - "Erinnerungsvorzeichen" (courtesy accidentals) - wie (#) oder (b) - bleiben unberücksichtigt. - Vorhalte - wie z.B. 76 - werden korrekt ausgeführt - Terzverdopplung bei Sextakkorden auf Wunsch möglich - keine Fehlermeldung mehr bei waagerechten Strich (Halten des Akkords) - +-Zeichen als singuläre Alteration der Terz sind jetzt möglich - Fehler bei Tonartwechsel beseitigt - Das §-Zeichen im Liedtext als Auflösungszeichen - alterierte Bassnoten werden in die rechte Hand übernommen ab Version 6.1: Die Steuerung der Sprachen ist implementiert. ab Version 6.2: Bezifferungen 4$/2, 5x/x, 6x/x, 7x/x, 9x/x, 7x/5x, 7x/5x/x, Vorhalt 65x/x, 65x/xx jetzt korrekt ausgesetzt, Vorhalt an ganzer Note jetzt möglich, 3.Durchgangsnote mit Vorhalt und anderem Wert als die vorhergehenden zwei Noten jetzt korrekt ab Version 6.3: Auswahl der "Durchgangs- und Wechsel-Notenwerte" mittels "Radio-Knöpfen" ab Version 6.4: Keine Analyse des Textfeldes, falls Liedtext-Ebene0 benutzt (Ln:576) ab Version 7.0: Die bezifferte Gb-Notenzeile kann jetzt eine beliebige sein. ab Version 7.1: Korrekte Zuordnung von Klammern, falls die Gb-Zeile nicht die letzte ist Anordnung einer vorhandenen Gb-Instrumentenbezeichnung zwischen beiden GB-Notenzeilen ab Version 7.2: Korrektur (Meldung von Herrn Werner 18-07-09): In Zeile 190 1/1 zusätzlich für Vorhalte an ganzen Noten. Herr Jungmann: get1stOrAddChildNode(el, tagName) zur Vermeidung von mehrfachen alter-Elementen ab Version 7.3: Korrektur: Bei Bassnoten mit Auflösungszeichen werden diese in der entsprechenden Note(Oktavierung) für die rechte Hand berücksichtigt ab Version 7.4: Bei Wechselnoten und Durchgängen führte die Punktierung der dritten Note zu einen rudimentären Balken an der ersten Achtelnote ab Version 7.5: 6/5/a-Bezifferung(a=Alteration): Ergebnis jetzt korrekt. 6a-6/3a-4 und 3a-3 jetzt korrekt. Korrektur unter Punkt 7.4 war nicht OK, jetzt nachgebessert(Zeile 243). ab Version 7.6: Löschen von Schlüsseln innerhalb der Notenzeilen der rechten Hand vor dem Aussetzen. Mehrstimmige Notenzeilen werden berücksichtigt. ab Version 7.7: Wenn "capella'n'" als Character-Set verwendet ist, dann nur die 3 Vorzeichen zulassen. ab Version 8.0: Gegenbewegung der rechten Hand, um Quint- und Oktavparallelen zu reduzieren. t.s. für alle Bassnoten von '0' zu '0' (im Liedtext) als Option im Skript-Dialog. ab Version 8.1: Bei 6+/5 wurde die Hochalterierung der '6' nicht ausgeführt (Dr. Jaksch). Fehler behoben. Bei Einzelstufenbewegungen des Basses explizit Gegenbewegung der Stimmen der rechten Hand - kann im Skript-Dialog abgewählt werden. ab Version 8.2: Integration des "Dachs-Söhner-Giebels" für die Lagensteuerung der Akkorde der rechten Hand (Terz: ^3, Quint: ^5, Oktav: ^8) (Wunsch von Herrn Wolfgang Müller Juni 2010) """ german = ("de", { "title" : 'Einstellungen für das Aussetzen des Generalbasses (Version 8.2)', "labStaff1" : 'Selektion der Generalbass-Zeile (die letzte Zeile des Mustersystems ist automatisch voreingestellt)', "labStaff2" : ' "Beschreibung" der Notenzeile im capella-Mustersystem', "text" : 'Die hier ausgewählten Notenwerte der "Durchgangs- und Wechselnoten" in der Generalbasszeile werden harmonisiert:', "gr8tel" : 'größer als 1/8 (Standard)', "8tel+gr" : "1/8 und größer", "16tel+gr" : "1/16 und größer", "32tel+gr" : "1/32 und größer", "checkNotenWert" : "Der Akkord vor einer nicht harmonisierten ""Durchgangs- oder Wechselnote"" wird im Wert entsprechend vergrößert", "checkGegenBewegung" : "Bei Stufenbewegungen des Basses möglichst Gegenbewegung der Stimmen der rechten Hand", "checkTerzVerdoppl" : "Bei Sextakkorden soll der Basston (Terz) verdoppelt werden", "checkTsVon0zu0" : "Tasto Solo für alle Bassnoten von '0' zu '0' in der Bezifferung (''Liedtext'')", "Gb" : "Generalbass", "hinweis" : 'HINWEIS: Bitte beachten Sie die detaillierten Informationen unter "Hilfe"'}) try: from bassoContinuo_tr import translations translations.append(german) setLanguages(translations) except: #messageBox('Stop','stop') def tr(s): return german[1].get(s, "???") #------------------------------------------------------------------- def changeDoc(score): global pitch, length, accorde, head, data, data0, data1, data2, interval, alter, chord, base, \ dots, duration, Vorhalt0, Vorhalt1, Vorhalt2, newChord, prevData0, prevData1, prevData2, note, \ firstNoteFlag, noteNumber, noteNumberSave, chordXersteNote, base1,accordStaff, key, saveStep, diff, diffX, \ data0X, data0Xset, ts # 1. Schritt: Mustersystem um eine Notenzeile erweitern #====================================================== count = 0 # zum Bestimmen der Gb-Zeile für das Setzen der geschweiften Klammer for staffLayout in score.getElementsByTagName('staffLayout'): count = count + 1 description = staffLayout.getAttribute('description') if description != staffList[selStaff.value()]: continue staffLayout.setAttribute('description','Generalbass') instrument = staffLayout.getElementsByTagName('instrument')[0] name = instrument.getAttribute('name') # Eventuell vorhandenen Instrumenten-Namen instrument.setAttribute('pairName',name)# zwischen die Zeilen setzen und name = '' instrument.setAttribute('name',name) # in der Gb-Zeile löschen accordStaff = staffLayout.cloneNode(True) # Generieren der neuen Notenzeile für die rechte Hand staffLayout.parentNode.insertBefore(accordStaff, staffLayout) instrument.setAttribute('pairName',name) # Löschen des mitgeclonten Instrumentennamens accordStaff.setAttribute('description','Gb ausgesetzt') notation = accordStaff.getElementsByTagName('notation')[0] notation.setAttribute('defaultClef',['treble','bass'][0]) barlines = accordStaff.getElementsByTagName('barlines')[0] # durchgezogene Taktstriche setzen mode = 0 mode = barlines.getAttribute('mode') if mode != '': # es gibt Partituren ohne "mode"-Attribute barlines.removeAttribute('mode') # "erzwingt" durchgezogene Taktstriche für Gb-Instrument layout = score.getElementsByTagName('layout')[0] # geschweifte Klammer setzen und eventuell vorhandene Klammern verschieben brackets = score.getElementsByTagName('brackets') if brackets == []: # noch keine Klammern brackets = addNewChildNode(layout,'brackets') spacing = layout.getElementsByTagName('spacing')[0] # mit diesen beiden Zeilen "erzwinge" spacing.parentNode.insertBefore(brackets, spacing) # ich das Kreieren der neuen Elemente bracket = addNewChildNode(brackets,'bracket') bracket.setAttribute('from',str(count-1)) bracket.setAttribute('to',str(count)) bracket.setAttribute('curly','true') else: # schon Klammern in der Partitur vorhanden for bracket in score.getElementsByTagName('bracket'): # vorhandene Klammern unter der Gb-Zeile um eine Zeile nach unten verschieben bracketLine = bracket.getAttribute('from')[0] if int(bracketLine) > int(count-1): bracket.setAttribute('from',str(int(bracketLine)+1)) # Start einer vorhandenen Klammer unterhalb der Gb-Zeile um eine Zeile nach unten bracketLine = bracket.getAttribute('to')[0] if int(bracketLine) >= int(count-1): bracket.setAttribute('to',str(int(bracketLine)+1)) # Ende einer vorhandenen unterhalb der Gb-Zeile um eine zeile nach unten brackets = score.getElementsByTagName('brackets')[0] bracket = addNewChildNode(brackets,'bracket') bracket.setAttribute('from',str(count-1)) bracket.setAttribute('to',str(count)) bracket.setAttribute('curly','true') # 2. Schritt: Partitur um eine Notenzeile erweitern #================================================== ts = 'OFF' for system in score.getElementsByTagName('system'): for staff in system.getElementsByTagName('staff'): # Aufsuchen der selektierten Notenzeile layout = staff.getAttribute('layout') if layout != staffList[selStaff.value()]: continue staff.setAttribute('layout', 'Generalbass') accordStaff = staff.cloneNode(1) staff.parentNode.insertBefore(accordStaff, staff) accordStaff.setAttribute('layout', 'Gb ausgesetzt') for voice in accordStaff.getElementsByTagName('voice'): # bedeutsam für mehrstimmige Notenzeilen clefSign = voice.getElementsByTagName('clefSign')[0] clefSign.setAttribute('clef','treble') # Überschreiben der geklonten Bassschlüssel durch Violinschlüssel primClef = 0 # zum "Überspringen" der Löschung des Violinchlüssels am Beginn der Notenzeilen, bzw. Stimmen for clefSign in voice.getElementsByTagName('clefSign'): # Löschen aller Schlüssel innerhalb der Notenzeilen (stammten von Gb-Zeile) if primClef == 1: # Nicht löschen des Violinschlüssels zu Beginn der Notenzeilen clefSign.parentNode.removeChild(clefSign) else: primClef = 1 # 3. Schritt: Akkorde bilden #=========================== skip = 0 # jede zweite 16tel-Note überspringen dots = 0 usePrevChord = 0 Vorhalt0 = 0 Vorhalt1 = 0 Vorhalt2 = 0 prevData0 = 0 data0 = '0' # Zeichen in der Ebene '0' data1 = '0' # Zeichen in der Ebene '1' data2 = '0' # Zeichen in der Ebene '2' noteNumber = 0 noteNumberSave = 0 firstNoteFlag = 0 firstStep = 0 dotsX = 0 diff = 0 diffX = 0 data0X = 0 data0Xset = 0 # Ermittlung der ersten Vorzeichnung #----------------------------------- staff = system.getElementsByTagName('staff')[0] voice = staff.getElementsByTagName('voice')[0] noteObjects = voice.getElementsByTagName('noteObjects')[0] clefSign = noteObjects.getElementsByTagName('clefSign')[0] nextObject = nextSiblingElement(clefSign) if nextObject.tagName == 'keySign': key = nextObject # Tonart übernehmen else: key =[] # keine Vorzeichnung (C-Dur) for chord in accordStaff.getElementsByTagName('chord'): # die einzelenen Akkord-Positionen duration = chord.getElementsByTagName('duration')[0] base = duration.getAttribute('base') # Notenwert # Ermittlung eines eventuellen Tonartwechsels vor dem aktuellen Akkord nextObject = prevSiblingElement(chord) if nextObject.tagName == 'keySign': # Tonartwechsel key = nextObject # Tonart übernehmen if base == '1/16' or base == '1/8' or base == '1/4' or base == '1/2' or base == '1/1': dots = duration.getAttribute('dots') if len(dots)!= 0: dots = duration.getAttribute('dots')[0] dotsX = dots else: dotsX = 0 head = chord.getElementsByTagName('head')[0] pitch = head.getAttribute('pitch') alter = head.getElementsByTagName('alter') saveStep = 0 if alter != []: alter = head.getElementsByTagName('alter')[0] saveStep = alter.getAttribute('step') # für die Auswertung einer möglichen Bassnoten-Alteration unter der Funktion "setNote" #------------------------------ Analysieren und Bearbeiten von Durchgangs- und Wechselnoten des Basses -------------------------------# # Array zum Ermitteln von Durchgangs- und Wechselnoten !!!!!!!!!! nur für Gb-Noten ganz ohne Zeichen, bei Zeichen nicht unterdrücken note = {'C2':0,'D2':1,'E2':2,'F2':3,'G2':4,'A2':5,'B2':6,'C3':7,'D3':8,'E3':9,'F3':10,'G3':11,'A3':12,'B3':13,'C4':14,'D4':15,'E4':16, 'F4':17,'G4':18,'A4':19,'B4':20,'C5':21,'D5':22,'E5':23,'F5':24,'G5':25,'A5':26,'B5':27,'C6':28,'D6':29,'E6':30,'F6':31,'G6':32, 'A6':33,'B6':34} if pitch[1] > '1' and pitch[1] < '7': # Einschränken auf die Werte im obigen Array # ------ Analyse der dritten Note, falls zwischen erster und zweiter ein Sekundschritt war -------------- # if firstStep == 1: # ein Sekundschritt von der ersten zur zweiten Note firstStep = 0 # jetzt dritte Note testen noteNumber = note[pitch] diff = abs(noteNumberSave - noteNumber) noteNumberSave = noteNumber savebase = base if diff == 1: # Sekundschritt (Stufe) von der zweiten zur dritten Note ? display = get1stOrAddChildNode(prevChordX,'display') display.setAttribute('invisible','true') # Noten der rechten Hand unsichtbar machen for headX in prevChordX.getElementsByTagName('head'): headX.setAttribute('silent','true') # Noten der rechten Hand tonlos machen beam = get1stOrAddChildNode(prevChordX,'beam') beam.setAttribute('group','split') # Entfernen von rudimentären Balken if wertVergr == 1: duration = prevChordX.getElementsByTagName('duration')[0] duration.setAttribute('noDuration','true') duration = chordXersteNote.getElementsByTagName('duration')[0] base = duration.getAttribute('base') # Notenwert der ersten Note if base == '1/8': duration.setAttribute('base','1/4') base = savebase # aktuellen Wert wieder herstellen elif base == '1/16': duration.setAttribute('base','1/8') beam = get1stOrAddChildNode(chordXersteNote,'beam') beam.setAttribute('group','split') # Entfernen von rudimentären Balken base = savebase # aktuellen Wert wieder herstellen elif base == '1/32': duration.setAttribute('base','1/16') beam = get1stOrAddChildNode(chordXersteNote,'beam') beam.setAttribute('group','split') # Entfernen von rudimentären Balken base = savebase # aktuellen Wert wieder herstellen else: beam = get1stOrAddChildNode(chordXersteNote,'beam') beam.setAttribute('group','split') else: firstNote() # ------ Analyse der zweiten Note, falls "firstNoteFlag" gesetzt wurde --------------- # if firstNoteFlag == 1: # jetzt Schrittweite zur zweiten Note prüfen firstNoteFlag = 0 noteNumber = note[pitch] diff = abs(noteNumberSave - noteNumber) diffX = noteNumber - noteNumberSave noteNumberSave = noteNumber if base1 == base: if diff == 1: # Sekundschritt (Stufe) ? content = chord.getElementsByTagName('verse') length = len(content) if dotsX == 0: # ist mögliche Durchgans- oder Wechselnote unpunktiert? if length == 0: # keine Bezifferung durch Liedtext ? content = chord.getElementsByTagName('content') # Inhalt eines möglichen Textfeldes mit Vorzeichen if content == []: # keine Bezifferung mittels Normaltext ? if base == '1/8': # 1/8-Noten harmonisieren? if selValue == 0: # Eingabe des Anwenders firstStep = 1 # ein Sekundschritt von der ersten zur zweiten Note prevChordX = chord # Vorbereitung auf Durchgangs- oder Wechselnote (könnte sein) if base == '1/16' : # 1/16-Noten harmonisieren? if selValue == 0 or selValue == 1: # Eingabe des Anwenders firstStep = 1 # ein Sekundschritt von der ersten zur zweiten Note prevChordX = chord # Vorbereitung auf Durchgangs- oder Wechselnote (könnte sein) if base == '1/32' : # 1/32-Noten harmonisieren? if selValue == 0 or selValue == 1 or selValue == 2: # Eingabe des Anwenders firstStep = 1 # ein Sekundschritt von der ersten zur zweiten Note prevChordX = chord # Vorbereitung auf Durchgangs- oder Wechselnote (könnte sein) # ------ Kennzeichnen der ersten Note ----------------- # else: # Bezifferung mittels Normaltext firstNote() #messageBox('Stop1','stop1') else: # Bezifferung mittels Liedtext firstNote() #messageBox('Stop2','stop2') else: # kein Sekundschritt if dotsX == 0: firstNote() #messageBox('Stop3','stop3') else: # erste und zweite Note haben ungleiche Werte if dotsX == 0: firstNote() #messageBox('Stop4','stop4') else: # erste Note (keine zweite oder dritte indifiziert) if dotsX == 0: firstNote() #messageBox('Stop5','stop5') #------------------------------------------- Ende Durchgangs- und Wechselnoten ------------------------------------------------# AUSWERTUNG(score) # Auswerten der Bassnote if Vorhalt0 == 1 or Vorhalt1 == 1 or Vorhalt2 == 1: saveChord = chord # Retten der ersten Vorhaltsnote chord = newChord # zweite Vorhaltsnote als aktuelle Note head = newChord.getElementsByTagName('head')[0] if Vorhalt0 == 1: Vorhalt0 = 2 # jetzt in "AUSWERTUNG" durchführen if Vorhalt1 == 1: Vorhalt1 = 2 # jetzt in "AUSWERTUNG" durchführen if Vorhalt2 == 1: Vorhalt2 = 2 # jetzt in "AUSWERTUNG" durchführen if Vorhalt0 == 2 or Vorhalt1 == 2 or Vorhalt2 == 2: AUSWERTUNG(score) # Durchführen des zweiten Vorhaltschritts chord = saveChord # Wiederherstellen der ersten Vorhaltsnote insertAfter(chord.parentNode, newChord, chord) # Setzen der zweiten Vorhaltsnote def AUSWERTUNG(score): global interval, Vorhalt0, Vorhalt1, Vorhalt2, newChord, prevData0, prevData1, prevData2, content, data0, data1, \ data2, length0, data, key, data0X, data0Xset, ts # C-Dur / a-Moll intervalle = {'C':('XX','x','C5','0','D5','0','E5','0','F5','0','G5','0','A5','0','B5','0','C6','0','D5','0'), 'D':('XX','x','D5','0','E5','0','F5','0','G5','0','A5','0','B5','0','C5','0','D6','0','E5','0'), 'E':('XX','x','E5','0','F5','0','G5','0','A5','0','B5','0','C5','0','D5','0','E6','0','F5','0'), 'F':('XX','x','F5','0','G5','0','A5','0','B5','0','C5','0','D5','0','E5','0','F6','0','G5','0'), 'G':('XX','x','G5','0','A5','0','B5','0','C5','0','D5','0','E5','0','F5','0','G6','0','A5','0'), 'A':('XX','x','A5','0','B5','0','C5','0','D5','0','E5','0','F5','0','G5','0','A6','0','B5','0'), 'B':('XX','x','B5','0','C5','0','D5','0','E5','0','F5','0','G5','0','A5','0','B6','0','C5','0')} interval = intervalle[pitch[0]] # 'interval' bekommt die Stammtonzeile - [0] weil Pich aus 2 Zeichen besteht, if key != []: fifths = key.getAttribute('fifths') # die Tonart-Quinten if fifths == '1': # G-Dur / e-Moll intervalle = {'C':('XX','x','C5','0','D5','0','E5','0','F5','1','G5','0','A5','0','B5','0','C6','0','D5','0'), 'D':('XX','x','D5','0','E5','0','F5','1','G5','0','A5','0','B5','0','C5','0','D6','0','E5','0'), 'E':('XX','x','E5','0','F5','1','G5','0','A5','0','B5','0','C5','0','D5','0','E6','0','F5','1'), 'F':('XX','x','F5','1','G5','0','A5','0','B5','0','C5','0','D5','0','E5','0','F6','0','G5','0'), 'G':('XX','x','G5','0','A5','0','B5','0','C5','0','D5','0','E5','0','F5','1','G6','0','A5','0'), 'A':('XX','x','A5','0','B5','0','C5','0','D5','0','E5','0','F5','1','G5','0','A6','0','B5','0'), 'B':('XX','x','B5','0','C5','0','D5','0','E5','0','F5','1','G5','0','A5','0','B6','0','C5','0')} interval = intervalle[pitch[0]] elif fifths == '2': # D-Dur / h-Moll intervalle = {'C':('XX','x','C5','1','D5','0','E5','0','F5','1','G5','0','A5','0','B5','0','C6','1','D5','0'), 'D':('XX','x','D5','0','E5','0','F5','1','G5','0','A5','0','B5','0','C5','1','D6','0','E5','0'), 'E':('XX','x','E5','0','F5','1','G5','0','A5','0','B5','0','C5','1','D5','0','E6','0','F5','1'), 'F':('XX','x','F5','1','G5','0','A5','0','B5','0','C5','1','D5','0','E5','0','F6','1','G5','0'), 'G':('XX','x','G5','0','A5','0','B5','0','C5','1','D5','0','E5','0','F5','1','G6','0','A5','0'), 'A':('XX','x','A5','0','B5','0','C5','1','D5','0','E5','0','F5','1','G5','0','A6','0','B5','0'), 'B':('XX','x','B5','0','C5','1','D5','0','E5','0','F5','1','G5','0','A5','0','B6','0','C5','1')} interval = intervalle[pitch[0]] elif fifths == '3': # A-Dur / fis-Moll intervalle = {'C':('XX','x','C5','1','D5','0','E5','0','F5','1','G5','1','A5','0','B5','0','C6','1','D5','0'), 'D':('XX','x','D5','0','E5','0','F5','1','G5','1','A5','0','B5','0','C5','1','D6','0','E5','0'), 'E':('XX','x','E5','0','F5','1','G5','1','A5','0','B5','0','C5','1','D5','0','E6','0','F5','1'), 'F':('XX','x','F5','1','G5','1','A5','0','B5','0','C5','1','D5','0','E5','0','F6','1','G5','1'), 'G':('XX','x','G5','1','A5','0','B5','0','C5','1','D5','0','E5','0','F5','1','G6','1','A5','0'), 'A':('XX','x','A5','0','B5','0','C5','1','D5','0','E5','0','F5','1','G5','1','A6','0','B5','0'), 'B':('XX','x','B5','0','C5','1','D5','0','E5','0','F5','1','G5','1','A5','0','B6','0','C5','1')} interval = intervalle[pitch[0]] elif fifths == '4': # E-Dur / cis-Moll intervalle = {'C':('XX','x','C5','1','D5','1','E5','0','F5','1','G5','1','A5','0','B5','0','C6','1','D5','1'), 'D':('XX','x','D5','1','E5','0','F5','1','G5','1','A5','0','B5','0','C5','1','D6','1','E5','0'), 'E':('XX','x','E5','0','F5','1','G5','1','A5','0','B5','0','C5','1','D5','1','E6','0','F5','1'), 'F':('XX','x','F5','1','G5','1','A5','0','B5','0','C5','1','D5','1','E5','0','F6','1','G5','1'), 'G':('XX','x','G5','1','A5','0','B5','0','C5','1','D5','1','E5','0','F5','1','G6','1','A5','0'), 'A':('XX','x','A5','0','B5','0','C5','1','D5','1','E5','0','F5','1','G5','1','A6','0','B5','0'), 'B':('XX','x','B5','0','C5','1','D5','1','E5','0','F5','1','G5','1','A5','0','B6','0','C5','1')} interval = intervalle[pitch[0]] elif fifths == '5': # H-Dur / gis-Moll intervalle = {'C':('XX','x','C5','1','D5','1','E5','0','F5','1','G5','1','A5','1','B5','0','C6','1','D5','1'), 'D':('XX','x','D5','1','E5','0','F5','1','G5','1','A5','1','B5','0','C5','1','D6','1','E5','0'), 'E':('XX','x','E5','0','F5','1','G5','1','A5','1','B5','0','C5','1','D5','1','E6','0','F5','1'), 'F':('XX','x','F5','1','G5','1','A5','1','B5','0','C5','1','D5','1','E5','0','F6','1','G5','1'), 'G':('XX','x','G5','1','A5','1','B5','0','C5','1','D5','1','E5','0','F5','1','G6','1','A5','1'), 'A':('XX','x','A5','1','B5','0','C5','1','D5','1','E5','0','F5','1','G5','1','A6','1','B5','0'), 'B':('XX','x','B5','0','C5','1','D5','1','E5','0','F5','1','G5','1','A5','1','B6','0','C5','1')} interval = intervalle[pitch[0]] elif fifths == '6': # Fis-Dur / dis-Moll intervalle = {'C':('XX','x','C5','1','D5','1','E5','1','F5','1','G5','1','A5','1','B5','0','C6','1','D5','1'), 'D':('XX','x','D5','1','E5','1','F5','1','G5','1','A5','1','B5','0','C5','1','D6','1','E5','1'), 'E':('XX','x','E5','1','F5','1','G5','1','A5','1','B5','0','C5','1','D5','1','E6','1','F5','1'), 'F':('XX','x','F5','1','G5','1','A5','1','B5','0','C5','1','D5','1','E5','1','F6','1','G5','1'), 'G':('XX','x','G5','1','A5','1','B5','0','C5','1','D5','1','E5','1','F5','1','G6','1','A5','1'), 'A':('XX','x','A5','1','B5','0','C5','1','D5','1','E5','1','F5','1','G5','1','A6','1','B5','0'), 'B':('XX','x','B5','0','C5','1','D5','1','E5','1','F5','1','G5','1','A5','1','B6','0','C5','1')} interval = intervalle[pitch[0]] elif fifths == '7': # Cis-Dur / ais-Moll intervalle = {'C':('XX','x','C5','1','D5','1','E5','1','F5','1','G5','1','A5','1','B5','1','C6','1','D5','1'), 'D':('XX','x','D5','1','E5','1','F5','1','G5','1','A5','1','B5','1','C5','1','D6','1','E5','1'), 'E':('XX','x','E5','1','F5','1','G5','1','A5','1','B5','1','C5','1','D5','1','E6','1','F5','1'), 'F':('XX','x','F5','1','G5','1','A5','1','B5','1','C5','1','D5','1','E5','1','F6','1','G5','1'), 'G':('XX','x','G5','1','A5','1','B5','1','C5','1','D5','1','E5','1','F5','1','G6','1','A5','1'), 'A':('XX','x','A5','1','B5','1','C5','1','D5','1','E5','1','F5','1','G5','1','A6','1','B5','1'), 'B':('XX','x','B5','1','C5','1','D5','1','E5','1','F5','1','G5','1','A5','1','B6','1','C5','1')} interval = intervalle[pitch[0]] elif fifths == '-1': # F-Dur / d-Moll intervalle = {'C':('XX','x','C5','0','D5','0','E5','0','F5','0','G5','0','A5','0','B5','-1','C6','0','D5','0'), 'D':('XX','x','D5','0','E5','0','F5','0','G5','0','A5','0','B5','-1','C5','0','D6','0','E5','0'), 'E':('XX','x','E5','0','F5','0','G5','0','A5','0','B5','-1','C5','0','D5','0','E6','0','F5','0'), 'F':('XX','x','F5','0','G5','0','A5','0','B5','-1','C5','0','D5','0','E5','0','F6','0','G5','0'), 'G':('XX','x','G5','0','A5','0','B5','-1','C5','0','D5','0','E5','0','F5','0','G6','0','A5','0'), 'A':('XX','x','A5','0','B5','-1','C5','0','D5','0','E5','0','F5','0','G5','0','A6','0','B5','-1'), 'B':('XX','x','B5','-1','C5','0','D5','0','E5','0','F5','0','G5','0','A5','0','B6','-1','C5','0')} interval = intervalle[pitch[0]] elif fifths == '-2': # B-Dur / g-Moll intervalle = {'C':('XX','x','C5','0','D5','0','E5','-1','F5','0','G5','0','A5','0','B5','-1','C6','0','D5','0'), 'D':('XX','x','D5','0','E5','-1','F5','0','G5','0','A5','0','B5','-1','C5','0','D6','0','E5','-1'), 'E':('XX','x','E5','-1','F5','0','G5','0','A5','0','B5','-1','C5','0','D5','0','E6','-1','F5','0'), 'F':('XX','x','F5','0','G5','0','A5','0','B5','-1','C5','0','D5','0','E5','-1','F6','0','G5','0'), 'G':('XX','x','G5','0','A5','0','B5','-1','C5','0','D5','0','E5','-1','F5','0','G6','0','A5','0'), 'A':('XX','x','A5','0','B5','-1','C5','0','D5','0','E5','-1','F5','0','G5','0','A6','0','B5','-1'), 'B':('XX','x','B5','-1','C5','0','D5','0','E5','-1','F5','0','G5','0','A5','0','B6','-1','C5','0')} interval = intervalle[pitch[0]] elif fifths == '-3': # Es-Dur / c-Moll intervalle = {'C':('XX','x','C5','0','D5','0','E5','-1','F5','0','G5','0','A5','-1','B5','-1','C6','0','D5','0'), 'D':('XX','x','D5','0','E5','-1','F5','0','G5','0','A5','-1','B5','-1','C5','0','D6','0','E5','-1'), 'E':('XX','x','E5','-1','F5','0','G5','0','A5','-1','B5','-1','C5','0','D5','0','E6','-1','F5','0'), 'F':('XX','x','F5','0','G5','0','A5','-1','B5','-1','C5','0','D5','0','E5','-1','F6','0','G5','0'), 'G':('XX','x','G5','0','A5','-1','B5','-1','C5','0','D5','0','E5','-1','F5','0','G6','0','A5','-1'), 'A':('XX','x','A5','-1','B5','-1','C5','0','D5','0','E5','-1','F5','0','G5','0','A6','-1','B5','-1'), 'B':('XX','x','B5','-1','C5','0','D5','0','E5','-1','F5','0','G5','0','A5','-1','B6','-1','C5','0')} interval = intervalle[pitch[0]] elif fifths == '-4': # As-Dur / f-Moll intervalle = {'C':('XX','x','C5','0','D5','-1','E5','-1','F5','0','G5','0','A5','-1','B5','-1','C6','0','D5','-1'), 'D':('XX','x','D5','-1','E5','-1','F5','0','G5','0','A5','-1','B5','-1','C5','0','D6','-1','E5','-1'), 'E':('XX','x','E5','-1','F5','0','G5','0','A5','-1','B5','-1','C5','0','D5','-1','E6','-1','F5','0'), 'F':('XX','x','F5','0','G5','0','A5','-1','B5','-1','C5','0','D5','-1','E5','-1','F6','0','G5','0'), 'G':('XX','x','G5','0','A5','-1','B5','-1','C5','0','D5','-1','E5','-1','F5','0','G6','0','A5','-1'), 'A':('XX','x','A5','-1','B5','-1','C5','0','D5','-1','E5','-1','F5','0','G5','0','A6','-1','B5','-1'), 'B':('XX','x','B5','-1','C5','0','D5','-1','E5','-1','F5','0','G5','0','A5','-1','B6','-1','C5','0')} interval = intervalle[pitch[0]] if fifths == '-5': # Des-Dur / b-Moll intervalle = {'C':('XX','x','C5','0','D5','-1','E5','-1','F5','0','G5','-1','A5','-1','B5','-1','C6','0','D5','-1'), 'D':('XX','x','D5','-1','E5','-1','F5','0','G5','-1','A5','-1','B5','-1','C5','0','D6','-1','E5','-1'), 'E':('XX','x','E5','-1','F5','0','G5','-1','A5','-1','B5','-1','C5','0','D5','-1','E6','-1','F5','0'), 'F':('XX','x','F5','0','G5','-1','A5','-1','B5','-1','C5','0','D5','-1','E5','-1','F6','0','G5','-1'), 'G':('XX','x','G5','-1','A5','-1','B5','-1','C5','0','D5','-1','E5','-1','F5','0','G6','-1','A5','-1'), 'A':('XX','x','A5','-1','B5','-1','C5','0','D5','-1','E5','-1','F5','0','G5','-1','A6','-1','B5','-1'), 'B':('XX','x','B5','-1','C5','0','D5','-1','E5','-1','F5','0','G5','-1','A5','-1','B6','-1','C5','0')} interval = intervalle[pitch[0]] elif fifths == '-6': # Ges-Dur / es-Moll intervalle = {'C':('XX','x','C5','-1','D5','-1','E5','-1','F5','0','G5','-1','A5','-1','B5','-1','C6','-1','D5','-1'), 'D':('XX','x','D5','-1','E5','-1','F5','0','G5','-1','A5','-1','B5','-1','C5','-1','D6','-1','E5','-1'), 'E':('XX','x','E5','-1','F5','0','G5','-1','A5','-1','B5','-1','C5','-1','D5','-1','E6','-1','F5','0'), 'F':('XX','x','F5','0','G5','-1','A5','-1','B5','-1','C5','-1','D5','-1','E5','-1','F6','0','G5','-1'), 'G':('XX','x','G5','-1','A5','-1','B5','-1','C5','-1','D5','-1','E5','-1','F5','0','G6','-1','A5','-1'), 'A':('XX','x','A5','-1','B5','-1','C5','-1','D5','-1','E5','-1','F5','0','G5','-1','A6','-1','B5','-1'), 'B':('XX','x','B5','-1','C5','-1','D5','-1','E5','-1','F5','0','G5','-1','A5','-1','B6','-1','C5','-1')} interval = intervalle[pitch[0]] elif fifths == '-7': # Ces-Dur / as-Moll intervalle = {'C':('XX','x','C5','-1','D5','-1','E5','-1','F5','-1','G5','-1','A5','-1','B5','-1','C6','-1','D5','-1'), 'D':('XX','x','D5','-1','E5','-1','F5','-1','G5','-1','A5','-1','B5','-1','C5','-1','D6','-1','E5','-1'), 'E':('XX','x','E5','-1','F5','-1','G5','-1','A5','-1','B5','-1','C5','-1','D5','-1','E6','-1','F5','-1'), 'F':('XX','x','F5','-1','G5','-1','A5','-1','B5','-1','C5','-1','D5','-1','E5','-1','F6','-1','G5','-1'), 'G':('XX','x','G5','-1','A5','-1','B5','-1','C5','-1','D5','-1','E5','-1','F5','-1','G6','-1','A5','-1'), 'A':('XX','x','A5','-1','B5','-1','C5','-1','D5','-1','E5','-1','F5','-1','G5','-1','A6','-1','B5','-1'), 'B':('XX','x','B5','-1','C5','-1','D5','-1','E5','-1','F5','-1','G5','-1','A5','-1','B6','-1','C5','-1')} interval = intervalle[pitch[0]] content = chord.getElementsByTagName('verse') length = len(content) # Anzahl der Zeichen-Ebenen '0-1-2' (Strophen des Liedtextes) length0 = '0' # Anzahl der Zeichen in der Ebene '0' length1 = '0' # Anzahl der Zeichen in der Ebene '1' length2 = '0' # Anzahl der Zeichen in der Ebene '2' if length == 1: # eine Zeichen-Ebene content = chord.getElementsByTagName('verse')[0] # Beginn mit Zeichen-Ebene0 extender = content.getAttribute('extender') # Strich (__) für zu haltenden Akkord if extender == 'true': content.parentNode.removeChild(content) # Löschen der ersten Zeichen-Ebene length = 0 if length == 0: # kein Zeichen als Liedtext (für die zweite Vorhaltsnote immer = 0) if Vorhalt0 != 2 and Vorhalt1 != 2 and Vorhalt2 != 2: # Setzen der zweiten Vorhaltsnote? setNote(5) # bei 'nein' diese Noten setzen setNote(1) setLastNote(3) elif length == 1: # eine Zeichen-Ebene if Vorhalt0 == 0: # Falls in "Vorhalt-Behandlung" nach "else": Löschen der ersten Zeichen-Ebene content = chord.getElementsByTagName('verse')[0] # Beginn mit Zeichen-Ebene0 data0 = content.firstChild.data # Zeichen in Ebene0 if data0Xset == 0: data0X = data0[0] data0Xset = 1 prevData0 = data0 # für eventuelle Auswertung eines Vorhalts content.parentNode.removeChild(content) # Löschen der ersten Zeichen-Ebene length0 = len(data0) # Anzahl der Zeichen in Ebene0 # Lagensteuerung der Akkorde der rechten Hand mittels "Dachs-Söhner-Giebels" # # --------------------------------------------------------------------------- # if length0 == 2: if data0[0] == '^': # "Dachs-Söhner-Giebel" ? if pitch[0] == 'C': if data0[1] == '3': # Terzlage setNoteAbsolut('E6',3,0) # Ton, Zugriff zur Intervall-Tabelle, letzter Ton (kein neuer Head) setNoteAbsolut('C6',1,0) setNoteAbsolut('G5',5,1) elif data0[1] == '5': # Quintlage setNoteAbsolut('G6',5,0) setNoteAbsolut('E6',3,0) setNoteAbsolut('C6',1,1) elif data0[1] == '8': # Oktavlage setNoteAbsolut('C6',1,0) setNoteAbsolut('G5',5,0) setNoteAbsolut('E5',3,1) else: messageBox('Fehler', 'Bezifferung: '+str(data0), img=3) if pitch[0] == 'D': if data0[1] == '3': setNoteAbsolut('F6',3,0) setNoteAbsolut('D6',1,0) setNoteAbsolut('A5',5,1) elif data0[1] == '5': setNoteAbsolut('A5',5,0) setNoteAbsolut('F5',3,0) setNoteAbsolut('D5',1,1) elif data0[1] == '8': setNoteAbsolut('D6',1,0) setNoteAbsolut('A5',5,0) setNoteAbsolut('F5',3,1) else: messageBox('Fehler', 'Bezifferung: '+str(data0), img=3) if pitch[0] == 'E': if data0[1] == '3': setNoteAbsolut('G6',3,0) setNoteAbsolut('E6',1,0) setNoteAbsolut('B5',5,1) elif data0[1] == '5': setNoteAbsolut('B5',5,0) setNoteAbsolut('G5',3,0) setNoteAbsolut('E5',1,1) elif data0[1] == '8': setNoteAbsolut('E6',1,0) setNoteAbsolut('B5',5,0) setNoteAbsolut('G5',3,1) else: messageBox('Fehler', 'Bezifferung: '+str(data0), img=3) if pitch[0] == 'F': if data0[1] == '3': setNoteAbsolut('A5',3,0) setNoteAbsolut('F5',1,0) setNoteAbsolut('C5',5,1) elif data0[1] == '5': setNoteAbsolut('C6',5,0) setNoteAbsolut('A5',3,0) setNoteAbsolut('F5',1,1) elif data0[1] == '8': setNoteAbsolut('F6',1,0) setNoteAbsolut('C6',5,0) setNoteAbsolut('A5',3,1) else: messageBox('Fehler', 'Bezifferung: '+str(data0), img=3) if pitch[0] == 'G': if data0[1] == '3': setNoteAbsolut('B5',3,0) setNoteAbsolut('G5',1,0) setNoteAbsolut('D5',5,1) elif data0[1] == '5': setNoteAbsolut('D6',5,0) setNoteAbsolut('B5',3,0) setNoteAbsolut('G5',1,1) elif data0[1] == '8': setNoteAbsolut('G6',1,0) setNoteAbsolut('D6',5,0) setNoteAbsolut('B5',3,1) else: messageBox('Fehler', 'Bezifferung: '+str(data0), img=3) if pitch[0] == 'A': if data0[1] == '3': setNoteAbsolut('C6',3,0) setNoteAbsolut('A5',1,0) setNoteAbsolut('E5',5,1) elif data0[1] == '5': setNoteAbsolut('E6',5,0) setNoteAbsolut('C6',3,0) setNoteAbsolut('A5',1,1) elif data0[1] == '8': setNoteAbsolut('A5',1,0) setNoteAbsolut('E5',5,0) setNoteAbsolut('C5',3,1) else: messageBox('Fehler', 'Bezifferung: '+str(data0), img=3) if pitch[0] == 'B': if data0[1] == '3': setNoteAbsolut('D6',3,0) setNoteAbsolut('B5',1,0) setNoteAbsolut('F5',5,1) elif data0[1] == '5': setNoteAbsolut('F6',5,0) setNoteAbsolut('D6',3,0) setNoteAbsolut('B5',1,1) elif data0[1] == '8': setNoteAbsolut('B5',1,0) setNoteAbsolut('F5',5,0) setNoteAbsolut('D5',3,1) else: messageBox('Fehler', 'Bezifferung: '+str(data0), img=3) # ---------------------------------------------------------------------------- # if length0 == 3 and data0[0] == '(': # "courtesy accidental" wie (#) oder (b) als Liedtext setNote(5) setNote(1) setLastNote(3) if length0 > 2 and data0[0] != 't' and data0[0] != '(': # sollte ein Vorhalt sein, aber kein t.s.(auch Länge > 2) Vorhalt0 = 1 bildeVorhaltnoten() else: # Löschen der ersten Zeichen-Ebene content = chord.getElementsByTagName('verse')[0] content.parentNode.removeChild(content) elif length == 2: # zwei Zeichen-Ebenen content = chord.getElementsByTagName('verse')[0] # Beginn mit Zeichen-Ebene0 data0 = content.firstChild.data # Zeichen in Ebene0 if data0Xset == 0: data0X = data0[0] data0Xset = 1 prevData0 = data0 # für eventuelle Auswertung eines Vorhalts content.parentNode.removeChild(content) # Löschen der Zeichen-Ebene0 (Ebene1 nimmt jetzt die Position0 ein) length0 = len(data0) # Anzahl der Zeichen in Ebene0 if length0 > 2: # sollte ein Vorhalt sein Vorhalt0 = 1 bildeVorhaltnoten() content = chord.getElementsByTagName('verse')[0] data1 = content.firstChild.data # Zeichen in Ebene1 content.parentNode.removeChild(content) # Löschen der Zeichen-Ebene1 prevData1 = data1 length1 = len(data1) # Anzahl der Zeichen in Ebene1 if length1 > 2: # sollte ein Vorhalt sein Vorhalt1 = 1 bildeVorhaltnoten() elif length == 3: # Drei Zeichen-Ebenen content = chord.getElementsByTagName('verse')[0] # Beginn mit Zeichen-Ebene0 data0 = content.firstChild.data # Zeichen in Ebene0 if data0Xset == 0: data0X = data0[0] data0Xset = 1 prevData0 = data0 # für eventuelle Auswertung eines Vorhalts content.parentNode.removeChild(content) # Löschen der Zeichen-Ebene0 (Ebene1 nimmt jetzt die Position0 ein) length0 = len(data0) # Anzahl der Zeichen in Ebene0 if length0 > 2: # sollte ein Vorhalt sein Vorhalt0 = 1 bildeVorhaltnoten() content = chord.getElementsByTagName('verse')[0] # Zeichen-Ebene1 hat jetzt die Position von Zeichen-Ebene0 data1 = content.firstChild.data # Zeichen in Ebene1 prevData1 = data1 # für eventuelle Auswertung eines Vorhalts content.parentNode.removeChild(content) # Löschen der Zeichen-Ebene1 (Ebene2 nimmt jetzt die Position0 ein) length1 = len(data1) # Anzahl der Zeichen in Ebene1 if length1 > 2: # sollte ein Vorhalt sein Vorhalt1 = 1 bildeVorhaltnoten() content = chord.getElementsByTagName('verse')[0] # Zeichen-Ebene2 hat jetzt die Position von Zeichen-Ebene0 data2 = content.firstChild.data # Zeichen in Ebene2 prevData2 = data2 # für eventuelle Auswertung eines Vorhalts content.parentNode.removeChild(content) # Löschen der Zeichen-Ebene2 length2 = len(data2) if length2 > 2: # sollte ein Vorhalt sein Vorhalt2 = 1 bildeVorhaltnoten() if data0[0] == '0': # enthält "data0[0]" schon ein Zeichen der Liedtext-Ebene0? Falls ja, dann keine Textfeldanalyse. font = chord.getElementsByTagName('font') if font <> []: # ist ein 'font' vorhanden? font = chord.getElementsByTagName('font')[0] face = font.getAttribute('face')[0:7] # Vorbereiten der Abfrage auf nur 'capella' content = chord.getElementsByTagName('content')[0] # Inhalt data0 = content.firstChild.data # das Zeichen content.parentNode.removeChild(content) # Entfernen aus der neuen Notenzeile if face == 'capella': # Falls 'capella'-Zeichensatz, dann Abtesten auf die 3 Vorzeichen if data0[0] != 'S' and data0[0] != 'Q' and data0[0] != 'R': #, b, Auflösung data0 = '0' # Löschen, wenn kein Vorzeichen if Vorhalt0 == 2: # zweites Vorhaltszeichen in Ebene0 Vorhalt0 = 0 lenx = len(prevData0) if prevData0[lenx-1] == 'b' or prevData0[lenx-1] == '#' or prevData0[lenx-1] == '+' or prevData0[lenx-1] == '$': data0 = prevData0[lenx-2]+ prevData0[lenx-1]###### lenx-1 letztes Zeichen - zuwenig, wenn Alteration ###### else: data0 = prevData0[lenx-1] length = 1 length0 = len(data0) if Vorhalt1 == 2: # zweites Vorhaltszeichen in Ebene1 Vorhalt1 = 0 lenx = len(prevData1) data1 = prevData1[lenx-1] length = 2 if Vorhalt2 == 2: # zweites Vorhaltszeichen in Ebene2 Vorhalt2 = 0 lenx = len(prevData2) data2 = prevData2[lenx-1] length = 3 # ---- "reine" Terz-Alteration durch Liedtext-Zeichen in Ebene0 ---- # if length == 1: if data0[0] == 'b' or data0[0] == '#' or data0[0] == '+' or data0[0] == '$': setNote(5) setNote(1) setLastNote(3) # ---- Ausführen der "reinen" Terz-Alteration durch Text- oder Liedtext-Zeichen ---- # if data0[0] == 'S': # Code für '#' als Textzeichen alter.setAttribute('step','1') elif data0[0] == 'Q': # Code für 'b' als Textzeichen alter.setAttribute('step','-1') elif data0[0] == 'R': # Code für Auflösungszeichen als Textzeichen alter.setAttribute('step','0') elif data0[0] == '$': # Code für Auflösungszeichen mittels Liedtext alter.setAttribute('step','0') elif data0[0] == '#': # '#' mittels Liedtext alter.setAttribute('step','1') elif data0[0] == '+': # '+' mittels Liedtext alter.setAttribute('step','1') elif data0[0] == 'b': # 'b' mittels Liedtext alter.setAttribute('step','-1') if length <> 0: # ist Bezifferung vorhanden? if data0[0] == '9': # ---- Nonakkord ---- # if Vorhalt0 == 1: # 9-8 Vorhalt mit Quinte anstelle der Septe if data1[0] == '4': setNote(4) setNote(5) setLastNote(9) else: setNote(5) setNote(9) setLastNote(3) else: if data1[0] == '4': setNote(9) setNote(7) setLastNote(4) if length1 == 2: # Ebene '1' hat 2 Zeichen (=Alteration) setAlteration(1) else: if length0 == 2: setNote(7) setNote(3) setLastNote(9) setAlteration(0) setNote(0) setLastNote(3) else: setNote(7) setNote(9) setLastNote(3) # letzter Eintrag für Terz-Alteration elif data0[0] == '8': # ---- Oktave ---- # setNote(1) setNote(5) setLastNote(3) elif data0[0] == '7': # ---- Septakkord ---- # if data1[0] == '4': if data2[0] == '2': setNote(7) setNote(4) setLastNote(2) else: setNote(7) setNote(4) setLastNote(5) elif data1[0] == '5': setLastNote(7) # ohne neuen "head" if length0 == 2: # Alteration in "Ebene 0" ? setAlteration(0) # Alteration in "Ebene 0" setNote(0) # ein neuer "head" setLastNote(5) # ohne neuen "head" if length1 == 2: # Alteration in "Ebene 1" ? setAlteration(1) # Alteration in "Ebene 1" setNote(0) # ein neuer "head" setLastNote(3) else: setNote(5) if length0 == 2: setLastNote(7) setAlteration(0) setNote(0) setLastNote(3) else: setNote(7) setLastNote(3) elif data0[0] == '6': # ---- Sextakkord ---- # if data1[0] == '4': if data2[0] == '2': setNote(6) setNote(4) setNote(2) if length1 >= 2: setLastNote(4)# Note mit Alteration muss an letzter Stelle definiert werden! setAlteration(1) else: # ---- Quartsextakkord (2.Umkehrung)---- # setNote(6) setNote(1) setLastNote(4) if length1 == 2: # Ebene '1' hat 2 Zeichen setAlteration(1) elif data1[0] == '5': # ---- Quintsextakkord ---- # setLastNote(6) # ohne neuen "head" if length0 == 2: # Alteration in "Ebene 0" ? setAlteration(0) # Alteration in "Ebene 0" setNote(0) # ein neuer "head" setLastNote(5) # ohne neuen "head" if length1 == 2: # Alteration in "Ebene 1" ? setAlteration(1) # Alteration in "Ebene 1" setNote(0) # ein neuer "head" setLastNote(3) elif data1[0] == '3': if length0 >= 2: # mit Alteration setLastNote(6) setAlteration(0) setNote(0) # Vorbereitung der 3 mit Alteration else: setNote(6) if length1 >= 2: # mit Alteration setLastNote(3) setAlteration(1) else: setLastNote(3) else: if length0 >= 2: # Ebene '0' hat 2 Zeichen if terzVerdoppl == 1: setNote(1) # würde Terzverdopplung bedeuten setLastNote(6) # Note mit Alteration muss an letzter Stelle definiert werden! setAlteration(0) setNote(0) setLastNote(3) else: setNote(6) if terzVerdoppl == 1: setNote(1) # würde Terzverdopplung bedeuten setLastNote(3) elif data0[0] == '5': # ---- Quinte ---- # if length0 == 2: setNote(1) setLastNote(5) setAlteration(0) setNote(0) setLastNote(3) else: setNote(5) setNote(1) setLastNote(3) elif data0[0] == '4': # ---- Quarte ---- # if data1[0] == '2': setNote(6) setNote(2) setLastNote(4)# Note mit Alteration muss an letzter Stelle definiert werden if length0 == 2: # '4#'/'4+'/'4b'/'4$' setAlteration(0) elif data1[0] == '3': # ---- Terzquartakkord ---- # setNote(6) #(2.Umkehrung des Septakkords) setNote(3) setLastNote(4) else: # nur die '4' if length0 == 2: setNote(1) setNote(4) # diese Folge für korrekte Kopfanordnung (Sekunde) setNote(5) # setLastNote(4)# Note mit Alteration muss an letzter Stelle definiert werden setAlteration(0) else: setNote(1) setNote(4) setLastNote(5) elif data0[0] == '3': # ---- Terz ---- # if length0 >= 2: setNote(5) setNote(1) setLastNote(3) setAlteration(0) else: setNote(5) setNote(1) setLastNote(3) elif data0[0] == '2': # ---- Sekundakkord ---- # setNote(6) #(3.Umkehrung des Septakkords) setNote(4) setLastNote(2) # ---- Alteration der Terz durch Zeichen in der 2. Ebene ---- # if data1[0] == '#': # '#' mittels Liedtext alter.setAttribute('step','1') elif data1[0] == '+': # '+' mittels Liedtext alter.setAttribute('step','1') elif data1[0] == 'b': # 'b' mittels Liedtext alter.setAttribute('step','-1') elif data1[0] == '$': # Code für Auflösungszeichen mittels Liedtext alter.setAttribute('step','0') # ---- Alteration der Terz durch Zeichen in der 3. Ebene ---- # if data2[0] == '#': # '#' mittels Liedtext alter.setAttribute('step','1') elif data2[0] == '+': # '+' mittels Liedtext alter.setAttribute('step','1') elif data2[0] == 'b': # 'b' mittels Liedtext alter.setAttribute('step','-1') elif data2[0] == '$': # Code für Auflösungszeichen mittels Liedtext alter.setAttribute('step','0') # ---- keine Harmonisierung ---- # if data0[0] == '0': # Bezifferung mit '0' (keine Harmonisierung) display = get1stOrAddChildNode(chord,'display') display.setAttribute('invisible','true') head.setAttribute('silent','true') if ts == 'ON': ts = 'OFF' else: ts = 'ON' if length0 > 1: if data0[0] == 't': # Bezifferung mit't.s.' (tasto solo - keine Harmonisierung) display = get1stOrAddChildNode(chord,'display') display.setAttribute('invisible','true') head.setAttribute('silent','true') if tsVon0zu0 == 1: if ts == 'ON': # Bezifferung mit '0' (keine Harmonisierung) display = get1stOrAddChildNode(chord,'display') display.setAttribute('invisible','true') head.setAttribute('silent','true') # ---- Löschen der 3 Bezifferungs-Ebenen ---- # data0 = '0' data1 = '0' data2 = '0' def bildeVorhaltnoten(): global newChord duration = chord.getElementsByTagName('duration')[0] # Wiederherstellen der "duration" falls auch 3.Note eines Durchgangs if base == '1/1': base2 = '1/2' elif base == '1/2': base2 = '1/4' elif base == '1/4': base2 = '1/8' elif base == '1/8': base2 = '1/16' if dots == '': # keine Punktierung ?# duration.setAttribute('base',base2) # Vorhalt auf zwei Noten verteilen (halber Notenwert) newChord = chord.cloneNode(True) # Clonen des aktuellen Akkords elif dots == '1': # Punktierung ? duration.setAttribute('dots','0') # Entfernen der Punktierung duration.setAttribute('base',base2) # Notenwert für die Punktierung (halber Notenwert der "Basisnote") newChord = chord.cloneNode(True) # Clonen des aktuellen Akkords für die nachfolgende Note duration.setAttribute('base',base) # auf Basiswert zurücksetzen def firstNote(): # erste Note einer möglichen Durchgangs- oder Wechselnote global firstNoteFlag, noteNumber, noteNumberSave, chordXersteNote, base1 firstNoteFlag = 1 noteNumber = note[pitch] noteNumberSave = noteNumber chordXersteNote = chord base1 = base # Wert der jeweils ersten Note von möglichen dreien def setNote(n): # Setzen der Note und erzeugen eines neuen "head's" global alter, head, pitch, diff, diffX if n == 0: clone = head.cloneNode(1) # Erzeugen eines neuen "head's" für die nächste Note head.parentNode.insertBefore(clone, head) else: remDisplInd = 0 if gegenBew == 1: if diffX == 1: # Gegenbewegung für die rechte Hand (Bass aufwärts) if pitch[0] == 'C': if data0X == '7': data0Xset = 0 if n == 7: pitchX = interval[2*n] # eigentlich zu setzende Note x = int(pitchX[1])-1 # minus eine Oktave pitchX = pitchX[0]+str(x) head.setAttribute('pitch',pitchX) diffX = 0 else: head.setAttribute('pitch',interval[2*n]) else: head.setAttribute('pitch',interval[2*n]) elif pitch[0] == 'D': if n == 5 or n == 6: pitchX = interval[2*n] # eigentlich zu setzende Note x = int(pitchX[1])-1 # minus eine Oktave pitchX = pitchX[0]+str(x) head.setAttribute('pitch',pitchX) else: head.setAttribute('pitch',interval[2*n]) elif pitch[0] == 'E': if n == 5: pitchX = interval[2*n] # eigentlich zu setzende Note x = int(pitchX[1])-1 # minus eine Oktave pitchX = pitchX[0]+str(x) head.setAttribute('pitch',pitchX) else: head.setAttribute('pitch',interval[2*n]) diffX = 0 elif pitch[0] == 'B': if n == 1: # Oktave pitchX = interval[2*n] # eigentlich zu setzende Note x = int(pitchX[1])-1 # minus eine Oktave pitchX = pitchX[0]+str(x) head.setAttribute('pitch',pitchX) diffX = 0 elif data0X == '7': data0Xset = 0 if n == 7: pitchX = interval[2*n] # eigentlich zu setzende Note x = int(pitchX[1])-1 # minus eine Oktave pitchX = pitchX[0]+str(x) head.setAttribute('pitch',pitchX) else: head.setAttribute('pitch',interval[2*n]) else: head.setAttribute('pitch',interval[2*n]) else: head.setAttribute('pitch',interval[2*n]) elif diffX == -1: # Gegenbewegung für die rechte Hand (Bass abwärts) pitchX = interval[2*n] if pitchX == 'C5': # eigentliche zu setzende Note x = int(pitchX[1])+1 # plus eine Oktave pitchX = pitchX[0]+str(x) head.setAttribute('pitch',pitchX) diffX = 0 elif pitch[0] == 'D' or pitch[0] == 'F' : # Bassnote if pitchX == 'D5': # eigentlich zu setzende Note x = int(pitchX[1])+1 # plus eine Oktave pitchX = pitchX[0]+str(x) head.setAttribute('pitch',pitchX) diffX = 0 else: head.setAttribute('pitch',interval[2*n]) else: head.setAttribute('pitch',interval[2*n]) else: head.setAttribute('pitch',interval[2*n]) else: head.setAttribute('pitch',interval[2*n]) alter = get1stOrAddChildNode(head, 'alter') # von Herrn Jungmann alter.setAttribute('step',interval[2*n+1]) if n == 1: # Grundton, bzw. Oktave step = alter.getAttribute('step') if step == '0': # nicht '0' bei Tonart abhängigen "step" if saveStep == '1' or saveStep == '-1': # hat die Bassnote eine Alteration? alter.setAttribute('step',(saveStep)) alter.setAttribute('display', 'force') saveAlter = alter remDisplInd = 1 else: # Note soll Alteration aus Tabelle bekommen if saveStep == 0: # Bassnote hat keine Alteration alter.setAttribute('step','0') # lösche Alteration für rechte Hand clone = head.cloneNode(1) # Erzeugen eines neuen "head's" für die nächste Note head.parentNode.insertBefore(clone, head) if remDisplInd == 1: saveAlter.removeAttribute('display') def setLastNote(n): # ohne Vorbereitung eines neuen "head's" für die nächste Note global alter, head, diff, pitch, diffX, data0X, data0Xset if gegenBew == 1: if diffX == 1: # Gegenbewegung für die rechte Hand (Bass aufwärts) if pitch[0] == 'C': if data0X == '7': data0Xset = 0 if n == 7: pitchX = interval[2*n] # eigentlich zu setzende Note x = int(pitchX[1])-1 # minus eine Oktave pitchX = pitchX[0]+str(x) head.setAttribute('pitch',pitchX) else: head.setAttribute('pitch',interval[2*n]) else: head.setAttribute('pitch',interval[2*n]) elif pitch[0] == 'B': if data0X == '7': data0Xset = 0 if n == 7: pitchX = interval[2*n] # eigentlich zu setzende Note x = int(pitchX[1])-1 # minus eine Oktave pitchX = pitchX[0]+str(x) head.setAttribute('pitch',pitchX) diffX = 0 else: head.setAttribute('pitch',interval[2*n]) else: head.setAttribute('pitch',interval[2*n]) elif pitch[0] == 'G': if n == 3: pitchX = interval[2*n] # eigentlich zu setzende Note x = int(pitchX[1])-1 # minus eine Oktave pitchX = pitchX[0]+str(x) head.setAttribute('pitch',pitchX) diffX = 0 else: head.setAttribute('pitch',interval[2*n]) elif pitch[0] == 'D': if data0X == '6': data0Xset = 0 if n == 6: pitchX = interval[2*n] # eigentlich zu setzende Note x = int(pitchX[1])-1 # minus eine Oktave pitchX = pitchX[0]+str(x) head.setAttribute('pitch',pitchX) else: head.setAttribute('pitch',interval[2*n]) else: head.setAttribute('pitch',interval[2*n]) diffX = 0 else: head.setAttribute('pitch',interval[2*n]) # entsprechend der Intervallziffer wird der entspr. Ton aus der Stammtonzeile gesetzt #diffX = 0 elif diffX == -1: # Gegenbewegung für die rechte Hand (Bass abwärts) pitchX = interval[2*n] if pitchX == 'C5': # eigentlich zu setzende Note x = int(pitchX[1])+1 # plus eine Oktave pitchX = pitchX[0]+str(x) head.setAttribute('pitch',pitchX) diffX = 0 elif pitch[0] == 'F': if data0X == '6': data0Xset = 0 if n == 6: pitchX = interval[2*n] # eigentlich zu setzende Note x = int(pitchX[1])+1 # minus eine Oktave pitchX = pitchX[0]+str(x) head.setAttribute('pitch',pitchX) else: head.setAttribute('pitch',interval[2*n]) else: head.setAttribute('pitch',interval[2*n]) else: head.setAttribute('pitch',interval[2*n]) else: head.setAttribute('pitch',interval[2*n]) # entsprechend der Intervallziffer wird der entspr. Ton aus der Stammtonzeile gesetzt else: head.setAttribute('pitch',interval[2*n]) alter = get1stOrAddChildNode(head, 'alter') # von Herrn Jungmann alter.setAttribute('step',interval[2*n+1]) def setNoteAbsolut(n,i,l): # Setzen einer 'absoluten' Note, Intervall für Tabellenzugriff, letzte Note (kein neuer Head) global alter, head, pitch head.setAttribute('pitch',n) # Setzen der Note alter = get1stOrAddChildNode(head, 'alter') # Ermittlung des Vorzeichens abhängig von Tonart alter.setAttribute('step',interval[2*i+1]) # Setzen des Vorzeichens if l == 0: # Nicht letzte Note clone = head.cloneNode(1) # Erzeugen eines neuen "head's" für die nächste Note head.parentNode.insertBefore(clone, head) def addNewChildNode(el,tagName): global doc #newChild = doc.createElement(tagName) newChild = el.ownerDocument.createElement(tagName) # lt. Prof. Ring (eMail) el.appendChild(newChild) return newChild def get1stOrAddChildNode(el, tagName): # von Herrn Jungmann for n in el.childNodes: if n.nodeType == n.ELEMENT_NODE and n.tagName == tagName: return n return addNewChildNode(el, tagName) def setAlteration(n): # Alterationszeichen an einer Ziffer if n == 0: if data0[1] == '#': # '#' mittels Liedtext alter.setAttribute('step','1') elif data0[1] == '+': # '+' mittels Liedtext alter.setAttribute('step','1') elif data0[1] == 'b': # 'b' mittels Liedtext alter.setAttribute('step','-1') elif data0[1] == '$': # Code für Auflösungszeichen mittels Liedtext alter.setAttribute('step','0') else: if data1[1] == '#': # '#' mittels Liedtext alter.setAttribute('step','1') if data1[1] == '+': # '+' mittels Liedtext alter.setAttribute('step','1') elif data1[1] == 'b': # 'b' mittels Liedtext alter.setAttribute('step','-1') elif data1[1] == '$': # Code für Auflösungszeichen mittels Liedtext alter.setAttribute('step','0') def prevSiblingElement(element): sibling = element.previousSibling while sibling and sibling.nodeType != element.ELEMENT_NODE: sibling = sibling.previousSibling return sibling def nextSiblingElement(element): sibling = element.nextSibling while sibling and sibling.nodeType != element.ELEMENT_NODE: sibling = sibling.nextSibling return sibling def insertAfter(parent, newChild, refChild): next = nextSiblingElement(refChild) if next: parent.insertBefore(newChild, next) else: parent.appendChild(newChild) # ---- Dialogbox zur Eingabe des Dateinamens der neuen Einzelpartitur ---- # def dialog(): global dlg, check8tel, check8und16tel, check8und16und32tel, checkNotenWert, checkGegenbewegung, checkTerzVerdoppl,\ selection, selStaff, checkTsVon0zu0 labStaff1 = Label(tr("labStaff1")) selStaff = ComboBox(staffList, value=countAll-1, width=20) labStaff2 = Label(tr("labStaff2")) text = Label(tr("text")) selection = Radio([tr("gr8tel"), # value = 0 tr("8tel+gr"), # value = 1 tr("16tel+gr"), # value = 2 tr("32tel+gr"), # value = 3 ], value = 0) checkNotenWert = CheckBox(tr("checkNotenWert"), value=1) checkTerzVerdoppl = CheckBox(tr("checkTerzVerdoppl"), value=1) checkTsVon0zu0 = CheckBox(tr("checkTsVon0zu0"), value = 0) checkGegenbewegung = CheckBox(tr("checkGegenBewegung"), value = 1) hinweis = Label(tr("hinweis")) leerZeile = ('') trennLinie = Label('_____________________________________________________________________________________________') hBox0 = HBox([selStaff, labStaff2]) hBox1 = HBox([selection]) hBox2 = HBox([checkNotenWert]) hBox3 = HBox([checkGegenbewegung]) hBox4 = HBox([checkTerzVerdoppl]) hBox5 = HBox([checkTsVon0zu0]) vBox = VBox([labStaff1, leerZeile, hBox0, trennLinie, leerZeile, text, leerZeile, hBox1, trennLinie, leerZeile, hBox2, hBox3, hBox4, hBox5, trennLinie, leerZeile, hinweis, leerZeile]) dlg = Dialog(tr("title"), vBox) # --------- Hauptprogramm ---------------------------- # from caplib.capDOM import ScoreChange import tempfile, codecs class newScoreChange(ScoreChange): def changeScore(self, score): global scriptAction, doc doc = score.parentNode changeDoc(score) if activeScore(): staffList = activeScore().voiceList()# für ComboBox countAll = len(staffList) # für Voreinstellung der letzten Notenzeile (als Gb-Zeile) in ComboBox dialog() # Aufruf der Dialogbox if dlg.run(): # nur bei OK - nicht bei "Abbrechen" selValue = selection.value() wertVergr = checkNotenWert.value() gegenBew = checkGegenbewegung.value() terzVerdoppl = checkTerzVerdoppl.value() tsVon0zu0 = checkTsVon0zu0.value() activeScore().registerUndo(tr("Gb")) tempInput = tempfile.mktemp('.capx') tempOutput = tempfile.mktemp('.capx') activeScore().write(tempInput) newScoreChange(tempInput, tempOutput) activeScore().read(tempOutput) os.remove(tempInput) os.remove(tempOutput) getUserDataDir()