# -*- coding: ISO-8859-1 -*- """ capellaScript -- Copyright (c) 2005 Peter Becker >>> ClubOrgel_B : Tabulaturschrift für Club-Handorgel Umsetzen von Noten in die Tabulaturschrift für die Club Orgel. -> Schritt 2 von 3|| Umwandeln in Griffschrift|| Lässt sich eine Note oder ein Akkord nicht greifen, wird er wahlweise unterdrückt oder rot dargestellt. Ist es der letzte Kopf einer Note, wird er immer rot dargestellt|| Bei Problemen bitte eine Mail an peter_becker@freenet.de <<< History: 01.07.05 - Erste Ausgabe 06.07.05 - implicite Barlines in Begleitstimme übernehmen Fehlernachricht, ohne ClubOrgel_A, korrigiert 07.07.05 zusätzliche Zeilenabstände entfernen Absturz verhindern wenn Tonart am Zeilenende 13.07.05 Akkorde auch an Pausen 13.10.05 Bei Taktwechsel in der Zeile entstehen links Ränder 05.12.05 Strophentexte löschen, wenn ausgewählt und doppelte löschen 20.02.06 2 Töne in der Übersetzungstabelle korrigiert 07.04.06 Balgrichtungsänderung bei baesse=NO 28.04.06 Support für Übersetzen ohne Transposition 24.05.06 Bugfix, Pausen am Anfang 30.12.06 eventuell vorhandene Leerzeilen löschen um Absturz in Part C zu verhindern 28.11.09 diverse Fixe für wechselnde Taktarten 03.12.09 - falls am Ende der Zeile eine Note oder Pause steht. festen Taktstrich einsteuern um Fehler bei der Platzhaltergenerierung zu vermeiden. 08.05.12 V5.1.6 wg ClubOrgel_C """ import xml.dom, tempfile from caplib.capDOM import ScoreChange from xml.dom.minidom import NodeList, Node, Element doc = [] # parentNode von score impBarline = 0 summe = 0 notenWert = dict( W16 = dict(wert=0.25 , punkt=0.125 ), W8 = dict(wert=0.5 , punkt=0.25 ), W4 = dict(wert=1.0 , punkt=0.5 ), W2 = dict(wert=2.0 , punkt=1.0 ), W1 = dict(wert=4.0 , punkt=2.0 ) ) # Dictionary Einträge xxyz : xx=Ton, yz=00 kein Vorzeichen, y=1 ein Kreuz als Vz, z=1 ein B als Vz innenDruckList = dict( F410 = dict(wert='G4' , kreuz='1' ), G401 = dict(wert='G4' , kreuz='1' ), D500 = dict(wert='B4' , kreuz='1' ), D510 = dict(wert='D5' , kreuz='1' ), E501 = dict(wert='D5' , kreuz='1' ), B501 = dict(wert='F5' , kreuz='1' ), A510 = dict(wert='F5' , kreuz='1' ), F510 = dict(wert='A5' , kreuz='1' ), G501 = dict(wert='A5' , kreuz='1' ), D610 = dict(wert='C6' , kreuz='1' ), E601 = dict(wert='C6' , kreuz='1' ), D600 = dict(wert='E6' , kreuz='1' ), F610 = dict(wert='G6' , kreuz='1' ), G601 = dict(wert='G6' , kreuz='1' ), D710 = dict(wert='B6' , kreuz='1' ), E701 = dict(wert='B6' , kreuz='1' ), D700 = dict(wert='D7' , kreuz='1' ) ) mitteDruckList = dict( F400 = dict(wert='F4' , kreuz='0' ), A400 = dict(wert='A4' , kreuz='0' ), C500 = dict(wert='C5' , kreuz='0' ), F500 = dict(wert='E5' , kreuz='0' ), A500 = dict(wert='G5' , kreuz='0' ), C600 = dict(wert='B5' , kreuz='0' ), F600 = dict(wert='D6' , kreuz='0' ), A600 = dict(wert='F6' , kreuz='0' ), C700 = dict(wert='A6' , kreuz='0' ), F700 = dict(wert='C7' , kreuz='0' ), A700 = dict(wert='E7' , kreuz='0' ) ) aussenDruckList = dict( C400 = dict(wert='E4' , kreuz='0' ), E400 = dict(wert='G4' , kreuz='0' ), G400 = dict(wert='B4' , kreuz='0' ), C500 = dict(wert='D5' , kreuz='0' ), E500 = dict(wert='F5' , kreuz='0' ), G500 = dict(wert='A5' , kreuz='0' ), C600 = dict(wert='C6' , kreuz='0' ), E600 = dict(wert='E6' , kreuz='0' ), G600 = dict(wert='G6' , kreuz='0' ), C700 = dict(wert='B6' , kreuz='0' ), E700 = dict(wert='D7' , kreuz='0' ), G700 = dict(wert='F7' , kreuz='0' ) ) innenZugList = dict( G410 = dict(wert='G4' , kreuz='1' ), A401 = dict(wert='G4' , kreuz='1' ), D510 = dict(wert='B4' , kreuz='1' ), E501 = dict(wert='B4' , kreuz='1' ), C510 = dict(wert='D5' , kreuz='1' ), D501 = dict(wert='D5' , kreuz='1' ), F510 = dict(wert='F5' , kreuz='1' ), G501 = dict(wert='F5' , kreuz='1' ), G510 = dict(wert='A5' , kreuz='1' ), A501 = dict(wert='A5' , kreuz='1' ), C610 = dict(wert='C6' , kreuz='1' ), D601 = dict(wert='C6' , kreuz='1' ), D610 = dict(wert='E6' , kreuz='1' ), E601 = dict(wert='E6' , kreuz='1' ), G610 = dict(wert='G6' , kreuz='1' ), A601 = dict(wert='G6' , kreuz='1' ), C710 = dict(wert='B6' , kreuz='1' ), D701 = dict(wert='B6' , kreuz='1' ), D710 = dict(wert='D7' , kreuz='1' ), E701 = dict(wert='D7' , kreuz='1' ) ) mitteZugList = dict( A410 = dict(wert='F4' , kreuz='0' ), B401 = dict(wert='F4' , kreuz='0' ), C500 = dict(wert='A4' , kreuz='0' ), E500 = dict(wert='C5' , kreuz='0' ), G500 = dict(wert='E5' , kreuz='0' ), A510 = dict(wert='G5' , kreuz='0' ), B501 = dict(wert='G5' , kreuz='0' ), C600 = dict(wert='B5' , kreuz='0' ), E600 = dict(wert='D6' , kreuz='0' ), G600 = dict(wert='F6' , kreuz='0' ), A610 = dict(wert='A6' , kreuz='0' ), B601 = dict(wert='A6' , kreuz='0' ), D700 = dict(wert='C7' , kreuz='0' ), E700 = dict(wert='E7' , kreuz='0' ) ) aussenZugList = dict( D400 = dict(wert='E4' , kreuz='0' ), G400 = dict(wert='G4' , kreuz='0' ), B400 = dict(wert='B4' , kreuz='0' ), D500 = dict(wert='D5' , kreuz='0' ), F500 = dict(wert='F5' , kreuz='0' ), A500 = dict(wert='A5' , kreuz='0' ), B500 = dict(wert='C6' , kreuz='0' ), D600 = dict(wert='E6' , kreuz='0' ), F600 = dict(wert='G6' , kreuz='0' ), A600 = dict(wert='B6' , kreuz='0' ), B600 = dict(wert='D7' , kreuz='0' ), C700 = dict(wert='F7' , kreuz='0' ) ) #xx = druckList['D300']['wert'] #so wird das Dictionary abgefragt def getTime(score): if score.getElementsByTagName('timeSign'): ts = score.getElementsByTagName('timeSign')[0] t = ts.getAttribute('time') return(t) else: #messageBox('Time','Taktangabe fehlt, 4/4 wird angenommen') return('x') def addElementNode(el,tagName): # Neue Node zu "el" hinzufügen wenn Node "tagName" nicht existiert # ansonsten existierende Node zurückmelden global doc childs = el.childNodes for n in range(childs.length): if childs[n].nodeType ==childs[n].ELEMENT_NODE and childs[n].tagName == tagName: return childs[n] newChild = doc.createElement(tagName) el.appendChild(newChild) return newChild def addNewElementNode(el,tagName): # add new Node with tagName "tagName" to el global doc newChild = doc.createElement(tagName) el.appendChild(newChild) return newChild def getElementObjects(objList): # returns a List newList = NodeList() for n in range(objList.length): if objList[n].nodeType == objList[n].ELEMENT_NODE: newList.append(objList[n]) return newList def makeIndex(head): # Index für druckList oder zugList erzeugen alter = head.getElementsByTagName('alter') pitch = head.getAttribute('pitch') if alter: step = str(alter[0].getAttribute('step')) x = str(step) # Kreuz als Vorzeichen y = '0' if step == '-1': # B als Vorzeichen x = '0' y = '1' else: x = '0' y = '0' index = str(pitch) + x + y #messageBox('INDEX',str(index)) return index def analyseHeads(score,head,chord): global doc, dCnt, zCnt, aDir, darNicht, darKopf, baesse, force #messageBox('CHORD',str(chord)) kreuzPos = dict( ADG = dict(G4='+4.5' , B4='+3.5', D5='+2.5', F5='+1.5', A5='+0.5', C6='-0.5', E6='-1.5', G6='-2.5', B6='-3.5', D7='-4.5') ) #xx = kreuzPos['ADG'][G4] #so wird das Dictionary abgefragt DrList = [] ZgList = [] PosList = [] changeFlag = 0 schonDa = 0 lHvalid = 0 for hd in range(head.length): # wo lässt sich dieser Ton greifen ? index = makeIndex(head[hd]) PosList.append(str(index)) #messageBox('INDEX',str(index)) if mitteDruckList.has_key(index): PosList.append('DM') else: PosList.append('XX') if innenDruckList.has_key(index): PosList.append('DI') else: PosList.append('XX') if aussenDruckList.has_key(index): PosList.append('DA') else: PosList.append('XX') if mitteZugList.has_key(index): PosList.append('ZM') else: PosList.append('XX') if innenZugList.has_key(index): PosList.append('ZI') else: PosList.append('XX') if aussenZugList.has_key(index): PosList.append('ZA') else: PosList.append('XX') # PosList xxxx , aa , bb, cc, dd, ee, ff, xxxx , aa , bb, .... # xxxx = index # aa,..= DM, DI etc # len(PosList) = 0-x Anzahl der Elemente in der Liste # PosList[0] = erstes Element der PosList # len(PosList[0]) = Länge des ersten Elementes, wenn 4 dann Index wenn 2 dann Eintrag #messageBox('PosList',str(PosList) + ' ' + str(len(PosList))) oDM = 'LE' oDI = 'LE' oDA = 'LE' oZM = 'LE' oZI = 'LE' oZA = 'LE' for ix in range(len(PosList)/7): # auf welcher Reihe lässt sich der Akkord vollständig greifen ? if oDM == 'LE': oDM = PosList[ix*7+1] else: if oDM <> PosList[ix*7+1]: oDM = 'XX' if oDI == 'LE': oDI = PosList[ix*7+2] else: if oDI <> PosList[ix*7+2]: oDI = 'XX' if oDA == 'LE': oDA = PosList[ix*7+3] else: if oDA <> PosList[ix*7+3]: oDA = 'XX' if oZM == 'LE': oZM = PosList[ix*7+4] else: if oZM <> PosList[ix*7+4]: oZM = 'XX' if oZI == 'LE': oZI = PosList[ix*7+5] else: if oZI <> PosList[ix*7+5]: oZI = 'XX' if oZA == 'LE': oZA = PosList[ix*7+6] else: if oZA <> PosList[ix*7+6]: oZA = 'XX' #messageBox('WO-CHORD','aDir=' + str(aDir) + '\n' + str(oDI) + str(oDM) + str(oDA) + str(oZI) + str(oZM) + str(oZA) + '\n' + str(force)) if baesse == 'NO': oDCnt = 0 oZCnt = 0 if oDI == 'XX' and oDM == 'XX' and oDA == 'XX' and oZI == 'XX' and oZM == 'XX' and oZA == 'XX': # Akkord nicht auf einer Balgrichtung spielbar #messageBox('WO-CHORD','aDir=' + str(aDir) + '\n' + str(oDI) + str(oDM) + str(oDA) + str(oZI) + str(oZM) + str(oZA) + '\n' + str(force)) for ix in range(len(PosList)/7): if PosList[ix*7+1] <> 'XX' or PosList[ix*7+2] <> 'XX'or PosList[ix*7+3] <> 'XX': oDCnt = oDCnt + 1 if PosList[ix*7+4] <> 'XX' or PosList[ix*7+5] <> 'XX'or PosList[ix*7+6] <> 'XX': oZCnt = oZCnt + 1 #messageBox('PosList',str(PosList) + '\n' + str(oDCnt) + str(oZCnt)) if oDCnt == oZCnt and force == 0: aDir = 'D' # Richtung mit der höchsten Trefferrate setzen, Druck bevorzugen elif oDCnt > oZCnt and force == 0: aDir = 'D' elif oDCnt < oZCnt and force == 0: aDir = 'Z' #messageBox('WO-CHORD-2','aDir=' + str(aDir) + '\n' + str(oDI) + str(oDM) + str(oDA) + str(oZI) + str(oZM) + str(oZA)) for hd in range(head.length): # in Griffschrift umwandeln index = makeIndex(head[hd]) alter = head[hd].getElementsByTagName('alter') if aDir == 'N' or aDir == 'D': # Druck oder nicht definiert if oDI == 'DI': # Akkord auf Druck Innen wt = innenDruckList[index]['wert'] kz = innenDruckList[index]['kreuz'] richtung = 'D' elif oDM == 'DM': # Akkord auf Druck Mitte wt = mitteDruckList[index]['wert'] kz = mitteDruckList[index]['kreuz'] richtung = 'D' elif oDA == 'DA': # Akkord auf Druck Aussen wt = aussenDruckList[index]['wert'] kz = aussenDruckList[index]['kreuz'] richtung = 'D' elif innenDruckList.has_key(index): # Kreuzgriff Druck Innen wt = innenDruckList[index]['wert'] kz = innenDruckList[index]['kreuz'] richtung = 'D' elif mitteDruckList.has_key(index): # Kreuzgriff Druck Mitte wt = mitteDruckList[index]['wert'] kz = mitteDruckList[index]['kreuz'] richtung = 'D' elif aussenDruckList.has_key(index): # Kreuzgriff Druck Aussen wt = aussenDruckList[index]['wert'] kz = aussenDruckList[index]['kreuz'] richtung = 'D' else: wt = 'XX' # Ton nicht auf Druck kz = 'XX' richtung = 'X' #messageBox('Druck-Richtung',str(richtung) + '\n' + str(wt) + '\n' + str(kz)) elif aDir == 'Z': # Zug if oZI == 'ZI': # Akkord auf Zug Innen wt = innenZugList[index]['wert'] kz = innenZugList[index]['kreuz'] richtung = 'Z' elif oZM == 'ZM': # Akkord auf Zug Mitte wt = mitteZugList[index]['wert'] kz = mitteZugList[index]['kreuz'] richtung = 'Z' elif oZA == 'ZA': # Akkord auf Zug Aussen wt = aussenZugList[index]['wert'] kz = aussenZugList[index]['kreuz'] richtung = 'Z' elif innenZugList.has_key(index): # Kreuzgriff Zug Innen wt = innenZugList[index]['wert'] kz = innenZugList[index]['kreuz'] richtung = 'Z' elif mitteZugList.has_key(index): # Kreuzgriff Zug Mitte wt = mitteZugList[index]['wert'] kz = mitteZugList[index]['kreuz'] richtung = 'Z' elif aussenZugList.has_key(index): # Kreuzgriff Zug Aussen wt = aussenZugList[index]['wert'] kz = aussenZugList[index]['kreuz'] richtung = 'Z' else: wt = 'XX' # Ton nicht auf Zug kz = 'XX' richtung = 'X' #messageBox('Zug-Richtung',str(richtung)) else: wt = 'XX' # Ton nicht auf dem Instrument kz = 'XX' richtung = 'X' #changeFlag = 0 #messageBox('Richtung1',str(richtung)) if richtung <> 'X': head[hd].setAttribute('pitch',wt) if kz == '1': # <--- wenn kz=1 dann Kreuz machen ton = makeIndex(head[hd])[0:2] y = kreuzPos['ADG'][ton] drawObjects = addElementNode(chord,'drawObjects') drawObj = addNewElementNode(drawObjects,'drawObj') text = addNewElementNode(drawObj,'text') font = addNewElementNode(text,'font') content = addNewElementNode(text,'content') font.setAttribute('face','capella3') font.setAttribute('height','18') font.setAttribute('charSet','2') font.setAttribute('pitchAndFamily','2') text.setAttribute('y',str(y)) if darKopf == 0: # klassische Kopf-Darstellung text.setAttribute('x','-1.15') else: # alternative Kopf-Darstellung duration = head[hd].parentNode.parentNode.getElementsByTagName('duration') base = str(duration[0].getAttribute('base')) if base == '1/2' or base == '1/1' or base == '2/1': text.setAttribute('x','-1.15') # ausser bei 1/2, 1/1 oder 2/1 Noten else: text.setAttribute('x','0') head[hd].setAttribute('shape','none') content.appendChild(score.parentNode.createTextNode('T')) if alter: alter[0].setAttribute('step','0') else: # Wenn Ton nicht auf dem Instrument #messageBox('Nicht auf Instrument',str(darNicht) + ' ' + str(baesse)) if lHvalid == 0: lH = len(head) lHvalid = 1 #messageBox('Start',str(lH) + ' ' + str(hd)) if darNicht == 1: # wenn rot färben new = addElementNode(head[hd].parentNode.parentNode,'display') # Original Note anzeigen und new.setAttribute('color',str('E00050')) # rot einfärben elif darNicht == 0 and lH > 1: # wenn entfernen x = head[hd].parentNode.removeChild(head[hd]) # Kopf entfernen lH = lH - 1 #messageBox('Kopf entfernt',str(len(head)) + ' ' + str(hd)) elif darNicht == 0 and lH == 1: # ausser wenn letzter #messageBox('ROT','rot färben') new = addElementNode(head[hd].parentNode.parentNode,'display') # Original Note anzeigen und new.setAttribute('color',str('E00050')) # rot einfärben #messageBox('Richtung',str(richtung )) if richtung <> 'X': dObjs = chord.getElementsByTagName('drawObjects') #messageBox('Anzahl DOS',str(dObjs)) if dObjs.length == 0: # falls noch keine #messageBox('noDos',str(head) + ' ' + str(hd)) new = addElementNode(head[hd].parentNode.parentNode,'drawObjects') # drawObjs vorhanden dO = addElementNode(new,'drawObj') # Anker für Line dB = addElementNode(new,'drawObj') # Anker für Basic else: #messageBox('Dos',str(head) + ' ' + str(hd)) dO = doc.createElement('drawObj') # falls vorhanden dObjs[0].appendChild(dO) # Anker für Line dB = addElementNode(dObjs[0],'drawObj') # Anker für Basic if richtung == 'D' or richtung == 'Z': # wenn Druck, dann Balken anzeigen line = addElementNode(dO,'line') y1 = 10.875 - 8 + float(tzlOben) + float(tzlUnten) line.setAttribute('x1','-1.5') line.setAttribute('x2','1') line.setAttribute('y1',str(y1)) line.setAttribute('y2',str(y1)) if richtung == 'D': lw = '0.5' else: # wenn Zug Balken unsichtbar machen lw = '0.0' line.setAttribute('color',str('FFFFFF')) line.setAttribute('lineWidth',lw) basic = addElementNode(dB,'basic') if richtung == 'D': basic.setAttribute('tag','2086-31') else: basic.setAttribute('tag','2086-41') changeFlag = 0 for hd in range(head.length): # eventuelle Vorzeichen in Tabulatur unterdrücken altsup = addElementNode(head[hd],'alter') altsup.setAttribute('display','suppress' ) force = 0 return def insertTimeSign(score, zeile, time): # zur besseren Formatierung Takt übernehmen sys = score.getElementsByTagName('system') staves = sys[zeile].getElementsByTagName('staves') staff1 = staves[0].getElementsByTagName('staff') voices1 = staff1[1].getElementsByTagName('voices') voice1 = voices1[0].getElementsByTagName('voice') # Tabulatur Zeile voices2 = staff1[2].getElementsByTagName('voices') voice2 = voices2[0].getElementsByTagName('voice') # Begleitungs Zeile no = voice2[0].getElementsByTagName('noteObjects') el = addNewElementNode(no[0],'timeSign') el.setAttribute('time',time) el.setAttribute('color','FFFFFF') def insertPlaceholder(score, zeile, taktsumme, type): global darPlatz sys = score.getElementsByTagName('system') staves = sys[zeile].getElementsByTagName('staves') staff1 = staves[0].getElementsByTagName('staff') voices1 = staff1[1].getElementsByTagName('voices') voice1 = voices1[0].getElementsByTagName('voice') # Tabulatur Zeile voices2 = staff1[2].getElementsByTagName('voices') voice2 = voices2[0].getElementsByTagName('voice') # Begleitungs Zeile taktsumme = taktsumme * 4 tw = divmod(float(taktsumme),1) cnt1 = tw[0] # Anzahl 4tel bis Taktstrich cnt2 = tw[1] # unvollständige Takte #messageBox('Anzahl',str(cnt1) + ' ' + str(cnt2)) if cnt2 > 0: #messageBox('ungerade',str(cnt2)) no = voice2[0].getElementsByTagName('noteObjects') el = addNewElementNode(no[0],'chord') du = addNewElementNode(el,'duration') di = addNewElementNode(el,'display') if cnt2 >= 0.5: du.setAttribute('base','1/8') cnt2 = cnt2 - 0.5 else: du.setAttribute('base','1/16') cnt2 = cnt2 - 0.25 if cnt2 <> 0: du.setAttribute('dots','1') di.setAttribute('invisible','true') if str(darPlatz) == '1': # Anzahl Noten verdoppeln wenn 1/8 als Platzhalter notenlg = '1/8' cnt1 = cnt1 * 2 else: notenlg = '1/4' while cnt1 <> 0: # Anzahl Noten bis Taktstrich auflösen no = voice2[0].getElementsByTagName('noteObjects') el = addNewElementNode(no[0],'chord') du = addNewElementNode(el,'duration') di = addNewElementNode(el,'display') du.setAttribute('base',notenlg) di.setAttribute('invisible','true') cnt1 = cnt1 - 1 if type == 1: # explicite Barline übernehmen no = voice2[0].getElementsByTagName('noteObjects') el = addNewElementNode(no[0],'barline') #messageBox('Barline',str(no) + '\n' + str(el)) return def changeDoc(score): global doc, nzlAnz, saOben, saZw, nzlOben, nzlUnten, tzlOben, tzlUnten, dCnt, zCnt, aDir, time global lzlAbstand, lzlStrophe, oktInnen, oktMitte, oktAussen, darNicht, darKopf, summe, notenWert global baesse, force force = 0 doc = score.parentNode for system in score.getElementsByTagName('system'): # falls am Zeilenende eine Pause oder for nOs in system.getElementsByTagName('noteObjects'): # Note steht, sicherheitshalber einen cn = nOs.childNodes # festen Taktstrich einsteuern lc = len(cn) ln = str(cn[lc-2]) if ln.find('chord') >= 0 or ln.find('rest') >= 0: # festen Taktstrich dranhängen el = addNewElementNode(nOs,'barline') ssIx = 0 # Leerzeilen merken savesystem = [] for system in score.getElementsByTagName('system'): for nOs in system.getElementsByTagName('noteObjects'): emptyVoice = 0 for no in nOs.getElementsByTagName('chord'): emptyVoice = 1 for rs in nOs.getElementsByTagName('rest'): emptyVoice = 1 if emptyVoice == 0: savesystem.append(system) ssIx = ssIx + 1 #messageBox('SS',str(ssIx) + '\n' + str(savesystem)) layout = score.getElementsByTagName('layout') # Layout erweitern staves = layout[0].getElementsByTagName('staves') slEl = staves[0].getElementsByTagName('staffLayout') slNd = slEl[0].cloneNode('staffLayout') # Notenzeile als Tabularturzeile clonen staves[0].appendChild(slNd) slNd.setAttribute('description','Tabulatur') slNd = slEl[0].cloneNode('staffLayout') # Notenzeile als Akkord / Spielanweisungszeile clonen staves[0].appendChild(slNd) slNd.setAttribute('description','Begleitung') riTAB = staves[0].lastChild notation = riTAB.getElementsByTagName('notation') notation[0].setAttribute('defaultClef','N3') # Schlüssel weg notation[0].setAttribute('notelines','__|_____') # eine Line barLines = riTAB.getElementsByTagName('barlines') barLines[0].setAttribute('from','2') barLines[0].setAttribute('to','2') layout = score.getElementsByTagName('layout') # Systemabstände setzen systems = layout[0].getElementsByTagName('systems') systems[0].setAttribute('top',str(saOben)) systems[0].setAttribute('between',str(saZw)) staves = layout[0].getElementsByTagName('staves') n = 1 for sL in staves[0].getElementsByTagName('staffLayout'): distances = sL.getElementsByTagName('distances') if n == 1: distances[0].setAttribute('top',str(nzlOben)) # Notenzeilen Abstände setzen distances[0].setAttribute('bottom',str(nzlUnten)) n = n + 1 else: distances[0].setAttribute('top',str(tzlOben)) # Tabulatur Abstände setzen distances[0].setAttribute('bottom',str(tzlUnten)) n = n + 1 for lZ in score.getElementsByTagName('lyricsSettings'): # Lyrics Abstände setzen lza = float(lzlAbstand)/2 lsa = float(lzlStrophe)/2 lZ.setAttribute('firstLine',str(lza)) lZ.setAttribute('lineDist',str(lsa)) for system in score.getElementsByTagName('system'): # Notenzeile laut Layout einfügen staff = system.getElementsByTagName('staff')[0] for extraDist in staff.getElementsByTagName('extraDistance'): # zusätzlicher Abstand weg extraDist.parentNode.removeChild(extraDist) if nzlLt == 1: # wenn gewünscht for lyric in staff.getElementsByTagName('lyric'): # Lyric aus Tabulatur entfernen 05.12.05 lyric.parentNode.removeChild(lyric) newStaff = staff.cloneNode(True) newStaff.setAttribute('layout','Tabulatur') newStaff = staff.parentNode.appendChild(newStaff) for clefSign in newStaff.getElementsByTagName('clefSign'): # Schlüssel weg clefSign.setAttribute('clef','N3') for keySign in newStaff.getElementsByTagName('keySign'): # Tonart weg keySign.parentNode.removeChild(keySign) newStaff = staff.cloneNode(True) newStaff.setAttribute('layout','Begleitung') newStaff = staff.parentNode.appendChild(newStaff) # Spielzeile einfügen for clefSign in newStaff.getElementsByTagName('clefSign'): # Schlüssel weg clefSign.setAttribute('clef','N3') for chord in newStaff.getElementsByTagName('chord'): # Noten weg chord.parentNode.removeChild(chord) for rest in newStaff.getElementsByTagName('rest'): # Pausen weg rest.parentNode.removeChild(rest) for keySign in newStaff.getElementsByTagName('keySign'): # Tonart weg keySign.parentNode.removeChild(keySign) for barLine in newStaff.getElementsByTagName('barline'): # Taktstriche weg barLine.parentNode.removeChild(barLine) for timeSign in newStaff.getElementsByTagName('timeSign'): # Takt weg 13.10.05 timeSign.parentNode.removeChild(timeSign) for lyric in staff.getElementsByTagName('lyric'): # Lyric aus Melodiestimme entfernen 05.12.05 lyric.parentNode.removeChild(lyric) taktsumme = 0 if baesse == 'YES': # Begleitstimme vorbereiten durch for sy in range(activeScore().nSystems()): System = activeScore().system(sy) #messageBox('KEY',str(taktsumme)) if taktsumme <> 0: # offene Zeilenenden #messageBox('SAVE',str(taktsumme)) type = 0 #messageBox('KEY',"Taktsumme <> 0") insertPlaceholder(score,sySave,taktsumme,type) taktsumme = 0 #messageBox('ST',str(range(System.nStaves()))) zeilenanfang = 1 for st in range(System.nStaves()): sySave = sy Staff = System.staff(st) for vo in range(Staff.nVoices()): Voice = Staff.voice(vo) #messageBox('KEY',str(taktsumme)) for no in range(Voice.nNoteObjs()): NoteObj = Voice.noteObj(no) #messageBox('KEY',str(taktsumme)) if NoteObj.isRest(): zeilenanfang = 0 lg = NoteObj.duration() taktsumme = taktsumme + lg elif NoteObj.isChord(): zeilenanfang = 0 lg = NoteObj.duration() taktsumme = taktsumme + lg elif NoteObj.isBarline() and zeilenanfang == 0: type = 1 #messageBox('KEY',"isBarline") insertPlaceholder(score,sy,taktsumme,type) taktsumme = 0 if NoteObj.implBarline() and zeilenanfang == 0: type = 1 #messageBox('KEY',"implicitBarline") insertPlaceholder(score,sy,taktsumme,type) taktsumme = 0 #if NoteObj.meter() and zeilenanfang == 0: if NoteObj.meter(): type = 0 time = str(NoteObj.meter()) if time == '1': time = '4/4' #messageBox('KEY',str(time)) insertPlaceholder(score,sy,taktsumme,type) insertTimeSign(score,sy,time) taktsumme = 0 if NoteObj.subType() == 3 and zeilenanfang == 0: # Tonart 9.4.2008 type = 1 #messageBox('KEY',"Tonart") insertPlaceholder(score,sy,taktsumme,type) taktsumme = 0 #messageBox('Umwandlung','Start Umwandlung') system = score.getElementsByTagName('system') # In Griffschrift umwandeln aDir = 'N' # Voreinstellung - not defined dr = 'M' # Voreinstellung - Richtung for sy in range(system.length): staff = system[sy].getElementsByTagName('staff') # Notenzeile extrahieren for st in range(staff.length): if str(staff[st].getAttribute('layout')) == 'Tabulatur': voices = staff[st].getElementsByTagName('voice') voice = voices[0] # Tabulaturstimme extrahieren noteObjects = voices[0].getElementsByTagName('noteObjects') chords = noteObjects[0].childNodes # Noten und Pausen extrahieren for ch in range(chords.length): if chords[ch].nodeType <> chords[ch].ELEMENT_NODE: continue else: if chords[ch].tagName <> 'chord' and chords[ch].tagName <> 'rest': continue basic = chords[ch].getElementsByTagName('basic') # Feststellung ob Druck oder Zug for ba in range(basic.length): # abhängig von Begleitakkord if basic[ba].hasAttribute('tag'): tag = basic[ba].getAttribute('tag') if tag == '2086-31': aDir = 'D' force = 0 elif tag == '2086-32': aDir = 'D' force = 1 elif tag == '2086-41': aDir = 'Z' force = 0 elif tag == '2086-42': aDir = 'Z' force = 1 text = basic[ba].parentNode.getElementsByTagName('content') bass = text[0].firstChild.data # Akkord extrahieren taste = bass content = score.parentNode.createElement('content') content.appendChild(score.parentNode.createTextNode(taste)) text[0].appendChild(content) # und setzen text = basic[ba].parentNode.getElementsByTagName('text') accPos = (((float(tzlUnten) + float(tzlOben))/2)*2)+2 # Position des Begleitakkords über der Druck-Linie text[0].setAttribute('y',str(accPos)) text[0].setAttribute('x','-0.5') text = basic[ba].parentNode.getElementsByTagName('font') text[0].setAttribute('face','Times New Roman') text[0].setAttribute('height','12') text[0].setAttribute('weight','0') text[0].setAttribute('pitchAndFamily','0') #xxx = chords[ch].tagName #messageBox('Umwandlung Tag',str(xxx)) if chords[ch].tagName == 'chord': heads = chords[ch].getElementsByTagName('heads') head = heads[0].getElementsByTagName('head') # Köpfe pro Note extrahieren analyseHeads(score,head,chords[ch]) # und umwandeln if chords[ch].tagName == 'rest': if aDir == 'D': # wenn Druck, dann Balken anzeigen dObjs = chords[ch].getElementsByTagName('drawObjects') if dObjs.length == 0: # falls noch keine drawObjects da sind new = addElementNode(chords[ch],'drawObjects') dO = addElementNode(new,'drawObj') else: dO = doc.createElement('drawObj') # falls bereits drawObjects vorhanden sind dObjs[0].appendChild(dO) line = addElementNode(dO,'line') y1 = 10.875 - 8 + float(tzlOben) + float(tzlUnten) line.setAttribute('x1','-2.0') line.setAttribute('x2','1.0') line.setAttribute('y1',str(y1)) line.setAttribute('y2',str(y1)) line.setAttribute('lineWidth','0.5') #messageBox('Umwandlung Ende','Ende') systems = score.getElementsByTagName('systems') if nzlAnz == 1: # Notenzeile löschen for sys in systems[1].getElementsByTagName('system'): # wenn im Dialog ausgewählt staves = sys.getElementsByTagName('staves') staff = staves[0].getElementsByTagName('staff') staff[0].parentNode.removeChild(staff[0]) lay = score.getElementsByTagName('layout') # Notenzeile aus for sv in lay[0].getElementsByTagName('staves'): # Partiturschablone sl = sv.getElementsByTagName('staffLayout') # entfernen sl[0].parentNode.removeChild(sl[0]) break if ssIx <> 0: # Leerzeilen entfernen for i in range(ssIx): savesystem[i].parentNode.removeChild(savesystem[i]) return def pqDialog(): global nzlAnz, saOben, saZw, nzlOben, nzlUnten, tzlOben, tzlUnten, lzlAbstand, lzlStrophe global oktInnen, oktMitte, oktAussen, darNicht, darKopf, darPlatz, baesse global nzlLt vorbereitet = 'NO' # prüfen ob bereits mit "ClubOrgel_A" vorbereitet baesse = 'YES' for no in activeScore().noteObjs(): if no.isChord() or no.isRest(): i = no.nDrawObjs()-1 while i >= 0: d = no.drawObj(i) if d.has_key('tag'): xx = d['tag'] if xx == '2086-51': baesse = 'NO' if xx == '2086-31' or xx == '2086-32' or xx == '2086-41' or xx == '2086-42'or xx == '2086-51': vorbereitet = 'OK' break else: i -= 1 else: i -= 1 if vorbereitet == 'NO': messageBox('ClubOrgel_B','Partitur wurde nicht mit "ClubOrgel_A" vorbereitet, oder enthält keine Akkord-Bezeichnungen.') return False options = ScriptOptions() opt = options.get() #messageBox('Options',str(opt)) # Dialog Defaults lt = '0' # Liedtext anzeigen na = '1' # Notenzeile anzeigen so = '15' # Systemabstand über erstem System su = '8' # Systemabstand zwischen den Systemen no = '4' # Notenzeile Abstand nach oben nu = '10' # Notenzeile Abstand nach unten to = '3' # Tabulatur Abstand nach oben tu = '4' # Tabulatur Abstand nach unten la = '25' # Liedzeile Abstand zur Mittellinie ls = '5' # Liedstrophen Abstand dz = '0' # nichtdarstellbare Noten 0=unterdrücken, 1=rot dk = '0' # Kopfform 0=klassisch, 1=alternativ dp = '0' # Platzhalter für Begleitstimme 0=Viertelnoten, 1=Achtelnoten if opt: lt = opt.get('dNzlLt',lt) na = opt.get('dNzlAnz',na) so = opt.get('dSaOben',so) su = opt.get('dSaZw',su) no = opt.get('dNzlOben',no) nu = opt.get('dNzlUnten',nu) to = opt.get('dTzlOben',to) tu = opt.get('dTzlUnten',tu) la = opt.get('dLzlAbstand',la) ls = opt.get('dLzlStrophe',ls) dz = opt.get('dDarNicht',dz) dk = opt.get('dDarKopf',dk) dp = opt.get('dDarPlatz',dp) placeholder1 = Label(' ',width=1) placeholder2 = Label(' ',width=1) placeholder3 = Label(' ',width=1) placeholder4 = Label(' ',width=1) if baesse == 'YES': radNzlAnz = Radio(['anzeigen','nicht anzeigen'],text='Notenzeile anzeigen',value=int(opt.get('nzlAnz',str(na)))) radDarN = Radio(['unterdrücken','rot darstellen'],text='nicht spielbare Noten',value=int(opt.get('darNicht',str(dz)))) radDarK = Radio(['klassisch','alternativ'],text='Kopfform',value=int(opt.get('darKopf',str(dk)))) radDarP = Radio(['Viertelnoten ','Achtelnoten '],text='Platzhalter für Begleitung',value=int(opt.get('darPlatz',str(dp)))) subboxDar = HBox([radNzlAnz,radDarN,radDarK,radDarP,placeholder1],padding=4) box1 = HBox([subboxDar,placeholder4],padding=4) mainboxDar = VBox([box1],text='Darstellung') else: radNzlAnz = Radio(['anzeigen','nicht anzeigen'],text='Notenzeile anzeigen',value=int(opt.get('nzlAnz',str(na)))) radDarN = Radio(['unterdrücken','rot darstellen'],text='nicht spielbare Noten',value=int(opt.get('darNicht',str(dz)))) radDarK = Radio(['klassisch','alternativ'],text='Kopfform',value=int(opt.get('darKopf',str(dk)))) subboxDar = HBox([radNzlAnz,radDarN,radDarK,placeholder1],padding=4) box1 = HBox([subboxDar,placeholder4],padding=4) mainboxDar = VBox([box1],text='Darstellung') lablSaOben = Label('über erstem System ',width=6) editSaOben = Edit (opt.get('saOben',str(so)),width=10) lablSaZw = Label('zwischen den Systemen ',width=6) editSaZw = Edit (opt.get('saZw',str(su)),width=10) subboxSaOben = HBox([lablSaOben,editSaOben,placeholder4],padding=0) subboxSaZw = HBox([lablSaZw,editSaZw,placeholder4],padding=0) box1 = HBox([subboxSaOben,subboxSaZw,placeholder4],padding=4) mainboxSa = VBox([box1],text='Systemabstände') lablNzlOben = Label('Abstand nach oben ',width=6) editNzlOben = Edit (opt.get('nzlOben',str(no)),width=10) lablNzlUnten = Label('Abstand nach unten ',width=10) editNzlUnten = Edit (opt.get('nzlUnten',str(nu)),width=10) subboxNzlOben = HBox([lablNzlOben,editNzlOben,placeholder4],padding=0) subboxNzlUnten = HBox([lablNzlUnten,editNzlUnten,placeholder4],padding=0) box1 = HBox([subboxNzlOben,subboxNzlUnten,placeholder4],padding=4) mainboxNzl = VBox([box1],text='Notenzeile') lablTzlOben = Label('Abstand nach oben ',width=6) editTzlOben = Edit (opt.get('tzlOben',str(to)),width=10) lablTzlUnten = Label('Abstand nach unten ',width=10) editTzlUnten = Edit (opt.get('tzlUnten',str(tu)),width=10) subboxTzlOben = HBox([lablTzlOben,editTzlOben,placeholder4],padding=0) subboxTzlUnten = HBox([lablTzlUnten,editTzlUnten,placeholder4],padding=0) box1 = HBox([subboxTzlOben,subboxTzlUnten,placeholder4],padding=4) mainboxTzl = VBox([box1],text='Griffschrift') radDarLt = Radio(['anzeigen','nicht anzeigen'],value=int(opt.get('darLt',str(lt)))) lablLzlAbstand = Label('Abstand von der Mittellinie ',width=6) editLzlAbstand = Edit (opt.get('lzlAbstand',str(la)),width=10) lablLzlStrophe = Label('Strophenabstand ',width=10) editLzlStrophe = Edit (opt.get('lzlStrophe',str(ls)),width=10) subboxLzlAbstand = HBox([lablLzlAbstand,editLzlAbstand,placeholder4],padding=0) subboxLzlStrophe = HBox([lablLzlStrophe,editLzlStrophe,placeholder4],padding=0) box1 = HBox([radDarLt,subboxLzlAbstand,subboxLzlStrophe,placeholder4],padding=4) mainboxLzl = VBox([box1],text='Liedtext') box = VBox([mainboxDar,mainboxSa,mainboxNzl,mainboxTzl,mainboxLzl,placeholder1],padding=1) dlg = Dialog('ClubOrgel_B :', box) if dlg.run(): nzlLt = radDarLt.value() nzlAnz = radNzlAnz.value() saOben = editSaOben.value() saZw = editSaZw.value() nzlOben = editNzlOben.value() nzlUnten = editNzlUnten.value() tzlOben = editTzlOben.value() tzlUnten = editTzlUnten.value() lzlAbstand = editLzlAbstand.value() lzlStrophe = editLzlStrophe.value() darNicht = radDarN.value() darKopf = radDarK.value() if baesse == 'YES': darPlatz = radDarP.value() else: darPlatz = 0 lt = opt.get('dNzlLt','') na = opt.get('dNzlAnz','') so = opt.get('dSaOben','') su = opt.get('dSaZw','') no = opt.get('dNzlOben','') nu = opt.get('dNzlUnten','') to = opt.get('dTzlOben','') tu = opt.get('dTzlUnten','') la = opt.get('dLzlAbstand','') ls = opt.get('dLzlStrophe','') dz = opt.get('dDarNicht','') dk = opt.get('dDarKopf','') dp = opt.get('dDarPlatz','') opt = dict( dNzlLt = str(nzlLt), dNzlAnz = str(nzlAnz), dSaOben = str(saOben), dSaZw = str(saZw), dNzlOben = str(nzlOben), dNzlUnten = str(nzlUnten), dTzlOben = str(tzlOben), dTzlUnten = str(tzlUnten), dLzlAbstand = str(lzlAbstand), dLzlStrophe = str(lzlStrophe), dDarKopf = str(darKopf), dDarPlatz = str(darPlatz) ) options.set(opt) return True else: return False # Hauptprogramm: from caplib.capDOM import ScoreChange import tempfile global tArt tList = [] tArt = 'T' activeScore().registerUndo("ClubOrgel_B") class ScoreChange(ScoreChange): def changeScore(self, score): changeDoc(score) # und endlich umwandeln if activeScore(): if pqDialog(): global tempInput, tempOutput activeScore().registerUndo("ClubOrgel_B") tempInput = tempfile.mktemp('.capx') tempOutput = tempfile.mktemp('.capx') activeScore().write(tempInput) ScoreChange(tempInput, tempOutput) activeScore().read(tempOutput) os.remove(tempInput) os.remove(tempOutput)