X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scripts%2Fmidi2ly.py;h=79351bbfa2c1817b8fde62871471b18afff34bce;hb=d935a5a0fac63dc0dcd8197d4d2286d235fe617c;hp=a4ed761448fdaaddbc471d259ac37f43220a1060;hpb=27d3e1188a9885e72a5afbd72482617b34907f30;p=lilypond.git diff --git a/scripts/midi2ly.py b/scripts/midi2ly.py index a4ed761448..79351bbfa2 100644 --- a/scripts/midi2ly.py +++ b/scripts/midi2ly.py @@ -4,7 +4,7 @@ # This file is part of LilyPond, the GNU music typesetter. # -# Copyright (C) 1998--2011 Han-Wen Nienhuys +# Copyright (C) 1998--2014 Han-Wen Nienhuys # Jan Nieuwenhuizen # # LilyPond is free software: you can redistribute it and/or modify @@ -78,7 +78,7 @@ def warranty (): %s %s -''' % ( _ ('Copyright (c) %s by') % '1998--2011', +''' % ( _ ('Copyright (c) %s by') % '1998--2014', '\n '.join (authors), _ ('Distributed under terms of the GNU General Public License.'), _ ('It comes with NO WARRANTY.'))) @@ -111,8 +111,6 @@ class Duration: allowed_durs = (1, 2, 4, 8, 16, 32, 64, 128) def __init__ (self, clocks): self.clocks = clocks - if clocks <= 0: - self.clocks = duration_quant_clocks (self.dur, self.num, self.den) = self.dur_num_den (clocks) def dur_num_den (self, clocks): @@ -140,8 +138,7 @@ class Duration: s = '%d*%d/%d' % (self.dur, self.num, self.den) global reference_note - if reference_note: # debugging - reference_note.duration = self + reference_note.duration = self return s @@ -403,7 +400,8 @@ class Text: s = s + ' ' elif (self.text.strip () and self.type == midi.SEQUENCE_TRACK_NAME - and not self.text == 'control track'): + and not self.text == 'control track' + and not self.track.lyrics_p_): text = self.text.replace ('(MIDI)', '').strip () if text: s = '\n \\set Staff.instrumentName = "%(text)s"\n ' % locals () @@ -509,6 +507,7 @@ class Channel: elif (e[1][1] >= midi.SEQUENCE_NUMBER and e[1][1] <= midi.CUE_POINT): text = Text (e[1][1], e[1][2]) + text.track = self music.append ((t, text)) if (text.type == midi.SEQUENCE_TRACK_NAME): self.name = text.text @@ -661,7 +660,6 @@ def dump_chord (ch): for i in notes[1:]: s = s + i.dump (dump_dur=False) s = s + '>' - s = s + notes[0].duration.dump () + ' ' reference_note = r return s @@ -829,7 +827,12 @@ def dump_track (track, n): if not n and not vv and global_options.key: s += global_options.key.dump () if average_pitch[vv+1] and voices > 1: - s += ' \\voice' + get_voice_layout (average_pitch[1:])[vv] + '\n' + vl = get_voice_layout (average_pitch[1:])[vv] + if vl: + s += ' \\voice' + vl + '\n' + else: + if not global_options.quiet: + warning (_ ('found more than 5 voices on a staff, expect bad output')) s += ' ' + dump_voice (voice, skip) s += '}\n\n' v += 1 @@ -973,7 +976,7 @@ def convert_midi (in_file, out_file): s = tag s += r''' -\version "2.13.53" +\version "2.14.0" ''' s += r''' @@ -1000,6 +1003,7 @@ def convert_midi (in_file, out_file): s += '\n\\score {\n <<\n' + control_track = False i = 0 for i, staff in enumerate (staves): track_name = get_track_name (i) @@ -1007,11 +1011,12 @@ def convert_midi (in_file, out_file): staff_name = track_name context = None if not i and not item and len (staves) > 1: - # control track - staff_name = get_track_name (1) - context = 'Staff' + control_track = track_name + continue elif (item and item.__class__ == Note): context = 'Staff' + if control_track: + s += ' \\context %(context)s=%(staff_name)s \\%(control_track)s\n' % locals () elif item and item.__class__ == Text: context = 'Lyrics' if context: @@ -1023,7 +1028,8 @@ def convert_midi (in_file, out_file): } ''' - progress (_ ("%s output to `%s'...") % ('LY', out_file)) + if not global_options.quiet: + progress (_ ("%s output to `%s'...") % ('LY', out_file)) if out_file == '-': handle = sys.stdout @@ -1046,27 +1052,30 @@ def get_option_parser (): metavar=_ ('DUR'), help=_ ('quantise note durations on DUR')) p.add_option ('-D', '--debug', - action='store_true', - help=_ ('debug printing')) + action='store_true', + help=_ ('debug printing')) p.add_option ('-e', '--explicit-durations', action='store_true', help=_ ('print explicit durations')) p.add_option('-h', '--help', - action='help', - help=_ ('show this help and exit')) + action='help', + help=_ ('show this help and exit')) p.add_option('-i', '--include-header', - help=_ ('prepend FILE to output'), - action='append', - default=[], - metavar=_ ('FILE')) + help=_ ('prepend FILE to output'), + action='append', + default=[], + metavar=_ ('FILE')) p.add_option('-k', '--key', help=_ ('set key: ALT=+sharps|-flats; MINOR=1'), - metavar=_ ('ALT[:MINOR]'), - default=None), + metavar=_ ('ALT[:MINOR]'), + default=None), p.add_option ('-o', '--output', help=_ ('write output to FILE'), metavar=_ ('FILE'), action='store') p.add_option ('-p', '--preview', help=_ ('preview of first 4 bars'), action='store_true') + p.add_option ('-q', '--quiet', + action="store_true", + help=_ ("suppress progress messages and warnings about excess voices")) p.add_option ('-s', '--start-quant',help= _ ('quantise note starts on DUR'), metavar=_ ('DUR')) p.add_option ('-S', '--skip', @@ -1079,15 +1088,13 @@ def get_option_parser (): help=_ ('allow tuplet durations DUR*NUM/DEN'), default=[]) p.add_option ('-V', '--verbose', help=_ ('be verbose'), - action='store_true' - ), + action='store_true') p.version = 'midi2ly (LilyPond) @TOPLEVEL_VERSION@' p.add_option ('--version', action='version', help=_ ('show version number and exit')) p.add_option ('-w', '--warranty', help=_ ('show warranty and copyright'), - action='store_true', - ), + action='store_true',) p.add_option ('-x', '--text-lyrics', help=_ ('treat every text as a lyric'), action='store_true')