# -*- coding: ISO-8859-1 -*- """ capellaScript -- 27.12.2007 Hans H. Lampe >>> Umkehrungen von Melodieabschnitten (Version 3.0 - 07.08.2008)|| Mit diesem Skript wird ein markierter Melodieabschnitt vertikal oder/und horizontal umgekehrt, d.h. es entsteht die Spiegel- oder/und die Krebsform des Melodieabschnitts.| Beide Spiegelarten - real und tonal - sind möglich.|| Diese Umkehrungen unterstützen in capella das Komponieren von polyphonen Gattungen, wie Inventionen, Kanons und Fugen.|| Der Tonbereich für gespiegelte Töne liegt zwischen C und h'''. Töne, deren Spiegelung außerhalb dieses Tonbereichs liegen würden, werden rot dargestellt.|| HINWEIS: Der umzukehrende Melodieabschnitt könnte vorher |- ggf. von der Urform - mittels "Strg+C und Strg+V" an die gewünschte Position der Partitur kopiert werden.|| Rückmeldungen bitte an Hans H. Lampe:|HansHermann.Lampe@t-online.de <<< NEU in Version 0.2: Die Basis für die Spiegelung sind die diatonischen Notennummern; die chromatischen dienen der "Alterations-Rechnung" Drei Combo-Boxen wurden implementiert: "Spiegelton", "Alteration" und "Oktave" im Bereich von C bis h3 NEU in Version 0.3: Umkehrungen beziehen sich jetzt auf markierte Melodieabschnitte NEU in Version 0.4: Implementierung der tonalen Spiegelung NEU in Version 0.4.1: Änderungen gemäß eMail von Herrn Werner 8.07.08 11:06 NEU in Version 0.4.2: Korrektur der tonalen Spiegelung NEU in Version 0.4.3: Implementierung des "Anfangstons" als Alternative bei der Spiegelung NEU in Version 1.0 (relesae-fähig): Änderungen und Ergänzungen lt. eMail von Herrn Werner 17.07.08 9:55 NEU in Version 2.0: Bindebögen werden in einer Ebene unterstützt. Müssen ggf. angepasst werden (siehe "Hilfe" im Dialog) NEU in Version 3.0: Setzen eines "festen" Auftaktstrichs, falls bei horizontaler Spiegelung (Krebs) vor der Spiegelung der letzte Takt des Melodieabschnitts unvollständig war """ from caplib.capDOM import ScoreChange import xml.dom.minidom DOC = xml.dom.minidom.Document import tempfile, codecs, pickle def addNewChildNode(el,tagName): global doc newChild = el.ownerDocument.createElement(tagName) # lt. Prof. Ring (eMail) el.appendChild(newChild) return newChild ##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) ## def spiegeln(score): global redInd, outOfRange, spiegelAlt, spNote step = 0 # für die vorhandenen Alterationen redInd = 0 # für die Rot-Markierung außerhalb des Tonbereichs liegender outOfRange = [] ersteNote = 1 # Indikator, wenn mit"Anfangston" gearbeitet wird (1="on") diatPitchTransp = 0 # diat. Transposition, wenn mit"Anfangston" gearbeitet wird chrPitchTransp = 0 # chrom. Transposition, wenn mit"Anfangston" gearbeitet wird # ----- Spiegelnoten (diatonisch, chromatisch) ----- # # H A G F E D C spNoten ={1:{1:(55,95),2:(54,93),3:(53,91),4:(52,89),5:(51,88),6:(50,86),7:(49,84)}, # h3-c3 2:{1:(48,83),2:(47,81),3:(46,79),4:(45,77),5:(44,76),6:(43,74),7:(42,72)}, # h2-c2 3:{1:(41,71),2:(40,69),3:(39,67),4:(38,65),5:(37,64),6:(36,62),7:(35,60)}, # h1-c1 4:{1:(34,59),2:(33,57),3:(32,55),4:(31,53),5:(30,52),6:(29,50),7:(28,48)}, # h -c 5:{1:(27,47),2:(26,45),3:(25,43),4:(24,41),5:(23,40),6:(22,38),7:(21,36)} # H -C } # ----- capella-Notierungen und Chromatic-Pitches aufgerufen durch Diatonic-Pitches ----- # capNotes = {21:('C3',36),22:('D3',38),23:('E3',40),24:('F3',41),25:('G3',43),26:('A3',45),27:('B3',47), # C -H 28:('C4',48),29:('D4',50),30:('E4',52),31:('F4',53),32:('G4',55),33:('A4',57),34:('B4',59), # c -h 35:('C5',60),36:('D5',62),37:('E5',64),38:('F5',65),39:('G5',67),40:('A5',69),41:('B5',71), # c1-h1 42:('C6',72),43:('D6',74),44:('E6',76),45:('F6',77),46:('G6',79),47:('A6',81),48:('B6',83), # c2-h2 49:('C7',84),50:('D7',86),51:('E7',88),52:('F7',89),53:('G7',91),54:('A7',93),55:('B7',95) # c3-h3 } # ----- Tabelle für die Steuerung der "tonalen Alteration" abhängig von Tonart und gespiegeltem Ton ----- # tonalAlt = {7:{'C':1,'D':1,'E':1,'F':1,'G':1,'A':1,'B':1}, # Cis-Dur (7#) 6:{'C':1,'D':1,'E':1,'F':1,'G':1,'A':1,'B':0}, # Fis-Dur (6#) 5:{'C':1,'D':1,'E':0,'F':1,'G':1,'A':1,'B':0}, # H - Dur (5#) 4:{'C':1,'D':1,'E':0,'F':1,'G':1,'A':0,'B':0}, # E - Dur (4#) 3:{'C':1,'D':0,'E':0,'F':1,'G':1,'A':0,'B':0}, # A - Dur (3#) 2:{'C':1,'D':0,'E':0,'F':1,'G':0,'A':0,'B':0}, # D - Dur (2#) 1:{'C':0,'D':0,'E':0,'F':1,'G':0,'A':0,'B':0}, # G - Dur (1#) 0:{'C':0,'D':0,'E':0,'F':0,'G':0,'A':0,'B':0}, # C - Dur -1:{'C':0,'D':0,'E':0,'F':0,'G':0,'A':0,'B':-1}, # F - Dur (1b) -2:{'C':0,'D':0,'E':-1,'F':0,'G':0,'A':0,'B':-1}, # B - Dur (2b) -3:{'C':0,'D':0,'E':-1,'F':0,'G':0,'A':-1,'B':-1}, # Es- Dur (3b) -4:{'C':0,'D':-1,'E':-1,'F':0,'G':0,'A':-1,'B':-1}, # As- Dur (4b) -5:{'C':0,'D':-1,'E':-1,'F':0,'G':-1,'A':-1,'B':-1}, # Des-Dur (5b) -6:{'C':-1,'D':-1,'E':-1,'F':0,'G':-1,'A':-1,'B':-1}, # Ges-Dur (6b) -7:{'C':-1,'D':-1,'E':-1,'F':-1,'G':-1,'A':-1,'B':-1} # Ces-Dur (7b) } systemsX = score.getElementsByTagName('system') sysIndex = 0 for system in activeScore().systems(): # "Intern" systemX = systemsX[sysIndex] sysIndex = sysIndex + 1 for staff in system.staves(): # "Intern": Suchen der selektierten Notenzeile if staff.index() <> system.staffIndexFromDescr(selStaff):#staffList[selStaff.value()]): continue for staffX in systemX.getElementsByTagName('staff'): # "Extern": Suchen der selektierten Notenzeile layout = staffX.getAttribute('layout') if layout != selStaff: continue heads = staffX.getElementsByTagName('head') # "Extern": Alle "heads" einer einstimmigen Notenzeile headIndex = -1 for obj in staff.noteObjs(): # "Intern" if obj.isChord(): # "Adressieren der einzelnen "heads" headIndex = headIndex + 1 if sel[0] != sel[1]: # Markierung vorhanden syIndex = system.index() stIndex = staff.index() if syIndex == sy and stIndex == st: objIndex = obj.index() if objIndex < no0 or no1 <= objIndex: # markierter Bereich zwischen 'no0' und 'no1'-1 continue head = obj.head(0) diatPitch = head.diatonicPitch() # "Intern" diatPitch = diatPitch[0] chrPitch = head.chromaticPitch() spNote = spNoten[spiegelOktave][spiegelTon] if anfangsTon: # Soll mit Anfangston gearbeitet werden? if ersteNote: # zur Ermittlung des Transpositions-Intervalls diatPitchTransp = diatPitch - spNote[0] # diat. Transposition chrPitchTransp = chrPitch - spNote[1] # chrom. Transposition ersteNote=0 # Indikator "off" diatPitch = diatPitch-diatPitchTransp # u.U. mit diat. Transposition chrPitch = head.chromaticPitch()-chrPitchTransp # u.U. mit chrom. Transposition head = heads[headIndex] # "Extern" XML # ----- bei tonaler Spiegelung wird Quinte zur Quarte und umgekehrt ----- # if spiegelArt == 1: # tonale Spiegelung? (0 = reale Spiegelung, 1 = tonale Spiegelung) # tonale Spiegelung # ----------------- intervall = diatPitch - spNote[0] # diatonisches Intervall intervCh = 0 if QuintQuart: # Quinte zur Quarte und umgekehrt? if intervall == 4: # Quinte nach oben intervCh = 1 # wird zur Quarte nach unten if intervall == 3: # Quarte nach oben intervCh = -1 # wird zur Quinte nach unten if intervall == -3: # Quarte nach unten intervCh = 1 # wird zur Quinte nach oben if intervall == -4: # Quinte nach unten intervCh = -1 # wird zur Quarte oben try: # prüfen, ob Spiegelton vorgesehen if spiegelArt: # tonale Spiegelung capNote = capNotes[2*spNote[0]-diatPitch+intervCh] else: # reale Spiegelung capNote = capNotes[2*spNote[0]-diatPitch] except: # Ton kann nicht gespiegelt werden headsX = head.parentNode display = doc.createElement('display') display = headsX.parentNode.insertBefore(display,headsX) display.setAttribute('color','FF0000') diatPitchDispl= 2*spNote[0]-diatPitch outOfRange.append(diatPitchDispl) redInd = 1 # für die entsprechende Schlussanzeige continue capNoteOld = head.getAttribute('pitch') head.setAttribute('pitch',capNote[0]) # Setzen der "gespiegelten Note" alter = head.getElementsByTagName('alter') # "Extern" if alter != []: # Alteration der Ursprungsnote? # Alteration der Ursprungsnote (explizit oder durch Tonart) # = = = = = = = = = = = = = = = = = = = = = = = = = = = = = alter = head.getElementsByTagName('alter')[0] step = alter.getAttribute('step') if spiegelArt == 1: # tonale Spiegelung? (0 = real, 1 = tonal) # tonale Spiegelung (Alteration der Ursprungsnote) # =============================================== tonArt = obj.curKey() if tonalAlt[tonArt][capNote[0][0]] == 0: # Zielnote: Alteration durch Tonart? # keine Alteration der Zielnote durch Tonart # ------------------------------------------ if tonalAlt[tonArt][capNoteOld[0]] == 0: # Ursprungsnote: Alteration durch Tonart? # Ursprungsnote hat keine Alteration durch Tonart # ----------------------------------------------- if capNoteOld[0] == capNote[0][0]: alter.setAttribute('step',str(2*(spNote[1]+spiegelAlt)-chrPitch-capNote[1])) else: alter.setAttribute('step',str(-int(step))) # Ursprungsnote hat Alteration durch Tonart # ----------------------------------------- else: alter.setAttribute('step',str(0)) # Zielnote hat Alteration durch Tonart # ------------------------------------ else: if tonalAlt[tonArt][capNoteOld[0]] == 0: # Ursprungsnote: Alteration durch Tonart? # Ursprungsnote hat keine Alteration durch Tonart # ----------------------------------------------- #alter.setAttribute('step',str(2*(spNote[1]+spiegelAlt)-chrPitch-capNote[1]\ #-tonalAlt[tonArt][capNote[0][0]])) alter.setAttribute('step',str(-int(step))) # Ursprungsnote hat Alteration durch Tonart # ----------------------------------------- else: if capNoteOld[0] == capNote[0][0]: # gleicher Notenname? if capNoteOld[1] == capNote[0][1]: # dieselbe Oktave? alter.setAttribute('step',str(2*(spNote[1]+spiegelAlt)-chrPitch-capNote[1])) else: alter.setAttribute('step',str(-(2*(spNote[1]+spiegelAlt)-chrPitch-capNote[1]))) else: alter.setAttribute('step',str(2*(spNote[1]+spiegelAlt)-chrPitch-capNote[1]\ +tonalAlt[tonArt][capNote[0][0]])) # reale Spiegelung (Alteration der Ursprungsnote) # ============================================== else: alter.setAttribute('step',str(2*(spNote[1]+spiegelAlt)-chrPitch-capNote[1])) # keine Alteration der Ursprungsnote # = = = = = = = = = = = = = = = = = else: alter = addNewChildNode(head,'alter') if spiegelArt == 1: # tonale Spiegelung? # tonale Spiegelung # ----------------- tonArt = obj.curKey() alter.setAttribute('step',str(tonalAlt[tonArt][capNote[0][0]])) # reale Spiegelung # ---------------- else: alter.setAttribute('step',str(2*(spNote[1]+spiegelAlt)-chrPitch-capNote[1])) def krebsen(score): global messageInd step = 0 # für die vorhandenen Alterationen krebs = [] i = 0 messageInd = 0 # Indikator für die Schlussanzeige slurInd = 0 barlineInd = 0 # vor dem Krebsen firstBarline = 0 # nach dem Krebsen systemsX = score.getElementsByTagName('system') sysIndex = 0 for system in activeScore().systems(): # "Intern" systemX = systemsX[sysIndex] sysIndex = sysIndex + 1 for staff in system.staves(): # "Intern": Suchen der selektierten Notenzeile if staff.index() <> system.staffIndexFromDescr(selStaff): continue for staffX in systemX.getElementsByTagName('staff'): # "Extern": Suchen der selektierten Notenzeile layout = staffX.getAttribute('layout') if layout != selStaff: continue chords = staffX.getElementsByTagName('chord') # "Extern": Alle "chords" einer einstimmigen Notenzeile chordIndex = -1 for obj in staff.noteObjs(): # "Intern" if obj.isChord(): # "Adressieren der einzelnen "heads" chordIndex = chordIndex + 1 if sel[0] != sel[1]: # Markierung vorhanden syIndex = system.index() stIndex = staff.index() if syIndex == sy and stIndex == st: objIndex = obj.index() if objIndex < no0 or no1 <= objIndex: # markierter Bereich zwischen 'no0' und 'no1'-1 continue chord = chords[chordIndex] # "Extern" XML implBarline = obj.implBarline() # falls impliziter Taktstrich vorhanden... if barlineInd: # falls impl. Taktstrich an Vornote erkannt barlineInd = 0 krebs.append('barline') else: if implBarline != 0: # impliziter Taktstrich? barlineInd = 1 # impliziter Taktstrich erkannt -um eine Note verzögern tie = chord.getElementsByTagName('tie') # bei vorhandenem Haltebogen... if tie != []: # Haltebogen... tie = tie[0] type = tie.getAttribute('begin') # ist es der Beginn des Bogens? if type: # Beginn des Bogens... tie.removeAttribute('begin') # Entfernen des Typs 'begin' tie.setAttribute('end','true') # Setzen des Typs 'end' else: tie.removeAttribute('end') # Entfernen des Typs 'end' tie.setAttribute('begin','true') # Setzen des Typs 'begin' if slurInd: # Bindebogen "aktuell" ? if chord: noteRange = int(noteRange)-1 if noteRange == 0: # neue "Ankernote" wenn '0' slurInd = 0 chord.appendChild(drawObjects) # Übertragen der Bindebogenverankerung (Elternknoten) zum nachf. 'chord' krebs.append(chord) continue slur = chord.getElementsByTagName('slur') # bei vorhandenem Bindebogen... if slur != []: slurInd = 1 # Bindebogen entdeckt basic = chord.getElementsByTagName('basic')[0] noteRange = basic.getAttribute('noteRange') # "Weite" (Anz. folg. Noten) des Bindebogens drawObjects = chord.getElementsByTagName('drawObjects')[0] # Elternknoten zur Übertragung auf nachfolgenden 'chord' krebs.append(chord) krebs.reverse() # horizontale Umkehrung clipBoard = pickle.dumps(krebs) # "serialisieren" krebs = pickle.loads(clipBoard) # "deserialisieren" i = 0 systemsX = score.getElementsByTagName('system') sysIndex = 0 for system in activeScore().systems(): # "Intern" systemX = systemsX[sysIndex] sysIndex = sysIndex + 1 for staff in system.staves(): # "Intern": Suchen der selektierten Notenzeile if staff.index() <> system.staffIndexFromDescr(selStaff): continue for staffX in systemX.getElementsByTagName('staff'): # "Extern": Suchen der selektierten Notenzeile layout = staffX.getAttribute('layout') if layout != selStaff: continue chords = staffX.getElementsByTagName('chord') # "Extern": Alle "chords" einer einstimmigen Notenzeile chordIndex = -1 for obj in staff.noteObjs(): # "Intern" if obj.isChord(): # "Adressieren der einzelnen "heads" chordIndex = chordIndex + 1 if sel[0] != sel[1]: # Markierung vorhanden syIndex = system.index() stIndex = staff.index() if syIndex == sy and stIndex == st: objIndex = obj.index() if objIndex < no0 or no1 <= objIndex: # markierter Bereich zwischen 'no0' und 'no1'-1 continue chord = chords[chordIndex] nextObject = krebs[i] if nextObject == 'barline': # wurde impliziter Taktstrich erkannt? if firstBarline == 0: # nur den ersten impl.Taktstrich(mögl.Auftakt)... el = chord.parentNode #...als festen Taktstrich setzen barline = el.ownerDocument.createElement('barline') chord.parentNode.insertBefore(barline, chord) firstBarline = 1 i = i + 1 # gespeicherten Taktstrich-Indikator 'barline' überspringen chord.parentNode.replaceChild(krebs[i],chord) i = i + 1 class spiegelnClass(ScoreChange): def changeScore(self, score): global scriptAction, doc doc = score.parentNode spiegeln(score) class krebsenClass(ScoreChange): def changeScore(self, score): global scriptAction, doc doc = score.parentNode krebsen(score) active = 0 # für 'Abbrechen'-Steuerung staffList = activeScore().voiceList() sel = curSelection() if sel <> 0: (sy,st,vo,no0) = sel[0] # vor erster Note der Markierung (sy1,st1,vo1,no1) = sel[1] # hinter letzter Note der Markierung (nur 'no1' wird im Skript verwendet) system = activeScore().system(sy) staff = system.staff(st) # ------ Aktuellen Eintrag im Mustersystem bestimmen ------ # staffIndex = 1 i = 0 for descr in staffList: if staff.index() == system.staffIndexFromDescr(descr): staffIndex = i i += 1 selStaff = staffList[staffIndex] # -------- Dialogbox --------- # AnfangsTon = CheckBox('Spiegelton als Anfangston der Spiegelung verwenden', value=0) Spiegelung = CheckBox('Spiegelung ', value=0) SpiegelArt = Radio(['real','tonal'], value=0) SpiegelTon = ComboBox(["Spiegelton","h","a","g","f","e","d","c"], width=10, value=0) SpiegelAlt = ComboBox(["Alteration","keine","#","b"],width=9, value=0) SpiegelOktave = ComboBox(["Oktave","c'''-- h'''","c'' -- h''","c' -- h'","c -- h","C -- H"], width=8, value=0 ) QuintQuart = CheckBox('Quinten zu Quarten und umgekehrt bei tonaler Spiegelung',value=1) Krebs = CheckBox('Krebs (horizontal umkehren)', value=0) labHinweis = Label('HINWEISE: Bitte beachten Sie den Text auf der ersten Seite nach Aufruf dieses Skripts !\r\n\ - Ab capella 2008 Version 6.0 - 09 kann dafür auch hier der Hilfe-Knopf betätigt werden.\r\n\ - Die Laufzeit des Skripts ist beim ersten Aufruf länger - bitte haben Sie etwas Geduld !') nullLab = Label('') dlg = Dialog(' Umkehrung eines Melodieabschnitts (Version 3.0)', VBox([ HBox([nullLab]), HBox([Spiegelung, SpiegelArt, SpiegelTon, SpiegelAlt, SpiegelOktave]), HBox([nullLab, QuintQuart], padding = 70), HBox([nullLab, AnfangsTon], padding = 70), (''), HBox([Krebs]), (''), HBox([labHinweis]), ('') ] ) , help="Mit diesem Skript wird ein markierter Melodieabschnitt vertikal oder/und horizontal ""umgekehrt"", \ d.h. es entsteht die Spiegel- oder/und die Krebsform des Melodieabschnitts. \r\n\n\ Der Tonbereich für gespiegelte Töne liegt zwischen C und h'''.\r\n\ Töne, deren Spiegelung außerhalb dieses Tonbereichs liegen würden, werden rot dargestellt.\r\n\n\ Der ausgewählte Spiegelton kann auch als Anfangston der Spiegelung verwendet werden.\r\n\n\ Um die Optionen dieses Skripts für den Anwender überschaubar zu halten, berücksichtigt das Skript bei tonalem Spiegeln \ nicht alle Extremfälle. Daher kann es nötig werden, je nach musikalischem Zusammenhang einzelne Töne vertikal nachzujustieren.\r\n\n\ Bitte passen Sie nach einer Spiegelung ggf. noch die Bindebögen an: \r\n\ ''Format - Transponieren - Cursorzeile in allen Systemen - Bindebögen - Anpassen ohne Transposition''.\r\n\ Dabei bitte vorher den Cursor in die entsprechende Notenzeile setzen.\r\n\n\ HINWEIS:\r\n\ Der umzukehrende Melodieabschnitt könnte vorher - ggf. von der ''Urform'' - mittels ''Strg+C und Strg+V'' \ an die gewünschte Position der Partitur kopiert werden.\r\n\n\n\ Rückmeldungen bitte an Hans H. Lampe: HansHermann.Lampe@t-online.de") def dlgRun(): global active, transposeOctave, entfVorz, maxVorz, max6Vorz if sel[0] == sel[1]: # keine Markierung vorhanden? messageBox(' Markierung des Melodieabschitts fehlt', 'Bitte markieren Sie den umzukehrenden Melodieabschnitt \r\n\n\ und rufen anschließend das Skript mit Strg+R wieder auf',img=3) return if dlg.run(): active = 1 # für 'Abrechen'-Steuerung if Spiegelung.value() == 0: if Krebs.value() == 0: messageBox(' Es wurde keine Umkehrung gewählt', 'Bitte wählen Sie "Spiegelung" oder/und "Krebs"',img=3) active = 0 dlgRun() return if Spiegelung.value() == 1: if SpiegelTon.value() == 0: messageBox(' Der Spiegelton fehlt','Bitte den Spiegelton bestimmen',img=3) active = 0 dlgRun() return if SpiegelOktave.value() == 0: messageBox(' Die Selektion der Oktave fehlt', 'Bitte noch die Oktave des Spiegeltons wählen',img=3) active = 0 dlgRun() return activeScore().registerUndo("Umkehrung") # an dieser Stelle??????????? # ------ Hauptprogramm ----- # dlgRun() # Starten des Skripts spiegelnInd = Spiegelung.value() spiegelArt = SpiegelArt.value() spiegelTon = SpiegelTon.value() spiegelAlt = SpiegelAlt.value() spiegelOktave = SpiegelOktave.value() QuintQuart = QuintQuart.value() krebsenInd = Krebs.value() anfangsTon = AnfangsTon.value() if spiegelAlt == 0: spiegelAlt = 0 # 'Alteration' (impl. 'keine') elif spiegelAlt == 1: spiegelAlt = 0 # 'keine' elif spiegelAlt == 2: spiegelAlt = 1 # '#' = Halbton nach oben elif spiegelAlt == 3: spiegelAlt = -1 # 'b' = Halbton nach unten if active == 1: # bei 'Abbrechen' Schluss if activeScore(): activeScore().registerUndo("Umkehrung") tempInput = tempfile.mktemp('.capx') # für aktuelle aktive Partitur # tempOutput = tempfile.mktemp('.capx') activeScore().write(tempInput) # Einlesen der aktiven Partitur if spiegelnInd: # Soll gespiegelt werden? spiegelnClass(tempInput, tempOutput) # Spiegelung durchführen activeScore().read(tempOutput) # Ergebnis als aktive Partitur zurück if redInd: # Hinweis auf die roten Noten, die außerhalb des Spiegel-Tonbereichs liegen messageBox(' Spiegelproblem', 'Die roten Noten konnten nicht gespiegelt werden, da die gespiegelten \r\n\ Noten außerhalb des unterstützten Tonbereichs (C-h3) liegen würden.\r\n Entweder "von Hand" spiegeln oder beim Autor reklamieren.\r\n\n\ (Info für den Autor: 3.0 - '+str(spNote[0])+' - '+ str(outOfRange)+')', img=3) # (Vers.-diat Sp-Ton-zu spieg.diat Töne) os.remove(tempInput) os.remove(tempOutput) if krebsenInd: # Soll gekrebst werden? activeScore().write(tempInput) # Einlesen der aktiven Partitur krebsenClass(tempInput, tempOutput) # Krebs durchführen activeScore().read(tempOutput) # Ergebnis als aktive Partitur zurück os.remove(tempInput) os.remove(tempOutput)