]> git.donarmstrong.com Git - lilypond.git/blob - scripts/mup2ly.py
release: 1.3.92
[lilypond.git] / scripts / mup2ly.py
1 #!@PYTHON@
2
3 # mup-to-ly.py -- 
4
5 # source file of the GNU LilyPond music typesetter
6
7 # (c) 1998, 1999 Jan Nieuwenhuizen <janneke@gnu.org>
8
9 # TODO: regex -> re.
10
11 name = 'mup2ly'
12 version = '0.1'
13
14 import os
15 import sys
16
17 import getopt
18 from string import *
19 import regex
20 import regsub
21 import time
22
23 def program_id ():
24     return name + ' version ' + version;
25
26 def identify ():
27     sys.stdout.write (program_id () + '\n')
28
29 def help ():
30     sys.stdout.write ("Usage: %s [options] [files]\n"
31                       "Convert mup to ly\n\n"
32                       + "Options:\n"
33                       + "  -h, --help             print this help\n"
34                       % (program_name)
35                       )
36     sys.exit (0)
37
38 identify ()
39 (options, files) = getopt.getopt (
40     sys.argv[1:], 'hp:', ['help', 'package'])
41 for opt in options:
42     o = opt[0]
43     a = opt[1]
44     if o== '--help' or o == '-h':
45         help ()
46     elif o == '-p' or o == '--package':
47         topdir = a
48     else:
49         print o
50         raise getopt.error
51
52 def gulp_file (f):
53         sys.stderr.write ('[%s' % f)
54         try:
55                 i = open (f)
56                 i.seek (0, 2)
57                 n = i.tell ()
58                 i.seek (0,0)
59         except:
60                 sys.stderr.write ('can\'t open file %s\n ' % f)
61                 return ''
62         s = i.read (n)
63         sys.stderr.write (']')
64         if len (s) <= 0:
65                 sys.stderr.write ('gulped empty file: %s\n'% f)
66         return s
67
68 def line_to_ly (s):
69         notes = ""
70         o = 0
71         i = regex.search (";", s)
72         last_name = "c"
73         last_duration = "4"
74         while i >= 0:
75                 note = s[o:o+i]
76                 o = o + i
77                 i = regex.search (";", s[o+1:])
78                 if i >= 0 :
79                         o = o + 1
80                 name = regsub.gsub ("[0-9<>\.&]*", "", note)
81                 duration = regsub.gsub ("[a-z+<>#+&\-]*", "", note)
82                 duration = regsub.gsub (" ", "", duration)
83                 if name:
84                         last_name = name
85                 else:
86                         name = last_name
87                 name = lstrip (name)
88                 name = rstrip (name)
89                 if name == "ms":
90                         name = "s"
91                         duration = 1
92                 if duration:
93                         last_duration = duration
94                 else:
95                         duration = last_duration
96                 name = regsub.sub ("#", "is", name)
97                 name = regsub.sub ("+", "'", name)
98                 name = regsub.sub ("-", ",", name)
99                 #name = regsub.sub ("ms", "s1", name)
100                 notes = notes + " %s%s" % (name, duration)
101         return notes
102
103 def get_voice (staff, s, staffs):
104         voice = len (staffs[staff-1]) + 1
105         tag = "^%d [0-9-]*%d[0-9-]*:" % (staff, voice)
106         notes = ""
107         o = 0
108         i = regex.search (tag, s)
109         while i >= 0:
110                 o = o + i
111                 n = regex.search ("$", s[o:])
112                 line = s[o:o+n]
113                 line = regsub.sub (tag, "", line)
114                 line = line_to_ly (line)
115                 notes = notes + line
116                 i = regex.search (tag, s[o+n:])
117                 if i >= 0:
118                         i = i + n
119         if notes != "":
120                 sys.stderr.write ('%d ' % voice)
121                 staffs[staff-1].append (notes)
122         return notes != ""
123
124 def get_staff (s, staffs):
125         staff=len (staffs)
126         i=1
127         sys.stderr.write ('Staff %d ( ' % staff)
128         while i: 
129                 i = get_voice (staff, s, staffs)
130                 if not i:
131                         sys.stderr.write (')\n')
132                         staffs.append ([])
133                         staff = staff + 1
134                         sys.stderr.write ('Staff %d ( ' % staff)
135                         i = get_voice (staff, s, staffs)
136                         if not i:
137                                 del staffs[staff-1]
138         return 0
139         
140 staffs=[[]]
141 mup=files[0]
142 ly = os.path.basename (os.path.splitext (mup)[0]) + ".ly"
143 s = gulp_file (mup)
144 sys.stderr.write ('\n')
145 i=1
146 while i:
147         i=get_staff (s, staffs)
148 sys.stderr.write ('\n')
149 sys.stderr.write ('Ly output to: %s...' % ly)
150 lyfile = open (ly, "w")
151 for i in range (len (staffs)):
152         for v in range (len (staffs[i])):
153                 lyfile.write ("$staff%d_voice_%d = \\notes {\n %s\n}\n\n" % (i+1, v+1, staffs[i][v]))
154 lyfile.write ("\\score{\n")
155 lyfile.write ("\\notes <\n")
156 for i in range (len (staffs)):
157         lyfile.write ("\\context Staff=staff%s <\n" % chr(ord('A')+i))
158         for v in range (len (staffs[i])):
159                 lyfile.write ("{ \\$staff%d_voice_%d } " % (i+1, v+1))
160         lyfile.write ("\n>\n")
161 lyfile.write (">\n")
162 lyfile.write ("\n}")
163 lyfile.close ()
164 sys.stderr.write ('\n')