# -*- coding: ISO-8859-1 -*- """ CapellaScript -- Radolf von Salis 2005 >>> Chromatic_Griff : Tabulaturschrift für chromatisches Knopf-Akkordeon Umwandlung von Noten in Griffnotation für chromatisches Knopf-Akkordeon. Normale Griffnoten zwischen den Linien entsprechen der äusseren (und der zweitinnersten) Knopfreihe.|| Griffnoten auf den Linien entsprechen der zweitäussersten (und innersten) Knopfreihe.|| Kreuznoten (immer zwischen den Linien) entsprechen der mittleren Knopfreihe. <<< """ import xml.dom, tempfile from caplib.capDOM import ScoreChange from xml.dom.minidom import NodeList Tabelle = ['C4+','C4','D4','E4+','E4','F4','G4+','G4','A4','B4+','B4', 'C5','D5+','D5','E5','F5+','F5','G5','A5+','A5','B5', 'C6+','C6','D6','E6+','E6','F6','G6+','G6','A6','B6+','B6', 'C7','D7+','D7','E7','F7+','F7','G7','A7+','A7','B7', 'C8+','C8','D8','E8+','E8','F8','G8+','G8','A8','B8+','B8'] def Text(): return dict( type = 'text', x = -3, y = -6, content = 'Griffnoten') def writeGriff(score): k = 0 for obj in score.noteObjs(): if k > 0: return if obj.isChord(): obj.addDrawObj(Text()) k += 1 def getElementObjects(objList): newList = NodeList() for n in range(objList.length): if objList[n].nodeType == objList[n].ELEMENT_NODE: newList.append(objList[n]) return newList def rewrite(score): k=0 systems = score.getElementsByTagName('system') for sy in range(systems.length): staves = systems[sy].getElementsByTagName('staff') for st in range(staves.length): for keySign in staves[st].getElementsByTagName('keySign'): keySign.parentNode.removeChild(keySign) #Tonart entfernen voices = staves[st].getElementsByTagName('voice') for vo in range(voices.length): noteObjects = getElementObjects(voices[vo].getElementsByTagName('noteObjects')[0].childNodes) for ob in range(noteObjects.length): nv = noteObjects[ob].nodeName if nv == 'chord': heads = getElementObjects(noteObjects[ob].getElementsByTagName('heads')[0].childNodes) for hd in range(heads.length): griff=liste[k] heads[hd].setAttribute('pitch',griff[:2]) #Griffbild zeichnen alter = heads[hd].getElementsByTagName('alter') if alter: alter[0].setAttribute('step','0') #Vorzeichen entfernen if len(griff)>2: heads[hd].setAttribute('shape','crossCircle') #Kreuztöne k+=1 return class ScoreChange(ScoreChange): def changeScore(self,score): rewrite(score) #-------------------------------------------------------------------------------------------------------------- # Main #-------------------------------------------------------------------------------------------------------------- #vorerst alle Töne finden, umwandeln und in eine Liste eintragen s = activeScore() s.registerUndo("chromatic_Griff") writeGriff(s) liste = [] n=s.nSystems() for k in range(0,n,1): for a in s.system(k).noteObjs(): if a.isChord(): t=a.time() tonh = s.system(k).pitches(t,True,False) j=0 for b in a.heads(): ton=tonh[j]; listeneintrag = [Tabelle[(ton-50)]] liste += listeneintrag j += 1 #anschliessend neues File erzeugen tempInput = tempfile.mktemp('.capx') tempOutput = tempfile.mktemp('.capx') s.write(tempInput) ScoreChange(tempInput,tempOutput) s.read(tempOutput) os.remove(tempInput) os.remove(tempOutput)