def parseTokens(mh, dst, p, useMeasures): ''' parses all the tokens in a measure or part. ''' # in case need to transpose due to clef indication from music21 import abcFormat postTransposition = 0 clefSet = False for t in mh.tokens: if isinstance(t, abcFormat.ABCMetadata): if t.isMeter(): ts = t.getTimeSignatureObject() if ts is not None: # can be None # should append at the right position if useMeasures: # assume at start of measures dst.timeSignature = ts else: dst.coreAppend(ts) elif t.isKey(): ks = t.getKeySignatureObject() if useMeasures: # assume at start of measures dst.keySignature = ks else: dst.coreAppend(ks) # check for clef information sometimes stored in key clefObj, transposition = t.getClefObject() if clefObj is not None: clefSet = False #environLocal.printDebug(['found clef in key token:', t, # clefObj, transposition]) if useMeasures: # assume at start of measures dst.clef = clefObj else: dst.coreAppend(clefObj) postTransposition = transposition elif t.isTempo(): mmObj = t.getMetronomeMarkObject() dst.coreAppend(mmObj) # as ABCChord is subclass of ABCNote, handle first elif isinstance(t, abcFormat.ABCChord): # may have more than notes? pitchNameList = [] accStatusList = [] # accidental display status list for tSub in t.subTokens: # notes are contained as subtokens are already parsed if isinstance(tSub, abcFormat.ABCNote): pitchNameList.append(tSub.pitchName) accStatusList.append(tSub.accidentalDisplayStatus) c = chord.Chord(pitchNameList) c.duration.quarterLength = t.quarterLength if t.activeTuplet: thisTuplet = copy.deepcopy(t.activeTuplet) if thisTuplet.durationNormal is None: thisTuplet.setDurationType(c.duration.type, c.duration.dots) c.duration.appendTuplet(thisTuplet) # adjust accidental display for each contained pitch for pIndex in range(len(c.pitches)): if c.pitches[pIndex].accidental is None: continue c.pitches[pIndex].accidental.displayStatus = accStatusList[ pIndex] dst.coreAppend(c) #ql += t.quarterLength elif isinstance(t, abcFormat.ABCNote): # add the attached chord symbol if t.chordSymbols: cs_name = t.chordSymbols[0] cs_name = re.sub('["]', '', cs_name).lstrip().rstrip() cs_name = re.sub('[()]', '', cs_name) cs_name = common.cleanedFlatNotation(cs_name) try: if cs_name in ('NC', 'N.C.', 'No Chord', 'None'): cs = harmony.NoChord(cs_name) else: cs = harmony.ChordSymbol(cs_name) dst.coreAppend(cs, setActiveSite=False) dst.coreElementsChanged() except ValueError: pass # Exclude malformed chord if t.isRest: n = note.Rest() else: n = note.Note(t.pitchName) if n.pitch.accidental is not None: n.pitch.accidental.displayStatus = t.accidentalDisplayStatus n.duration.quarterLength = t.quarterLength if t.activeTuplet: thisTuplet = copy.deepcopy(t.activeTuplet) if thisTuplet.durationNormal is None: thisTuplet.setDurationType(n.duration.type, n.duration.dots) n.duration.appendTuplet(thisTuplet) # start or end a tie at note n if t.tie is not None: if t.tie in ('start', 'continue'): n.tie = tie.Tie(t.tie) n.tie.style = 'normal' elif t.tie == 'stop': n.tie = tie.Tie(t.tie) ### Was: Extremely Slow for large Opus files... why? ### Answer: some pieces didn't close all their spanners, so ### everything was in a Slur/Diminuendo, etc. for span in t.applicableSpanners: span.addSpannedElements(n) if t.inGrace: n = n.getGrace() n.articulations = [] while any(t.artic): tmp = t.artic.pop() if tmp == "staccato": n.articulations.append(articulations.Staccato()) elif tmp == "upbow": n.articulations.append(articulations.UpBow()) elif tmp == "downbow": n.articulations.append(articulations.DownBow()) elif tmp == "accent": n.articulations.append(articulations.Accent()) elif tmp == "strongaccent": n.articulations.append(articulations.StrongAccent()) elif tmp == "tenuto": n.articulations.append(articulations.Tenuto()) dst.coreAppend(n, setActiveSite=False) elif isinstance(t, abcFormat.ABCSlurStart): p.coreAppend(t.slurObj) elif isinstance(t, abcFormat.ABCCrescStart): p.coreAppend(t.crescObj) elif isinstance(t, abcFormat.ABCDimStart): p.coreAppend(t.dimObj) dst.coreElementsChanged() return postTransposition, clefSet
def parseTokens(mh, dst, p, useMeasures): ''' parses all the tokens in a measure or part. ''' # in case need to transpose due to clef indication from music21 import abcFormat postTransposition = 0 clefSet = False for t in mh.tokens: if isinstance(t, abcFormat.ABCMetadata): if t.isMeter(): ts = t.getTimeSignatureObject() if ts is not None: # can be None # should append at the right position if useMeasures: # assume at start of measures dst.timeSignature = ts else: dst.coreAppend(ts) elif t.isKey(): ks = t.getKeySignatureObject() if useMeasures: # assume at start of measures dst.keySignature = ks else: dst.coreAppend(ks) # check for clef information sometimes stored in key clefObj, transposition = t.getClefObject() if clefObj is not None: clefSet = False # environLocal.printDebug(['found clef in key token:', t, # clefObj, transposition]) if useMeasures: # assume at start of measures dst.clef = clefObj else: dst.coreAppend(clefObj) postTransposition = transposition elif t.isTempo(): mmObj = t.getMetronomeMarkObject() dst.coreAppend(mmObj) # as ABCChord is subclass of ABCNote, handle first elif isinstance(t, abcFormat.ABCChord): # may have more than notes? pitchNameList = [] accStatusList = [] # accidental display status list for tSub in t.subTokens: # notes are contained as subtokens are already parsed if isinstance(tSub, abcFormat.ABCNote): pitchNameList.append(tSub.pitchName) accStatusList.append(tSub.accidentalDisplayStatus) c = chord.Chord(pitchNameList) c.duration.quarterLength = t.quarterLength if t.activeTuplet: thisTuplet = copy.deepcopy(t.activeTuplet) if thisTuplet.durationNormal is None: thisTuplet.setDurationType(c.duration.type, c.duration.dots) c.duration.appendTuplet(thisTuplet) # adjust accidental display for each contained pitch for pIndex in range(len(c.pitches)): if c.pitches[pIndex].accidental is None: continue c.pitches[pIndex].accidental.displayStatus = accStatusList[pIndex] dst.coreAppend(c) #ql += t.quarterLength elif isinstance(t, abcFormat.ABCNote): # add the attached chord symbol if t.chordSymbols: cs_name = t.chordSymbols[0] cs_name = re.sub('["]','', cs_name).lstrip().rstrip() cs_name = re.sub('[()]', '', cs_name) cs_name = common.cleanedFlatNotation(cs_name) try: if cs_name in ('NC', 'N.C.', 'No Chord', 'None'): cs = harmony.NoChord(cs_name) else: cs = harmony.ChordSymbol(cs_name) dst.coreAppend(cs, setActiveSite=False) dst.coreElementsChanged() except ValueError: pass # Exclude malformed chord if t.isRest: n = note.Rest() else: n = note.Note(t.pitchName) if n.pitch.accidental is not None: n.pitch.accidental.displayStatus = t.accidentalDisplayStatus n.duration.quarterLength = t.quarterLength if t.activeTuplet: thisTuplet = copy.deepcopy(t.activeTuplet) if thisTuplet.durationNormal is None: thisTuplet.setDurationType(n.duration.type, n.duration.dots) n.duration.appendTuplet(thisTuplet) # start or end a tie at note n if t.tie is not None: if t.tie in ('start', 'continue'): n.tie = tie.Tie(t.tie) n.tie.style = 'normal' elif t.tie == 'stop': n.tie = tie.Tie(t.tie) ### Was: Extremely Slow for large Opus files... why? ### Answer: some pieces didn't close all their spanners, so ### everything was in a Slur/Diminuendo, etc. for span in t.applicableSpanners: span.addSpannedElements(n) if t.inGrace: n = n.getGrace() n.articulations = [] while any(t.artic): tmp = t.artic.pop() if tmp == "staccato": n.articulations.append(articulations.Staccato()) elif tmp == "upbow": n.articulations.append(articulations.UpBow()) elif tmp == "downbow": n.articulations.append(articulations.DownBow()) elif tmp == "accent": n.articulations.append(articulations.Accent()) elif tmp == "strongaccent": n.articulations.append(articulations.StrongAccent()) elif tmp == "tenuto": n.articulations.append(articulations.Tenuto()) dst.coreAppend(n, setActiveSite=False) elif isinstance(t, abcFormat.ABCSlurStart): p.coreAppend(t.slurObj) elif isinstance(t, abcFormat.ABCCrescStart): p.coreAppend(t.crescObj) elif isinstance(t, abcFormat.ABCDimStart): p.coreAppend(t.dimObj) dst.coreElementsChanged() return postTransposition, clefSet