# -*- coding: ISO-8859-1 -*-
""" capellaScript -- 
>>> GENERALBASS aussetzen                     (Version 7.4 - 26.07.09)
Die Bezifferung ist generell mittels LIEDTEXT.|
Die Harmonisierung für die rechte Hand erfolgt grundsätzlich 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 

  
"""

german = ("de", {
    "title"               : 'Einstellungen für das Aussetzen des Generalbasses (Version 7.4)',
    "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.",
    "checkTerzVerdoppl"   : "Bei Sextakkorden soll der Basston (Terz) verdoppelt werden.",
    "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

    # 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
        #barlines.setAttribute('from','3') # diese beiden Werte sind schon vorhanden
        #barlines.setAttribute('to','7')
        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
    #==================================================

    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')
            clefSign = accordStaff.getElementsByTagName('clefSign')[0]
            clefSign.setAttribute('clef',['treble','bass'][0])
    
    # 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
        
        # 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':
                
                if firstStep != 1: # für dritte Note bleibt Punktierung unberücksichtigt
                    dots = duration.getAttribute('dots')
                    if len(dots)!= 0:
                        dots = duration.getAttribute('dots')[0]
                        dotsX = dots
               

            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 = {'C3':0,'D3':1,'E3':2,'F3':3,'G3':4,'A3':5,'B3':6,'C4':7,'D4':8,'E4':9,'F4':10,'G4':11,'A4':12,'B4':13,'C5':14,'D5':15,'E5':16}
            if pitch[1] > '2' and pitch[1] < '5' or pitch == 'C5' or pitch == 'D5' or pitch == 'E5': # 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:
                            if dotsX == 0:
                                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)
                    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()
                                   
                                else: # Bezifferung mittels Liedtext
                                    firstNote()
                              
                        else: # kein Sekundschritt
                            if dotsX == 0:
                                firstNote()

                    else: # erste und zweite Note haben ungleiche Werte
                        if dotsX == 0:
                            firstNote()
                                                                   
                else: # erste Note (keine zweite oder dritte indifiziert) 
                    if dotsX == 0:
                        firstNote()
                        

        #------------------------------------------- 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
                                
                          # 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
                    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
                    
                    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
                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
                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.
                content = chord.getElementsByTagName('content') # Inhalt eines möglichen Textfeldes mit Vorzeichen
                
                if content <> []: # Symbole mittels Textfeld
                    content = chord.getElementsByTagName('content')[0]
                    data0 = content.firstChild.data
                    content.parentNode.removeChild(content)
            
            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(9) # muss zusätzlich vor der Terz gesetzt werden, um die "Sekund-Köpfe" gegeneinander zu versetzen!!??
                                setNote(3)
                                setLastNote(9)

                                setAlteration(0)

                                setNote(0)
                                setLastNote(3)

                            else:                
                                #setNote(5)
                                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:
                            setNote(3)
                            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 ---- #
                        setNote(5)        #(1.Umkehrung des Septakkords) 
                        setNote(6)
                        setNote(3)

                        if length1 == 2: # mit Alteration
                            setLastNote(5)

                            setAlteration(1)

                        else:
                            setLastNote(5)
                    
                    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(3)
                        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 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')
 

            # ---- 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
    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
        head.setAttribute('pitch',interval[2*n])
#        alter = addNewChildNode(head,'alter')
        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
    head.setAttribute('pitch',interval[2*n]) # entsprechend der Intervallziffer wird der entspr. Ton aus der Stammtonzeile gesetzt
#    alter = addNewChildNode(head,'alter')
    alter = get1stOrAddChildNode(head, 'alter') # von Herrn Jungmann
    alter.setAttribute('step',interval[2*n+1])
                        
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, checkTerzVerdoppl, selection, selStaff

    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=0)
    hinweis = Label(tr("hinweis"))
    leerZeile = ('')
    trennLinie = Label('_____________________________________________________________________________________________')
    hBox0 = HBox([selStaff, labStaff2])
    hBox1 = HBox([selection])
    hBox2 = HBox([checkNotenWert])
    hBox3 = HBox([checkTerzVerdoppl])
    vBox = VBox([labStaff1, leerZeile, hBox0, trennLinie, leerZeile, text, leerZeile, hBox1,
                 trennLinie, leerZeile, hBox2, hBox3, 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()
        terzVerdoppl = checkTerzVerdoppl.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()
        
