mirror of
https://github.com/microtherion/VocalEasel.git
synced 2024-12-22 11:14:00 +00:00
128 lines
2.6 KiB
Python
128 lines
2.6 KiB
Python
|
#!/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
|