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