if re.search ('\\\\multi', str):
sys.stderr.write ('\n')
sys.stderr.write (NOT_SMART % "\\multi")
+ sys.stderr.write ('\n')
return str
conversions.append (((0,1,9), conv, '\\header { key = concat + with + operator }'))
if re.search ('\\\\header', str):
sys.stderr.write ('\n')
sys.stderr.write (NOT_SMART % "new \\header format")
+ sys.stderr.write ('\n')
return str
conversions.append (((1,0,2), conv, '\\header { key = concat + with + operator }'))
if re.search ('[a-zA-Z]+ = *\\translator',str):
sys.stderr.write ('\n')
sys.stderr.write (NOT_SMART % "\\translator syntax")
+ sys.stderr.write ('\n')
# raise FatalConversionError ()
return str
if re.search ('\\\\repeat',str):
sys.stderr.write ('\n')
sys.stderr.write (NOT_SMART % "\\repeat")
+ sys.stderr.write ('\n')
# raise FatalConversionError ()
return str
if re.search ('\\\\repetitions',str):
sys.stderr.write ('\n')
sys.stderr.write (NOT_SMART % "\\repetitions")
+ sys.stderr.write ('\n')
# raise FatalConversionError ()
return str
if re.search ('\\\\notenames',str):
sys.stderr.write ('\n')
sys.stderr.write (NOT_SMART % "new \\notenames format")
+ sys.stderr.write ('\n')
return str
conversions.append (((1,3,38), conv, '\musicalpitch { a b c } -> #\'(a b c)'))
if re.search ('\\[:',str):
sys.stderr.write ('\n')
sys.stderr.write (NOT_SMART % "new tremolo format")
+ sys.stderr.write ('\n')
return str
conversions.append (((1,3,41), conv,
if re.search ('\\\\keysignature', str):
sys.stderr.write ('\n')
sys.stderr.write (NOT_SMART % "new tremolo format")
+ sys.stderr.write ('\n')
return str
if re.search ('\\\\textscript "[^"]* *"[^"]*"', str):
sys.stderr.write ('\n')
sys.stderr.write (NOT_SMART % "new \\textscript markup text")
+ sys.stderr.write ('\n')
str = re.sub ('\\textscript +("[^"]*")', '\\textscript #\\1', str)
and re.search ('automaticMelismata', str) == None:
sys.stderr.write ('\n')
sys.stderr.write (NOT_SMART % "automaticMelismata; turned on by default since 1.5.67.")
+ sys.stderr.write ('\n')
raise FatalConversionError ()
return str
str = re.sub (r'@ACCENT@', '>', str)
return str
+ markup_start = re.compile(r"([-^_]|\\mark)\s*(#\s*'\s*)\(")
+ musicglyph = re.compile(r"\(\s*music\b")
+ columns = re.compile(r"\(\s*columns\b")
+ submarkup_start = re.compile(r"\(\s*([a-zA-Z]+)")
+ leftpar = re.compile(r"\(")
+ rightpar = re.compile(r"\)")
+
def text_markup (str):
- str = re.sub (r"""([-_^]) *# *' *\( *music *(\"[^"]*\") *\)""",
- r"\1\\markup { \\musicglyph #\2 }", str)
- str = re.sub (r"""([-_^]) *# *' *\( *([a-z]+) *([^()]*)\)""",
- r"\1\\markup { \\\2 \3 }", str)
- str = re.sub (r"""\\mark *# *' *\( *music *(\"[^"]*\") *\)""",
- r"\\mark \\markup { \\musicglyph #\1 }", str)
- str = re.sub (r"""\\mark *# *' *\( *([a-z]+) *([^()]*)\)""",
- r"\\mark \\markup { \\\1 \2 }", str)
- return str
+ result = ''
+ # Find the beginning of each markup:
+ match = markup_start.search (str)
+ while match:
+ result = result + str[:match.end (1)] + " \markup"
+ str = str[match.end( 2):]
+ # Count matching parentheses to find the end of the
+ # current markup:
+ nesting_level = 0
+ pars = re.finditer(r"[()]",str)
+ for par in pars:
+ if par.group () == '(':
+ nesting_level = nesting_level + 1
+ else:
+ nesting_level = nesting_level - 1
+ if nesting_level == 0:
+ markup_end = par.end ()
+ break
+ # The full markup in old syntax:
+ markup = str[:markup_end]
+ # Modify to new syntax:
+ markup = musicglyph.sub (r"{\\musicglyph", markup)
+ markup = columns.sub (r"{", markup)
+ markup = submarkup_start.sub (r"{\\\1", markup)
+ markup = leftpar.sub ("{", markup)
+ markup = rightpar.sub ("}", markup)
+
+ result = result + markup
+ # Find next markup
+ str = str[markup_end:]
+ match = markup_start.search(str)
+ result = result + str
+ return result
def articulation_substitute (str):
- str = re.sub (r"""([^-])\[ *([a-z]+[,']*[!?]?[0-9:]*\.*)""",
+ str = re.sub (r"""([^-])\[ *(\\?\)?[a-z]+[,']*[!?]?[0-9:]*\.*)""",
r"\1 \2[", str)
str = re.sub (r"""([^-])\\\) *([a-z]+[,']*[!?]?[0-9:]*\.*)""",
r"\1 \2\\)", str)
r"\1 \2\\!", str)
return str
+ string_or_scheme = re.compile ('("(?:[^"\\\\]|\\\\.)*")|(#\\s*\'?\\s*\\()')
+
+ # Only apply articulation_substitute () outside strings and
+ # Scheme expressions:
+ def smarter_articulation_subst (str):
+ result = ''
+ # Find the beginning of next string or Scheme expr.:
+ match = string_or_scheme.search (str)
+ while match:
+ # Convert the preceding LilyPond code:
+ previous_chunk = str[:match.start()]
+ result = result + articulation_substitute (previous_chunk)
+ if match.group (1): # Found a string
+ # Copy the string to output:
+ result = result + match.group (1)
+ str = str[match.end(1):]
+ else: # Found a Scheme expression. Count
+ # matching parentheses to find its end
+ str = str[match.start ():]
+ nesting_level = 0
+ pars = re.finditer(r"[()]",str)
+ for par in pars:
+ if par.group () == '(':
+ nesting_level = nesting_level + 1
+ else:
+ nesting_level = nesting_level - 1
+ if nesting_level == 0:
+ scheme_end = par.end ()
+ break
+ # Copy the Scheme expression to output:
+ result = result + str[:scheme_end]
+ str = str[scheme_end:]
+ # Find next string or Scheme expression:
+ match = string_or_scheme.search (str)
+ # Convert the remainder of the file
+ result = result + articulation_substitute (str)
+ return result
+
def conv_relative(str):
if re.search (r"\\relative", str):
str= "#(ly:set-option 'old-relative)\n" + str
str = sub_chords (str)
str = text_markup (str)
- str = articulation_substitute (str)
+ str = smarter_articulation_subst (str)
str = re.sub ("@SCM_EOL@", "#'()", str)
return str
sys.stderr.write (NOT_SMART % "\\pitch")
sys.stderr.write ('\n')
sys.stderr.write ("Use Scheme code to construct arbitrary note events.")
+ sys.stderr.write ('\n')
raise FatalConversionError ()
sys.stderr.write (NOT_SMART % "ly:paper-get-variable")
sys.stderr.write ('\n')
sys.stderr.write ('use (ly:paper-lookup (ly:grob-paper ))')
+ sys.stderr.write ('\n')
raise FatalConversionError ()
str = re.sub (r'\\defaultAccidentals', "#(set-accidental-style 'default)", str)
str = re.sub (r'\\applymusic\s*#notes-to-clusters',
'\\makeClusters', str)
- str = re.sub (r'pagenumber\s*=', 'firstpagenumber', str)
+ str = re.sub (r'pagenumber\s*=', 'firstpagenumber = ', str)
return str
conversions.append (((2, 3, 12), conv,
conversions.append (((2, 5, 18),
conv,
'ly:warn -> ly:warning'))
+def conv (str):
+ if re.search ("(override-|revert-)auto-beam-setting", str)\
+ or re.search ("autoBeamSettings", str):
+ sys.stderr.write ('\n')
+ sys.stderr.write (NOT_SMART % "auto beam settings")
+ sys.stderr.write ('\n')
+ sys.stderr.write ('''
+Auto beam settings must now specify each interesting moment in a measure
+explicitely; 1/4 is no longer multiplied to cover moments 1/2 and 3/4 too.
+''')
+ sys.stderr.write (UPDATE_MANUALLY)
+ sys.stderr.write ('\n')
+ raise FatalConversionError ()
+ return str
+
+conversions.append (((2, 5, 21),
+ conv,
+ 'warn about auto beam settings'))
################################
# END OF CONVERSIONS
try:
for x in conv_list:
sys.stderr.write (tup_to_str (x[0]))
- str = x[1] (str)
- last_conversion = x[0]
if x != conv_list[-1]:
sys.stderr.write (', ')
+ str = x[1] (str)
+ last_conversion = x[0]
except FatalConversionError:
sys.stderr.write (_ ("%s: error while converting") \
if infile_name:
- infile = open (infile_name,'r')
+ infile = open (infile_name, 'r')
else:
infile = sys.stdin
if f == '-':
f = ''
elif not os.path.isfile (f):
+ sys.stderr.write ('\n')
+ sys.stderr.write (_ ("can't open file: `%s'") % f)
+ sys.stderr.write ('\n')
+ if len (files) == 1:
+ sys.exit (1)
continue
try:
do_one_file (f)