# -*- coding: ISO-8859-1 -*- """ capellaScript -- 27.12.2007 Hans H. Lampe >>> Konvertieren von Violine nach Viola und v.v. (Version 1.3)|| Konvertieren der Notierung einer Violine in die einer Viola (Bratsche) und umgekehrt.|| Noten außerhalb des Tonumfangs des Zielinstruments werden farbig markiert und auf Wunsch automatisch oktaviert.|| Bitte den Cursor für die automatische Zeilenwahl in die entsprechende Notenzeile setzen, oder die gewünschte Notenzeile im nachfolgenden Dialog wählen.|| In dieser Version werden nur einstimmige Notenzeilen unterstützt.||| Rückmeldungen bitte an Hans H. Lampe:|HansHermann.Lampe@t-online.de <<< Konvertieren von Violine nach Viola und v.v.

(Version 1.3)

Konvertieren der Notierung einer Violine in die einer Viola (Bratsche) und umgekehrt.

Noten außerhalb des Tonumfangs des Zielinstruments werden farbig markiert und auf Wunsch automatisch oktaviert.

Bitte den Cursor für die automatische Zeilenwahl in die entsprechende Notenzeile setzen, oder die gewünschte Notenzeile im nachfolgenden Dialog wählen.

In dieser Version werden nur einstimmige Notenzeilen unterstützt.

Rückmeldungen bitte an Hans H. Lampe: HansHermann.Lampe@t-online.de

Converteren van viool naar altviool en v.v.

(Versie 1.3)

Converteren van de notatie voor viool in die voor altviool (viola) en omgekeerd.

Noten buiten het toonbereik van het doelinstrument worden in kleur gemarkeerd en indien gewenst automatisch geoctaveerd.

Plaats Voor automatische selectie van de notenbalk de cursor in de betreffende notenbalk, men kan de gewenste notenbalk ook in het dialoogvenster selecteren.

In deze versie werden slechts eenstemmige notenbalken ondersteund.

Reacties graag naar Hans H. Lampe: HansHermann.Lampe@t-online.de

Converting from Violin to Viola and v.v.

(Version 1.3)

Converting of the notation for a violin into that for a viola and reversed.

Notes out of the range of the target instrument are marked in color and, if desired, automatically transposed an octave up or down.

Please put the cursor for automatic staff selection in the concerning staff or select, or select the desired staff in the dialogue window.

In this version only staves for one voice are supported.

Reactions please to Hans H. Lampe: HansHermann.Lampe@t-online.de

27.12.2017 V 1.0 HL Erste Version 22.08.2017 V 1.1 PB Anpassung an Capella 2008 05.05.2021 V 1.2 WW Internationalisierung und 'Messageboxes' angepasst(de-en-nl) 13.01,2021 V 1.3 WW Outside --> out of (in engl. Texte) """ english = { 'selInstrument' :'Select instrument', 'violin' :'Violin', 'viola' :'Viola', 'staffInstr' :' Staff of the instrument (preselected by the position of the cursor)', 'descrStaffLayOut' :'\'Description\' of the staff in the capella Staff Layout', 'fromInstrument' :' From instrument', 'toInstrument' :'To instrument', 'outRangeNotesOct' :'Notes out of the range will be transposed an octave up or down', 'hint1a' :'HINTS: - If only the range of the instrument must be investigated and/or the notes out of its range', 'hint1b' :' transposed an octave, please select then the concerning instrument in both of the selection fields.', 'hint2a' :' - If with double stops only one of both notes lies out of the instrument range, still both of them', 'hint2b' :' will be marked in color and this being the case also transposed an octave up or down.', 'header' :'Converting from Violin to Viola and reversed (Version 1.3)', 'selOfInstrument' :'Please select the \'From instrument\'', 'selStaff' :'Please select also the concerning staff', 'selToInstrument' :'Please select the \'To instrument\'', 'outRange' :'Warning: Notes out of the range of', 'colorNotesAreOut' :'The >colored notes< lie out of the standard range of', 'colorNotesWereOut' :'The >colored notes< lied out of the standard range of', 'octave' :'and were as desired transposed an octave up or down', 'inRange' :'All notes lie within the standard range of', 'allNotes' :'All notes of', 'areInRange' :'lie within the standard range.', 'searched' :'There was a search in the staff' } german = { 'selInstrument' :'Instrument auswählen', 'violin' :'Violine', 'viola' :'Viola (Bratsche)', 'staffInstr' :' Notenzeile des Instruments (durch Positionierung des Cursors wurde diese vorbestimmt)', 'descrStaffLayOut' :'\'Beschreibung\' der Notenzeile im capella-Mustersystem', 'fromInstrument' :' von Instrument', 'toInstrument' :'nach Instrument', 'outRangeNotesOct' :'Noten außerhalb des Tonbereichs werden oktaviert', 'hint1a' :'HINWEISE: - Falls nur der Tonumfang eines Instruments überprüft und/oder die Noten außerhalb seines Tonbereichs', 'hint1b' :' oktaviert werden sollen, bitte das entsprechende Instrument in beiden Feldern auswählen.', 'hint2a' :' - Falls bei Doppelgriffen nur eine der beiden Noten außerhalb des Tonbereiches liegen sollte,', 'hint2b' :' werden trotzdem beide farbig markiert und ggf. auch beide oktaviert.', 'header' :'Konvertieren von Violine nach Viola und umgekehrt (Version 1.3)', 'selOfInstrument' :'Bitte das \'von Instrument\' auswählen', 'selStaff' :'Bitte auch die entsprechende Notenzeile auswählen', 'selToInstrument' :'Bitte das \'nach Instrument\' auswählen', 'outRange' :'Achtung: Noten außerhalb des Tonbereichs von', 'colorNotesAreOut' :'Die >farbigen Noten< liegen außerhalb des Standard-Tonbereichs von', 'colorNotesWereOut' :'Die >farbigen Noten< lagen außerhalb des Standard-Tonbereichs von', 'octave' :'und wurden auf Wunsch oktaviert', 'inRange' :'Alle noten liegen im Sandard-Tonbereich von', 'allNotes' :'Alle Noten von', 'areInRange' :'liegen im Standard-Tonbereich.', 'searched' :'Geprüft wurde in der Notenzeile' } dutch = { 'selInstrument' :'Instrument selecteren', 'violin' :'Viool', 'viola' :'Altviool (Viola)', 'staffInstr' :' Notenbalk van het instruments (door positionerung van de cursor vóórgesecteerd)', 'descrStaffLayOut' :'\'Beschrijving\' van de notenbalk in het Partituursjabloon van capella', 'fromInstrument' :' Van instrument', 'toInstrument' :'Naar instrument', 'outRangeNotesOct' :'Noten buiten het toonbereik worden geoctaveerd', 'hint1a' :'N.B.: - Indien slechts het toonbereik van een instrument moet worden onderzocht en/of de noten buiten het toonbereik', 'hint1b' :' geoctaveerd moeten worden, selecteer dan s.v.p. het desbetreffende instrument in beide keuzevelden.', 'hint2a' :' - Indien bij dubbelgrepen slechts één van beide noten buiten het toonbereik ligt, worden toch beide in kleur', 'hint2b' :' gemarkeerd en in het voorkomende geval ook beide geoctaveerd.', 'header' :'Converteren van Viool naar Altviool en omgekeerd (Versie 1.3)', 'selOfInstrument' :'S.v.p. het \'Van instrument\' selecteren', 'selStaff' :'S.v.p. ook de desbetreffende notenbalk selecteren', 'selToInstrument' :'S.v.p. het \'Naar instrument\' selecteren', 'outRange' :'Let op: Noten buiten het toonbereik van', 'colorNotesAreOut' :'De >gekleurde noten< liggen buiten het standaard toonbereik van', 'colorNotesWereOut' :'De >gekleurde noten< lagen buiten het standaard toonbereik van', 'octave' :'en werden naar wens geoctaveerd', 'allNotes' :'Alle noten van', 'areInRange' :'liggen in het standaard toonbereik.', 'searched' :'Onderzocht werd de notenbalk' } try: setStringTable( ("en", english), ("de", german), ("nl", dutch)) except: def tr(s): return german[s] from caplib.capDOM import ScoreChange import xml.dom.minidom DOC = xml.dom.minidom.Document import tempfile, codecs def change(score): # ------ vom (fiktiven) C-Instrument zum Zielinstrument (T = Target) ------ # #===========================================================================# transposeTo = toInstr.value() # Position des "nach-Instruments" in der Tabelle Instrparam = fromCinstr[transposeTo] # Instrumentenparameter aus Tabelle lesen 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 transposeTo = toInstr.value() toInstrX = fromCinstr[transposeTo] clefType = toInstrX[1] # Schlüssel setzen #================= for staffLayout in score.getElementsByTagName('staffLayout'): # Setzen des Schlüssels im Mustersystem # description = staffLayout.getAttribute('description') if description != staffList[selStaff.value()]: continue notation = staffLayout.getElementsByTagName('notation')[0] notation.setAttribute('defaultClef',['treble','alto'][clefType]) for staff in score.getElementsByTagName('staff'): # Setzen des Schlüssels in der Partitur # layout = staff.getAttribute('layout') if layout != staffList[selStaff.value()]: continue clefSign = staff.getElementsByTagName('clefSign')[0] clefSign.setAttribute('clef',['treble','alto'][clefType]) def Octave(score): global indOktaviert # ------ Eventuelles Oktavieren der Noten außerhalb des Tonbereichs des Zielinstruments ------ # indOktaviert = 0 if oktavieren: # Noten außerhalb des Tonbereichs des Zielinstruments oktavieren? if indColor: indOktaviert = 1 for display in score.getElementsByTagName('display'): color = display.getAttribute('color') heads = display.parentNode.getElementsByTagName('head') noHeads = len(heads) #messageBox('stop',str(noHeads)) if heads != []: # nur bei 'head' weiter ('display' kommt auch in ganzen und Ganztakt-Pausen vor) headLow = display.parentNode.getElementsByTagName('head')[0] # unterster oder einziger Kopf pitchLow = headLow.getAttribute('pitch') if noHeads > 1: #mehr als ein Kopf (bei 2 = Doppelgriff) headHigh = display.parentNode.getElementsByTagName('head')[noHeads-1] # der höchsteKopf pitchHigh = headHigh.getAttribute('pitch') if color == 'FF0000': # rot (oben außerhalb des Tonbereichs) headHigh.setAttribute('pitch', pitchHigh[0]+str(int(pitchHigh[1])-1)) if color == '0000FF': # blau (unten außerhalb des Tonbereichs) headHigh.setAttribute('pitch',pitchHigh[0]+str(int(pitchHigh[1])+1)) if color == 'FF0000': # rot (oben außerhalb des Tonbereichs) headLow.setAttribute('pitch', pitchLow[0]+str(int(pitchLow[1])-1)) if color == '0000FF': # blau (unten außerhalb des Tonbereichs) headLow.setAttribute('pitch',pitchLow[0]+str(int(pitchLow[1])+1)) class changeClass(ScoreChange): def changeScore(self, score): global scriptAction, doc doc = score.parentNode change(score) class OctaveClass(ScoreChange): def changeScore(self, score): global scriptAction, doc doc = score.parentNode Octave(score) # -------- Unterstützte Instrumente --------- # instrList = [tr('selInstrument'), #--00--# Default-Eintrag tr('violin'), #--01--# tr('viola') #--02--# ] # -------- toCinstr = {0:[9], # 1:[0], # 2:[0], # } # -------- V = 0 # Violinschlüssel A = 1 # Bratschenschlüssel fromCinstr = {0:[9,0], # vom fixtiven C-Instrument 1:[0,V], # 2:[0,A], # } # --------- Tonumfänge der Instrumente ---------- # pRt = {0:(00,00), # PitchRange-Table 1:(55,96), # Violine: g-c4 (d5, Flageolett) 2:(48,84), # Viola : c-c3 (e4, Flageolett) } active = 0 # zum Steuern der Schlussanzeige staffList = activeScore().voiceList() staffIndex = 0 sel = curSelection() if sel <> 0: (sy,st,vo,no) = sel[0] system = activeScore().system(sy) staff = system.staff(st) # ------ Aktuellen Eintrag im Mustersystem bestimmen ------ # i = 0 for descr in staffList: if staff.index() == system.staffIndexFromDescr(descr): staffIndex = i i += 1 # -------- Dialogbox --------- # labStaff1 = Label(tr('staffInstr')) selStaff = ComboBox(staffList, value=staffIndex, width=20) labStaff2 = Label(' '+tr('descrStaffLayOut')) fromLab = Label(tr('fromInstrument')+' -------------------------->') fromInstr = ComboBox(instrList, value=0, width=18) toLab = Label(tr('toInstrument'), width=21) toInstr = ComboBox(instrList, value=0, width=18) oktavieren = CheckBox(tr('outRangeNotesOct'), value=0 ) nullLab = Label('') Hinweis1a = Label(tr('hint1a')) Hinweis1b = Label(tr('hint1b')) Hinweis2a = Label(tr('hint2a')) Hinweis2b = Label(tr('hint2b')) dlg = Dialog(tr('header'), VBox([ HBox([labStaff1]), nullLab, HBox([selStaff, labStaff2]), nullLab, HBox([fromLab, toLab], padding = 5), nullLab, HBox([fromInstr, toInstr, oktavieren],padding = 32), nullLab, HBox([Hinweis1a]), HBox([Hinweis1b]), HBox([Hinweis2a]), HBox([Hinweis2b]), nullLab ] ) ) def dlgRun(): global active, transposeOctave, entfVorz, maxVorz, max6Vorz if dlg.run(): active = 1 # nicht ganz klar - siehe unten transposeFrom = fromInstr.value() transposeTo = toInstr.value() Instr = toCinstr[transposeFrom] Instr = Instr[0] if Instr == 9: messageBox(tr('selOfInstrument'), str(tr('selStaff'))) dlgRun() return # darf hier anschließend nicht weiterlaufen Instr = fromCinstr[transposeTo] Instr = Instr[0] if Instr == 9: messageBox(tr('selToInstrument'), str(tr('selStaff'))) dlgRun() return # darf hier anschließend nicht weiterlaufen activeScore().registerUndo("Instrumente transponieren") # an dieser Stelle??????????? dlgRun() if active == 1: # keine Schlussanzeige bei 'Abbrechen' #### nicht ganz klar !!!!!!!!!! oktavieren = oktavieren.value() if activeScore(): activeScore().registerUndo("Instrumente transponieren") tempInput = tempfile.mktemp('.capx') # für aktuelle aktive Partitur # tempOutput = tempfile.mktemp('.capx') activeScore().write(tempInput) # Einlesen der aktiven Partitur changeClass(tempInput, tempOutput) # Transposition durchführen activeScore().read(tempOutput) # Ergebnis als aktive Partitur zurück # ------ Überprüfen des Tonumfangs ---- # indColor = 0 for system in activeScore().systems(): for staff in system.staves(): if staff.index() <> system.staffIndexFromDescr(staffList[selStaff.value()]): continue # -------- Töne außerhalb des Tonumfangs werden rot dargestellt -------- # # Alle Noten werden zuerst auf schwarz gesetzt Bl = (Color.RGB(0,0,0)) # schwarz for obj in staff.noteObjs(): # alle Noten auf schwarz setzen if obj.isChord(): obj.setColor(Bl) trTo = toInstr.value() #transposeTo R = (Color.RGB(255,0,0)) # rot B = (Color.RGB(0,0,255)) # blau for obj in staff.noteObjs(): if obj.isChord(): noHeads = obj.nHeads() # Anzahl der Köpfe headLow = obj.head(0) # der unterste Kopf chrPlow = headLow.chromaticPitch() chrPhigh = headLow.chromaticPitch() #messageBox('stop',str(chrPlow)) pR = pRt[trTo] # PitchRange pLow = pR[0] pHigh = pR[1] if noHeads > 1: headHigh = obj.head(noHeads-1) chrPhigh = headHigh.chromaticPitch() #messageBox('stop',str(chrPhigh)) if (chrPlow < pLow):# or (chrP > pHigh): # !!! durch "setColor" z.B 'b' -> # !!! obj.setColor(B) indColor = 1 elif (chrPhigh > pHigh):# obj.setColor(R) indColor = 1 else: obj.setColor(Bl) # wenn farbige Noten durch Oktavierung wieder zu schwarzen werden müssen # Setzen der Vorspiel-Transposition und eventuelles Oktavieren der Noten außerhalb des Tonbereichs des Zielinstruments #===================================================================================================================== activeScore().write(tempInput) # Partitur wieder einlesen OctaveClass(tempInput, tempOutput) # Funktions-Aufruf activeScore().read(tempOutput) # Ergebnis als aktive Partitur zurück # -------- Schluss-Anzeige --------- # Instrument = instrList[toInstr.value()] staff = staffList[selStaff.value()] if indColor == 1: if indOktaviert == 0: messageBox(tr('outRange')+' >'+str(Instrument)+'< !', tr('colorNotesAreOut')+' >'+str(Instrument)+ '< .\n\n'+tr('searched')+' >'+str(staff)+'< ('+tr('descrStaffLayOut')+').') else: messageBox(tr('outRange')+' >'+str(Instrument)+'< !', tr('colorNotesWereOut')+' >'+str(Instrument)+'< '+tr('octave')+ '.\n\n'+tr('searched')+' >'+str(staff)+'< ('+tr('descrStaffLayOut')+').') else: messageBox(tr('allNotes')+' >'+str(Instrument)+'< '+tr('areInRange'), tr('searched')+' >'+str(staff)+'< ('+tr('descrStaffLayOut')+').') os.remove(tempInput) os.remove(tempOutput)