From 4c65c625b3ea8ffdce6928831a8a4aa04c6f064f Mon Sep 17 00:00:00 2001 From: hanwen Date: Wed, 23 Nov 2005 13:10:43 +0000 Subject: [PATCH] (process_music): bugfix: stop staff if first_start_ is true. --- ChangeLog | 13 ++++++ GNUmakefile.in | 2 +- THANKS | 1 + lily/mark-engraver.cc | 1 + lily/staff-symbol-engraver.cc | 2 + python/midi.c | 9 ++++ scripts/midi2ly.py | 86 ++++++++++++++++++++++++----------- 7 files changed, 87 insertions(+), 27 deletions(-) diff --git a/ChangeLog b/ChangeLog index c7ff49008c..8bf5781f50 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2005-11-23 Han-Wen Nienhuys + + * lily/staff-symbol-engraver.cc (process_music): bugfix: stop + staff if first_start_ is true. + +2005-11-23 Han-Wen Nienhuys + + * scripts/midi2ly.py (split_track): add __repr__ members. + (track_first_item): only return Item if not None. This fixes a + problem when dumping a track that starts with an empty channel. + + * python/midi.c: doc module. + 2005-11-22 Mats Bengtsson * Documentation/user/global.itely (Creating MIDI files): Fix diff --git a/GNUmakefile.in b/GNUmakefile.in index cc81039dfd..8cd8fb7d5d 100644 --- a/GNUmakefile.in +++ b/GNUmakefile.in @@ -126,7 +126,7 @@ $(tree-share-prefix)/lilypond-force link-tree: GNUmakefile ln -sf ../../scripts/$(outconfbase)/lilypond-book . && \ ln -sf ../../scripts/$(outconfbase)/*.ly . cd $(tree-lib-prefix) && \ - ln -s ../../../../../python/$(outconfbase) python + ln -s ../../../../python/$(outconfbase) python cd $(tree-share-prefix) && \ ln -s $(top-src-dir)/ly ly && \ ln -s ../../../../mf mf && \ diff --git a/THANKS b/THANKS index 9d76cdc643..81cbbfb5d2 100644 --- a/THANKS +++ b/THANKS @@ -54,6 +54,7 @@ Matevž Jekovec Michael Welsh Duggan Milan Zamazal Ralph Little +Sean Reed Scott Russell Sven Axelsson Thomas Bushnell BSG diff --git a/lily/mark-engraver.cc b/lily/mark-engraver.cc index 897475e6af..0215ce4b8e 100644 --- a/lily/mark-engraver.cc +++ b/lily/mark-engraver.cc @@ -135,6 +135,7 @@ Mark_engraver::process_music () #include "translator.icc" ADD_ACKNOWLEDGER (Mark_engraver, bar_line); + ADD_TRANSLATOR (Mark_engraver, /* doc */ "This engraver will create RehearsalMark objects. " "It puts them on top of all staves (which is taken from " diff --git a/lily/staff-symbol-engraver.cc b/lily/staff-symbol-engraver.cc index 971c49bdfa..807f6696e1 100644 --- a/lily/staff-symbol-engraver.cc +++ b/lily/staff-symbol-engraver.cc @@ -43,6 +43,8 @@ Staff_symbol_engraver::process_music () { finished_span_ = span_; span_ = 0; + if (first_start_) + first_start_ = false; } if (span_events_[START] diff --git a/python/midi.c b/python/midi.c index 76b75ee9e1..7d65f2cc66 100644 --- a/python/midi.c +++ b/python/midi.c @@ -16,6 +16,15 @@ s = open ("s.midi").read () midi.parse_track (s) midi.parse (s) + +returns a MIDI file as the tuple + + (format, division, TRACKLIST) + +each track is an EVENTLIST, where EVENT is + + (time, (type, ARG1, [ARG2])) + */ #include diff --git a/scripts/midi2ly.py b/scripts/midi2ly.py index 7a84bf7bc6..cd5bf729eb 100644 --- a/scripts/midi2ly.py +++ b/scripts/midi2ly.py @@ -1,6 +1,6 @@ #!@PYTHON@ # -# midi2ly.py -- LilyPond midi import script +# msdi2ly.py -- LilyPond midi import script # # source file of the GNU LilyPond music typesetter # @@ -26,13 +26,13 @@ import os import string import sys - + ################################################################ # Users of python modules should include this snippet. # libdir = '@local_lilypond_libdir@' if not os.path.isdir (libdir): - libdir = '@lilypond_libdir@' + libdir = '@lilypond_libdir@' # ugh if os.environ.has_key ('LILYPONDPREFIX'): @@ -41,6 +41,12 @@ if os.environ.has_key ('LILYPONDPREFIX'): datadir= datadir[:-1] libdir = datadir.replace ('/share/', '/lib/') +if os.path.exists (os.path.join (datadir, 'lib/lilypond/@TOPLEVEL_VERSION@/')): + libdir = os.path.join (libdir, 'lib/lilypond/@TOPLEVEL_VERSION@/') + +if os.path.exists (os.path.join (datadir, 'lib/lilypond/current/')): + libdir = os.path.join (libdir, 'lib/lilypond/current/') + sys.path.insert (0, os.path.join (libdir, 'python')) ################################################################ @@ -344,7 +350,6 @@ class Note: names = (0, 0, 1, 1, 2, 3, 3, 4, 4, 5, 5, 6) alterations = (0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0) alteration_names = ('eses', 'es', '', 'is' , 'isis') - def __init__ (self, clocks, pitch, velocity): self.pitch = pitch self.velocity = velocity @@ -429,6 +434,10 @@ class Note: return (o, n, a) + def __repr__ (self): + s = chr ((self.notename + 2) % 7 + ord ('a')) + return 'Note(%s %s)' % (s, self.duration.dump()) + def dump (self, dump_dur = 1): global reference_note s = chr ((self.notename + 2) % 7 + ord ('a')) @@ -470,7 +479,10 @@ class Time: def bar_clocks (self): return clocks_per_1 * self.num / self.den - + + def __repr__ (self): + return 'Time(%d/%d)' % (self.num, self.den) + def dump (self): global time time = self @@ -481,14 +493,23 @@ class Tempo: self.clocks = 0 self.seconds_per_1 = seconds_per_1 + def __repr__ (self): + return 'Tempo(%d)' % self.bpm () + + def bpm (self): + return 4 * 60 / self.seconds_per_1 + def dump (self): - return '\n ' + '\\tempo 4 = %d ' % (4 * 60 / self.seconds_per_1) + '\n ' + return '\n ' + '\\tempo 4 = %d ' % (self.bpm()) + '\n ' class Clef: clefs = ('"bass_8"', 'bass', 'violin', '"violin^8"') def __init__ (self, type): self.type = type - + + def __repr__ (self): + return 'Clef(%s)' % self.clefs[self.type] + def dump (self): return '\n \\clef %s\n ' % self.clefs[self.type] @@ -574,6 +595,10 @@ class Text: s = '\n % [' + self.text_types[self.type] + '] ' + self.text + '\n ' return s + def __repr__ (self): + return 'Text(%d=%s)' % (self.type, self.text) + + def split_track (track): chs = {} @@ -928,15 +953,19 @@ def dump_track (channels, n): def thread_first_item (thread): for chord in thread: for event in chord: - if event[1].__class__ == Note \ - or (event[1].__class__ == Text \ - and event[1].type == midi.LYRIC): - return event[1] - return 0 + if (event[1].__class__ == Note + or (event[1].__class__ == Text + and event[1].type == midi.LYRIC)): + + return event[1] + return None def track_first_item (track): for thread in track: - return thread_first_item (thread) + first = thread_first_item (thread) + if first: + return first + return None def guess_clef (track): i = 0 @@ -957,24 +986,24 @@ def guess_clef (track): return Clef (2) -def convert_midi (f, o): +def convert_midi (in_file, out_file): global clocks_per_1, clocks_per_4, key + global start_quant, start_quant_clocks + global duration_quant, duration_quant_clocks + global allowed_tuplet_clocks - str = open (f).read () + str = open (in_file).read () midi_dump = midi.parse (str) - + clocks_per_1 = midi_dump[0][1] clocks_per_4 = clocks_per_1 / 4 - global start_quant, start_quant_clocks if start_quant: start_quant_clocks = clocks_per_1 / start_quant - global duration_quant, duration_quant_clocks if duration_quant: duration_quant_clocks = clocks_per_1 / duration_quant - global allowed_tuplet_clocks allowed_tuplet_clocks = [] for (dur, num, den) in allowed_tuplets: allowed_tuplet_clocks.append (clocks_per_1 * num / (dur * den)) @@ -988,29 +1017,34 @@ def convert_midi (f, o): s = '' - s = tag + '\n\\version "2.3.25"\n\n' + s = tag + '\n\\version "2.7.18"\n\n' for i in range (len (tracks)): s = s + dump_track (tracks[i], i) s = s + '\n\\score {\n <<\n' - for i in range (len (tracks)): + + i = 0 + for t in tracks: track = track_name (i) - item = track_first_item (tracks[i]) + item = track_first_item (t) + if item and item.__class__ == Note: s = s + ' \\context Staff=%s \\%s\n' % (track, track) elif item and item.__class__ == Text: s = s + ' \\context Lyrics=%s \\%s\n' % (track, track) + + i += 1 s = s + ' >>\n}\n' progress (_ ("%s output to `%s'...") % ('LY', o)) if o == '-': - h = sys.stdout + handle = sys.stdout else: - h = open (o, 'w') + handle = open (out_file, 'w') - h.write (s) - h.close () + handle.write (s) + handle.close () (sh, long) = getopt_args (option_definitions) -- 2.39.2