view patches/lilypond-midi2ly-preview.patch @ 6512:ccc20ae889ca default tip guix

mingw::guile-2.0.7 builds.
author Jan Nieuwenhuizen <janneke@gnu.org>
date Thu, 24 Mar 2016 08:03:39 +0100
parents 6796a4dca5cf
children
line wrap: on
line source

From 2005e201323314c8439d6aca062386c70c784294 Mon Sep 17 00:00:00 2001
From: Jan Nieuwenhuizen <janneke@gnu.org>
Date: Mon, 24 Jan 2011 14:15:36 +0100
Subject: [PATCH 1/5] Midi2ly: Whitespace nits.

---
 scripts/midi2ly.py |  213 ++++++++++++++++++++++++++--------------------------
 1 files changed, 107 insertions(+), 106 deletions(-)

diff --git a/scripts/midi2ly.py b/scripts/midi2ly.py
index b03e1a8..43000c1 100644
--- a/scripts/midi2ly.py
+++ b/scripts/midi2ly.py
@@ -5,7 +5,7 @@
 # This file is part of LilyPond, the GNU music typesetter.
 #
 # Copyright (C) 1998--2010  Han-Wen Nienhuys <hanwen@xs4all.nl>
-#                 Jan Nieuwenhuizen <janneke@gnu.org>
+#                           Jan Nieuwenhuizen <janneke@gnu.org>
 #
 # LilyPond is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -87,7 +87,7 @@ def warranty ():
 
 %s
 %s
-''' % ( _ ('Copyright (c) %s by') % '2001--2010',
+''' % ( _ ('Copyright (c) %s by') % '1998--2010',
         '\n  '.join (authors),
         _ ('Distributed under terms of the GNU General Public License.'),
         _ ('It comes with NO WARRANTY.')))
@@ -97,7 +97,7 @@ def progress (s):
 
 def warning (s):
     progress (_ ("warning: ") + s)
-        
+
 def error (s):
     progress (_ ("error: ") + s)
     raise Exception (_ ("Exiting... "))
@@ -119,7 +119,7 @@ class Duration:
         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):
         for i in range (len (allowed_tuplet_clocks)):
             if clocks == allowed_tuplet_clocks[i]:
@@ -143,7 +143,7 @@ class Duration:
                 s = '%d*%d' % (self.dur, self.num)
         else:
             s = '%d*%d/%d' % (self.dur, self.num, self.den)
-            
+
         global reference_note
         reference_note.duration = self
 
@@ -246,10 +246,10 @@ class Note:
             n = 6; a = 1; o = o - 1
 
         return (o, n, a)
-        
+
     def __repr__ (self):
         s = chr ((self.notename + 2)  % 7 + ord ('a'))
-        return 'Note(%s %s)' % (s, self.duration.dump())
+        return 'Note(%s %s)' % (s, self.duration.dump ())
 
     def dump (self, dump_dur = 1):
         global reference_note
@@ -260,25 +260,25 @@ class Note:
         else:
             delta = self.pitch - reference_note.pitch
             commas = sign (delta) * (abs (delta) / 12)
-            if ((sign (delta) \
-              * (self.notename - reference_note.notename) + 7) \
-              % 7 >= 4) \
-              or ((self.notename == reference_note.notename) \
-                and (abs (delta) > 4) and (abs (delta) < 12)):
+            if (((sign (delta)
+                  * (self.notename - reference_note.notename) + 7)
+                 % 7 >= 4)
+                or ((self.notename == reference_note.notename)
+                    and (abs (delta) > 4) and (abs (delta) < 12))):
                 commas = commas + sign (delta)
-            
+
         if commas > 0:
             s = s + "'" * commas
         elif commas < 0:
             s = s + "," * -commas
 
         ## FIXME: compile fix --jcn
-        if dump_dur and (global_options.explicit_durations \
-         or self.duration.compare (reference_note.duration)):
+        if (dump_dur and (global_options.explicit_durations
+                          or self.duration.compare (reference_note.duration))):
             s = s + self.duration.dump ()
 
         reference_note = self
-        
+
         # TODO: move space
         return s + ' '
 
@@ -294,7 +294,7 @@ class Time:
 
     def __repr__ (self):
         return 'Time(%d/%d)' % (self.num, self.den)
-    
+
     def dump (self):
         global time
         time = self
@@ -307,12 +307,12 @@ class Tempo:
 
     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 ' % (self.bpm()) + '\n  '
+        return '\n  ' + '\\tempo 4 = %d ' % (self.bpm ()) + '\n  '
 
 class Clef:
     clefs = ('"bass_8"', 'bass', 'violin', '"violin^8"')
@@ -321,7 +321,7 @@ class Clef:
 
     def __repr__ (self):
         return 'Clef(%s)' % self.clefs[self.type]
-    
+
     def dump (self):
         return '\n  \\clef %s\n  ' % self.clefs[self.type]
 
@@ -346,7 +346,7 @@ class Key:
                 k = (ord ('cfbeadg'[self.flats % 7]) - ord ('a') - 2 -2 * self.minor + 7) % 7
             else:
                 k = (ord ('cgdaebf'[self.sharps % 7]) - ord ('a') - 2 -2 * self.minor + 7) % 7
- 
+
             if not self.minor:
                 name = chr ((k + 2) % 7 + ord ('a'))
             else:
@@ -386,7 +386,7 @@ class Text:
         'LYRIC',
         'MARKER',
         'CUE_POINT',)
-    
+
     def __init__ (self, type, text):
         self.clocks = 0
         self.type = type
@@ -397,8 +397,8 @@ class Text:
         if self.type == midi.LYRIC:
             s = '"%s"' % self.text
             d = Duration (self.clocks)
-            if global_options.explicit_durations \
-             or d.compare (reference_note.duration):
+            if (global_options.explicit_durations
+                or d.compare (reference_note.duration)):
                 s = s + Duration (self.clocks).dump ()
             s = s + ' '
         else:
@@ -412,9 +412,9 @@ class Text:
 
 def split_track (track):
     chs = {}
-    for i in range(16):
+    for i in range (16):
         chs[i] = []
-        
+
     for e in track:
         data = list (e[1])
         if data[0] > 0x7f and data[0] < 0xf0:
@@ -452,7 +452,7 @@ def end_note (pitches, notes, t, e):
         (lt, vel) = pitches[e]
         del pitches[e]
 
-        i = len (notes) - 1 
+        i = len (notes) - 1
         while i > 0:
             if notes[i][0] > lt:
                 i = i -1
@@ -484,20 +484,20 @@ def events_on_channel (channel):
             t = quantise_clocks (t, start_quant_clocks)
 
 
-        if e[1][0] == midi.NOTE_OFF \
-         or (e[1][0] == midi.NOTE_ON and e[1][2] == 0):
+        if (e[1][0] == midi.NOTE_OFF
+            or (e[1][0] == midi.NOTE_ON and e[1][2] == 0)):
             end_note (pitches, notes, t, e[1][1])
-            
+
         elif e[1][0] == midi.NOTE_ON:
             if not pitches.has_key (e[1][1]):
                 pitches[e[1][1]] = (t, e[1][2])
-                
+
         # all include ALL_NOTES_OFF
-        elif e[1][0] >= midi.ALL_SOUND_OFF \
-          and e[1][0] <= midi.POLY_MODE_ON:
+        elif (e[1][0] >= midi.ALL_SOUND_OFF
+          and e[1][0] <= midi.POLY_MODE_ON):
             for i in pitches:
                 end_note (pitches, notes, t, i)
-                
+
         elif e[1][0] == midi.META_EVENT:
             if e[1][1] == midi.END_OF_TRACK:
                 for i in pitches:
@@ -511,7 +511,7 @@ def events_on_channel (channel):
                 events.append ((t, Tempo (seconds_per_1)))
             elif e[1][1] == midi.TIME_SIGNATURE:
                 (num, dur, clocks4, count32) = map (ord, e[1][2])
-                den = 2 ** dur 
+                den = 2 ** dur
                 events.append ((t, Time (num, den)))
             elif e[1][1] == midi.KEY_SIGNATURE:
                 (alterations, minor) = map (ord, e[1][2])
@@ -530,16 +530,16 @@ def events_on_channel (channel):
                 # Better do Note.calc () at dump time?
                 global_options.key = k
 
-            elif e[1][1] == midi.LYRIC \
-              or (global_options.text_lyrics and e[1][1] == midi.TEXT_EVENT):
+            elif (e[1][1] == midi.LYRIC
+                  or (global_options.text_lyrics and e[1][1] == midi.TEXT_EVENT)):
                 if last_lyric:
                     last_lyric.clocks = t - last_time
                     events.append ((last_time, last_lyric))
                 last_time = t
                 last_lyric = Text (midi.LYRIC, e[1][2])
 
-            elif e[1][1] >= midi.SEQUENCE_NUMBER \
-              and e[1][1] <= midi.CUE_POINT:
+            elif (e[1][1] >= midi.SEQUENCE_NUMBER
+                  and e[1][1] <= midi.CUE_POINT):
                 events.append ((t, Text (e[1][1], e[1][2])))
             else:
                 if global_options.verbose:
@@ -556,7 +556,7 @@ def events_on_channel (channel):
         last_lyric.clocks = clocks_per_4
         events.append ((last_time, last_lyric))
         last_lyric = 0
-        
+
     i = 0
     while len (notes):
         if i < len (events) and notes[0][0] >= events[i][0]:
@@ -575,17 +575,17 @@ def unthread_notes (channel):
         todo = []
         for e in channel:
             t = e[0]
-            if e[1].__class__ == Note \
-             and ((t == start_busy_t \
-                and e[1].clocks + t == end_busy_t) \
-              or t >= end_busy_t):
+            if (e[1].__class__ == Note
+                and ((t == start_busy_t
+                      and e[1].clocks + t == end_busy_t)
+                     or t >= end_busy_t)):
                 thread.append (e)
                 start_busy_t = t
                 end_busy_t = t + e[1].clocks
-            elif e[1].__class__ == Time \
-              or e[1].__class__ == Key \
-              or e[1].__class__ == Text \
-              or e[1].__class__ == Tempo:
+            elif (e[1].__class__ == Time
+                  or e[1].__class__ == Key
+                  or e[1].__class__ == Text
+                  or e[1].__class__ == Tempo):
                 thread.append (e)
             else:
                 todo.append (e)
@@ -598,12 +598,12 @@ def gcd (a,b):
     if b == 0:
         return a
     c = a
-    while c: 
+    while c:
         c = a % b
         a = b
         b = c
     return a
-    
+
 def dump_skip (skip, clocks):
     return skip + Duration (clocks).dump () + ' '
 
@@ -629,7 +629,7 @@ def dump_chord (ch):
             s = s + i.dump (dump_dur = 0 )
         s = s + '>'
 
-        s = s + notes[0].duration.dump() + ' '
+        s = s + notes[0].duration.dump () + ' '
         reference_note = r
     return s
 
@@ -638,17 +638,17 @@ def dump_bar_line (last_bar_t, t, bar_count):
     bar_t = time.bar_clocks ()
     if t - last_bar_t >= bar_t:
         bar_count = bar_count + (t - last_bar_t) / bar_t
-        
+
         if t - last_bar_t == bar_t:
             s = '|\n  %% %d\n  ' % bar_count
             last_bar_t = t
         else:
             # urg, this will barf at meter changes
             last_bar_t = last_bar_t + (t - last_bar_t) / bar_t * bar_t
-            
+
     return (s, last_bar_t, bar_count)
 
-            
+
 def dump_channel (thread, skip):
     global reference_note, time
 
@@ -668,9 +668,9 @@ def dump_channel (thread, skip):
         else:
             if ch:
                 chs.append ((last_e[0], ch))
-                
+
             ch = [e[1]]
-            
+
         last_e = e
 
     if ch:
@@ -679,9 +679,9 @@ def dump_channel (thread, skip):
     last_t = 0
     last_bar_t = 0
     bar_count = 1
-    
+
     lines = ['']
-    for ch in chs: 
+    for ch in chs:
         t = ch[0]
 
         i = lines[-1].rfind ('\n') + 1
@@ -696,16 +696,16 @@ def dump_channel (thread, skip):
         (s, last_bar_t, bar_count) = dump_bar_line (last_bar_t,
                               t, bar_count)
         lines[-1] = lines[-1] + s
-        
+
         lines[-1] = lines[-1] + dump_chord (ch[1])
 
         clocks = 0
         for i in ch[1]:
             if i.clocks > clocks:
                 clocks = i.clocks
-                
+
         last_t = t + clocks
-        
+
         (s, last_bar_t, bar_count) = dump_bar_line (last_bar_t,
                               last_t, bar_count)
         lines[-1] = lines[-1] + s
@@ -771,10 +771,10 @@ 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 
+            if (event[1].__class__ == Note
+              or (event[1].__class__ == Text
                 and event[1].type == midi.LYRIC)):
-                
+
               return event[1]
     return None
 
@@ -802,20 +802,20 @@ def guess_clef (track):
         return Clef (3)
     else:
         return Clef (2)
-    
+
 
 def convert_midi (in_file, out_file):
     global clocks_per_1, clocks_per_4, key
     global start_quant_clocks
-    global  duration_quant_clocks
+    global duration_quant_clocks
     global allowed_tuplet_clocks
 
     str = open (in_file, 'rb').read ()
     midi_dump = midi.parse (str)
-    
+
     clocks_per_1 = midi_dump[0][1]
     clocks_per_4 = clocks_per_1 / 4
-    
+
     if global_options.start_quant:
         start_quant_clocks = clocks_per_1 / global_options.start_quant
 
@@ -833,19 +833,19 @@ def convert_midi (in_file, out_file):
 
     tag = '%% Lily was here -- automatically converted by %s from %s' % ( program_name, in_file)
 
-    
+
     s = ''
     s = tag + '\n\\version "2.7.38"\n\n'
     for i in range (len (tracks)):
         s = s + dump_track (tracks[i], i)
 
     s = s + '\n\\score {\n  <<\n'
-    
+
     i = 0
     for t in tracks:
         track = track_name (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:
@@ -872,44 +872,44 @@ def get_option_parser ():
 
     p.add_option ('-a', '--absolute-pitches',
            action='store_true',
-           help=_ ("print absolute pitches"))
+           help=_ ('print absolute pitches'))
     p.add_option ('-d', '--duration-quant',
-           metavar= _("DUR"),
-           help=_ ("quantise note durations on DUR"))
+           metavar=_ ('DUR'),
+           help=_ ('quantise note durations on DUR'))
     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"))
-    p.add_option('-k', '--key', help=_ ("set key: ALT=+sharps|-flats; MINOR=1"),
-          metavar=_ ("ALT[:MINOR]"),
+           help=_ ('print explicit durations'))
+    p.add_option('-h', '--help',
+                 action='help',
+                 help=_ ('show this help and exit'))
+    p.add_option('-k', '--key', help=_ ('set key: ALT=+sharps|-flats; MINOR=1'),
+          metavar=_ ('ALT[:MINOR]'),
           default='0'),
-    p.add_option ('-o', '--output', help=_ ("write output to FILE"),
-           metavar=_("FILE"),
+    p.add_option ('-o', '--output', help=_ ('write output to FILE'),
+           metavar=_('FILE'),
            action='store')
-    p.add_option ('-s', '--start-quant',help= _ ("quantise note starts on DUR"),
-           metavar=_ ("DUR"))
+    p.add_option ('-s', '--start-quant',help= _ ('quantise note starts on DUR'),
+           metavar=_ ('DUR'))
     p.add_option ('-t', '--allow-tuplet',
-           metavar=_ ("DUR*NUM/DEN"),
-           action = "append",
-           dest="allowed_tuplets",
-           help=_ ("allow tuplet durations DUR*NUM/DEN"),
+           metavar=_ ('DUR*NUM/DEN'),
+           action = 'append',
+           dest='allowed_tuplets',
+           help=_ ('allow tuplet durations DUR*NUM/DEN'),
            default=[])
-    p.add_option ('-V', '--verbose', help=_ ("be verbose"),
+    p.add_option ('-V', '--verbose', help=_ ('be verbose'),
            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"),
+    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',
            ),
-    p.add_option ('-x', '--text-lyrics', help=_ ("treat every text as a lyric"),
+    p.add_option ('-x', '--text-lyrics', help=_ ('treat every text as a lyric'),
            action='store_true')
 
-    p.add_option_group (ly.display_encode (_ ("Examples")),
+    p.add_option_group (ly.display_encode (_ ('Examples')),
               description = r'''
   $ midi2ly --key=-2:1 --duration-quant=32 --allow-tuplet=4*2/3 --allow-tuplet=2*4/3 foo.midi
 ''')
@@ -923,13 +923,13 @@ def get_option_parser ():
 
 
 def do_options ():
-    opt_parser = get_option_parser()
+    opt_parser = get_option_parser ()
     (options, args) = opt_parser.parse_args ()
 
     if not args or args[0] == '-':
         opt_parser.print_help ()
-        ly.stderr_write ('\n%s: %s %s\n' % (program_name, _ ("error: "),
-                         _ ("no files specified on command line.")))
+        ly.stderr_write ('\n%s: %s %s\n' % (program_name, _ ('error: '),
+                         _ ('no files specified on command line.')))
         sys.exit (2)
 
     if options.duration_quant:
@@ -949,20 +949,20 @@ def do_options ():
 
         options.key = Key (sharps, flats, minor)
 
-        
+
     if options.start_quant:
         options.start_quant = int (options.start_quant)
-        
+
     options.allowed_tuplets = [map (int, a.replace ('/','*').split ('*'))
                 for a in options.allowed_tuplets]
-    
+
     global global_options
     global_options = options
 
     return args
 
-def main():
-    files = do_options()
+def main ():
+    files = do_options ()
 
     for f in files:
         g = f
@@ -990,5 +990,6 @@ def main():
                 pass
 
         convert_midi (f, o)
+
 if __name__ == '__main__':
-    main()
+    main ()
-- 
1.7.1

From 7b3a9b122d7ef1eb70fdabaac466b7b0c23a1df2 Mon Sep 17 00:00:00 2001
From: Jan Nieuwenhuizen <janneke@gnu.org>
Date: Mon, 24 Jan 2011 14:29:37 +0100
Subject: [PATCH 2/5] Midi2ly: add --preview option.

---
 scripts/midi2ly.py |   23 +++++++++++++++++------
 1 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/scripts/midi2ly.py b/scripts/midi2ly.py
index 43000c1..1b3723e 100644
--- a/scripts/midi2ly.py
+++ b/scripts/midi2ly.py
@@ -62,7 +62,7 @@ start_quant_clocks = 0
 
 duration_quant_clocks = 0
 allowed_tuplet_clocks = []
-
+bar_max = 0
 
 ################################################################
 
@@ -689,14 +689,20 @@ def dump_channel (thread, skip):
             lines.append ('')
 
         if t - last_t > 0:
-            lines[-1] = lines[-1] + dump_skip (skip, t-last_t)
+            d = t - last_t
+            if bar_max and t > time.bar_clocks () * bar_max:
+                d = time.bar_clocks () * bar_max - last_t
+            lines[-1] = lines[-1] + dump_skip (skip, d)
         elif t - last_t < 0:
             errorport.write ('BUG: time skew')
 
         (s, last_bar_t, bar_count) = dump_bar_line (last_bar_t,
                               t, bar_count)
-        lines[-1] = lines[-1] + s
 
+        if bar_max and bar_count > bar_max:
+            break
+
+        lines[-1] = lines[-1] + s
         lines[-1] = lines[-1] + dump_chord (ch[1])
 
         clocks = 0
@@ -707,7 +713,7 @@ def dump_channel (thread, skip):
         last_t = t + clocks
 
         (s, last_bar_t, bar_count) = dump_bar_line (last_bar_t,
-                              last_t, bar_count)
+                                                    last_t, bar_count)
         lines[-1] = lines[-1] + s
 
     return '\n  '.join (lines) + '\n'
@@ -886,8 +892,10 @@ def get_option_parser ():
           metavar=_ ('ALT[:MINOR]'),
           default='0'),
     p.add_option ('-o', '--output', help=_ ('write output to FILE'),
-           metavar=_('FILE'),
+           metavar=_ ('FILE'),
            action='store')
+    p.add_option ('-p', '--preview', help=_ ('preview of first 4 bars'),
+           action='store_true')
     p.add_option ('-s', '--start-quant',help= _ ('quantise note starts on DUR'),
            metavar=_ ('DUR'))
     p.add_option ('-t', '--allow-tuplet',
@@ -949,10 +957,13 @@ def do_options ():
 
         options.key = Key (sharps, flats, minor)
 
-
     if options.start_quant:
         options.start_quant = int (options.start_quant)
 
+    global bar_max
+    if options.preview:
+        bar_max = 4
+
     options.allowed_tuplets = [map (int, a.replace ('/','*').split ('*'))
                 for a in options.allowed_tuplets]
 
-- 
1.7.1

From 7a2766a80beb907df0b291584c1a84b6b4fe4c4f Mon Sep 17 00:00:00 2001
From: Jan Nieuwenhuizen <janneke@gnu.org>
Date: Mon, 24 Jan 2011 14:30:37 +0100
Subject: [PATCH 3/5] Midi2ly: bug fix for --allow-tuplets.

---
 scripts/midi2ly.py |    8 +++++++-
 1 files changed, 7 insertions(+), 1 deletions(-)

diff --git a/scripts/midi2ly.py b/scripts/midi2ly.py
index 1b3723e..afe5c5a 100644
--- a/scripts/midi2ly.py
+++ b/scripts/midi2ly.py
@@ -830,7 +830,10 @@ def convert_midi (in_file, out_file):
 
     allowed_tuplet_clocks = []
     for (dur, num, den) in global_options.allowed_tuplets:
-        allowed_tuplet_clocks.append (clocks_per_1 / den)
+        allowed_tuplet_clocks.append (clocks_per_1 / dur * num / den)
+
+    if global_options.verbose:
+        print 'allowed tuplet clocks:', allowed_tuplet_clocks
 
     tracks = []
     for t in midi_dump[1]:
@@ -967,6 +970,9 @@ def do_options ():
     options.allowed_tuplets = [map (int, a.replace ('/','*').split ('*'))
                 for a in options.allowed_tuplets]
 
+    if options.verbose:
+        sys.stderr.write ('Allowed tuplets: %s\n' % `options.allowed_tuplets`)
+
     global global_options
     global_options = options
 
-- 
1.7.1

From a013e110e10a1531521d73455b89bd0b00fbf3d0 Mon Sep 17 00:00:00 2001
From: Jan Nieuwenhuizen <janneke@gnu.org>
Date: Mon, 24 Jan 2011 15:13:05 +0100
Subject: [PATCH 4/5] midi.c: resurrect debug printing.

---
 python/midi.c |   11 ++++++-----
 1 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/python/midi.c b/python/midi.c
index 4e6368a..2ec5224 100644
--- a/python/midi.c
+++ b/python/midi.c
@@ -60,7 +60,8 @@ compat_itoa (int i)
 #if 0
 int x = 0;
 int *track = &x;
-#define debug_print(f, args...) fprintf (stderr, "%s:%d: track: %p :" f, __FUNCTION__, __LINE__, *track, ##args)
+#define urg_debug_print(f, args...) fprintf (stderr, "%s:%d: track: %p: " f, __FUNCTION__, __LINE__, *track, ##args)
+#define debug_print(f, args...) fprintf (stderr, f, ##args)
 #else
 #define debug_print(f, args...)
 #endif
@@ -161,7 +162,7 @@ get_number (unsigned char ** str, unsigned char * end_str, int length)
     sum = (sum << 8) + (unsigned char) (*str)[i];
 
   *str += length;
-  debug_print ("%d:\n", sum);
+  debug_print ("%ld:\n", sum);
   return sum;
 }
 
@@ -178,7 +179,7 @@ get_variable_length_number (unsigned char **str, unsigned char * end_str)
       if (!(x & 0x80))
 	break;
     }
-  debug_print ("%d:\n", sum);
+  debug_print ("%ld:\n", sum);
   return sum;
 }
 
@@ -312,8 +313,8 @@ midi_parse_track (unsigned char **track, unsigned char *track_end)
 
   track_len = get_number (track, *track + 4, 4);
 
-  debug_print ("track_len: %u\n", track_len);
-  debug_print ("track_size: %u\n", track_size);
+  debug_print ("track_len: %lu\n", track_len);
+  debug_print ("track_size: %lu\n", track_size);
   debug_print ("track begin: %p\n", track);
   debug_print ("track end: %p\n", track + track_len);
   
-- 
1.7.1

From 0996f6663b2635491b5efa385e0e3a581fb96292 Mon Sep 17 00:00:00 2001
From: Jan Nieuwenhuizen <janneke@gnu.org>
Date: Mon, 24 Jan 2011 15:17:10 +0100
Subject: [PATCH 5/5] Midi2ly: in --preview mode, only parse first eight 4/4 bars (12288 clocks).

---
 python/midi.c      |   26 +++++++++++++++-----------
 scripts/midi2ly.py |    3 ++-
 2 files changed, 17 insertions(+), 12 deletions(-)

diff --git a/python/midi.c b/python/midi.c
index 2ec5224..187268b 100644
--- a/python/midi.c
+++ b/python/midi.c
@@ -292,7 +292,7 @@ read_event (unsigned char **track, unsigned char *end, PyObject *time,
 }
 
 static PyObject *
-midi_parse_track (unsigned char **track, unsigned char *track_end)
+midi_parse_track (unsigned char **track, unsigned char *track_end, int clocks_max)
 {
   unsigned int time = 0;
   unsigned long track_len, track_size;
@@ -338,7 +338,8 @@ midi_parse_track (unsigned char **track, unsigned char *track_end)
 	time += dt;
 	if (dt)
 	  pytime = PyInt_FromLong (time);
-
+	if (clocks_max && time > clocks_max)
+	  break;
 	pyev = read_event (track, track_end, pytime,
 			   &running_status);
 	if (pyev)
@@ -356,21 +357,23 @@ pymidi_parse_track (PyObject *self, PyObject *args)
 {
   unsigned char *track, *track_end;
   unsigned long track_size;
+  int clocks_max;
 
   debug_print ("%s", "\n");
-  if (!PyArg_ParseTuple (args, "s#", &track, &track_size))
+  if (!PyArg_ParseTuple (args, "s#|i", &track, &track_size, &clocks_max))
     return 0;
+  debug_print ("clocks_max: %d\n", clocks_max);
 
   if (track_size < 0)
     return midi_error (__FUNCTION__,   ": negative track size: ", compat_itoa (track_size));
 
   track_end = track + track_size;
   
-  return midi_parse_track (&track, track_end);
+  return midi_parse_track (&track, track_end, clocks_max);
 }
 
 static PyObject *
-midi_parse (unsigned char **midi,unsigned  char *midi_end)
+midi_parse (unsigned char **midi,unsigned  char *midi_end, int clocks_max)
 {
   PyObject *pymidi = 0;
   unsigned long header_len;
@@ -404,7 +407,7 @@ midi_parse (unsigned char **midi,unsigned  char *midi_end)
 
   /* Tracks */
   for (i = 0; i < tracks; i++)
-    PyList_Append (pymidi, midi_parse_track (midi, midi_end));
+    PyList_Append (pymidi, midi_parse_track (midi, midi_end, clocks_max));
 
   pymidi = Py_BuildValue ("(OO)", Py_BuildValue ("(ii)", format, division),
 			  pymidi);
@@ -416,10 +419,12 @@ pymidi_parse (PyObject *self, PyObject *args)
 {
   unsigned char *midi, *midi_end;
   unsigned long midi_size;
+  int clocks_max;
   
   debug_print ("%s", "\n");
-  if (!PyArg_ParseTuple (args, "s#", &midi, &midi_size))
+  if (!PyArg_ParseTuple (args, "s#|i", &midi, &midi_size, &clocks_max))
     return 0;
+  debug_print ("clocks_max: %d\n", clocks_max);
 
   if (memcmp (midi, "MThd", 4))
     {
@@ -431,14 +436,13 @@ pymidi_parse (PyObject *self, PyObject *args)
 
   midi_end = midi + midi_size;
 
-  return midi_parse (&midi, midi_end);
+  return midi_parse (&midi, midi_end, clocks_max);
 }
 
-
 static PyMethodDef MidiMethods[] = 
 {
-  {"parse",  pymidi_parse, 1},
-  {"parse_track",  pymidi_parse_track, 1},
+  {"parse",  pymidi_parse, METH_VARARGS},
+  {"parse_track",  pymidi_parse_track, METH_VARARGS},
   {0, 0}        /* Sentinel */
 };
 
diff --git a/scripts/midi2ly.py b/scripts/midi2ly.py
index afe5c5a..9ce050b 100644
--- a/scripts/midi2ly.py
+++ b/scripts/midi2ly.py
@@ -817,7 +817,8 @@ def convert_midi (in_file, out_file):
     global allowed_tuplet_clocks
 
     str = open (in_file, 'rb').read ()
-    midi_dump = midi.parse (str)
+    clocks_max = bar_max * clocks_per_1 * 2
+    midi_dump = midi.parse (str, clocks_max)
 
     clocks_per_1 = midi_dump[0][1]
     clocks_per_4 = clocks_per_1 / 4
-- 
1.7.1