X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=python%2Fmusicexp.py;h=df54f70106c113f3e30681093e043511d3e2e59f;hb=96e14d746b102f223acf6b6f4cdb8b0f0a11cd24;hp=0346e91f4c96df400292d751f6a3641d96af63f4;hpb=5b71a12f23e99039ef9c4e3fd571d8b0d0ae655c;p=lilypond.git diff --git a/python/musicexp.py b/python/musicexp.py index 0346e91f4c..df54f70106 100644 --- a/python/musicexp.py +++ b/python/musicexp.py @@ -719,7 +719,15 @@ class ChordEvent (NestedMusic): for e in self.elements: l = max(l, e.get_length()) return l - + + def get_duration (self): + note_events = [e for e in self.elements if + isinstance (e, NoteEvent) or isinstance (e, RestEvent)] + if note_events: + return note_events[0].duration + else: + return None + def print_ly (self, printer): note_events = [e for e in self.elements if isinstance (e, NoteEvent)] @@ -757,7 +765,9 @@ class ChordEvent (NestedMusic): basepitch = previous_pitch printer ('<%s>' % string.join (pitches)) previous_pitch = basepitch - note_events[0].duration.print_ly (printer) + duration = self.get_duration () + if duration: + duration.print_ly (printer) else: pass @@ -853,9 +863,9 @@ class BeamEvent (SpanEvent): class PedalEvent (SpanEvent): def ly_expression (self): - return {-1: '\\sustainDown', - 0:'\\sustainUp\\sustainDown', - 1:'\\sustainUp'}.get (self.span_direction, '') + return {-1: '\\sustainOn', + 0:'\\sustainOff\\sustainOn', + 1:'\\sustainOff'}.get (self.span_direction, '') class TextSpannerEvent (SpanEvent): def ly_expression (self): @@ -891,10 +901,10 @@ class OctaveShiftEvent (SpanEvent): dir = self.ly_octave_shift_indicator () value = '' if dir: - value = '#(set-octavation %s)' % dir + value = '\ottava #%s' % dir return { -1: value, - 1: '#(set-octavation 0)'}.get (self.span_direction, '') + 1: '\ottava #0'}.get (self.span_direction, '') class TrillSpanEvent (SpanEvent): def ly_expression (self): @@ -927,12 +937,12 @@ class ArpeggioEvent(Event): if self.non_arpeggiate: printer.dump ("\\arpeggioBracket") else: - dir = { -1: "\\arpeggioDown", 1: "\\arpeggioUp" }.get (self.direction, '') + dir = { -1: "\\arpeggioArrowDown", 1: "\\arpeggioArrowUp" }.get (self.direction, '') if dir: printer.dump (dir) def print_after_note (self, printer): if self.non_arpeggiate or self.direction: - printer.dump ("\\arpeggioNeutral") + printer.dump ("\\arpeggioNormal") def ly_expression (self): return ('\\arpeggio') @@ -1089,6 +1099,60 @@ class FretEvent (MarkupEvent): else: return '' +class ChordPitch: + def __init__ (self): + self.alteration = 0 + self.step = 0 + def __repr__(self): + return self.ly_expression() + def ly_expression (self): + return pitch_generating_function (self) + +class ChordModification: + def __init__ (self): + self.alteration = 0 + self.step = 0 + self.type = 0 + def ly_expression (self): + if self.type: + val = {1: ".", -1: "^" }.get (self.type, "") + val += "%s" % self.step + val += {1: "+", -1: "-"}.get (self.alteration, "") + return val + else: + return '' + +class ChordNameEvent (Event): + def __init__ (self): + Event.__init__ (self) + self.root = None + self.kind = None + self.duration = None + self.modifications = [] + self.bass = None + def add_modification (self, mod): + self.modifications.append (mod) + def ly_expression (self): + if not self.root: + return '' + value = self.root.ly_expression () + if self.duration: + value += self.duration.ly_expression () + if self.kind: + value += ":" + value += self.kind + # First print all additions/changes, and only afterwards all subtractions + for m in self.modifications: + if m.type == 1: + value += m.ly_expression () + for m in self.modifications: + if m.type == -1: + value += m.ly_expression () + if self.bass: + value += "/+%s" % self.bass.ly_expression () + return value + + class TremoloEvent (ArticulationEvent): def __init__ (self): Event.__init__ (self) @@ -1307,9 +1371,7 @@ class TempoMark (Music): return res if self.beats: if self.parentheses: - dm = self.duration_to_markup (self.baseduration) - contents = "\"(\" %s = %s \")\"" % (dm, self.beats) - res += self.tempo_markup_template() % contents + res += "\\tempo \"\" %s=%s" % (self.baseduration.ly_expression(), self.beats) else: res += "\\tempo %s=%s" % (self.baseduration.ly_expression(), self.beats) elif self.newduration: @@ -1487,6 +1549,12 @@ class Staff (StaffGroup): sub_staff_type = self.stafftype for [staff_id, voices] in self.part_information: + # Chord names need to come before the staff itself! + for [v, lyrics, figuredbass, chordnames] in voices: + if chordnames: + printer ('\context ChordNames = "%s" \\%s' % (chordnames, chordnames)) + + # now comes the real staff definition: if staff_id: printer ('\\context %s = "%s" << ' % (sub_staff_type, staff_id)) else: @@ -1494,7 +1562,7 @@ class Staff (StaffGroup): printer.newline () n = 0 nr_voices = len (voices) - for [v, lyrics, figuredbass] in voices: + for [v, lyrics, figuredbass, chordnames] in voices: n += 1 voice_count_text = '' if nr_voices > 1: @@ -1549,6 +1617,34 @@ class DrumStaff (Staff): class RhythmicStaff (Staff): def __init__ (self, command = "RhythmicStaff"): Staff.__init__ (self, command) + +class Score: + def __init__ (self): + self.contents = None + self.create_midi = False + + def set_contents (self, contents): + self.contents = contents + + def set_part_information (self, part_id, staves_info): + if self.contents: + self.contents.set_part_information (part_id, staves_info) + + def print_ly (self, printer): + printer.dump ("\\score {"); + printer.newline () + if self.contents: + self.contents.print_ly (printer); + printer.dump ("\\layout {}"); + printer.newline () + if not self.create_midi: + printer.dump ("% To create MIDI output, uncomment the following line:"); + printer.newline (); + printer.dump ("% "); + printer.dump ("\\midi {}"); + printer.newline () + printer.dump ("}"); + printer.newline () def test_pitch ():