- def print_ly (self, printer):
- printer ('{')
- if self.comment:
- self.print_comment (printer)
- elif isinstance (printer, Output_printer):
- printer.newline()
- else:
- printer ('\n')
-
- for e in self.elements:
- e.print_ly (printer)
-
- printer ('}')
-
- def lisp_sub_expression (self, pred):
- name = self.name()
-
-
- props = self.get_subset_properties (pred)
-
- return "(make-music '%s %s)" % (name, props)
-
- def set_start (self, start):
- for e in self.elements:
- e.set_start (start)
- start += e.get_length()
-
-class EventChord(NestedMusic):
- def get_length (self):
- l = Rational (0)
- for e in self.elements:
- l = max(l, e.get_length())
- return l
-
- def print_ly (self, printer):
- note_events = [e for e in self.elements if
- isinstance (e, NoteEvent)]
-
- rest_events = [e for e in self.elements if
- isinstance (e, RhythmicEvent)
- and not isinstance (e, NoteEvent)]
-
- other_events = [e for e in self.elements if
- not isinstance (e, RhythmicEvent)]
-
- if rest_events:
- rest_events[0].print_ly (printer)
- elif len (note_events) == 1:
- note_events[0].print_ly (printer)
- elif note_events:
- pitches = [x.pitch.ly_expression () for x in note_events]
- printer ('<%s>' % string.join (pitches))
- note_events[0].duration.print_ly (printer)
- else:
- pass
-
- # print 'huh', rest_events, note_events, other_events
- for e in other_events:
- e.print_ly (printer)
-
- self.print_comment (printer)
-
+ def get_last_event_chord (self):
+ value = None
+ at = len( self.elements ) - 1
+ while (at >= 0 and
+ not isinstance (self.elements[at], EventChord) and
+ not isinstance (self.elements[at], BarLine)):
+ at -= 1
+
+ if (at >= 0 and isinstance (self.elements[at], EventChord)):
+ value = self.elements[at]
+ return value
+
+ def print_ly (self, printer, newline = True):
+ printer ('{')
+ if self.comment:
+ self.print_comment (printer)
+
+ if newline:
+ printer.newline()
+ for e in self.elements:
+ e.print_ly (printer)
+
+ printer ('}')
+ if newline:
+ printer.newline()
+
+ def lisp_sub_expression (self, pred):
+ name = self.name()
+
+
+ props = self.get_subset_properties (pred)
+
+ return "(make-music '%s %s)" % (name, props)
+
+ def set_start (self, start):
+ for e in self.elements:
+ e.set_start (start)
+ start += e.get_length()
+
+class RepeatedMusic:
+ def __init__ (self):
+ self.repeat_type = "volta"
+ self.repeat_count = 2
+ self.endings = []
+ self.music = None
+ def set_music (self, music):
+ if isinstance (music, Music):
+ self.music = music
+ elif isinstance (music, list):
+ self.music = SequentialMusic ()
+ self.music.elements = music
+ else:
+ sys.stderr.write ("WARNING: Unable to set the music %s for the repeat %s" % (music, self))
+ def add_ending (self, music):
+ self.endings.append (music)
+ def print_ly (self, printer):
+ printer.dump ('\\repeat %s %s' % (self.repeat_type, self.repeat_count))
+ if self.music:
+ self.music.print_ly (printer)
+ else:
+ sys.stderr.write ("WARNING: Encountered repeat without body\n")
+ printer.dump ('{}')
+ if self.endings:
+ printer.dump ('\\alternative {')
+ for e in self.endings:
+ e.print_ly (printer)
+ printer.dump ('}')
+
+
+class Lyrics:
+ def __init__ (self):
+ self.lyrics_syllables = []
+
+ def print_ly (self, printer):
+ printer.dump ("\lyricmode {")
+ for l in self.lyrics_syllables:
+ printer.dump ( "%s " % l )
+ printer.dump ("}")
+
+ def ly_expression (self):
+ lstr = "\lyricmode {\n "
+ for l in self.lyrics_syllables:
+ lstr += l + " "
+ lstr += "\n}"
+ return lstr
+
+
+class Header:
+ def __init__ (self):
+ self.header_fields = {}
+ def set_field (self, field, value):
+ self.header_fields[field] = value
+
+ def print_ly (self, printer):
+ printer.dump ("\header {")
+ printer.newline ()
+ for (k,v) in self.header_fields.items ():
+ if v:
+ printer.dump ('%s = %s' % (k,v))
+ printer.newline ()
+ printer.dump ("}")
+ printer.newline ()
+ printer.newline ()
+
+
+class Paper:
+ def __init__ (self):
+ self.global_staff_size = -1
+ # page size
+ self.page_width = -1
+ self.page_height = -1
+ # page margins
+ self.top_margin = -1
+ self.bottom_margin = -1
+ self.left_margin = -1
+ self.right_margin = -1
+ self.system_left_margin = -1
+ self.system_right_margin = -1
+ self.system_distance = -1
+ self.top_system_distance = -1
+
+ def print_length_field (self, printer, field, value):
+ if value >= 0:
+ printer.dump ("%s = %s\\cm" % (field, value))
+ printer.newline ()
+ def print_ly (self, printer):
+ if self.global_staff_size > 0:
+ printer.dump ('#(set-global-staff-size %s)' % self.global_staff_size)
+ printer.newline ()
+ printer.dump ('\\paper {')
+ printer.newline ()
+ self.print_length_field (printer, "paper-width", self.page_width)
+ self.print_length_field (printer, "paper-height", self.page_height)
+ self.print_length_field (printer, "top-margin", self.top_margin)
+ self.print_length_field (printer, "botton-margin", self.bottom_margin)
+ self.print_length_field (printer, "left-margin", self.left_margin)
+ # TODO: maybe set line-width instead of right-margin?
+ self.print_length_field (printer, "right-margin", self.right_margin)
+ # TODO: What's the corresponding setting for system_left_margin and
+ # system_right_margin in Lilypond?
+ self.print_length_field (printer, "between-system-space", self.system_distance)
+ self.print_length_field (printer, "page-top-space", self.top_system_distance)
+
+ printer.dump ('}')
+ printer.newline ()
+
+
+class EventChord (NestedMusic):
+ def __init__ (self):
+ NestedMusic.__init__ (self)
+ self.grace_elements = None
+ self.grace_type = None
+ def append_grace (self, element):
+ if element:
+ if not self.grace_elements:
+ self.grace_elements = SequentialMusic ()
+ self.grace_elements.append (element)
+
+ def get_length (self):
+ l = Rational (0)
+ for e in self.elements:
+ l = max(l, e.get_length())
+ return l
+
+ def print_ly (self, printer):
+ note_events = [e for e in self.elements if
+ isinstance (e, NoteEvent)]
+
+ rest_events = [e for e in self.elements if
+ isinstance (e, RhythmicEvent)
+ and not isinstance (e, NoteEvent)]
+
+ other_events = [e for e in self.elements if
+ not isinstance (e, RhythmicEvent)]
+
+ if self.grace_elements and self.elements:
+ if self.grace_type:
+ printer ('\\%s' % self.grace_type)
+ else:
+ printer ('\\grace')
+ # don't print newlines after the { and } braces
+ self.grace_elements.print_ly (printer, False)
+
+ if rest_events:
+ rest_events[0].print_ly (printer)
+ elif len (note_events) == 1:
+ note_events[0].print_ly (printer)
+ elif note_events:
+ global previous_pitch
+ pitches = []
+ basepitch = None
+ for x in note_events:
+ pitches.append (x.pitch.ly_expression ())
+ if not basepitch:
+ basepitch = previous_pitch
+ printer ('<%s>' % string.join (pitches))
+ previous_pitch = basepitch
+ note_events[0].duration.print_ly (printer)
+ else:
+ pass
+
+ for e in other_events:
+ e.print_ly (printer)
+
+ self.print_comment (printer)
+
+class Partial (Music):
+ def __init__ (self):
+ Music.__init__ (self)
+ self.partial = None
+ def print_ly (self, printer):
+ if self.partial:
+ printer.dump ("\\partial %s" % self.partial.ly_expression ())
+
+class BarLine (Music):
+ def __init__ (self):
+ Music.__init__ (self)
+ self.bar_number = 0
+ self.type = None
+
+ def print_ly (self, printer):
+ bar_symbol = { 'regular': "|", 'dotted': ":", 'dashed': ":",
+ 'heavy': "|", 'light-light': "||", 'light-heavy': "|.",
+ 'heavy-light': ".|", 'heavy-heavy': ".|.", 'tick': "'",
+ 'short': "'", 'none': "" }.get (self.type, None)
+ if bar_symbol <> None:
+ printer.dump ('\\bar "%s"' % bar_symbol)
+ else:
+ printer.dump ("|")
+
+ if self.bar_number > 0 and (self.bar_number % 10) == 0:
+ printer.dump ("\\barNumberCheck #%d " % self.bar_number)
+ else:
+ printer.print_verbatim (' %% %d' % self.bar_number)
+ printer.newline ()
+
+ def ly_expression (self):
+ return " | "
+