def happyBirthday(): hb = cp("tinynotation: 3/4 d8. d16 e4 d g f#2 d8. d16 e4 d a g2 d8. d16 d'4 b g8. g16 f#4 e c'8. c'16 b4 g a g2") hb.insert(0, key.KeySignature(1)) hb.insert(0, tempo.TempoText("Brightly")) hb.insert(0, tempo.MetronomeMark(number = 120, referent = note.Note(type='quarter'))) hb.makeNotation(inPlace=True, cautionaryNotImmediateRepeat=False) return hb
def happyBirthday(): hb = tinyNotation.TinyNotationStream\ ("d8. d16 e4 d g f#2 d8. d16 e4 d a g2 " "d8. d16 d'4 b g8. g16 f#4 e c'8. c'16 b4 g a g2", "3/4") hb.insert(0, key.KeySignature(1)) hb.insert(0, tempo.TempoText("Brightly")) hb.insert(0, tempo.MetronomeMark(number = 120, referent = note.QuarterNote())) hb.makeNotation(inPlace=True, cautionaryNotImmediateRepeat=False) return hb
def musedataPartToStreamPart(museDataPart, inputM21=None): '''Translate a musedata part to a :class:`~music21.stream.Part`. ''' from music21 import stream from music21 import note from music21 import tempo if inputM21 == None: s = stream.Score() else: s = inputM21 p = stream.Part() p.id = museDataPart.getPartName() # create and store objects mdmObjs = museDataPart.getMeasures() #environLocal.printDebug(['first measure parent', mdmObjs[0].parent]) barCount = 0 # get each measure # store last Note/Chord/Rest for tie comparisons; span measures eLast = None for mIndex, mdm in enumerate(mdmObjs): #environLocal.printDebug(['processing:', mdm.src]) if not mdm.hasNotes(): continue if mdm.hasVoices(): hasVoices = True vActive = stream.Voice() else: hasVoices = False vActive = None #m = stream.Measure() # get a measure object with a left configured bar line if mIndex <= len(mdmObjs) - 2: mdmNext = mdmObjs[mIndex + 1] else: mdmNext = None m = mdm.getMeasureObject() # conditions for a final measure definition defining the last bar if mdmNext != None and not mdmNext.hasNotes(): #environLocal.printDebug(['got mdmNext not none and not has notes']) # get bar from next measure definition m.rightBarline = mdmNext.getBarObject() if barCount == 0: # only for when no bars are defined # the parent of the measure is the part c = mdm.parent.getClefObject() if c != None: m.clef = mdm.parent.getClefObject() m.timeSignature = mdm.parent.getTimeSignatureObject() m.keySignature = mdm.parent.getKeySignature() # look for a tempo indication directive = mdm.parent.getDirective() if directive is not None: tt = tempo.TempoText(directive) # if this appears to be a tempo indication, than get metro if tt.isCommonTempoText(): mm = tt.getMetronomeMark() m.insert(0, mm) # get all records; may be notes or note components mdrObjs = mdm.getRecords() # store pairs of pitches and durations for chording after a # new note has been found pendingRecords = [] # get notes in each record for i in range(len(mdrObjs)): mdr = mdrObjs[i] #environLocal.printDebug(['processing:', mdr.src]) if mdr.isBack(): # the current use of back assumes tt back assumes tt we always # return to the start of the measure; this may not be the case if pendingRecords != []: eLast = _processPending(hasVoices, pendingRecords, eLast, m, vActive) pendingRecords = [] # every time we encounter a back, we need to store # our existing voice and create a new one m.insert(0, vActive) vActive = stream.Voice() if mdr.isRest(): #environLocal.printDebug(['got mdr rest, parent:', mdr.parent]) # check for pending records first if pendingRecords != []: eLast = _processPending(hasVoices, pendingRecords, eLast, m, vActive) pendingRecords = [] # create rest after clearing pending records r = note.Rest() r.quarterLength = mdr.getQuarterLength() if hasVoices: vActive._appendCore(r) else: m._appendCore(r) eLast = r continue # a note is note as chord, but may have chord tones # attached to it that follow elif mdr.isChord(): # simply append if a chord; do not clear or change pending pendingRecords.append(mdr) elif mdr.isNote(): # either this is a note alone, or this is the first # note found that is not a chord; if first not a chord # need to append immediately if pendingRecords != []: # this could be a Chord or Note eLast = _processPending(hasVoices, pendingRecords, eLast, m, vActive) pendingRecords = [] # need to append this record for the current note pendingRecords.append(mdr) # check for any remaining single notes (if last) or chords if pendingRecords != []: eLast = _processPending(hasVoices, pendingRecords, eLast, m, vActive) # may be bending elements in a voice to append to a measure if vActive is not None and vActive: vActive.elementsChanged() m._insertCore(0, vActive) m.elementsChanged() if barCount == 0 and m.timeSignature != None: # easy case # can only do this b/c ts is defined if m.barDurationProportion() < 1.0: m.padAsAnacrusis() #environLocal.printDebug(['incompletely filled Measure found on musedata import; ', # 'interpreting as a anacrusis:', 'padingLeft:', m.paddingLeft]) p._appendCore(m) barCount += 1 p.elementsChanged() # for now, make all imports a c-score on import; tInterval = museDataPart.getTranspositionIntervalObject() #environLocal.printDebug(['got transposition interval', p.id, tInterval]) if tInterval is not None: p.flat.transpose(tInterval, classFilterList=['Note', 'Chord', 'KeySignature'], inPlace=True) # need to call make accidentals to correct new issues p.makeAccidentals() if museDataPart.stage == 1: # cannot yet get stage 1 clef data p.getElementsByClass('Measure')[0].clef = p.flat.bestClef() p.makeBeams(inPlace=True) # will call overridden method on Part p.makeAccidentals() # assume that beams and clefs are defined in all stage 2 s.insert(0, p) return s