VocalEasel/mma/util/mma-rm2std.py
Matthias Neeracher f54adbeec5 Update to MMA 1.7
2011-07-26 22:49:39 +00:00

128 lines
2.6 KiB
Python
Executable File

#!/usr/bin/env python
# Convert mma file with roman numeral chords to std.
import sys, os, platform
# setup for the MMA modules.
platform = platform.system()
if platform == 'Windows':
dirlist = ( sys.path[0], "c:/mma", "c:/program files/mma", ".")
else:
dirlist = ( sys.path[0], "/usr/local/share/mma", "/usr/share/mma", '.' )
for d in dirlist:
moddir = os.path.join(d, 'MMA')
if os.path.isdir(moddir):
if not d in sys.path:
sys.path.insert(0, d)
MMAdir = d
break
import MMA.roman
import MMA.keysig
import MMA.gbl as gbl
import MMA.midi
def error(m):
""" Abort on error with message. """
print m
sys.exit(1)
def usage():
""" Print usage message and exit. """
print "Mma-rm2std, (c) Bob van der Poel"
print "Convert a mma file using roman chords to std."
print
sys.exit(1)
##########################
if len(sys.argv[1:]) != 1:
print "mma-rm2std: requires 1 filename argument."
usage()
filename = sys.argv[1]
if filename[0] == '-':
usage()
try:
inpath = open(filename, 'r')
except:
error("Can't access the file '%s'" % filename)
linenum = 1
m = gbl.mtrks[0] = MMA.midi.Mtrk(0)
for l in inpath:
l=l.rstrip()
if l.strip().upper().startswith("KEYSIG"):
t = l
if '//' in t:
t = t[ :t.find('//')]
t=t.split()
MMA.keysig.keySig.set(t[1:])
if l and l[0].isdigit():
# strip off trailing lyric, notes, repeat or comment
eolstuff = ''
s=[]
for d in ("*", "{", "[", '//'):
if l.count(d):
s.append(l.find(d))
if s:
s.sort()
eolstuff = l[s[0]:]
l = l[:s[0]]
l = l.split()
for i in range(1,len(l)):
c=l[i]
if c[0] == '/':
l[i] = " %6s" % c
continue
lead = end = ''
while c[0] in ('+', '-'):
lead += c[0]
c=c[1:]
# strip from right side of chord barre, invert, etc.
s = []
for d in (":", ">", "/", 'z'):
if c.count(d):
s.append(c.find(d))
if s:
s.sort()
end = c[s[0]:]
c = c[:s[0]]
# all we have now is a chord name
if c and c[0] in ("I", "V", "i", "v"):
c=MMA.roman.convert(c)
# reassemble name
c = lead + c + end
l[i] = " %6s" % c
# reassemble line
l.append(eolstuff) # put back comment, lyric, etc.
l = ' '.join(l)
print l