]> git.donarmstrong.com Git - lilypond.git/blob - buildscripts/new-chords.py
(music-descriptions): no length for tempo event.
[lilypond.git] / buildscripts / new-chords.py
1
2 # to nwe chord syntax.  
3 import re
4 import string
5 import sys
6 import getopt
7 import os
8
9
10 def sub_chord (m):
11         str = m.group(1)
12
13         origstr =  '<%s>' % str
14         if re.search (r'\\\\', str):
15                 return origstr
16
17         if re.search (r'\\property', str):
18                 return origstr
19
20         if re.match (r'^\s*\)?\s*\\[a-zA-Z]+', str):
21                 return origstr
22
23         durs = []
24         def sub_durs (m):
25                 durs.append(m.group(2))
26                 return m.group (1)
27
28         str = re.sub ("([a-z]+[,'!? ]*)([0-9.]+)", sub_durs, str)
29         dur_str = ''
30
31         for d in durs:
32                 if dur_str == '':
33                         dur_str = d
34                 if dur_str <> d:
35                         return '<%s>' % m.group (1)
36
37
38         dyns = ['']
39         def sub_dyn_end (m):
40                 dyns.append (' -\!')
41                 return m.group(2)
42
43         str = re.sub (r'(\\!)\s*([a-z]+)', sub_dyn_end, str)
44
45         slur_strs = ['']
46         def sub_slurs(m):
47                 if '-)' not in slur_strs:
48                         slur_strs.append ( '-)')
49                 return m.group(1)
50         def sub_p_slurs(m):
51                 if '-\)' not in slur_strs:
52                         slur_strs.append ( '-\)')
53                 return m.group(1)
54         str = re.sub (r"\)[ ]*([a-z]+)", sub_slurs, str)
55         str = re.sub (r"\\\)[ ]*([a-z]+)", sub_p_slurs, str)
56         def sub_begin_slurs(m):
57                 if '-(' not in slur_strs:
58                         slur_strs.append ( '-(')
59                 return m.group(1)
60         str = re.sub (r"([a-z]+[,'!?0-9 ]*)\(", sub_begin_slurs, str)
61         def sub_begin_p_slurs(m):
62                 if '-\(' not in slur_strs:
63                         slur_strs.append ( '-\(')
64                 return m.group(1)
65
66         str = re.sub (r"([a-z]+[,'!?0-9 ]*)\\\(", sub_begin_p_slurs, str)
67
68         def sub_dyns (m):
69                 s = m.group(0)
70                 if s == '@STARTCRESC@':
71                         slur_strs.append ("-\\<")
72                 elif s == '@STARTDECRESC@':
73                         slur_strs.append ("-\\>")
74                 elif s == r'-?\\!':
75                         slur_strs.append ('-\\!')
76                 return ''
77                 
78         str = re.sub (r'@STARTCRESC@', sub_dyns, str)
79         str = re.sub (r'-?\\!', sub_dyns, str)
80         
81         def sub_articulations (m):
82                 a = m.group(1)
83                 if a not in slur_strs:
84                         slur_strs.append (a)
85                 return ''
86         
87         str = re.sub (r"([_^-]\@ACCENT\@)", sub_articulations, str)
88         str = re.sub (r"([_^-]\\[a-z]+)", sub_articulations, str)
89         str = re.sub (r"([_^-][>_.+|^-])", sub_articulations, str)
90         
91         pslur_strs = ['']
92         def sub_pslurs(m):
93                 slur_strs.append ( ' -\\)')
94                 return m.group(1)
95         str = re.sub (r"\\\)[ ]*([a-z]+)", sub_pslurs, str)
96
97         suffix = string.join (slur_strs, '') + string.join (pslur_strs, '') \
98                  + string.join (dyns, '')
99
100         return '@STARTCHORD@%s@ENDCHORD@%s%s' % (str , dur_str, suffix)
101
102
103
104
105 simend = '}'
106 simstart = "\n\\simultaneous {"
107 chordstart = '<'
108 chordend = '>'
109
110 old_syntax = 1
111
112 if old_syntax:
113         simend = '>'
114         simstart = "<" 
115         chordstart = '<<'
116         chordend = '>>'
117
118
119 marker_str = '%% new-chords-done %%'
120
121 def sub_chords (str):
122         if re.search (marker_str,str):
123                 return str
124         
125         str= re.sub (r'\\<', '@STARTCRESC@', str)
126         str= re.sub (r'\\>', '@STARTDECRESC@', str)
127         str= re.sub (r'([_^-])>', r'\1@ACCENT@', str)
128         str = re.sub ('<([^<>{}]+)>', sub_chord, str)
129
130         str = re.sub ('<([^?])', r'%s\1' % simstart, str)
131         str = re.sub ('>([^?])', r'%s\1' % simend,  str)
132         str = re.sub ('@STARTCRESC@', r'\\<', str)
133         str = re.sub ('@STARTDECRESC@', r'\\>' ,str)
134         str = re.sub (r'\\context *Voice *@STARTCHORD@', '@STARTCHORD@', str)
135         str = re.sub ('@STARTCHORD@', chordstart, str)
136         str = re.sub ('@ENDCHORD@', chordend, str)
137         str = re.sub (r'@ACCENT@', '>', str)
138         return str
139
140 (opts, files)= getopt.getopt( sys.argv[1:], 'e',['edit'])
141 edit = 0
142 for (o,a) in opts:
143         if o == '-e' or o == '--edit':
144                 edit = 1
145
146 for a in files:
147         str = open (a).read()
148         if re.search (marker_str, str):
149                 continue
150
151         sys.stderr.write ("processing %s\n" %a)
152         
153         str = sub_chords (str)  + marker_str + '\n'
154
155         if edit:
156                 open (a + '.NEW', 'w').write (str)
157                 os.rename (a, a + '~')
158                 os.rename (a + '.NEW', a)
159         else:
160                 print str