]> git.donarmstrong.com Git - lilypond.git/blobdiff - scripts/abc2ly.py
(leftb): bugfix.
[lilypond.git] / scripts / abc2ly.py
index 206d573c3473017ee1c113cc6aee961f8ee38119..8029dbea8f222ce93ab42137e46cc72a8939cef1 100644 (file)
@@ -1,5 +1,5 @@
 #!@PYTHON@
-
+# -*- coding: utf-8 -*-
 # once upon a rainy monday afternoon.
 #
 #   ...
@@ -102,7 +102,6 @@ nobarlines = 0
 global_key = [0] * 7                   # UGH
 names = ["One", "Two", "Three"]
 DIGITS='0123456789'
-alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZ"  
 HSPACE=' \t'
 midi_specs = ''
 
@@ -112,6 +111,9 @@ def error (msg):
        if strict:
                sys.exit (1)
        
+
+def alphabet (i):
+       return chr (i + ord('A'))
        
 def check_clef(s):
        if not s:
@@ -140,7 +142,7 @@ def check_clef(s):
                s = s[4:]
                state.base_octave = -2
                voices_append ("\\clef bass\n" )
-               return s
+       return s
 
 def select_voice (name, rol):
        if not voice_idx_dict.has_key (name):
@@ -164,12 +166,10 @@ def select_voice (name, rol):
                                elif keyword == "name":
                                        value = re.sub ('\\\\','\\\\\\\\', value)
                                        ## < 2.2
-                                       ##voices_append ("\\property Staff.instrument = %s\n" % value )
                                        voices_append ("\\set Staff.instrument = %s\n" % value )
                                        
                                        __main__.part_names = 1
                                elif keyword == "sname" or keyword == "snm":
-                                       ##voices_append ("\\property Staff.instr = %s\n" % value )
                                        voices_append ("\\set Staff.instr = %s\n" % value )
                else:
                        break
@@ -185,18 +185,17 @@ def dump_header (outf,hdr):
 
 def dump_lyrics (outf):
        if (len(lyrics)):
-               outf.write("\n\\score\n{\n    \\context Lyrics\n    <<\n")
+               outf.write("\n\\score\n{\n \\lyrics\n <<\n")
                for i in range (len (lyrics)):
                        outf.write ( lyrics [i])
                        outf.write ("\n")
-               outf.write("    >>\n    \\paper{}\n}\n")
+               outf.write("    >>\n    \\layout{}\n}\n")
 
 def dump_default_bar (outf):
        """
        Nowadays abc2ly outputs explicits barlines (?)
        """
        ## < 2.2
-       ##outf.write ("\n\\property Score.defaultBarType = \"empty\"\n")
        outf.write ("\n\\set Score.defaultBarType = \"empty\"\n")
 
 
@@ -205,12 +204,12 @@ def dump_slyrics (outf):
        ks.sort ()
        for k in ks:
                if re.match('[1-9]', k):
-                       m = alphabet[string.atoi(k)]
+                       m = alphabet(string.atoi(k))
                else:
                        m = k
                for i in range (len(slyrics[voice_idx_dict[k]])):
-                       l=alphabet[i]
-                       outf.write ("\nwords%sV%s =   {" % (m, l))
+                       l= alphabet(i)
+                       outf.write ("\nwords%sV%s = \lyricmode {" % (m, l))
                        outf.write ("\n" + slyrics [voice_idx_dict[k]][i])
                        outf.write ("\n}")
 
@@ -220,7 +219,7 @@ def dump_voices (outf):
        ks.sort ()
        for k in ks:
                if re.match ('[1-9]', k):
-                       m = alphabet[string.atoi(k)]
+                       m = alphabet(string.atoi(k))
                else:
                        m = k
                outf.write ("\nvoice%s =  {" % m)
@@ -253,7 +252,9 @@ def try_parse_q(a):
                sys.stderr.write("abc2ly: Warning, unable to parse Q specification: %s\n" % a)
         
 def dump_score (outf):
-       outf.write (r"""\score{
+       outf.write (r"""
+
+\score{
          <<
 """)
 
@@ -261,35 +262,30 @@ def dump_score (outf):
        ks.sort ()
        for k in  ks:
                if re.match('[1-9]', k):
-                       m = alphabet[string.atoi(k)]
+                       m = alphabet (string.atoi(k))
                else:
                        m = k
                if k == 'default' and len (voice_idx_dict) > 1:
                        break
-               if len ( slyrics [voice_idx_dict[k]] ):
-                       outf.write ("\n        \\addlyrics")
                outf.write ("\n\t\\context Staff=\"%s\"\n\t{\n" %k ) 
                if k != 'default':
                        outf.write ("\t    \\voicedefault\n")
                outf.write ("\t    \\voice%s " % m)
                outf.write ("\n\t}\n")
-               if len ( slyrics [voice_idx_dict[k]] ):
-                       outf.write ("\n\t\\context Lyrics=\"%s\" \n\t<<\t" % k)
+
+               l = ord( 'A' )
+               for lyrics in slyrics [voice_idx_dict[k]]:
+                       outf.write ("\n\t\\addlyrics { \n")
                        if re.match('[1-9]',k):
-                               m = alphabet[string.atoi(k)]
+                               m = alphabet (string.atoi(k))
                        else:
                                m = k
-                       for i in range (len(slyrics[voice_idx_dict[k]])):
-                               l=alphabet[i]
-                               outf.write("\n\t  { \\words%sV%s }" % ( m, l) )
-                       outf.write ( "\n\t>>\n" )
+
+                       outf.write ( " \\words%sV%s } " % ( m, chr (l)) )
+                       l += 1
+
        outf.write ("\n    >>")
-       outf.write ("\n\t\\paper {\n")
-       if part_names:
-               outf.write ("\t    \\translator \n\t    {\n")
-               outf.write ("\t\t\\StaffContext\n")
-#              outf.write ("\t\t\\consists Staff_margin_engraver\n")
-               outf.write ("\t    }\n")
+       outf.write ("\n\t\\layout {\n")
        outf.write ("\t}\n\t\\midi {%s}\n}\n" % midi_specs)
 
 
@@ -582,8 +578,8 @@ def repeat_prepend():
 
        
 def lyrics_append(a):
-       a = re.sub ( '#', '\\#', a)     # latex does not like naked #'s
-       a = re.sub ( '"', '\\"', a)     # latex does not like naked "'s
+       a = re.sub ('#', '\\#', a)      # latex does not like naked #'s
+       a = re.sub ('"', '\\"', a)      # latex does not like naked "'s
        a = '\t{  "' + a + '" }\n'
        stuff_append (lyrics, current_lyric_idx, a)
 
@@ -635,7 +631,10 @@ def try_parse_header_line (ln, state):
                        if header.has_key('title'):
                                if a:
                                        if len(header['title']):
-                                               header['title'] = header['title'] + '\\\\\\\\' + a
+                                               # the non-ascii character
+                                               # in the string below is a
+                                               # punctuation dash. (TeX ---)
+                                               header['title'] = header['title'] + ' — ' + a
                                        else:
                                                header['subtitle'] = a
                        else:
@@ -644,12 +643,12 @@ def try_parse_header_line (ln, state):
                        if a == 'C':
                                if not state.common_time:
                                        state.common_time = 1
-                                       voices_append ("\\property Staff.TimeSignature \\override #\'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 ("\\property Staff.TimeSignature \\override #\'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)
@@ -1207,7 +1206,7 @@ def try_parse_chord_delims (str, state):
        ch = ''
        if str[:1] ==']':
                str = str[1:]
-               ch = '>'
+               ch = '>>'
 
        end = 0
        while str[:1] ==')':
@@ -1387,6 +1386,10 @@ for f in files:
        sys.stderr.write ('lilypond output to: `%s\'...' % out_filename)
        outf = open (out_filename, 'w')
 
+# don't substitute @VERSION@. We want this to reflect
+# the last version that was verified to work.
+       outf.write ('\\version "2.5.20"\n')
+
 #      dump_global (outf)
        dump_header (outf, header)
        dump_slyrics (outf)