]> git.donarmstrong.com Git - lilypond.git/blobdiff - scripts/abc2ly.py
Merge branch 'master' of ssh://jneem@git.sv.gnu.org/srv/git/lilypond into tmp
[lilypond.git] / scripts / abc2ly.py
index e28577fb1c88b9eaed15d91b6b3309c5f42fc616..9107b8b8665903738a68586851738831d5a5b666 100644 (file)
@@ -5,7 +5,7 @@
 #   ...
 #
 # (not finished.)
-# ABC standard v1.6:  http://www.gre.ac.uk/~c.walshaw/abc2mtex/abc.txt
+# ABC standard v1.6:  http://www.walshaw.plus.com/abc/
 #
 # Enhancements  (Roy R. Rankin)
 #
@@ -58,6 +58,7 @@
 
 #TODO:
 #
+# * coding style
 # * lilylib
 # * GNU style messages:  warning:FILE:LINE:
 # * l10n
@@ -72,22 +73,14 @@ import __main__
 import getopt
 import sys
 import re
-import string
 import os
 
 program_name = sys.argv[0]
 
 
-for d in ['@lilypond_datadir@',
-          '@lilypond_libdir@']:
-    sys.path.insert (0, os.path.join (d, 'python'))
-
-# dynamic relocation, for GUB binaries.
-bindir = os.path.abspath (os.path.split (sys.argv[0])[0])
-for p in ['share', 'lib']:
-    datadir = os.path.abspath (bindir + '/../%s/lilypond/current/python/' % p)
-    sys.path.insert (0, datadir)
-
+"""
+@relocate-preamble@
+"""
 
 import lilylib as ly
 global _;_=ly._
@@ -124,7 +117,7 @@ def error (msg):
     sys.stderr.write (msg)
     if global_options.strict:
         sys.exit (1)
-    
+
 
 def alphabet (i):
     return chr (i + ord('A'))
@@ -218,12 +211,12 @@ def dump_slyrics (outf):
     ks.sort ()
     for k in ks:
         if re.match('[1-9]', k):
-            m = alphabet(string.atoi(k))
+            m = alphabet (int (k))
         else:
             m = k
         for i in range (len(slyrics[voice_idx_dict[k]])):
             l= alphabet(i)
-            outf.write ("\nwords%sV%s = \lyricmode {" % (m, l))
+            outf.write ("\nwords%sV%s = \\lyricmode {" % (m, l))
             outf.write ("\n" + slyrics [voice_idx_dict[k]][i])
             outf.write ("\n}")
 
@@ -233,7 +226,7 @@ def dump_voices (outf):
     ks.sort ()
     for k in ks:
         if re.match ('[1-9]', k):
-            m = alphabet(string.atoi(k))
+            m = alphabet (int (k))
         else:
             m = k
         outf.write ("\nvoice%s =  {" % m)
@@ -252,19 +245,19 @@ def try_parse_q(a):
     global midi_specs
     #assume that Q takes the form "Q:1/4=120"
     #There are other possibilities, but they are deprecated
-    if string.count(a, '/') == 1:
-        array=string.split(a,'/')
+    if a.count ('/') == 1:
+        array = a.split('/')
         numerator=array[0]
         if int(numerator) != 1:
             sys.stderr.write("abc2ly: Warning, unable to translate a Q specification with a numerator of %s: %s\n" % (numerator, a))
-        array2=string.split(array[1],'=')
+        array2 = array[1].split ('=')
         denominator=array2[0]
         perminute=array2[1]
-        duration=str(string.atoi(denominator)/string.atoi(numerator))
-        midi_specs=string.join(["    \n\t\t\context {\n\t\t \Score tempoWholesPerMinute = #(ly:make-moment ", perminute, " ", duration, ")\n\t\t }\n"])
+        duration = str (int (denominator) / int (numerator))
+        midi_specs = ' '.join(["\n\t\t\\context {\n\t\t \\Score tempoWholesPerMinute = #(ly:make-moment ", perminute, " ", duration, ")\n\t\t }\n"])
     else:
         sys.stderr.write("abc2ly: Warning, unable to parse Q specification: %s\n" % a)
-    
+
 def dump_score (outf):
     outf.write (r"""
 
@@ -276,7 +269,7 @@ def dump_score (outf):
     ks.sort ()
     for k in  ks:
         if re.match('[1-9]', k):
-            m = alphabet (string.atoi(k))
+            m = alphabet (int (k))
         else:
             m = k
         if k == 'default' and len (voice_idx_dict) > 1:
@@ -289,9 +282,9 @@ def dump_score (outf):
 
         l = ord( 'A' )
         for lyrics in slyrics [voice_idx_dict[k]]:
-            outf.write ("\n\t\\addlyrics { \n")
+            outf.write ("\n\t\\addlyrics {\n")
             if re.match('[1-9]',k):
-                m = alphabet (string.atoi(k))
+                m = alphabet (int (k))
             else:
                 m = k
 
@@ -308,14 +301,14 @@ def set_default_length (s):
     global length_specified
     m =  re.search ('1/([0-9]+)', s)
     if m:
-        __main__.default_len = string.atoi ( m.group (1))
+        __main__.default_len = int ( m.group (1))
         length_specified = 1
 
 def set_default_len_from_time_sig (s):
     m =  re.search ('([0-9]+)/([0-9]+)', s)
     if m:
-        n = string.atoi (m.group (1))
-        d = string.atoi (m.group (2))
+        n = int (m.group (1))
+        d = int (m.group (2))
         if (n * 1.0 )/(d * 1.0) <  0.75:
             __main__.default_len =  16
         else:
@@ -328,7 +321,7 @@ def gulp_file(f):
         n = i.tell ()
         i.seek (0,0)
     except:
-        sys.stderr.write ("can't open file: `%s'\n" % f)
+        sys.stderr.write ("cannot open file: `%s'\n" % f)
         return ''
     s = i.read (n)
     if len (s) <= 0:
@@ -414,7 +407,7 @@ key_lookup = {         # abc to lilypond key mode names
 def lily_key (k):
     orig = "" + k
     # UGR
-    k = string.lower (k)
+    k = k.lower ()
     key = k[0]
     #UGH
     k = k[1:]
@@ -472,7 +465,7 @@ key_shift = { # semitone shifts for key mode names
     'dorian' :        -2        
 }
 def compute_key (k):
-    k = string.lower (k)
+    k = k.lower ()
     intkey = (ord (k[0]) - ord('a') + 5) % 7
     intkeyacc =0
     k = k[1:]
@@ -504,7 +497,7 @@ def compute_key (k):
         accseq = map (lambda x: (3*x + 3 ) % 7, range (1, key_count + 1))
     else:
         error ("Huh?")
-        raise "Huh"
+        raise Exception ("Huh")
     
     key_table = [0] * 7
     for a in accseq:
@@ -528,7 +521,7 @@ def try_parse_tuplet_begin (str, state):
         dig = str[1]
         str = str[2:]
         prev_tuplet_state = state.parsing_tuplet
-        state.parsing_tuplet = string.atoi (dig[0])
+        state.parsing_tuplet = int (dig[0])
         if prev_tuplet_state:
             voices_append ("}")                
         voices_append ("\\times %s {" % tup_lookup[dig])
@@ -547,7 +540,7 @@ def header_append (key, a):
         header [key] = s + a
 
 def wordwrap(a, v):
-    linelen = len (v) - string.rfind(v, '\n')
+    linelen = len (v) - v.rfind ('\n')
     if linelen + len (a) > 80:
         v = v + '\n'
     return v + a + ' '
@@ -657,12 +650,12 @@ def try_parse_header_line (ln, state):
             if a == 'C':
                 if not state.common_time:
                     state.common_time = 1
-                    voices_append (" \\override Staff.TimeSignature #\'style = #'C\n")
+                    voices_append (" \\override Staff.TimeSignature #'style = #'C\n")
                 a = '4/4'
             if a == 'C|':
                 if not state.common_time:
                     state.common_time = 1
-                    voices_append ("\\override Staff.TimeSignature #\'style = #'C\n")
+                    voices_append ("\\override Staff.TimeSignature #'style = #'C\n")
                 a = '2/2'
             if not length_specified:
                 set_default_len_from_time_sig (a)
@@ -770,7 +763,7 @@ def parse_num (str):
 
     n = None
     if durstr:
-        n  =string.atoi (durstr) 
+        n = int (durstr)
     return (str,n)
 
 
@@ -786,7 +779,7 @@ def duration_to_lilypond_duration  (multiply_tup, defaultlen, dots):
             base = '\\breve'
             dots = 1
         if (multiply_tup[0] / multiply_tup[1]) == 4:
-            base = '\longa'
+            base = '\\longa'
     return '%s%s' % ( base, '.'* dots)
 
 class Parser_state:
@@ -907,7 +900,7 @@ def try_parse_articulation (str, state):
         
     # s7m2 input doesnt care about spaces
     if re.match('[ \t]*\(', str):
-        str = string.lstrip (str)
+        str = str.lstrip ()
 
     slur_begin =0
     while str[:1] =='(' and str[1] not in DIGITS:
@@ -935,9 +928,8 @@ def get_bar_acc(note, octave, state):
         return(UNDEF)
 
 def clear_bar_acc(state):
-    for k in state.in_acc.keys():
-        del state.in_acc[k]
-    
+    state.in_acc = {}
+
 
 # if we are parsing a beam, close it off
 def close_beam_state(state):
@@ -968,7 +960,7 @@ def try_parse_note (str, parser_state):
 
     octave = parser_state.base_octave
     if str[0] in "ABCDEFG":
-        str = string.lower (str[0]) + str[1:]
+        str = str[0].lower () + str[1:]
         octave = octave - 1
 
 
@@ -996,7 +988,7 @@ def try_parse_note (str, parser_state):
     (str, num,den,current_dots) = parse_duration (str, parser_state)
 
     if re.match('[ \t]*\)', str):
-        str = string.lstrip (str)
+        str = str.lstrip ()
     
     slur_end =0
     while str[:1] ==')':
@@ -1179,7 +1171,7 @@ def try_parse_bar (str,state):
         close_beam_state(state)
         voices_append (bs)
         if do_curly != '':
-            voices_append("} }")
+            voices_append("} ")
             do_curly = ''
     return str
 
@@ -1268,11 +1260,11 @@ def try_parse_comment (str):
             if 'nobarlines' in str:
                 nobarlines = 1
         elif str[0:3] == '%LY':
-            p = string.find(str, 'voices')
+            p = str.find ('voices')
             if (p > -1):
                 voices_append(str[p+7:])
                 voices_append("\n")
-            p = string.find(str, 'slyrics')
+            p = str.find ('slyrics')
             if (p > -1):
                 slyrics_append(str[p+8:])
             
@@ -1338,7 +1330,7 @@ def identify():
     sys.stderr.write ("%s from LilyPond %s\n" % (program_name, version))
 
 authors = """
-Written by Han-Wen Nienhuys <hanwen@cs.uu.nl>, Laura Conrad
+Written by Han-Wen Nienhuys <hanwen@xs4all.nl>, Laura Conrad
 <lconrad@laymusic.org>, Roy Rankin <Roy.Rankin@@alcatel.com.au>.
 """
 
@@ -1346,28 +1338,39 @@ def print_version ():
     print r"""abc2ly (GNU lilypond) %s""" % version
 
 def get_option_parser ():
-    p = ly.get_option_parser (usage='abc2ly [OPTIONS] FILE',
-                 version="abc2ly (LilyPond) @TOPLEVEL_VERSION@",
-                 description=_('''This program converts ABC music files (see
-http://www.gre.ac.uk/~c.walshaw/abc2mtex/abc.txt) to LilyPond input.'''))
-
-    p.add_option ('-o', '--output', metavar='FILE',help=_("set output filename to FILE"),
-           action='store')
-    p.add_option ('-s', '--strict', help=_("be strict about succes"),
-           action='store_true')
-    p.add_option ('-b', '--beams', help=_("preserve ABC's notion of beams"))
-    p.add_option_group  ('bugs',
-              description='''Report bugs via http://post.gmane.org/post.php'''
-              '''?group=gmane.comp.gnu.lilypond.bugs\n''')
-    
+    p = ly.get_option_parser (usage=_ ("%s [OPTION]... FILE") % 'abc2ly',
+                 description=_ ('''abc2ly converts ABC music files (see
+%s) to LilyPond input.
+''') % 'http://www.gre.ac.uk/~c.walshaw/abc2mtex/abc.txt',
+                 add_help_option=False)
+
+    p.version = "abc2ly (LilyPond) @TOPLEVEL_VERSION@"
+    p.add_option("--version",
+                 action="version",
+                 help=_ ("show version number and exit"))
+
+    p.add_option("-h", "--help",
+                 action="help",
+                 help=_ ("show this help and exit"))
+    p.add_option ('-o', '--output', metavar='FILE',
+                  help=_ ("write output to FILE"),
+                  action='store')
+    p.add_option ('-s', '--strict', help=_ ("be strict about success"),
+                  action='store_true')
+    p.add_option ('-b', '--beams', help=_ ("preserve ABC's notion of beams"))
+    p.add_option_group ('',
+                        description=(
+            _ ('Report bugs via %s')
+            % 'http://post.gmane.org/post.php'
+            '?group=gmane.comp.gnu.lilypond.bugs') + '\n')
     return p
 
 
-option_parser = get_option_parser()
-(global_options, files) = option_parser.parse_args()
+option_parser = get_option_parser ()
+(global_options, files) = option_parser.parse_args ()
 
 
-identify()
+identify ()
 
 header['tagline'] = 'Lily was here %s -- automatically converted from ABC' % version
 for f in files: