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