mirror of
https://github.com/microtherion/VocalEasel.git
synced 2024-12-22 11:14:00 +00:00
merging mma-1.1
This commit is contained in:
parent
52f8c7da38
commit
35300f3344
111
mma/MMA/alloc.py
111
mma/MMA/alloc.py
|
@ -2,7 +2,7 @@
|
|||
# alloc.py
|
||||
|
||||
"""
|
||||
This module is an integeral part of the program
|
||||
This module is an integeral part of the program
|
||||
MMA - Musical Midi Accompaniment.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
|
@ -19,10 +19,10 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bob van der Poel <bvdp@xplornet.com>
|
||||
|
||||
Bob van der Poel <bob@mellowood.ca>
|
||||
|
||||
"""
|
||||
|
||||
|
||||
import MMA.patChord
|
||||
import MMA.patWalk
|
||||
import MMA.patBass
|
||||
|
@ -30,74 +30,77 @@ import MMA.patDrum
|
|||
import MMA.patScale
|
||||
import MMA.patArpeggio
|
||||
import MMA.patSolo
|
||||
import MMA.patAria
|
||||
import gbl
|
||||
from MMA.common import *
|
||||
|
||||
|
||||
trkClasses = {
|
||||
'BASS' : MMA.patBass.Bass,
|
||||
'CHORD' : MMA.patChord.Chord,
|
||||
'ARPEGGIO' : MMA.patArpeggio.Arpeggio,
|
||||
'SCALE' : MMA.patScale.Scale,
|
||||
'DRUM' : MMA.patDrum.Drum,
|
||||
'WALK' : MMA.patWalk.Walk,
|
||||
'MELODY' : MMA.patSolo.Melody,
|
||||
'SOLO' : MMA.patSolo.Solo }
|
||||
'BASS' : MMA.patBass.Bass,
|
||||
'CHORD' : MMA.patChord.Chord,
|
||||
'ARPEGGIO' : MMA.patArpeggio.Arpeggio,
|
||||
'SCALE' : MMA.patScale.Scale,
|
||||
'DRUM' : MMA.patDrum.Drum,
|
||||
'WALK' : MMA.patWalk.Walk,
|
||||
'MELODY' : MMA.patSolo.Melody,
|
||||
'SOLO' : MMA.patSolo.Solo,
|
||||
'ARIA' : MMA.patAria.Aria
|
||||
}
|
||||
|
||||
|
||||
def trackAlloc(name, err):
|
||||
""" Check existence of track and create if possible.
|
||||
""" Check existence of track and create if possible.
|
||||
|
||||
If 'err' is set, the function will 'error out' if
|
||||
it's not possible to create the track. Otherwise,
|
||||
it is content to return without creation taking place.
|
||||
"""
|
||||
If 'err' is set, the function will 'error out' if
|
||||
it's not possible to create the track. Otherwise,
|
||||
it is content to return without creation taking place.
|
||||
"""
|
||||
|
||||
# If the track already exists, just return
|
||||
|
||||
if name in gbl.tnames:
|
||||
return
|
||||
# If the track already exists, just return
|
||||
|
||||
# Get the trackname. Can be just a type, or type-name.
|
||||
|
||||
if '-' in name:
|
||||
base, ext = name.split('-',1)
|
||||
else:
|
||||
ext = None
|
||||
base = name
|
||||
if name in gbl.tnames:
|
||||
return
|
||||
|
||||
# Get the trackname. Can be just a type, or type-name.
|
||||
|
||||
if '-' in name:
|
||||
base, ext = name.split('-',1)
|
||||
else:
|
||||
ext = None
|
||||
base = name
|
||||
|
||||
|
||||
""" See if there is a track class 'base'. If there is, then
|
||||
'f' points to the initialization function for the class.
|
||||
If not, we either error (err==1) or return (err==0).
|
||||
"""
|
||||
""" See if there is a track class 'base'. If there is, then
|
||||
'f' points to the initialization function for the class.
|
||||
If not, we either error (err==1) or return (err==0).
|
||||
"""
|
||||
|
||||
if trkClasses.has_key(base):
|
||||
f = trkClasses[base]
|
||||
else:
|
||||
if err:
|
||||
error("There is no track class '%s' for trackname '%s'" % (base, name) )
|
||||
else:
|
||||
return
|
||||
if trkClasses.has_key(base):
|
||||
f = trkClasses[base]
|
||||
else:
|
||||
if err:
|
||||
error("There is no track class '%s' for trackname '%s'" % (base, name) )
|
||||
else:
|
||||
return
|
||||
|
||||
# Now attempt to allocate the track
|
||||
|
||||
gbl.tnames[name] = newtk = f(name)
|
||||
# Now attempt to allocate the track
|
||||
|
||||
# Set the sequence size of new track
|
||||
|
||||
newtk.setSeqSize()
|
||||
gbl.tnames[name] = newtk = f(name)
|
||||
|
||||
# Update current grooves to reflect new track.
|
||||
|
||||
for slot in gbl.settingsGroove.keys():
|
||||
newtk.saveGroove(slot)
|
||||
# Set the sequence size of new track
|
||||
|
||||
|
||||
if gbl.debug:
|
||||
print "Creating new track", name
|
||||
newtk.setSeqSize()
|
||||
|
||||
# Update current grooves to reflect new track.
|
||||
|
||||
for slot in gbl.settingsGroove.keys():
|
||||
newtk.saveGroove(slot)
|
||||
|
||||
|
||||
if gbl.debug:
|
||||
print "Creating new track", name
|
||||
|
||||
return
|
||||
|
||||
return
|
||||
|
||||
|
||||
|
||||
|
|
294
mma/MMA/auto.py
294
mma/MMA/auto.py
|
@ -19,7 +19,7 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bob van der Poel <bvdp@xplornet.com>
|
||||
Bob van der Poel <bob@mellowood.ca>
|
||||
|
||||
"""
|
||||
|
||||
|
@ -34,7 +34,7 @@ import MMA.parse
|
|||
from MMA.common import *
|
||||
|
||||
grooveDir = {}
|
||||
mmadir = ".mmaDB" # constant, name of the lib database file
|
||||
mmadir = ".mmaDB" # constant, name of the lib database file
|
||||
fileCount = 0
|
||||
grooveCount = 0
|
||||
gdDate = None
|
||||
|
@ -42,161 +42,160 @@ processedFiles = []
|
|||
mkGrooveList = []
|
||||
|
||||
def updateGrooveList(n):
|
||||
""" Called from parse when new grooves are defined in a -g. """
|
||||
""" Called from parse when new grooves are defined in a -g. """
|
||||
|
||||
global mkGrooveList
|
||||
global mkGrooveList
|
||||
|
||||
mkGrooveList.append(n)
|
||||
mkGrooveList.append(n)
|
||||
|
||||
|
||||
def libUpdate():
|
||||
""" Update the mma library database file(s) with -g or -G option.
|
||||
""" Update the mma library database file(s) with -g or -G option.
|
||||
|
||||
This is called from the main program after the initialization
|
||||
and other option parsing. No RETURN.
|
||||
"""
|
||||
This is called from the main program after the initialization
|
||||
and other option parsing. No RETURN.
|
||||
"""
|
||||
|
||||
global fileCount, gdDate, grooveDir, processedfiles
|
||||
global fileCount, gdDate, grooveDir, processedfiles
|
||||
|
||||
print "Creating MMA groove directory database(s). Standby..."
|
||||
print "Creating MMA groove directory database(s). Standby..."
|
||||
|
||||
""" gbl.libPath points to one main directory tree which should include
|
||||
gbl.autoLib (defaults to 'stdlib'). We create a separate .mmaDB
|
||||
file for each directory found in the main tree. IE. if we have the
|
||||
directories stdlib and bvstuff we end up with stdlib/.mmaDB and
|
||||
bvstuff/.mmaDB.
|
||||
""" gbl.libPath points to one main directory tree which should include
|
||||
gbl.autoLib (defaults to 'stdlib'). We create a separate .mmaDB
|
||||
file for each directory found in the main tree. IE. if we have the
|
||||
directories stdlib and bvstuff we end up with stdlib/.mmaDB and
|
||||
bvstuff/.mmaDB.
|
||||
|
||||
"""
|
||||
"""
|
||||
|
||||
for d in os.listdir(gbl.libPath):
|
||||
libpath = os.path.join(gbl.libPath, d)
|
||||
for d in os.listdir(gbl.libPath):
|
||||
libpath = os.path.join(gbl.libPath, d)
|
||||
|
||||
if not os.path.isdir(libpath): # skip files, just process directories
|
||||
continue
|
||||
if not os.path.isdir(libpath): # skip files, just process directories
|
||||
continue
|
||||
|
||||
|
||||
""" Attempt to read existing database
|
||||
There is a flag gbl.makeGrvDefs set to 0, 1, 2
|
||||
0 - there was no -g or -G so we're not here
|
||||
1 - -g - read existing database and update
|
||||
2 - -G - don't read existing, create new
|
||||
"""
|
||||
""" Attempt to read existing database
|
||||
There is a flag gbl.makeGrvDefs set to 0, 1, 2
|
||||
0 - there was no -g or -G so we're not here
|
||||
1 - -g - read existing database and update
|
||||
2 - -G - don't read existing, create new
|
||||
"""
|
||||
|
||||
grooveDir = {}
|
||||
gdDate = None
|
||||
grooveDir = {}
|
||||
gdDate = None
|
||||
|
||||
if gbl.makeGrvDefs == 1:
|
||||
try:
|
||||
infile = os.path.join(libpath, mmadir)
|
||||
f=file(infile, "rb")
|
||||
f.readline() # Read/discard comment line
|
||||
grooveDir = pickle.load(f)
|
||||
f.close()
|
||||
gdDate = os.path.getmtime(infile)
|
||||
except:
|
||||
pass
|
||||
if gbl.makeGrvDefs == 1:
|
||||
try:
|
||||
infile = os.path.join(libpath, mmadir)
|
||||
f=file(infile, "rb")
|
||||
f.readline() # Read/discard comment line
|
||||
grooveDir = pickle.load(f)
|
||||
f.close()
|
||||
gdDate = os.path.getmtime(infile)
|
||||
except:
|
||||
pass
|
||||
|
||||
dolibupdate(libpath, '')
|
||||
dolibupdate(libpath, '')
|
||||
|
||||
# Strip out defs of deleted (not found) files.
|
||||
# Strip out defs of deleted (not found) files.
|
||||
|
||||
for f in grooveDir.keys():
|
||||
if f not in processedFiles:
|
||||
print " Deleting: %s" % f
|
||||
del grooveDir[f]
|
||||
for f in grooveDir.keys():
|
||||
if f not in processedFiles:
|
||||
print " Deleting: %s" % f
|
||||
del grooveDir[f]
|
||||
|
||||
try:
|
||||
outpath = file(os.path.join(libpath, mmadir), 'wb')
|
||||
except:
|
||||
error("Error creating lib-database file '%s'. CRITICAL!"
|
||||
% libpath)
|
||||
try:
|
||||
outpath = file(os.path.join(libpath, mmadir), 'wb')
|
||||
except:
|
||||
error("Error creating lib-database file '%s'. CRITICAL!" % libpath)
|
||||
|
||||
outpath.write("### mmaDB ... AUTOGENERATED BINARY DATA. "
|
||||
"DO NOT EDIT!!!\n")
|
||||
pickle.dump(grooveDir, outpath, pickle.HIGHEST_PROTOCOL )
|
||||
outpath.close()
|
||||
outpath.write("### mmaDB ... AUTOGENERATED BINARY DATA. "
|
||||
"DO NOT EDIT!!!\n")
|
||||
pickle.dump(grooveDir, outpath, pickle.HIGHEST_PROTOCOL )
|
||||
outpath.close()
|
||||
|
||||
print
|
||||
print "Database update complete."
|
||||
print " Files processed: %s" % fileCount
|
||||
print " Total number of grooves: %s" % grooveCount
|
||||
print
|
||||
print "Database update complete."
|
||||
print " Files processed: %s" % fileCount
|
||||
print " Total number of grooves: %s" % grooveCount
|
||||
|
||||
sys.exit(0)
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
def dolibupdate(root, subdir):
|
||||
""" Recursive function to read groove files in a directory. """
|
||||
""" Recursive function to read groove files in a directory. """
|
||||
|
||||
global fileCount, grooveCount, gdDate, grooveDir, processedFiles, mkGrooveList
|
||||
global fileCount, grooveCount, gdDate, grooveDir, processedFiles, mkGrooveList
|
||||
|
||||
if subdir == '.':
|
||||
print "Skipping: '.'"
|
||||
return
|
||||
if subdir == '.':
|
||||
print "Skipping: '.'"
|
||||
return
|
||||
|
||||
if subdir:
|
||||
print " Processing library directory '%s'." % subdir
|
||||
if subdir:
|
||||
print " Processing library directory '%s'." % subdir
|
||||
|
||||
|
||||
""" Get a list of the files in this directory. If the list
|
||||
includes a file called 'MMAIGNORE' the entire directory
|
||||
(and subdirs) is ignored. Otherwise, each file in the
|
||||
directory ending in 'mma' is parsed for groove defs.
|
||||
"""
|
||||
""" Get a list of the files in this directory. If the list
|
||||
includes a file called 'MMAIGNORE' the entire directory
|
||||
(and subdirs) is ignored. Otherwise, each file in the
|
||||
directory ending in 'mma' is parsed for groove defs.
|
||||
"""
|
||||
|
||||
p = os.path.join(root,subdir)
|
||||
dirfiles = os.listdir(p)
|
||||
p = os.path.join(root,subdir)
|
||||
dirfiles = os.listdir(p)
|
||||
|
||||
if "MMAIGNORE" in dirfiles:
|
||||
print "Skipping: %s" % p
|
||||
return
|
||||
if "MMAIGNORE" in dirfiles:
|
||||
print "Skipping: %s" % p
|
||||
return
|
||||
|
||||
for fn in sorted(dirfiles):
|
||||
for fn in sorted(dirfiles):
|
||||
|
||||
# Ignore hidden files and emacs auto-save and dead.
|
||||
# Ignore hidden files and emacs auto-save and dead.
|
||||
|
||||
if fn.startswith('.') or fn.startswith('#'):
|
||||
continue
|
||||
if fn.startswith('.') or fn.startswith('#'):
|
||||
continue
|
||||
|
||||
# Create full path name
|
||||
# Create full path name
|
||||
|
||||
f=os.path.join(root, subdir, fn)
|
||||
f=os.path.join(root, subdir, fn)
|
||||
|
||||
if os.path.isdir(f):
|
||||
dolibupdate(root, os.path.join(subdir,fn)) # recursive!
|
||||
if os.path.isdir(f):
|
||||
dolibupdate(root, os.path.join(subdir,fn)) # recursive!
|
||||
|
||||
elif f.endswith(gbl.ext):
|
||||
ename = os.path.join(subdir, fn)
|
||||
elif f.endswith(gbl.ext):
|
||||
ename = os.path.join(subdir, fn)
|
||||
|
||||
processedFiles.append(ename)
|
||||
processedFiles.append(ename)
|
||||
|
||||
if gdDate and grooveDir.has_key(ename) and \
|
||||
os.path.getmtime(f) < gdDate:
|
||||
print " Existing: %s" % f
|
||||
grooveCount += len(grooveDir[ename])
|
||||
continue
|
||||
if gdDate and grooveDir.has_key(ename) and \
|
||||
os.path.getmtime(f) < gdDate:
|
||||
print " Existing: %s" % f
|
||||
grooveCount += len(grooveDir[ename])
|
||||
continue
|
||||
|
||||
if grooveDir.has_key(ename):
|
||||
print " Updating: %s" % f
|
||||
else:
|
||||
print " Creating: %s" % f
|
||||
mkGrooveList = []
|
||||
gbl.mtrks = {}
|
||||
for c in gbl.midiAssigns.keys():
|
||||
gbl.midiAssigns[c]=[]
|
||||
for a,v in enumerate(gbl.midiAvail):
|
||||
gbl.midiAvail[a]=0
|
||||
gbl.mtrks[0]=MMA.midi.Mtrk(0)
|
||||
gbl.tnames = {}
|
||||
MMA.parse.parseFile(f) # read current file, grab grooves
|
||||
if grooveDir.has_key(ename):
|
||||
print " Updating: %s" % f
|
||||
else:
|
||||
print " Creating: %s" % f
|
||||
mkGrooveList = []
|
||||
gbl.mtrks = {}
|
||||
for c in gbl.midiAssigns.keys():
|
||||
gbl.midiAssigns[c]=[]
|
||||
for a,v in enumerate(gbl.midiAvail):
|
||||
gbl.midiAvail[a]=0
|
||||
gbl.mtrks[0]=MMA.midi.Mtrk(0)
|
||||
gbl.tnames = {}
|
||||
MMA.parse.parseFile(f) # read current file, grab grooves
|
||||
|
||||
fileCount += 1 # just so we can report to user
|
||||
grooveCount += len(mkGrooveList)
|
||||
fileCount += 1 # just so we can report to user
|
||||
grooveCount += len(mkGrooveList)
|
||||
|
||||
grooveDir[ename]=mkGrooveList
|
||||
grooveDir[ename]=mkGrooveList
|
||||
|
||||
else:
|
||||
if not f.endswith(mmadir):
|
||||
print " Ignoring: %s" % f
|
||||
else:
|
||||
if not f.endswith(mmadir):
|
||||
print " Ignoring: %s" % f
|
||||
|
||||
|
||||
|
||||
|
@ -204,52 +203,53 @@ def dolibupdate(root, subdir):
|
|||
|
||||
|
||||
def loadGrooveDir(g):
|
||||
""" Try to auto-load a groove from the library.
|
||||
""" Try to auto-load a groove from the library.
|
||||
|
||||
The compliation of all the MMADIR files is stored in the dict
|
||||
grooveDir{}.
|
||||
The compliation of all the MMADIR files is stored in the dict
|
||||
grooveDir{}.
|
||||
|
||||
Check the main libpath directory for the MMADIR file. The
|
||||
names of the files and corresponding grooves are extracted.
|
||||
This is stored in a dictionary with the filename as the key
|
||||
and a list of grooves as the data.
|
||||
"""
|
||||
Check the main libpath directory for the MMADIR file. The
|
||||
names of the files and corresponding grooves are extracted.
|
||||
This is stored in a dictionary with the filename as the key
|
||||
and a list of grooves as the data.
|
||||
"""
|
||||
|
||||
global grooveDir
|
||||
global grooveDir
|
||||
|
||||
|
||||
""" If the global dict grooveDir is empty we first load the MMADIR info.
|
||||
We're assuming that not much goes wrong here...if we don't find
|
||||
the database we set grooveDir{} to a BS value to avoid future
|
||||
load attempts. The entire load is in a try, which means it either
|
||||
all works, or not ...
|
||||
"""
|
||||
""" If the global dict grooveDir is empty we first load the MMADIR info.
|
||||
We're assuming that not much goes wrong here...if we don't find
|
||||
the database we set grooveDir{} to a BS value to avoid future
|
||||
load attempts. The entire load is in a try, which means it either
|
||||
all works, or not ...
|
||||
"""
|
||||
|
||||
if not grooveDir:
|
||||
try:
|
||||
infile = os.path.join(gbl.libPath, gbl.autoLib, mmadir)
|
||||
f=file(infile, "rb")
|
||||
f.readline() # Read/discard comment line
|
||||
grooveDir = pickle.load(f)
|
||||
f.close()
|
||||
except:
|
||||
grooveDir[0]=''
|
||||
if not grooveDir:
|
||||
try:
|
||||
infile = os.path.join(gbl.libPath, gbl.autoLib, mmadir)
|
||||
f=file(infile, "rb")
|
||||
f.readline() # Read/discard comment line
|
||||
grooveDir = pickle.load(f)
|
||||
f.close()
|
||||
except:
|
||||
grooveDir[0]=''
|
||||
|
||||
|
||||
""" Search the dict for a match. grooveDir{} is a dictionary
|
||||
for lists. Each dictionary key is filename (eg: "lib/rhumba.mma")
|
||||
and the list associated with it is a list of grooves defined
|
||||
in that file. Just a matter of stepping though the dict. and
|
||||
returning the proper filename.
|
||||
""" Search the dict for a match. grooveDir{} is a dictionary
|
||||
for lists. Each dictionary key is filename (eg: "lib/rhumba.mma")
|
||||
and the list associated with it is a list of grooves defined
|
||||
in that file. Just a matter of stepping though the dict. and
|
||||
returning the proper filename.
|
||||
|
||||
RETURN: Lib-Filename if found
|
||||
None if not found
|
||||
"""
|
||||
RETURN: Lib-Filename if found
|
||||
None if not found
|
||||
"""
|
||||
|
||||
for filename, namelist in grooveDir.items():
|
||||
if g in namelist:
|
||||
return filename
|
||||
for filename, namelist in grooveDir.items():
|
||||
if g in namelist:
|
||||
return filename
|
||||
|
||||
return None
|
||||
|
||||
return None
|
||||
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bob van der Poel <bvdp@xplornet.com>
|
||||
Bob van der Poel <bob@mellowood.ca>
|
||||
|
||||
"""
|
||||
|
||||
|
@ -27,69 +27,69 @@ import copy
|
|||
|
||||
|
||||
from MMA.common import *
|
||||
from MMA.chordtable import _chords
|
||||
from MMA.chordtable import chords
|
||||
|
||||
|
||||
|
||||
def defChord(ln):
|
||||
""" Add a new chord type to the _chords{} dict. """
|
||||
""" Add a new chord type to the chords{} dict. """
|
||||
|
||||
emsg="DefChord needs NAME (NOTES) (SCALE)"
|
||||
emsg="DefChord needs NAME (NOTES) (SCALE)"
|
||||
|
||||
# At this point ln is a list. The first item should be
|
||||
# the new chord type name.
|
||||
# At this point ln is a list. The first item should be
|
||||
# the new chord type name.
|
||||
|
||||
if not len(ln):
|
||||
error(emsg)
|
||||
name = ln.pop(0)
|
||||
if name in _chords.keys():
|
||||
warning("Redefining chordtype '%s'." % name)
|
||||
if not len(ln):
|
||||
error(emsg)
|
||||
name = ln.pop(0)
|
||||
if name in chords.keys():
|
||||
warning("Redefining chordtype '%s'" % name)
|
||||
|
||||
if '/' in name:
|
||||
error("A slash in not permitted in chord type name")
|
||||
if '/' in name:
|
||||
error("A slash in not permitted in chord type name")
|
||||
|
||||
if '>' in name:
|
||||
error("A '>' in not permitted in chord type name")
|
||||
if '>' in name:
|
||||
error("A '>' in not permitted in chord type name")
|
||||
|
||||
ln=pextract(''.join(ln), '(', ')')
|
||||
ln=pextract(''.join(ln), '(', ')')
|
||||
|
||||
if ln[0] or len(ln[1])!=2:
|
||||
error(emsg)
|
||||
if ln[0] or len(ln[1])!=2:
|
||||
error(emsg)
|
||||
|
||||
notes=ln[1][0].split(',')
|
||||
if len(notes) < 2 or len(notes)>8:
|
||||
error("There must be 2..8 notes in a chord, not '%s'." % len(note))
|
||||
notes.sort()
|
||||
for i,v in enumerate(notes):
|
||||
v=stoi(v, "Note offsets in chord must be integers, not '%s'." % v)
|
||||
if v<0 or v>24:
|
||||
error("Note offsets in chord must be 0..24, not '%s'." % v)
|
||||
notes[i]=v
|
||||
notes=ln[1][0].split(',')
|
||||
if len(notes) < 2 or len(notes)>8:
|
||||
error("There must be 2..8 notes in a chord, not '%s'" % len(note))
|
||||
notes.sort()
|
||||
for i,v in enumerate(notes):
|
||||
v=stoi(v, "Note offsets in chord must be integers, not '%s'" % v)
|
||||
if v<0 or v>24:
|
||||
error("Note offsets in chord must be 0..24, not '%s'" % v)
|
||||
notes[i]=v
|
||||
|
||||
scale=ln[1][1].split(',')
|
||||
if len(scale) != 7:
|
||||
error("There must be 7 offsets in chord scale, not '%s'" % len(scale))
|
||||
scale.sort()
|
||||
for i,v in enumerate(scale):
|
||||
v=stoi(v, "Scale offsets in chord must be integers, not '%s'." % v)
|
||||
if v<0 or v>24:
|
||||
error("Scale offsets in chord must be 0..24, not '%s'." % v)
|
||||
scale[i]=v
|
||||
scale=ln[1][1].split(',')
|
||||
if len(scale) != 7:
|
||||
error("There must be 7 offsets in chord scale, not '%s'" % len(scale))
|
||||
scale.sort()
|
||||
for i,v in enumerate(scale):
|
||||
v=stoi(v, "Scale offsets in chord must be integers, not '%s'" % v)
|
||||
if v<0 or v>24:
|
||||
error("Scale offsets in chord must be 0..24, not '%s'" % v)
|
||||
scale[i]=v
|
||||
|
||||
|
||||
_chords[name] = ( notes, scale, "User Defined")
|
||||
chords[name] = ( notes, scale, "User Defined")
|
||||
|
||||
if gbl.debug:
|
||||
print "ChordType '%s', %s" % (name, _chords[name])
|
||||
if gbl.debug:
|
||||
print "ChordType '%s', %s" % (name, chords[name])
|
||||
|
||||
|
||||
def printChord(ln):
|
||||
""" Display the note/scale/def for chord(s). """
|
||||
""" Display the note/scale/def for chord(s). """
|
||||
|
||||
for c in ln:
|
||||
if not _chords.has_key(c):
|
||||
error("Chord '%s' is unknown" % c)
|
||||
print c, ':', _chords[c][0], _chords[c][1], _chords[c][2]
|
||||
for c in ln:
|
||||
if not chords.has_key(c):
|
||||
error("Chord '%s' is unknown" % c)
|
||||
print c, ':', chords[c][0], chords[c][1], chords[c][2]
|
||||
|
||||
|
||||
"""
|
||||
|
@ -100,53 +100,53 @@ that with C as a midpoint we shift left for G/A/B and right for D/E/F.
|
|||
Should the shifts take in account the current key signature?
|
||||
"""
|
||||
|
||||
_chordAdjust = {
|
||||
'Gb':-6,
|
||||
'G' :-5,
|
||||
'G#':-4, 'Ab':-4,
|
||||
'A' :-3,
|
||||
'A#':-2, 'Bb':-2,
|
||||
'B' :-1, 'Cb':-1,
|
||||
'B#': 0, 'C' : 0,
|
||||
'C#': 1, 'Db': 1,
|
||||
'D' : 2,
|
||||
'D#': 3, 'Eb': 3,
|
||||
'E' : 4, 'Fb': 4,
|
||||
'E#': 5, 'F' : 5,
|
||||
'F#': 6 }
|
||||
cdAdjust = {
|
||||
'Gb':-6,
|
||||
'G' :-5,
|
||||
'G#':-4, 'Ab':-4,
|
||||
'A' :-3,
|
||||
'A#':-2, 'Bb':-2,
|
||||
'B' :-1, 'Cb':-1,
|
||||
'B#': 0, 'C' : 0,
|
||||
'C#': 1, 'Db': 1,
|
||||
'D' : 2,
|
||||
'D#': 3, 'Eb': 3,
|
||||
'E' : 4, 'Fb': 4,
|
||||
'E#': 5, 'F' : 5,
|
||||
'F#': 6 }
|
||||
|
||||
def chordAdjust(ln):
|
||||
""" Adjust the chord point up/down one octave. """
|
||||
""" Adjust the chord point up/down one octave. """
|
||||
|
||||
if not ln:
|
||||
error("ChordAdjust: Needs at least one argument.")
|
||||
if not ln:
|
||||
error("ChordAdjust: Needs at least one argument")
|
||||
|
||||
for l in ln:
|
||||
try:
|
||||
pitch, octave = l.split('=')
|
||||
except:
|
||||
error("Each arg must contain an '=', not '%s'." % l)
|
||||
for l in ln:
|
||||
try:
|
||||
pitch, octave = l.split('=')
|
||||
except:
|
||||
error("Each arg must contain an '=', not '%s'" % l)
|
||||
|
||||
if pitch not in _chordAdjust:
|
||||
error("ChordAdjust: '%s' is not a valid pitch." % pitch)
|
||||
if pitch not in cdAdjust:
|
||||
error("ChordAdjust: '%s' is not a valid pitch" % pitch)
|
||||
|
||||
octave = stoi(octave, "ChordAdjust: expecting integer, not '%s'." % octave)
|
||||
octave = stoi(octave, "ChordAdjust: expecting integer, not '%s'" % octave)
|
||||
|
||||
p=_chordAdjust[pitch]
|
||||
if octave == 0:
|
||||
if p < -6:
|
||||
_chordAdjust[pitch] += 12
|
||||
elif p > 6:
|
||||
_chordAdjust[pitch]-=12
|
||||
p=cdAdjust[pitch]
|
||||
if octave == 0:
|
||||
if p < -6:
|
||||
cdAdjust[pitch] += 12
|
||||
elif p > 6:
|
||||
cdAdjust[pitch]-=12
|
||||
|
||||
elif octave == -1 and p <= 6 and p >= -6:
|
||||
_chordAdjust[pitch] -= 12
|
||||
elif octave == -1 and p <= 6 and p >= -6:
|
||||
cdAdjust[pitch] -= 12
|
||||
|
||||
elif octave == 1 and p <= 6 and p >= -6:
|
||||
_chordAdjust[pitch] += 12
|
||||
elif octave == 1 and p <= 6 and p >= -6:
|
||||
cdAdjust[pitch] += 12
|
||||
|
||||
else:
|
||||
error("ChordAdjust: '%s' is not a valid octave. Use 1, 0 or -1." % octave)
|
||||
else:
|
||||
error("ChordAdjust: '%s' is not a valid octave. Use 1, 0 or -1" % octave)
|
||||
|
||||
|
||||
|
||||
|
@ -155,348 +155,330 @@ def chordAdjust(ln):
|
|||
###############################
|
||||
|
||||
class ChordNotes:
|
||||
""" The Chord class creates and manipulates chords for MMA. The
|
||||
class is initialized with a call with the chord name. Eg:
|
||||
""" The Chord class creates and manipulates chords for MMA. The
|
||||
class is initialized with a call with the chord name. Eg:
|
||||
|
||||
ch = ChordNotes("Am")
|
||||
ch = ChordNotes("Am")
|
||||
|
||||
The following methods and variables are defined:
|
||||
The following methods and variables are defined:
|
||||
|
||||
noteList - the notes in the chord as a list. The "Am"
|
||||
would be [9, 12, 16].
|
||||
noteList - the notes in the chord as a list. The "Am"
|
||||
would be [9, 12, 16].
|
||||
|
||||
noteListLen - length of noteList.
|
||||
noteListLen - length of noteList.
|
||||
|
||||
tonic - the tonic of the chord ("Am" would be "A").
|
||||
tonic - the tonic of the chord ("Am" would be "A").
|
||||
|
||||
chordType - the type of chord ("Am" would be "m").
|
||||
chordType - the type of chord ("Am" would be "m").
|
||||
|
||||
rootNote - the root note of the chord ("Am" would be a 9).
|
||||
rootNote - the root note of the chord ("Am" would be a 9).
|
||||
|
||||
bnoteList - the original chord notes, bypassing any
|
||||
invert(), etc. mangling.
|
||||
bnoteList - the original chord notes, bypassing any
|
||||
invert(), etc. mangling.
|
||||
|
||||
scaleList - a 7 note list representing a scale similar to
|
||||
the chord.
|
||||
scaleList - a 7 note list representing a scale similar to
|
||||
the chord.
|
||||
|
||||
reset() - resets noteList to the original chord notes.
|
||||
This is useful to restore the original after
|
||||
chord note mangling by invert(), etc. without having to
|
||||
create a new chord object.
|
||||
reset() - resets noteList to the original chord notes.
|
||||
This is useful to restore the original after
|
||||
chord note mangling by invert(), etc. without having to
|
||||
create a new chord object.
|
||||
|
||||
|
||||
invert(n) - Inverts a chord by 'n'. This is done inplace and
|
||||
returns None. 'n' can have any integer value, but -1 and 1
|
||||
are most common. The order of the notes is not changed. Eg:
|
||||
invert(n) - Inverts a chord by 'n'. This is done inplace and
|
||||
returns None. 'n' can have any integer value, but -1 and 1
|
||||
are most common. The order of the notes is not changed. Eg:
|
||||
|
||||
ch=Chord('Am')
|
||||
ch.noteList == [9, 12, 16]
|
||||
ch.invert(1)
|
||||
ch.noteList = [21, 12, 16]
|
||||
ch=Chord('Am')
|
||||
ch.noteList == [9, 12, 16]
|
||||
ch.invert(1)
|
||||
ch.noteList = [21, 12, 16]
|
||||
|
||||
compress() - Compresses the range of a chord to a single octave. This is
|
||||
done inplace and return None. Eg:
|
||||
compress() - Compresses the range of a chord to a single octave. This is
|
||||
done inplace and return None. Eg:
|
||||
|
||||
ch=Chord("A13")
|
||||
ch.noteList == [1, 5, 8, 11, 21]
|
||||
ch.compress()
|
||||
ch.noteList == [1, 5, 8, 11, 10 ]
|
||||
ch=Chord("A13")
|
||||
ch.noteList == [1, 5, 8, 11, 21]
|
||||
ch.compress()
|
||||
ch.noteList == [1, 5, 8, 11, 10 ]
|
||||
|
||||
|
||||
limit(n) - Limits the range of the chord 'n' notes. Done inplace
|
||||
and returns None. Eg:
|
||||
limit(n) - Limits the range of the chord 'n' notes. Done inplace
|
||||
and returns None. Eg:
|
||||
|
||||
ch=Chord("CM711")
|
||||
ch.noteList == [0, 4, 7, 11, 15, 18]
|
||||
ch.limit(4)
|
||||
ch.noteList == [0, 4, 7, 11]
|
||||
ch=Chord("CM711")
|
||||
ch.noteList == [0, 4, 7, 11, 15, 18]
|
||||
ch.limit(4)
|
||||
ch.noteList == [0, 4, 7, 11]
|
||||
|
||||
|
||||
"""
|
||||
"""
|
||||
|
||||
|
||||
#################
|
||||
### Functions ###
|
||||
#################
|
||||
#################
|
||||
### Functions ###
|
||||
#################
|
||||
|
||||
def __init__(self, name, line=''):
|
||||
""" Create a chord object. Pass the chord name as the only arg.
|
||||
def __init__(self, name, line=''):
|
||||
""" Create a chord object. Pass the chord name as the only arg.
|
||||
|
||||
NOTE: Chord names ARE case-sensitive!
|
||||
NOTE: Chord names ARE case-sensitive!
|
||||
|
||||
The chord NAME at this point is something like 'Cm' or 'A#7'.
|
||||
Split off the tonic and the type.
|
||||
If the 2nd char is '#' or 'b' we have a 2 char tonic,
|
||||
otherwise, it's the first char only.
|
||||
The chord NAME at this point is something like 'Cm' or 'A#7'.
|
||||
Split off the tonic and the type.
|
||||
If the 2nd char is '#' or 'b' we have a 2 char tonic,
|
||||
otherwise, it's the first char only.
|
||||
|
||||
A chord can start with a single '+' or '-'. This moves
|
||||
the entire chord and scale up/down an octave.
|
||||
A chord can start with a single '+' or '-'. This moves
|
||||
the entire chord and scale up/down an octave.
|
||||
|
||||
Note pythonic trick: By using ranges like [1:2] we
|
||||
avoid runtime errors on too-short strings. If a 1 char
|
||||
string, name[1] is an error; name[1:2] just returns None.
|
||||
Note pythonic trick: By using ranges like [1:2] we
|
||||
avoid runtime errors on too-short strings. If a 1 char
|
||||
string, name[1] is an error; name[1:2] just returns None.
|
||||
|
||||
Further note: I have tried to enable caching of the generated
|
||||
chords, but found no speed difference. So, to make life simpler
|
||||
I've decided to generate a new object each time.
|
||||
Further note: I have tried to enable caching of the generated
|
||||
chords, but found no speed difference. So, to make life simpler
|
||||
I've decided to generate a new object each time.
|
||||
|
||||
"""
|
||||
"""
|
||||
|
||||
slash = None
|
||||
octave = 0
|
||||
inversion = 0
|
||||
slash = None
|
||||
octave = 0
|
||||
inversion = 0
|
||||
|
||||
if name == 'z':
|
||||
self.tonic = self.chordType = None
|
||||
self.noteListLen = 0
|
||||
self.notesList = self.bnoteList = []
|
||||
return
|
||||
if name == 'z':
|
||||
self.tonic = self.chordType = None
|
||||
self.noteListLen = 0
|
||||
self.notesList = self.bnoteList = []
|
||||
return
|
||||
|
||||
if '/' in name and '>' in name:
|
||||
error("You cannot use both an inversion and a slash in the same chord.")
|
||||
if '/' in name and '>' in name:
|
||||
error("You cannot use both an inversion and a slash in the same chord")
|
||||
|
||||
if '>' in name:
|
||||
name, inversion = name.split('>', 1)
|
||||
inversion = stoi(inversion, "Expecting interger after '>'.")
|
||||
if inversion < -5 or inversion > 5:
|
||||
error("Chord inversions limited to -5 to 5 (more seems silly).")
|
||||
if '>' in name:
|
||||
name, inversion = name.split('>', 1)
|
||||
inversion = stoi(inversion, "Expecting interger after '>'")
|
||||
if inversion < -5 or inversion > 5:
|
||||
error("Chord inversions limited to -5 to 5 (more seems silly)")
|
||||
|
||||
if name.startswith('-'):
|
||||
name = name[1:]
|
||||
octave = -12
|
||||
if name.startswith('-'):
|
||||
name = name[1:]
|
||||
octave = -12
|
||||
|
||||
if name.startswith('+'):
|
||||
name = name[1:]
|
||||
octave = 12
|
||||
if name.startswith('+'):
|
||||
name = name[1:]
|
||||
octave = 12
|
||||
|
||||
name = name.replace('&', 'b')
|
||||
name = name.replace('&', 'b')
|
||||
|
||||
# Strip off the slash part of the chord. Use later
|
||||
# to do proper inversion.
|
||||
# Strip off the slash part of the chord. Use later
|
||||
# to do proper inversion.
|
||||
|
||||
if name.find('/') > 0:
|
||||
name, slash = name.split('/')
|
||||
if name.find('/') > 0:
|
||||
name, slash = name.split('/')
|
||||
|
||||
if name[1:2] in ( '#b' ):
|
||||
tonic = name[0:2]
|
||||
ctype = name[2:]
|
||||
else:
|
||||
tonic = name[0:1]
|
||||
ctype = name[1:]
|
||||
if name[1:2] in ( '#b' ):
|
||||
tonic = name[0:2]
|
||||
ctype = name[2:]
|
||||
else:
|
||||
tonic = name[0:1]
|
||||
ctype = name[1:]
|
||||
|
||||
if not ctype: # If no type, make it a Major
|
||||
ctype='M'
|
||||
if not ctype: # If no type, make it a Major
|
||||
ctype='M'
|
||||
|
||||
try:
|
||||
notes = _chords[ctype][0]
|
||||
adj = _chordAdjust[tonic] + octave
|
||||
except:
|
||||
error( "Illegal/Unknown chord name: '%s'." % name )
|
||||
try:
|
||||
notes = chords[ctype][0]
|
||||
adj = cdAdjust[tonic] + octave
|
||||
except:
|
||||
error( "Illegal/Unknown chord name: '%s'" % name )
|
||||
|
||||
self.noteList = [ x + adj for x in notes ]
|
||||
self.bnoteList = tuple(self.noteList)
|
||||
self.scaleList = tuple([ x + adj for x in _chords[ctype][1] ])
|
||||
self.chordType = ctype
|
||||
self.tonic = tonic
|
||||
self.rootNote = self.noteList[0]
|
||||
self.noteList = [ x + adj for x in notes ]
|
||||
self.bnoteList = tuple(self.noteList)
|
||||
self.scaleList = tuple([ x + adj for x in chords[ctype][1] ])
|
||||
self.chordType = ctype
|
||||
self.tonic = tonic
|
||||
self.rootNote = self.noteList[0]
|
||||
|
||||
self.noteListLen = len(self.noteList)
|
||||
self.noteListLen = len(self.noteList)
|
||||
|
||||
# Inversion
|
||||
# Inversion
|
||||
|
||||
if inversion:
|
||||
self.invert(inversion)
|
||||
self.bnoteList = tuple(self.noteList)
|
||||
if inversion:
|
||||
self.invert(inversion)
|
||||
self.bnoteList = tuple(self.noteList)
|
||||
|
||||
# Do inversions if there is a valid slash notation.
|
||||
# Do inversions if there is a valid slash notation.
|
||||
|
||||
if slash:
|
||||
if not _chordAdjust.has_key(slash):
|
||||
error("The note '%s' in the slash chord is unknown." % slash)
|
||||
if slash:
|
||||
if not cdAdjust.has_key(slash):
|
||||
error("The note '%s' in the slash chord is unknown" % slash)
|
||||
|
||||
r=_chordAdjust[slash] # r = -6 to 6
|
||||
r=cdAdjust[slash] # r = -6 to 6
|
||||
|
||||
# If the slash note is in the chord we invert
|
||||
# the chord so the slash note is in root position.
|
||||
# If the slash note is in the chord we invert
|
||||
# the chord so the slash note is in root position.
|
||||
|
||||
c_roted = 0
|
||||
s=self.noteList
|
||||
for octave in [0, 12, 24]:
|
||||
if r+octave in s:
|
||||
rot=s.index(r+octave)
|
||||
for i in range(rot):
|
||||
s.append(s.pop(0)+12)
|
||||
if s[0] >= 12:
|
||||
for i,v in enumerate(s):
|
||||
s[i] = v-12
|
||||
self.noteList = s
|
||||
self.bnoteList = tuple(s)
|
||||
self.rootNote = self.noteList[0]
|
||||
c_roted = 1
|
||||
break
|
||||
c_roted = 0
|
||||
s=self.noteList
|
||||
for octave in [0, 12, 24]:
|
||||
if r+octave in s:
|
||||
rot=s.index(r+octave)
|
||||
for i in range(rot):
|
||||
s.append(s.pop(0)+12)
|
||||
if s[0] >= 12:
|
||||
for i,v in enumerate(s):
|
||||
s[i] = v-12
|
||||
self.noteList = s
|
||||
self.bnoteList = tuple(s)
|
||||
self.rootNote = self.noteList[0]
|
||||
c_roted = 1
|
||||
break
|
||||
|
||||
s_roted = 0
|
||||
s=list(self.scaleList)
|
||||
for octave in [0, 12, 24]:
|
||||
if r+octave in s:
|
||||
rot=s.index(r+octave)
|
||||
for i in range(rot):
|
||||
s.append(s.pop(0)+12)
|
||||
if s[0] > 12:
|
||||
for i,v in enumerate(s):
|
||||
s[i] = v-12
|
||||
self.scaleList=tuple(s)
|
||||
s_roted = 1
|
||||
break
|
||||
s_roted = 0
|
||||
s=list(self.scaleList)
|
||||
for octave in [0, 12, 24]:
|
||||
if r+octave in s:
|
||||
rot=s.index(r+octave)
|
||||
for i in range(rot):
|
||||
s.append(s.pop(0)+12)
|
||||
if s[0] > 12:
|
||||
for i,v in enumerate(s):
|
||||
s[i] = v-12
|
||||
self.scaleList=tuple(s)
|
||||
s_roted = 1
|
||||
break
|
||||
|
||||
if not c_roted and not s_roted:
|
||||
warning("The slash chord note '%s' not in "
|
||||
"chord or scale." % slash)
|
||||
if not c_roted and not s_roted:
|
||||
warning("The slash chord note '%s' not in chord or scale" % slash)
|
||||
|
||||
elif not c_roted:
|
||||
warning("The slash chord note '%s' not in "
|
||||
"chord '%s'" % (slash, name))
|
||||
elif not c_roted:
|
||||
warning("The slash chord note '%s' not in chord '%s'" % (slash, name))
|
||||
|
||||
elif not s_roted: # Probably will never happen :)
|
||||
warning("The slash chord note '%s' not in "
|
||||
"scale for the chord '%s'" % (slash, name))
|
||||
elif not s_roted: # Probably will never happen :)
|
||||
warning("The slash chord note '%s' not in scale for the chord '%s'" % (slash, name))
|
||||
|
||||
|
||||
def reset(self):
|
||||
""" Restores notes array to original, undoes mangling. """
|
||||
def reset(self):
|
||||
""" Restores notes array to original, undoes mangling. """
|
||||
|
||||
self.noteList = list(self.bnoteList[:])
|
||||
self.noteListLen = len(self.noteList)
|
||||
self.noteList = list(self.bnoteList[:])
|
||||
self.noteListLen = len(self.noteList)
|
||||
|
||||
|
||||
def invert(self, n):
|
||||
""" Apply an inversion to a chord.
|
||||
def invert(self, n):
|
||||
""" Apply an inversion to a chord.
|
||||
|
||||
This does not reorder any notes, which means that the root note of
|
||||
the chord reminds in postion 0. We just find that highest/lowest
|
||||
notes in the chord and adjust their octave.
|
||||
This does not reorder any notes, which means that the root note of
|
||||
the chord reminds in postion 0. We just find that highest/lowest
|
||||
notes in the chord and adjust their octave.
|
||||
|
||||
NOTE: Done on the existing list of notes. Returns None.
|
||||
"""
|
||||
NOTE: Done on the existing list of notes. Returns None.
|
||||
"""
|
||||
|
||||
if n:
|
||||
c=self.noteList[:]
|
||||
if n:
|
||||
c=self.noteList[:]
|
||||
|
||||
while n>0: # Rotate up by adding 12 to lowest note
|
||||
n -= 1
|
||||
c[c.index(min(c))]+=12
|
||||
while n>0: # Rotate up by adding 12 to lowest note
|
||||
n -= 1
|
||||
c[c.index(min(c))]+=12
|
||||
|
||||
while n<0: # Rotate down, subtract 12 from highest note
|
||||
n += 1
|
||||
c[c.index(max(c))]-=12
|
||||
while n<0: # Rotate down, subtract 12 from highest note
|
||||
n += 1
|
||||
c[c.index(max(c))]-=12
|
||||
|
||||
self.noteList = c
|
||||
self.noteList = c
|
||||
|
||||
return None
|
||||
return None
|
||||
|
||||
|
||||
|
||||
def compress(self):
|
||||
""" Compress a chord to one ocatve.
|
||||
def compress(self):
|
||||
""" Compress a chord to one ocatve.
|
||||
|
||||
|
||||
Get max permitted value. This is the lowest note
|
||||
plus 12. Note: use the unmodifed value bnoteList!
|
||||
"""
|
||||
Get max permitted value. This is the lowest note
|
||||
plus 12. Note: use the unmodifed value bnoteList!
|
||||
"""
|
||||
|
||||
mx = self.bnoteList[0] + 12
|
||||
c=[]
|
||||
mx = self.bnoteList[0] + 12
|
||||
c=[]
|
||||
|
||||
for i, n in enumerate(self.noteList):
|
||||
if n > mx:
|
||||
n -= 12
|
||||
c.append(n)
|
||||
for i, n in enumerate(self.noteList):
|
||||
if n > mx:
|
||||
n -= 12
|
||||
c.append(n)
|
||||
|
||||
self.noteList = c
|
||||
self.noteList = c
|
||||
|
||||
return None
|
||||
return None
|
||||
|
||||
|
||||
|
||||
def limit(self, n):
|
||||
""" Limit the number of notes in a chord. """
|
||||
def limit(self, n):
|
||||
""" Limit the number of notes in a chord. """
|
||||
|
||||
if n < self.noteListLen:
|
||||
self.noteList = self.noteList[:n]
|
||||
self.noteListLen = len(self.noteList)
|
||||
if n < self.noteListLen:
|
||||
self.noteList = self.noteList[:n]
|
||||
self.noteListLen = len(self.noteList)
|
||||
|
||||
return None
|
||||
return None
|
||||
|
||||
|
||||
def center1(self, lastChord):
|
||||
""" Descriptive comment needed here!!!! """
|
||||
def center1(self, lastChord):
|
||||
""" Descriptive comment needed here!!!! """
|
||||
|
||||
def minDistToLast(x, lastChord):
|
||||
dist=99
|
||||
for j in range(len(lastChord)):
|
||||
if abs(x-lastChord[j])<abs(dist):
|
||||
dist=x-lastChord[j]
|
||||
return dist
|
||||
def minDistToLast(x, lastChord):
|
||||
dist=99
|
||||
for j in range(len(lastChord)):
|
||||
if abs(x-lastChord[j])<abs(dist):
|
||||
dist=x-lastChord[j]
|
||||
return dist
|
||||
|
||||
def sign(x):
|
||||
if (x>0):
|
||||
return 1
|
||||
elif (x<0):
|
||||
return -1
|
||||
else:
|
||||
return 0
|
||||
def sign(x):
|
||||
if (x>0):
|
||||
return 1
|
||||
elif (x<0):
|
||||
return -1
|
||||
else:
|
||||
return 0
|
||||
|
||||
# Only change what needs to be changed compared to the last chord
|
||||
# (leave notes where they are if they are in the new chord as well).
|
||||
# Only change what needs to be changed compared to the last chord
|
||||
# (leave notes where they are if they are in the new chord as well).
|
||||
|
||||
if lastChord:
|
||||
ch=self.noteList
|
||||
if lastChord:
|
||||
ch=self.noteList
|
||||
|
||||
for i in range(len(ch)):
|
||||
for i in range(len(ch)):
|
||||
|
||||
# minimize distance to last chord
|
||||
# minimize distance to last chord
|
||||
|
||||
oldDist = minDistToLast(ch[i], lastChord)
|
||||
while abs(minDistToLast(ch[i] - sign(oldDist)*12,
|
||||
lastChord)) < abs(oldDist):
|
||||
ch[i] -= 12* sign(oldDist)
|
||||
oldDist = minDistToLast(ch[i], lastChord)
|
||||
oldDist = minDistToLast(ch[i], lastChord)
|
||||
while abs(minDistToLast(ch[i] - sign(oldDist)*12,
|
||||
lastChord)) < abs(oldDist):
|
||||
ch[i] -= 12* sign(oldDist)
|
||||
oldDist = minDistToLast(ch[i], lastChord)
|
||||
|
||||
return None
|
||||
return None
|
||||
|
||||
def center2(self, centerNote, noteRange):
|
||||
""" Need COMMENT """
|
||||
def center2(self, centerNote, noteRange):
|
||||
""" Need COMMENT """
|
||||
|
||||
ch=self.noteList
|
||||
for i,v in enumerate(ch):
|
||||
ch=self.noteList
|
||||
for i,v in enumerate(ch):
|
||||
|
||||
dist = v - centerNote
|
||||
if dist < -noteRange:
|
||||
ch[i] = v + 12 * ( abs(dist) / 12+1 )
|
||||
if dist > noteRange:
|
||||
ch[i] = v - 12 * ( abs(dist) / 12+1 )
|
||||
dist = v - centerNote
|
||||
if dist < -noteRange:
|
||||
ch[i] = v + 12 * ( abs(dist) / 12+1 )
|
||||
if dist > noteRange:
|
||||
ch[i] = v - 12 * ( abs(dist) / 12+1 )
|
||||
|
||||
|
||||
return None
|
||||
return None
|
||||
|
||||
|
||||
######## End of Chord class #####
|
||||
|
||||
|
||||
|
||||
def docs():
|
||||
""" Print out a list of chord names and docs in LaTex. """
|
||||
|
||||
import copy
|
||||
|
||||
# Just in case someone else wants to use _chords, work on a copy
|
||||
|
||||
chords=copy.copy(_chords)
|
||||
|
||||
for n in sorted(chords.keys()):
|
||||
nm=n.replace("#", '$\\sharp$')
|
||||
nm=nm.replace('b', '$\\flat$')
|
||||
print "\\insline{%s}{%s}" % (nm, chords[n][2])
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bob van der Poel <bvdp@xplornet.com>
|
||||
Bob van der Poel <bob@mellowood.ca>
|
||||
|
||||
|
||||
|
||||
|
@ -53,222 +53,348 @@ A = Bbb= 9
|
|||
As = Bb = 10
|
||||
B = Cb = 11
|
||||
|
||||
_chords = {
|
||||
'M': ((C, E, G ),
|
||||
(C, D, E, F, G, A, B),
|
||||
"Major triad. This is the default and is used in "
|
||||
"the absense of any other chord type specification."),
|
||||
chords = {
|
||||
'M': ((C, E, G ),
|
||||
(C, D, E, F, G, A, B),
|
||||
"Major triad. This is the default and is used in "
|
||||
"the absense of any other chord type specification."),
|
||||
|
||||
'm': ((C, Eb, G ),
|
||||
(C, D, Eb, F, G, Ab, Bb),
|
||||
"Minor triad."),
|
||||
'(b5)': ((C, E, Gb ),
|
||||
(C, D, E, F, Gb, A, B),
|
||||
"Major triad with flat 5th."),
|
||||
|
||||
'mb5': ((C, Eb, Gb ),
|
||||
(C, D, Eb, F, Gb, Ab, Bb),
|
||||
"Minor triad with flat 5th."),
|
||||
'add9': ((C, E, G, D+12),
|
||||
(C, D, E, F, G, A, D+12),
|
||||
"Major chord plus 9th (no 7th.)"),
|
||||
|
||||
'm#5': ((C, Eb, Gs ),
|
||||
(C, D, Eb, F, Gs, Ab, Bb),
|
||||
"Major triad with augmented 5th."),
|
||||
'm': ((C, Eb, G ),
|
||||
(C, D, Eb, F, G, Ab, Bb),
|
||||
"Minor triad."),
|
||||
|
||||
'm6': ((C, Eb, G, A ),
|
||||
(C, D, Eb, F, G, A, Bb),
|
||||
"Minor 6th."),
|
||||
'mb5': ((C, Eb, Gb ),
|
||||
(C, D, Eb, F, Gb, Ab, Bb),
|
||||
"Minor triad with flat 5th (aka dim)."),
|
||||
|
||||
'm6(add9)': ((C, Eb, G, D+12, A+12),
|
||||
(C, D, Eb, F, G, A, B),
|
||||
"Minor 6th with added 9th. This is sometimes notated as a slash chord "
|
||||
"in the form ``m6/9''." ),
|
||||
'm#5': ((C, Eb, Gs ),
|
||||
(C, D, Eb, F, Gs, Ab, Bb),
|
||||
"Minor triad with augmented 5th."),
|
||||
|
||||
'm7': ((C, Eb, G, Bb ),
|
||||
(C, D, Eb, F, G, Ab, Bb),
|
||||
"Minor 7th."),
|
||||
'm6': ((C, Eb, G, A ),
|
||||
(C, D, Eb, F, G, A, Bb),
|
||||
"Minor 6th (flat 3rd plus a 6th)."),
|
||||
|
||||
'mM7': ((C, Eb, G, B ),
|
||||
(C, D, Eb, F, G, Ab, B),
|
||||
"Minor Triad plus Major 7th. You will also see this printed "
|
||||
"as ``m(maj7)'', ``m+7'', ``min(maj7)'' and ``min$\sharp$7'' "
|
||||
"(which \mma\ accepts); as well as the \mma\ \emph{invalid} "
|
||||
"forms: ``-($\Delta$7)'', and ``min$\\natural$7''."),
|
||||
'm6(add9)': ((C, Eb, G, D+12, A+12),
|
||||
(C, D, Eb, F, G, A, Bb),
|
||||
"Minor 6th with added 9th. This is sometimes notated as a slash chord "
|
||||
"in the form ``m6/9''." ),
|
||||
|
||||
'm7b5': ((C, Eb, Gb, Bb ),
|
||||
(C, D, Eb, F, Gb, Ab, Bb),
|
||||
"Minor 7th, flat 5 (aka 1/2 diminished). "),
|
||||
'm7': ((C, Eb, G, Bb ),
|
||||
(C, D, Eb, F, G, Ab, Bb),
|
||||
"Minor 7th (flat 3rd plus dominant 7th)."),
|
||||
|
||||
'm7b9': ((C, Eb, G, Bb, Db+12 ),
|
||||
(C, Db, Eb, F, G, Ab, Bb),
|
||||
"Minor 7th with added flat 9th."),
|
||||
'mM7': ((C, Eb, G, B ),
|
||||
(C, D, Eb, F, G, Ab, B),
|
||||
"Minor Triad plus Major 7th. You will also see this printed "
|
||||
"as ``m(maj7)'', ``m+7'', ``min(maj7)'' and ``min$\sharp$7'' "
|
||||
"(which \mma\ accepts); as well as the \mma\ \emph{invalid} "
|
||||
"forms: ``-($\Delta$7)'', and ``min$\\natural$7''."),
|
||||
|
||||
'7': ((C, E, G, Bb ),
|
||||
(C, D, E, F, G, A, Bb),
|
||||
"Dominant 7th."),
|
||||
'm+7b9': ((C, Eb, Gs, Bb, Db+12),
|
||||
(C, Db, Eb, F, Gs, Ab, Bb),
|
||||
"Augmented minor 7 plus flat 9th."),
|
||||
|
||||
'7#5': ((C, E, Gs, Bb ),
|
||||
(C, D, E, F, Gs, A, Bb),
|
||||
"7th, sharp 5."),
|
||||
'm+7#9': ((C, Eb, Gs, Bb, Ds+12),
|
||||
(C, Ds, Eb, F, Gs, Ab, Bb),
|
||||
"Augmented minor 7 plus sharp 9th."),
|
||||
|
||||
'mM7(add9)': ((C, Eb, G, B, D+12),
|
||||
(C, D, Eb, F, G, Ab, B),
|
||||
"Minor Triad plus Major 7th and 9th."),
|
||||
|
||||
'7b5': ((C, E, Gb, Bb ),
|
||||
(C, D, E, F, Gb, A, Bb),
|
||||
"7th, flat 5."),
|
||||
'm7b5': ((C, Eb, Gb, Bb ),
|
||||
(C, D, Eb, F, Gb, Ab, Bb),
|
||||
"Minor 7th, flat 5 (aka 1/2 diminished). "),
|
||||
|
||||
'dim7': ((C, Eb, Gb, Bbb ),
|
||||
(C, D, Eb, F, Gb, Ab, Bbb ), # missing 8th note
|
||||
"Diminished seventh."),
|
||||
'm7b9': ((C, Eb, G, Bb, Db+12 ),
|
||||
(C, Db, Eb, F, G, Ab, Bb),
|
||||
"Minor 7th with added flat 9th."),
|
||||
|
||||
'aug': ((C, E, Gs ),
|
||||
(C, D, E, F, Gs, A, B ),
|
||||
"Augmented triad."),
|
||||
'm7#9': ((C, Eb, G, Bb, Ds+12 ),
|
||||
(C, Ds, Eb, F, G, Ab, Bb),
|
||||
"Minor 7th with added sharp 9th."),
|
||||
|
||||
'6': ((C, E, G, A ),
|
||||
(C, D, E, F, G, A, B),
|
||||
"Major tiad with added 6th."),
|
||||
'7': ((C, E, G, Bb ),
|
||||
(C, D, E, F, G, A, Bb),
|
||||
"7th."),
|
||||
|
||||
'6(add9)': ((C, E, G, D+12, A+12),
|
||||
(C, D, E, F, G, A, B),
|
||||
"6th with added 9th. This is sometimes notated as a slash chord "
|
||||
"in the form ``6/9''."),
|
||||
'7b5': ((C, E, Gb, Bb ),
|
||||
(C, D, E, F, Gb, A, Bb),
|
||||
"7th, flat 5."),
|
||||
|
||||
'M7': ((C, E, G, B),
|
||||
(C, D, E, F, G, A, B),
|
||||
"Major 7th."),
|
||||
'dim7': ((C, Eb, Gb, Bbb ),
|
||||
(C, D, Eb, F, Gb, Ab, Bbb ), # missing 8th note
|
||||
"Diminished seventh."),
|
||||
|
||||
'dim7(addM7)': ((C, Eb, Gb, A, B),
|
||||
(C, D, Eb, F, Gb, A, B),
|
||||
"Diminished tirad with added Major 7th."),
|
||||
|
||||
'M7#5': ((C, E, Gs, B),
|
||||
(C, D, E, F, Gs, A, B),
|
||||
"Major 7th with sharp 5th."),
|
||||
'aug': ((C, E, Gs ),
|
||||
(C, D, E, F, Gs, A, B ),
|
||||
"Augmented triad."),
|
||||
|
||||
'M7b5': ((C, E, Gb, B ),
|
||||
(C, D, E, F, Gb, A, B ),
|
||||
"Major 7th with a flat 5th."),
|
||||
'6': ((C, E, G, A ),
|
||||
(C, D, E, F, G, A, B),
|
||||
"Major tiad with added 6th."),
|
||||
|
||||
'9': ((C, E, G, Bb, D+12 ),
|
||||
(C, D, E, F, G, A, Bb),
|
||||
"Dominant 7th plus 9th."),
|
||||
'6(add9)': ((C, E, G, D+12, A+12),
|
||||
(C, D, E, F, G, A, B),
|
||||
"6th with added 9th. This is sometimes notated as a slash chord "
|
||||
"in the form ``6/9''."),
|
||||
|
||||
'sus9': ((C, E, G, D+12),
|
||||
(C, D, E, F, G, A, D+12),
|
||||
"Dominant 7th plus 9th, omit 7th."),
|
||||
'M7': ((C, E, G, B),
|
||||
(C, D, E, F, G, A, B),
|
||||
"Major 7th."),
|
||||
|
||||
'9b5': ((C, E, Gb, Bb, D+12 ),
|
||||
(C, D, E, F, Gb, A, Bb),
|
||||
"Dominant 7th plus 9th with flat 5th."),
|
||||
'M7#5': ((C, E, Gs, B),
|
||||
(C, D, E, F, Gs, A, B),
|
||||
"Major 7th with sharp 5th."),
|
||||
|
||||
'm9': ((C, Eb, G, Bb, D+12 ),
|
||||
(C, D, Eb, F, G, Ab, Bb),
|
||||
"Minor triad plus 7th and 9th."),
|
||||
'M7b5': ((C, E, Gb, B ),
|
||||
(C, D, E, F, Gb, A, B ),
|
||||
"Major 7th with a flat 5th."),
|
||||
|
||||
'm9b5': ((C, Eb, Gb, Bb, D+12 ),
|
||||
(C, D, Eb, F, Gb, Ab, Bb),
|
||||
"Minor triad, flat 5, plus 7th and 9th."),
|
||||
'9': ((C, E, G, Bb, D+12 ),
|
||||
(C, D, E, F, G, A, Bb),
|
||||
"7th plus 9th."),
|
||||
|
||||
'm(sus9)':((C, Eb, G, D+12 ),
|
||||
(C, D, Eb, F, G, Ab, D+12),
|
||||
"Minor triad plus 9th (no 7th)."),
|
||||
|
||||
|
||||
'M9': ((C, E, G, B, D+12 ),
|
||||
(C, D, E, F, G, A, B),
|
||||
"Major 7th plus 9th."),
|
||||
'9b5': ((C, E, Gb, Bb, D+12 ),
|
||||
(C, D, E, F, Gb, A, Bb),
|
||||
"7th plus 9th with flat 5th."),
|
||||
|
||||
'7b9': ((C, E, G, Bb, Db+12 ),
|
||||
(C, Db, E, F, G, A, Bb),
|
||||
"Dominant 7th with flat 9th."),
|
||||
'm9': ((C, Eb, G, Bb, D+12 ),
|
||||
(C, D, Eb, F, G, Ab, Bb),
|
||||
"Minor triad plus 7th and 9th."),
|
||||
|
||||
'7#9': ((C, E, G, Bb, Ds+12 ),
|
||||
(C, Ds, E, F, G, A, Bb),
|
||||
"Dominant 7th with sharp 9th."),
|
||||
'm7b5b9': ((C, Eb, Gb, Bb, Db+12),
|
||||
(C, Db, Eb, F, Gb, Ab, Bb),
|
||||
"Minor 7th with flat 5th and flat 9th."),
|
||||
|
||||
'7b5b9':((C, E, Gb, Bb, Db+12 ),
|
||||
(C, Db, E, F, Gb, A, Bb),
|
||||
"Dominant 7th with flat 5th and flat 9th."),
|
||||
'm9b5': ((C, Eb, Gb, Bb, D+12 ),
|
||||
(C, D, Eb, F, Gb, Ab, Bb),
|
||||
"Minor triad, flat 5, plus 7th and 9th."),
|
||||
|
||||
'7b5#9':((C, E, Gb, Bb, Ds+12 ),
|
||||
(C, Ds, E, F, Gb, A, Bb),
|
||||
"Dominant 7th with flat 5th and sharp 9th."),
|
||||
'm(sus9)':((C, Eb, G, D+12 ),
|
||||
(C, D, Eb, F, G, Ab, D+12),
|
||||
"Minor triad plus 9th (no 7th)."),
|
||||
|
||||
'7#5#9':((C, E, Gs, Bb, Ds+12 ),
|
||||
(C, Ds, E, F, Gs, A, Bb),
|
||||
"Dominant 7th with sharp 5th and sharp 9th."),
|
||||
'M9': ((C, E, G, B, D+12 ),
|
||||
(C, D, E, F, G, A, B),
|
||||
"Major 7th plus 9th."),
|
||||
|
||||
'7#5b9':((C, E, Gs, Bb, Db+12 ),
|
||||
(C, Db, E, F, Gs, A, Bb),
|
||||
"Dominant 7th with sharp 5th and flat 9th."),
|
||||
'M9#11': ((C, E, G, B, D+12, Fs+12),
|
||||
(C, D, E, Fs, G, A, B),
|
||||
"Major 9th plus sharp 11th."),
|
||||
|
||||
'aug7': ((C, E, Gs, Bb ),
|
||||
(C, D, E, F, Gs, A, Bb),
|
||||
"An augmented chord (raised 5th) with a dominant 7th."),
|
||||
'7b9': ((C, E, G, Bb, Db+12 ),
|
||||
(C, Db, E, F, G, A, Bb),
|
||||
"7th with flat 9th."),
|
||||
|
||||
'aug7b9':((C, E, Gs, Bb, Db+12 ),
|
||||
(C, Db, E, F, Gs, A, Bb),
|
||||
"Augmented 7th with flat 5th and sharp 9th."),
|
||||
'7#9': ((C, E, G, Bb, Ds+12 ),
|
||||
(C, Ds, E, F, G, A, Bb),
|
||||
"7th with sharp 9th."),
|
||||
|
||||
'11': ((C, E, G, Bb, D+12, F+12 ),
|
||||
(C, D, E, F, G, A, Bb),
|
||||
"9th chord plus 11th."),
|
||||
'7#9b13': ((C, E, G, Bb, Ds+12, Ab+12 ),
|
||||
(C, Ds, E, F, G, Ab, Bb),
|
||||
"7th with sharp 9th and flat 13th."),
|
||||
|
||||
'm11': ((C, Eb, G, Bb, D+12, F+12 ),
|
||||
(C, D, Eb, F, G, Ab, Bb),
|
||||
"9th with minor 3rd, plus 11th."),
|
||||
'7b5b9':((C, E, Gb, Bb, Db+12 ),
|
||||
(C, Db, E, F, Gb, A, Bb),
|
||||
"7th with flat 5th and flat 9th."),
|
||||
|
||||
'11b9': ((C, E, G, Bb, Db+12, F+12 ),
|
||||
(C, Db, E, F, G, A, Bb),
|
||||
"9th chord plus flat 11th."),
|
||||
'7b5#9':((C, E, Gb, Bb, Ds+12 ),
|
||||
(C, Ds, E, F, Gb, A, Bb),
|
||||
"7th with flat 5th and sharp 9th."),
|
||||
|
||||
'9#5': ((C, E, Gs, Bb, D+12 ),
|
||||
(C, D, E, F, Gs, A, Bb),
|
||||
"Dominant 7th plus 9th with sharp 5th."),
|
||||
'7#5#9':((C, E, Gs, Bb, Ds+12 ),
|
||||
(C, Ds, E, F, Gs, A, Bb),
|
||||
"7th with sharp 5th and sharp 9th."),
|
||||
|
||||
'9#11': ((C, E, G, Bb, D+12, Fs+12 ),
|
||||
(C, D, E, Fs, G, A, Bb),
|
||||
"Dominant 7th plus 9th and sharp 11th."),
|
||||
|
||||
'aug7': ((C, E, Gs, Bb ),
|
||||
(C, D, E, F, Gs, A, Bb),
|
||||
"An augmented chord (raised 5th) with a dominant 7th."),
|
||||
|
||||
'7#9#11':((C, E, G, Bb, Ds+12, Fs+12 ),
|
||||
(C, Ds, E, Fs, G, A, Bb),
|
||||
"Dominant 7th plus sharp 9th and sharp 11th."),
|
||||
'aug7b9':((C, E, Gs, Bb, Db+12 ),
|
||||
(C, Db, E, F, Gs, A, Bb),
|
||||
"An augmented chord (raised 5th) with a dominant 7th and flat 9th."),
|
||||
|
||||
'aug7#9':((C, E, Gs, Bb, Ds+12 ),
|
||||
(C, Ds, E, F, Gs, A, Bb),
|
||||
"An augmented chord (raised 5th) with a dominant 7th and sharp 9th."),
|
||||
|
||||
'M7#11':((C, E, G, B, D+12, Fs+12 ),
|
||||
(C, D, E, Fs, G, A, B),
|
||||
"Major 7th plus 9th and sharp 11th."),
|
||||
'aug9M7':((C, E, Gs, B, D+12 ),
|
||||
(C, D, E, F, Gs, A, B),
|
||||
"An augmented chord (raised 5th) with a major 7th and 9th."),
|
||||
|
||||
# Sus chords. Not sure what to do with the associated scales. For
|
||||
# now just duplicating the 2nd or 3rd in the scale seems to make sense.
|
||||
'+7b9#11': ((C, E, Gs, Bb, Db+12, Fs+12),
|
||||
(C, Db, E, Fs, G, A, Bb),
|
||||
"Augmented 7th with flat 9th and sharp 11th."),
|
||||
|
||||
'sus4': ((C, F, G ),
|
||||
(C, D, F, F, G, A, B),
|
||||
"Suspended 4th, major triad with 3rd raised half tone."),
|
||||
'm+7b9#11': ((C, Eb, Gs, Bb, Db+12, Fs+12),
|
||||
(C, Db, Eb, Fs, Gs, A, Bb),
|
||||
"Augmented minor 7th with flat 9th and sharp 11th."),
|
||||
|
||||
'7sus': ((C, F, G, Bb ),
|
||||
(C, D, F, F, G, A, Bb),
|
||||
"7th with suspended 4th, dominant 7th with 3rd "
|
||||
"raised half tone."),
|
||||
'11': ((C, C, G, Bb, D+12, F+12 ),
|
||||
(C, D, E, F, G, A, Bb),
|
||||
"9th chord plus 11th (3rd not voiced)."),
|
||||
|
||||
'sus2': ((C, D, G ),
|
||||
(C, D, D, F, G, A, B),
|
||||
"Suspended 2nd, major triad with major 2nd above "
|
||||
"root substituted for 3rd."),
|
||||
'm11': ((C, Eb, G, Bb, D+12, F+12 ),
|
||||
(C, D, Eb, F, G, Ab, Bb),
|
||||
"9th with minor 3rd, plus 11th."),
|
||||
|
||||
'7sus2':((C, D, G, Bb ),
|
||||
(C, D, D, F, G, A, Bb),
|
||||
"A sus2 with dominant 7th added."),
|
||||
'm7(add11)': ((C, Eb, G, Bb, F+12 ),
|
||||
(C, D, Eb, F, G, Ab, Bb),
|
||||
"Minor 7th plus 11th."),
|
||||
|
||||
# these two chords should probably NOT have the 5th included,
|
||||
# but since a number of voicings depend on the 5th being
|
||||
# the third note of the chord, they're here.
|
||||
'm9#11': ((C, Eb, G, Bb, D+12, Fs+12),
|
||||
(C, D, Eb, Fs, G, A, Bb),
|
||||
"Minor 7th plus 9th and sharp 11th."),
|
||||
|
||||
'13': ((C, E, G, Bb, A+12),
|
||||
(C, D, E, F, G, A, Bb),
|
||||
"Dominant 7th (including 5th) plus 13th."),
|
||||
'm7b9#11': ((C, Eb, G, Bb, Db+12, Fs+12),
|
||||
(C, Db, Eb, Fs, G, A, Bb),
|
||||
"Minor 7th plus flat 9th and sharp 11th."),
|
||||
|
||||
'M13': ((C, E, G, B, A+12),
|
||||
(C, D, E, F, G, A, B),
|
||||
"Major 7th (including 5th) plus 13th."),
|
||||
'm7(add13)': ((C, Eb, G, Bb, A+12 ),
|
||||
(C, D, Eb, F, G, A, Bb),
|
||||
"Minor 7th plus 13th."),
|
||||
|
||||
# Because some patterns assume that the 3rd note in a chord is a 5th,
|
||||
# or a varient, we duplicate the root into the position of the 3rd ... and
|
||||
# to make the sound even we duplicate the 5th into the 4th position as well.
|
||||
'11b9': ((C, E, G, Bb, Db+12, F+12 ),
|
||||
(C, Db, E, F, G, A, Bb),
|
||||
"7th chord plus flat 9th and 11th."),
|
||||
|
||||
'5': ((C, C, G, G ),
|
||||
(C, D, E, F, G, A, B),
|
||||
"Altered Fifth or Power Chord; root and 5th only."),
|
||||
'9#5': ((C, E, Gs, Bb, D+12 ),
|
||||
(C, D, E, F, Gs, A, Bb),
|
||||
"7th plus 9th with sharp 5th (same as aug9)."),
|
||||
|
||||
'9#11': ((C, E, G, Bb, D+12, Fs+12 ),
|
||||
(C, D, E, Fs, G, A, Bb),
|
||||
"7th plus 9th and sharp 11th."),
|
||||
|
||||
'7#9#11':((C, E, G, Bb, Ds+12, Fs+12 ),
|
||||
(C, Ds, E, Fs, G, A, Bb),
|
||||
"7th plus sharp 9th and sharp 11th."),
|
||||
|
||||
'7b9#11': ((C, E, G, Bb, Db+12, Fs+12 ),
|
||||
(C, Db, E, Fs, G, A, Bb),
|
||||
"7th plus flat 9th and sharp 11th."),
|
||||
|
||||
'7#11':((C, E, G, Bb, Fs+12 ),
|
||||
(C, D, E, Fs, G, A, Bb),
|
||||
"7th plus sharp 11th (9th omitted)."),
|
||||
|
||||
'M7#11':((C, E, G, B, Fs+12 ),
|
||||
(C, D, E, Fs, G, A, B),
|
||||
"Major 7th plus sharp 11th (9th omitted)."),
|
||||
|
||||
'm11b5': ((C, Eb, Gb, Bb, D+12, F+12),
|
||||
(C, D, Eb, F, Gb, A, Bb),
|
||||
"Minor 7th with flat 5th plus 11th."),
|
||||
|
||||
# Sus chords. Not sure what to do with the associated scales. For
|
||||
# now just duplicating the 2nd or 3rd in the scale seems to make sense.
|
||||
|
||||
'sus4': ((C, F, G ),
|
||||
(C, D, F, F, G, A, B),
|
||||
"Suspended 4th, major triad with the 3rd raised half tone."),
|
||||
|
||||
'7sus': ((C, F, G, Bb ),
|
||||
(C, D, F, F, G, A, Bb),
|
||||
"7th with suspended 4th, dominant 7th with 3rd "
|
||||
"raised half tone."),
|
||||
|
||||
'7susb9': ((C, F, G, Bb, Db+12),
|
||||
(C, Db, F, F, G, A, Bb),
|
||||
"7th with suspended 4th and flat 9th."),
|
||||
|
||||
'sus2': ((C, D, G ),
|
||||
(C, D, D, F, G, A, B),
|
||||
"Suspended 2nd, major triad with the major 2nd above the "
|
||||
"root substituted for 3rd."),
|
||||
|
||||
'7sus2':((C, D, G, Bb ),
|
||||
(C, D, D, F, G, A, Bb),
|
||||
"A sus2 with dominant 7th added."),
|
||||
|
||||
'sus9': ((C, F, G, Bb, D+12),
|
||||
(C, D, F, F, G, A, Bb),
|
||||
"7sus plus 9th."),
|
||||
|
||||
'13sus': ((C, F, G, Bb, D+12, A+12),
|
||||
(C, D, F, F, G, A, Bb),
|
||||
"7sus, plus 9th and 13th"),
|
||||
|
||||
'13susb9': ((C, F, G, Bb, Db+12, A+12),
|
||||
(C, Db, F, F, G, A, Bb),
|
||||
"7sus, plus flat 9th and 13th"),
|
||||
|
||||
# these chords should probably NOT have the 5th included,
|
||||
# but since a number of voicings depend on the 5th being
|
||||
# the third note of the chord, they're here.
|
||||
|
||||
'13': ((C, E, G, Bb, A+12),
|
||||
(C, D, E, F, G, A, Bb),
|
||||
"7th (including 5th) plus 13th (the 9th and 11th are not voiced)."),
|
||||
|
||||
'13b5': ((C, E, Gb, Bb, A+12),
|
||||
(C, D, E, F, Gb, A, Bb),
|
||||
"7th with flat 5th, plus 13th (the 9th and 11th are not voiced)."),
|
||||
|
||||
'13#9': ((C, E, G, Bb, Ds+12, A+12),
|
||||
(C, Ds, E, F, G, A, Bb),
|
||||
"7th (including 5th) plus 13th and sharp 9th (11th not voiced)."),
|
||||
|
||||
'13b9': ((C, E, G, Bb, Db+12, A+12),
|
||||
(C, Db, E, F, G, A, Bb),
|
||||
"7th (including 5th) plus 13th and flat 9th (11th not voiced)."),
|
||||
|
||||
'M13': ((C, E, G, B, A+12),
|
||||
(C, D, E, F, G, A, B),
|
||||
"Major 7th (including 5th) plus 13th (9th and 11th not voiced)."),
|
||||
|
||||
'm13': ((C, Eb, G, Bb, A+12),
|
||||
(C, D, Eb, F, G, A, Bb),
|
||||
"Minor 7th (including 5th) plus 13th (9th and 11th not voiced)."),
|
||||
|
||||
'13#11': ((C, E, G, Bb, Fs+12, A+12),
|
||||
(C, D, E, Fs, G, A, Bb),
|
||||
"7th plus sharp 11th and 13th (9th not voiced)."),
|
||||
|
||||
'M13#11': ((C, E, G, B, Fs+12, A+12),
|
||||
(C, D, E, Fs, G, A, B),
|
||||
"Major 7th plus sharp 11th and 13th (9th not voiced)."),
|
||||
|
||||
# Because some patterns assume that the 3rd note in a chord is a 5th,
|
||||
# or a varient, we duplicate the root into the position of the 3rd ... and
|
||||
# to make the sound even we duplicate the 5th into the 4th position as well.
|
||||
|
||||
'5': ((C, C, G, G ),
|
||||
(C, D, E, F, G, A, B),
|
||||
"Altered Fifth or Power Chord; root and 5th only."),
|
||||
|
||||
'omit3add9': ((C, C, G, D+12),
|
||||
(C, D, E, F, G, A, Bb),
|
||||
"Triad: root, 5th and 9th."),
|
||||
|
||||
'7omit3': ((C, C, G, Bb),
|
||||
(C, D, E, F, G, A, Bb),
|
||||
"7th with unvoiced 3rd."),
|
||||
|
||||
'm7omit5': ((C, Eb, Bb),
|
||||
(C, D, Eb, F, G, A, Bb),
|
||||
"Minor 7th with unvoiced 5th."),
|
||||
}
|
||||
|
||||
|
||||
|
@ -278,44 +404,58 @@ the original.
|
|||
"""
|
||||
|
||||
aliases = (
|
||||
('aug9', '9#5' , ''),
|
||||
('69', '6(add9)', ''),
|
||||
('m69', 'm6(add9)', ''),
|
||||
('9+5', '9#5' , ''),
|
||||
('m+5', 'm#5' , ''),
|
||||
('M6', '6' , ''),
|
||||
('m7-5', 'm7b5' , ''),
|
||||
('+', 'aug' , ''),
|
||||
('+7', 'aug7' , ''),
|
||||
('#5', 'aug' , ''),
|
||||
('7-9', '7b9' , ''),
|
||||
('7+9', '7#9' , ''),
|
||||
('maj7', 'M7' , ''),
|
||||
('M7-5', 'M7b5' , ''),
|
||||
('M7+5', 'M7#5' , ''),
|
||||
('7alt', '7b5b9', ''),
|
||||
('7sus4', '7sus' , ''),
|
||||
('7#11', '9#11' , ''),
|
||||
('7+', 'aug7' , ''),
|
||||
('7+5', '7#5' , ''),
|
||||
('7-5', '7b5' , ''),
|
||||
('sus', 'sus4' , ''),
|
||||
('m(maj7)', 'mM7' , ''),
|
||||
('m+7', 'mM7' , ''),
|
||||
('min(maj7)','mM7' , ''),
|
||||
('min#7', 'mM7' , ''),
|
||||
('m#7', 'mM7' , ''),
|
||||
('dim', 'dim7' , 'A dim7, not a triad!'),
|
||||
('9sus', 'sus9' , ''),
|
||||
('9-5', '9b5' , ''),
|
||||
('dim3', 'mb5' , 'Diminished triad (non-standard notation).')
|
||||
)
|
||||
('aug9', '9#5', ''),
|
||||
('+9', '9#5', ''),
|
||||
('+9M7', 'aug9M7', ''),
|
||||
('+M7', 'M7#5', ''),
|
||||
('m(add9)', 'm(sus9)', ''),
|
||||
('69', '6(add9)', ''),
|
||||
('m69', 'm6(add9)', ''),
|
||||
('m(b5)', 'mb5', ''),
|
||||
('m7(b9)', 'm7b9', ''),
|
||||
('m7(#9)', 'm7#9', ''),
|
||||
('9+5', '9#5', ''),
|
||||
('m+5', 'm#5', ''),
|
||||
('M6', '6', ''),
|
||||
('m7-5', 'm7b5', ''),
|
||||
('m7(omit5)','m7omit5', ''),
|
||||
('+', 'aug', ''),
|
||||
('+7', 'aug7', ''),
|
||||
('7(omit3)', '7omit3', ''),
|
||||
('#5', 'aug', ''),
|
||||
('7#5b9', 'aug7b9', ''),
|
||||
('7-9', '7b9', ''),
|
||||
('7+9', '7#9', ''),
|
||||
('maj7', 'M7', ''),
|
||||
('M7-5', 'M7b5', ''),
|
||||
('M7+5', 'M7#5', ''),
|
||||
('M7(add13)','13b9', ''),
|
||||
('7alt', '7b5b9', ''),
|
||||
('7sus4', '7sus', ''),
|
||||
('7+', 'aug7', ''),
|
||||
('7#5', 'aug7', ''),
|
||||
('7+5', 'aug7', ''),
|
||||
('7-5', '7b5', ''),
|
||||
('sus', 'sus4', ''),
|
||||
('maj9', 'M9', ''),
|
||||
('maj13', 'M13', ''),
|
||||
('m(maj7)', 'mM7', ''),
|
||||
('m+7', 'mM7', ''),
|
||||
('min(maj7)','mM7', ''),
|
||||
('min#7', 'mM7', ''),
|
||||
('m#7', 'mM7', ''),
|
||||
('dim', 'dim7', 'A dim7, not a triad!'),
|
||||
('9sus', 'sus9', ''),
|
||||
('9-5', '9b5', ''),
|
||||
('dim3', 'mb5', 'Diminished triad (non-standard notation).'),
|
||||
('omit3(add9)','omit3add9', '')
|
||||
)
|
||||
|
||||
for a,b,d in aliases:
|
||||
n=_chords[b][0]
|
||||
s=_chords[b][1]
|
||||
if not d:
|
||||
d=_chords[b][2]
|
||||
n=chords[b][0]
|
||||
s=chords[b][1]
|
||||
if not d:
|
||||
d=chords[b][2]
|
||||
|
||||
_chords[a] = (n, s, d)
|
||||
chords[a] = (n, s, d)
|
||||
|
||||
|
|
|
@ -19,13 +19,13 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bob van der Poel <bvdp@xplornet.com>
|
||||
Bob van der Poel <bob@mellowood.ca>
|
||||
|
||||
|
||||
These are a collection of miscellaneous routines used in various
|
||||
parts of MMA. It is safe to load the whole works with:
|
||||
|
||||
from MMA.common import *
|
||||
from MMA.common import *
|
||||
|
||||
without side effects (yeah, right).
|
||||
|
||||
|
@ -38,136 +38,136 @@ import gbl
|
|||
|
||||
|
||||
class struct:
|
||||
pass
|
||||
pass
|
||||
|
||||
def error(msg):
|
||||
""" Print an error message and exit.
|
||||
""" Print an error message and exit.
|
||||
|
||||
If the global line number is >=0 then print the line number
|
||||
as well.
|
||||
"""
|
||||
If the global line number is >=0 then print the line number
|
||||
as well.
|
||||
"""
|
||||
|
||||
ln = ""
|
||||
if gbl.lineno >= 0:
|
||||
ln += "<Line %d>" % gbl.lineno
|
||||
ln = ""
|
||||
if gbl.lineno >= 0:
|
||||
ln += "<Line %d>" % gbl.lineno
|
||||
|
||||
if gbl.inpath:
|
||||
ln += "<File:%s>" % gbl.inpath.fname
|
||||
if gbl.inpath:
|
||||
ln += "<File:%s>" % gbl.inpath.fname
|
||||
|
||||
if ln:
|
||||
ln += '\n'
|
||||
if ln:
|
||||
ln += '\n'
|
||||
|
||||
print "ERROR:%s %s" % (ln, msg)
|
||||
print "ERROR:%s %s" % (ln, msg)
|
||||
|
||||
sys.exit(1)
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
def warning(msg):
|
||||
""" Print warning message and return. """
|
||||
""" Print warning message and return. """
|
||||
|
||||
|
||||
if gbl.noWarn:
|
||||
return
|
||||
if gbl.noWarn:
|
||||
return
|
||||
|
||||
ln = ""
|
||||
ln = ""
|
||||
|
||||
if gbl.lineno >= 0:
|
||||
ln = "<Line %d>" % gbl.lineno
|
||||
if gbl.lineno >= 0:
|
||||
ln = "<Line %d>" % gbl.lineno
|
||||
|
||||
if gbl.inpath:
|
||||
ln += "<File:%s>" % gbl.inpath.fname
|
||||
if gbl.inpath:
|
||||
ln += "<File:%s>" % gbl.inpath.fname
|
||||
|
||||
print "Warning:%s\n %s" % (ln, msg)
|
||||
print "Warning:%s\n %s" % (ln, msg)
|
||||
|
||||
|
||||
|
||||
def getOffset(ticks, ran=None):
|
||||
""" Calculate a midi offset into a song.
|
||||
""" Calculate a midi offset into a song.
|
||||
|
||||
ticks == offset into the current bar.
|
||||
ran == random adjustment from RTIME
|
||||
ticks == offset into the current bar.
|
||||
ran == random adjustment from RTIME
|
||||
|
||||
When calculating the random factor the test ensures
|
||||
that a note never starts before the start of the bar.
|
||||
This is important ... voice changes, etc. will be
|
||||
buggered if we put the voice change after the first
|
||||
note-on event.
|
||||
"""
|
||||
When calculating the random factor the test ensures
|
||||
that a note never starts before the start of the bar.
|
||||
This is important ... voice changes, etc. will be
|
||||
buggered if we put the voice change after the first
|
||||
note-on event.
|
||||
"""
|
||||
|
||||
p = gbl.tickOffset + int(ticks) # int() cast is important!
|
||||
p = gbl.tickOffset + int(ticks) # int() cast is important!
|
||||
|
||||
if ran:
|
||||
r = randrange( -ran, ran+1 )
|
||||
if ticks == 0 and r < 0:
|
||||
r=0
|
||||
p+=r
|
||||
if ran:
|
||||
r = randrange( -ran, ran+1 )
|
||||
if ticks == 0 and r < 0:
|
||||
r=0
|
||||
p+=r
|
||||
|
||||
return p
|
||||
return p
|
||||
|
||||
|
||||
|
||||
def stoi(s, errmsg=None):
|
||||
""" string to integer. """
|
||||
""" string to integer. """
|
||||
|
||||
try:
|
||||
return int(s, 0)
|
||||
except:
|
||||
if errmsg:
|
||||
error(errmsg)
|
||||
else:
|
||||
error("Expecting integer value, not %s" % s)
|
||||
try:
|
||||
return int(s, 0)
|
||||
except:
|
||||
if errmsg:
|
||||
error(errmsg)
|
||||
else:
|
||||
error("Expecting integer value, not %s" % s)
|
||||
|
||||
|
||||
def stof(s, errmsg=None):
|
||||
""" String to floating point. """
|
||||
""" String to floating point. """
|
||||
|
||||
try:
|
||||
return float(s)
|
||||
except:
|
||||
if errmsg:
|
||||
error(errmsg)
|
||||
else:
|
||||
error("Expecting a value, not %s" % s)
|
||||
try:
|
||||
return float(s)
|
||||
except:
|
||||
if errmsg:
|
||||
error(errmsg)
|
||||
else:
|
||||
error("Expecting a value, not %s" % s)
|
||||
|
||||
|
||||
|
||||
|
||||
def printList(l):
|
||||
""" Print each item in a list. Works for numeric and string."""
|
||||
""" Print each item in a list. Works for numeric and string."""
|
||||
|
||||
for a in l:
|
||||
print a,
|
||||
print
|
||||
for a in l:
|
||||
print a,
|
||||
print
|
||||
|
||||
|
||||
|
||||
def pextract(s, open, close, onlyone=None):
|
||||
""" Extract a parenthesized set of substrings.
|
||||
""" Extract a parenthesized set of substrings.
|
||||
|
||||
s - original string
|
||||
open - substring start tag \ can be multiple character
|
||||
close - substring end tag / strings (ie. "<<" or "-->")
|
||||
onlyone - optional, if set only the first set is extracted
|
||||
s - original string
|
||||
open - substring start tag \ can be multiple character
|
||||
close - substring end tag / strings (ie. "<<" or "-->")
|
||||
onlyone - optional, if set only the first set is extracted
|
||||
|
||||
returns ( original sans subs, [subs, ...] )
|
||||
returns ( original sans subs, [subs, ...] )
|
||||
|
||||
eg: pextract( "x{123}{666}y", '{', '}' )
|
||||
Returns: ( 'xy', [ '123', '666' ] )
|
||||
eg: pextract( "x{123}{666}y", '{', '}' )
|
||||
Returns: ( 'xy', [ '123', '666' ] )
|
||||
|
||||
"""
|
||||
"""
|
||||
|
||||
subs =[]
|
||||
while 1:
|
||||
lstart = s.find(open)
|
||||
lend = s.find(close)
|
||||
subs =[]
|
||||
while 1:
|
||||
lstart = s.find(open)
|
||||
lend = s.find(close)
|
||||
|
||||
if lstart>-1 and lstart < lend:
|
||||
subs.append( s[lstart+len(open):lend].strip() )
|
||||
s = s[:lstart] + s[lend+len(close):]
|
||||
if onlyone:
|
||||
break
|
||||
else:
|
||||
break
|
||||
if lstart>-1 and lstart < lend:
|
||||
subs.append( s[lstart+len(open):lend].strip() )
|
||||
s = s[:lstart] + s[lend+len(close):]
|
||||
if onlyone:
|
||||
break
|
||||
else:
|
||||
break
|
||||
|
||||
return s.strip(), subs
|
||||
return s.strip(), subs
|
||||
|
||||
|
|
281
mma/MMA/docs.py
281
mma/MMA/docs.py
|
@ -19,7 +19,7 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bob van der Poel <bvdp@xplornet.com>
|
||||
Bob van der Poel <bob@mellowood.ca>
|
||||
|
||||
"""
|
||||
|
||||
|
@ -32,47 +32,47 @@ import MMA.midiC
|
|||
|
||||
|
||||
def docDrumNames(order):
|
||||
""" Print LaTex table of drum names. """
|
||||
""" Print LaTex table of drum names. """
|
||||
|
||||
notenames = ['E\\flat', 'E', 'F', 'G\\flat', 'G', 'A\\flat',
|
||||
'A', 'B\\flat', 'B', 'C', 'D\\flat', 'D'] * 5
|
||||
notenames = ['E\\flat', 'E', 'F', 'G\\flat', 'G', 'A\\flat',
|
||||
'A', 'B\\flat', 'B', 'C', 'D\\flat', 'D'] * 5
|
||||
|
||||
n=zip( MMA.midiC.drumNames, range(27,len(MMA.midiC.drumNames)+27), notenames )
|
||||
n=zip( MMA.midiC.drumNames, range(27,len(MMA.midiC.drumNames)+27), notenames )
|
||||
|
||||
if order == "a":
|
||||
for a,v,m in sorted(n):
|
||||
print "\\insline{%s} {%s$^{%s}$}" % (a, v, m )
|
||||
if order == "a":
|
||||
for a,v,m in sorted(n):
|
||||
print "\\insline{%s} {%s$^{%s}$}" % (a, v, m )
|
||||
|
||||
else:
|
||||
for a,v,m in n:
|
||||
print "\\insline{%s} {%s$^{%s}$}" % (v, a, m)
|
||||
else:
|
||||
for a,v,m in n:
|
||||
print "\\insline{%s} {%s$^{%s}$}" % (v, a, m)
|
||||
|
||||
def docCtrlNames(order):
|
||||
""" Print LaTex table of MIDI controller names. """
|
||||
""" Print LaTex table of MIDI controller names. """
|
||||
|
||||
n=zip( MMA.midiC.ctrlNames, range(len(MMA.midiC.ctrlNames)) )
|
||||
n=zip( MMA.midiC.ctrlNames, range(len(MMA.midiC.ctrlNames)) )
|
||||
|
||||
if order == "a":
|
||||
for a,v in sorted(n):
|
||||
print "\\insline{%s} {%02x}" % (a, v)
|
||||
if order == "a":
|
||||
for a,v in sorted(n):
|
||||
print "\\insline{%s} {%02x}" % (a, v)
|
||||
|
||||
else:
|
||||
for a,v in n:
|
||||
print "\\insline{%02x} {%s}" % (v, a)
|
||||
else:
|
||||
for a,v in n:
|
||||
print "\\insline{%02x} {%s}" % (v, a)
|
||||
|
||||
def docInstNames(order):
|
||||
""" Print LaTex table of instrument names. """
|
||||
""" Print LaTex table of instrument names. """
|
||||
|
||||
n=zip( MMA.midiC.voiceNames, range(len(MMA.midiC.voiceNames)) )
|
||||
if order == "a":
|
||||
for a,v in sorted(n):
|
||||
a=a.replace('&', '\&')
|
||||
print "\\insline{%s} {%s}" % (a, v)
|
||||
n=zip( MMA.midiC.voiceNames, range(len(MMA.midiC.voiceNames)) )
|
||||
if order == "a":
|
||||
for a,v in sorted(n):
|
||||
a=a.replace('&', '\&')
|
||||
print "\\insline{%s} {%s}" % (a, v)
|
||||
|
||||
else:
|
||||
for a,v in n:
|
||||
a=a.replace('&', '\&')
|
||||
print "\\insline{%s} {%s}" % (v, a)
|
||||
else:
|
||||
for a,v in n:
|
||||
a=a.replace('&', '\&')
|
||||
print "\\insline{%s} {%s}" % (v, a)
|
||||
|
||||
|
||||
""" Whenever MMA encounters a DOC command, or if it defines
|
||||
|
@ -91,129 +91,166 @@ fname = ''
|
|||
author=""
|
||||
notes=""
|
||||
defs=[]
|
||||
variables=[]
|
||||
|
||||
def docAuthor(ln):
|
||||
global author
|
||||
global author
|
||||
|
||||
author = ' '.join(ln)
|
||||
author = ' '.join(ln)
|
||||
|
||||
|
||||
def docNote(ln):
|
||||
""" Add a doc line. """
|
||||
""" Add a doc line. """
|
||||
|
||||
global fname, notes
|
||||
global fname, notes
|
||||
|
||||
if not gbl.docs or not ln:
|
||||
return
|
||||
if not gbl.docs or not ln:
|
||||
return
|
||||
|
||||
# Grab the arg and data, save it
|
||||
# Grab the arg and data, save it
|
||||
|
||||
fname = os.path.basename(gbl.inpath.fname)
|
||||
if notes:
|
||||
notes += ' '
|
||||
notes += ' '.join(ln)
|
||||
fname = os.path.basename(gbl.inpath.fname)
|
||||
if notes:
|
||||
notes += ' '
|
||||
notes += ' '.join(ln)
|
||||
|
||||
def docVars(ln):
|
||||
""" Add a VARIABLE line (docs vars used in lib file)."""
|
||||
|
||||
global fname, variables
|
||||
|
||||
if not gbl.docs or not ln:
|
||||
return
|
||||
|
||||
fname = os.path.basename(gbl.inpath.fname)
|
||||
variables.append([ln[0], ' '.join(ln[1:]) ] )
|
||||
|
||||
|
||||
def docDefine(ln):
|
||||
""" Save a DEFGROOVE comment string.
|
||||
""" Save a DEFGROOVE comment string.
|
||||
|
||||
Entries are stored as a list. Each item in the list is
|
||||
complete groove def looking like:
|
||||
defs[ [ Name, Seqsize, Description, [ [TRACK,INST]...]] ...]
|
||||
Entries are stored as a list. Each item in the list is
|
||||
complete groove def looking like:
|
||||
defs[ [ Name, Seqsize, Description, [ [TRACK,INST]...]] ...]
|
||||
|
||||
"""
|
||||
"""
|
||||
|
||||
global defs
|
||||
global defs
|
||||
|
||||
l = [ ln[0], gbl.seqSize, ' '.join(ln[1:]) ]
|
||||
for a in sorted(gbl.tnames.keys()):
|
||||
c=gbl.tnames[a]
|
||||
if c.sequence and len(c.sequence) != c.sequence.count(None):
|
||||
if c.vtype=='DRUM':
|
||||
v=MMA.midiC.valueToDrum(c.toneList[0])
|
||||
else:
|
||||
v=MMA.midiC.valueToInst(c.voice[0])
|
||||
l.append( [c.name, v ] )
|
||||
l = [ ln[0], gbl.seqSize, ' '.join(ln[1:]) ]
|
||||
for a in sorted(gbl.tnames.keys()):
|
||||
c=gbl.tnames[a]
|
||||
if c.sequence and len(c.sequence) != c.sequence.count(None):
|
||||
if c.vtype=='DRUM':
|
||||
v=MMA.midiC.valueToDrum(c.toneList[0])
|
||||
else:
|
||||
v=MMA.midiC.valueToInst(c.voice[0])
|
||||
l.append( [c.name, v ] )
|
||||
|
||||
defs.append(l)
|
||||
defs.append(l)
|
||||
|
||||
def docDump():
|
||||
""" Print the LaTex docs. """
|
||||
""" Print the LaTex docs. """
|
||||
|
||||
global fname, author, notes, defs
|
||||
global fname, author, notes, defs, variables
|
||||
|
||||
if gbl.docs == 1: # latex docs
|
||||
if notes:
|
||||
if fname.endswith(gbl.ext):
|
||||
fname='.'.join(fname.split('.')[:-1])
|
||||
print "\\filehead{%s}{%s}" % (totex(fname), totex(notes))
|
||||
print
|
||||
if gbl.docs == 1: # latex docs
|
||||
if notes:
|
||||
if fname.endswith(gbl.ext):
|
||||
fname='.'.join(fname.split('.')[:-1])
|
||||
print "\\filehead{%s}{%s}" % (totex(fname), totex(notes))
|
||||
print
|
||||
|
||||
if defs:
|
||||
for l in defs:
|
||||
print " \\instable{%s}{%s}{%s}{" % \
|
||||
(totex(l[0]), totex(l[2]), l[1] )
|
||||
for c,v in l[3:]:
|
||||
print " \\insline{%s}{%s}" % (c.title(), totex(v))
|
||||
print " }"
|
||||
if variables:
|
||||
print " \\variables{"
|
||||
for l in variables:
|
||||
print " \\insvar{%s}{%s}" % ( totex(l[0]), totex(l[1]) )
|
||||
print " }"
|
||||
print
|
||||
|
||||
if gbl.docs == 2: # html docs
|
||||
if notes:
|
||||
print '<!-- Auto-Generated by MMA on: %s -->' % time.ctime()
|
||||
print '<HTML>'
|
||||
print '<BODY BGCOLOR="#B7DFFF" Text=Black>'
|
||||
if fname.endswith(gbl.ext):
|
||||
fname='.'.join(fname.split('.')[:-1])
|
||||
print "<H1>%s</H1>" % fname.title()
|
||||
print "<P>%s" % notes
|
||||
if defs:
|
||||
print "<ul>"
|
||||
for l in defs:
|
||||
print "<LI><A Href=#%s>%s</a>" % (l[0], l[0])
|
||||
print "</ul>"
|
||||
for l in defs:
|
||||
print '<A Name=%s></a>' % l[0]
|
||||
print '<P>'
|
||||
print '<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">'
|
||||
print ' <TR><TD>'
|
||||
print ' <H2> %s </H2> ' % l[0]
|
||||
print ' %s <B>(%s)</B> ' % ( l[2], l[1] )
|
||||
print ' </TD></TR>'
|
||||
print ' <TR><TD>'
|
||||
print ' <Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">'
|
||||
for c,v in l[3:]:
|
||||
print " <TR><TD> %s </TD> <TD> %s </TD></TR>" % (c.title(), v)
|
||||
print ' </Table>'
|
||||
print ' </TD></TR>'
|
||||
print '</Table>'
|
||||
print
|
||||
print '</Body></HTML>'
|
||||
defs = []
|
||||
notes = ""
|
||||
author = ""
|
||||
if defs:
|
||||
for l in defs:
|
||||
print " \\instable{%s}{%s}{%s}{" % \
|
||||
(totex(l[0]), totex(l[2]), l[1] )
|
||||
for c,v in l[3:]:
|
||||
print " \\insline{%s}{%s}" % (c.title(), totex(v))
|
||||
print " }"
|
||||
|
||||
if gbl.docs == 2: # html docs
|
||||
if notes:
|
||||
print '<!-- Auto-Generated by MMA on: %s -->' % time.ctime()
|
||||
print '<HTML>'
|
||||
print '<BODY BGCOLOR="#B7DFFF" Text=Black>'
|
||||
if fname.endswith(gbl.ext):
|
||||
fname='.'.join(fname.split('.')[:-1])
|
||||
print "<H1>%s</H1>" % fname.title()
|
||||
print "<P>%s" % notes
|
||||
|
||||
if variables:
|
||||
print "<P>"
|
||||
print '<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">'
|
||||
print ' <TR><TD>'
|
||||
print ' <H2> Variables </H2> '
|
||||
print ' </TD></TR>'
|
||||
print ' <TR><TD>'
|
||||
print ' <Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="100%">'
|
||||
for l in variables:
|
||||
print " <TR>"
|
||||
print " <TD Valign=Top> <B> %s </B> </TD> " % l[0]
|
||||
print " <TD Valign=Top> %s </TD>" % l[1]
|
||||
print " </TR>"
|
||||
print ' </Table>'
|
||||
print ' </TD></TR>'
|
||||
print '</Table>'
|
||||
|
||||
if defs:
|
||||
print "<ul>"
|
||||
for l in defs:
|
||||
print "<LI><A Href=#%s>%s</a>" % (l[0], l[0])
|
||||
print "</ul>"
|
||||
for l in defs:
|
||||
print '<A Name=%s></a>' % l[0]
|
||||
print '<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">'
|
||||
print ' <TR><TD>'
|
||||
print ' <H2> %s </H2> ' % l[0]
|
||||
print ' %s <B>(%s)</B> ' % ( l[2], l[1] )
|
||||
print ' </TD></TR>'
|
||||
print ' <TR><TD>'
|
||||
print ' <Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">'
|
||||
for c,v in l[3:]:
|
||||
print " <TR><TD> %s </TD> <TD> %s </TD></TR>" % (c.title(), v)
|
||||
print ' </Table>'
|
||||
print ' </TD></TR>'
|
||||
print '</Table>'
|
||||
print
|
||||
print '</Body></HTML>'
|
||||
defs = []
|
||||
variables=[]
|
||||
notes = ""
|
||||
author = ""
|
||||
|
||||
|
||||
|
||||
def totex(s):
|
||||
""" Parse a string and quote tex stuff.
|
||||
""" Parse a string and quote tex stuff.
|
||||
|
||||
Also handles proper quotation style.
|
||||
"""
|
||||
Also handles proper quotation style.
|
||||
"""
|
||||
|
||||
s = s.replace("$", "\\$")
|
||||
s = s.replace("*", "$*$")
|
||||
s = s.replace("\\", "\\\\")
|
||||
s = s.replace("#", "\\#")
|
||||
s = s.replace("&", "\\&")
|
||||
s = s.replace("$", "\$")
|
||||
s = s.replace("*", "$*$")
|
||||
s = s.replace("_", "\\_")
|
||||
#s = s.replace("\\", "\\\\")
|
||||
s = s.replace("#", "\\#")
|
||||
s = s.replace("&", "\\&")
|
||||
|
||||
q="``"
|
||||
while s.count('"'):
|
||||
i=s.find('"')
|
||||
s=s[:i] + q + s[i+1:]
|
||||
if q=="``":
|
||||
q="''"
|
||||
else:
|
||||
a="``"
|
||||
q="``"
|
||||
while s.count('"'):
|
||||
s=s.replace('"', q, 1)
|
||||
if q=="``":
|
||||
q="''"
|
||||
else:
|
||||
q="``"
|
||||
|
||||
|
||||
return s
|
||||
return s
|
||||
|
|
373
mma/MMA/file.py
373
mma/MMA/file.py
|
@ -19,11 +19,10 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bob van der Poel <bvdp@xplornet.com>
|
||||
Bob van der Poel <bob@mellowood.ca>
|
||||
|
||||
"""
|
||||
|
||||
|
||||
import sys
|
||||
import os
|
||||
|
||||
|
@ -31,38 +30,38 @@ import gbl
|
|||
from MMA.common import *
|
||||
|
||||
def locFile(name, lib):
|
||||
""" Locate a filename.
|
||||
""" Locate a filename.
|
||||
|
||||
This checks, in order:
|
||||
lib/name + .mma
|
||||
lib/name
|
||||
name + .mma
|
||||
name
|
||||
"""
|
||||
This checks, in order:
|
||||
lib/name + .mma
|
||||
lib/name
|
||||
name + .mma
|
||||
name
|
||||
"""
|
||||
|
||||
ext=gbl.ext
|
||||
exists = os.path.exists
|
||||
ext=gbl.ext
|
||||
exists = os.path.exists
|
||||
|
||||
name=os.path.expanduser(name) # for ~ expansion only
|
||||
name=os.path.expanduser(name) # for ~ expansion only
|
||||
|
||||
if lib:
|
||||
if not name.endswith(ext):
|
||||
t=os.path.join(lib, name + ext)
|
||||
if exists(t):
|
||||
return t
|
||||
t=os.path.join(lib, name)
|
||||
if exists(t):
|
||||
return t
|
||||
if lib:
|
||||
if not name.endswith(ext):
|
||||
t=os.path.join(lib, name + ext)
|
||||
if exists(t):
|
||||
return t
|
||||
t=os.path.join(lib, name)
|
||||
if exists(t):
|
||||
return t
|
||||
|
||||
if not name.endswith(ext):
|
||||
t = name + ext
|
||||
if exists(t):
|
||||
return t
|
||||
if not name.endswith(ext):
|
||||
t = name + ext
|
||||
if exists(t):
|
||||
return t
|
||||
|
||||
if exists(name):
|
||||
return name
|
||||
if exists(name):
|
||||
return name
|
||||
|
||||
return None
|
||||
return None
|
||||
|
||||
|
||||
###########################
|
||||
|
@ -72,241 +71,241 @@ def locFile(name, lib):
|
|||
|
||||
class ReadFile:
|
||||
|
||||
class FileData:
|
||||
""" After reading the file in bulk it is parsed and stored in this
|
||||
data structure. Blanks lines and comments are removed.
|
||||
"""
|
||||
class FileData:
|
||||
""" After reading the file in bulk it is parsed and stored in this
|
||||
data structure. Blanks lines and comments are removed.
|
||||
"""
|
||||
|
||||
def __init__(self, lnum, data, label):
|
||||
self.lnum=lnum
|
||||
self.data=data
|
||||
self.label=label
|
||||
def __init__(self, lnum, data, label):
|
||||
self.lnum=lnum
|
||||
self.data=data
|
||||
self.label=label
|
||||
|
||||
|
||||
def __init__(self, fname):
|
||||
def __init__(self, fname):
|
||||
|
||||
self.fdata=fdata=[]
|
||||
self.lastline = None
|
||||
self.lineptr = None
|
||||
self.fname = None
|
||||
self.fdata=fdata=[]
|
||||
self.lastline = None
|
||||
self.lineptr = None
|
||||
self.fname = None
|
||||
|
||||
self.que = [] # que for pushed lines (mainly for REPEAT)
|
||||
self.qnums = []
|
||||
self.que = [] # que for pushed lines (mainly for REPEAT)
|
||||
self.qnums = []
|
||||
|
||||
|
||||
dataStore = self.FileData # shortcut to avoid '.'s
|
||||
dataStore = self.FileData # shortcut to avoid '.'s
|
||||
|
||||
try:
|
||||
inpath = file(fname, 'r')
|
||||
try:
|
||||
inpath = file(fname, 'r')
|
||||
|
||||
except:
|
||||
error("Unable to open '%s' for input" % fname)
|
||||
except:
|
||||
error("Unable to open '%s' for input" % fname)
|
||||
|
||||
if gbl.debug or gbl.showFilenames:
|
||||
print "Opening file '%s'." % fname
|
||||
if gbl.debug or gbl.showFilenames:
|
||||
print "Opening file '%s'." % fname
|
||||
|
||||
self.fname = fname
|
||||
self.fname = fname
|
||||
|
||||
""" Read entire file, line by line:
|
||||
""" Read entire file, line by line:
|
||||
|
||||
- strip off blanks, comments
|
||||
- join continuation lines
|
||||
- parse out LABELS
|
||||
- create line numbers
|
||||
"""
|
||||
- strip off blanks, comments
|
||||
- join continuation lines
|
||||
- parse out LABELS
|
||||
- create line numbers
|
||||
"""
|
||||
|
||||
lcount=0
|
||||
label=''
|
||||
labs=[] # track label defs, error if duplicate in same file
|
||||
nlabs=[] # track linenumber label defs
|
||||
lcount=0
|
||||
label=''
|
||||
labs=[] # track label defs, error if duplicate in same file
|
||||
nlabs=[] # track linenumber label defs
|
||||
|
||||
while 1:
|
||||
l = inpath.readline()
|
||||
while 1:
|
||||
l = inpath.readline()
|
||||
|
||||
if not l: # EOF
|
||||
break
|
||||
if not l: # EOF
|
||||
break
|
||||
|
||||
l= l.strip()
|
||||
lcount += 1
|
||||
l= l.strip()
|
||||
lcount += 1
|
||||
|
||||
if not l:
|
||||
continue
|
||||
if not l:
|
||||
continue
|
||||
|
||||
while l[-1] == '\\':
|
||||
l = l[0:-1] + ' ' + inpath.readline().strip()
|
||||
lcount +=1
|
||||
while l[-1] == '\\':
|
||||
l = l[0:-1] + ' ' + inpath.readline().strip()
|
||||
lcount +=1
|
||||
|
||||
|
||||
""" This next line splits the line at the first found
|
||||
comment '//', drops the comment, and splits the
|
||||
remaining line into tokens using whitespace delimiters.
|
||||
Note that split() will strip off trailing and leading
|
||||
spaces, so a strip() is not needed here.
|
||||
"""
|
||||
""" This next line splits the line at the first found
|
||||
comment '//', drops the comment, and splits the
|
||||
remaining line into tokens using whitespace delimiters.
|
||||
Note that split() will strip off trailing and leading
|
||||
spaces, so a strip() is not needed here.
|
||||
"""
|
||||
|
||||
l = l.split('//',1)[0].split()
|
||||
l = l.split('//',1)[0].split()
|
||||
|
||||
if not l:
|
||||
continue
|
||||
if not l:
|
||||
continue
|
||||
|
||||
|
||||
""" Parse out label lines. There are 2 different kinds of labels:
|
||||
- LABEL XXX
|
||||
and
|
||||
- NNN
|
||||
""" Parse out label lines. There are 2 different kinds of labels:
|
||||
- LABEL XXX
|
||||
and
|
||||
- NNN
|
||||
|
||||
The first kind is treated as an exclusive. If a NNN label or previous
|
||||
XXX duplicates, and error is generated.
|
||||
The first kind is treated as an exclusive. If a NNN label or previous
|
||||
XXX duplicates, and error is generated.
|
||||
|
||||
The LINE NUMBER type is not exclusive. If a duplicate NNN is found, the
|
||||
last one is used.
|
||||
The LINE NUMBER type is not exclusive. If a duplicate NNN is found, the
|
||||
last one is used.
|
||||
|
||||
XXX NNN types can not duplicate each other.
|
||||
XXX NNN types can not duplicate each other.
|
||||
|
||||
Also note that XXX lines are stripped from input as well as NNN lines
|
||||
with only a NNN.
|
||||
"""
|
||||
Also note that XXX lines are stripped from input as well as NNN lines
|
||||
with only a NNN.
|
||||
"""
|
||||
|
||||
|
||||
if l[0].upper()=='LABEL':
|
||||
if len(l) !=2:
|
||||
gbl.lineno = lcount
|
||||
error("Usage: LABEL <string>")
|
||||
label=l[1].upper()
|
||||
if label[0]=='$':
|
||||
gbl.lineno = lcount
|
||||
error("Variables are not permitted as labels")
|
||||
if label in labs:
|
||||
gbl.lineno = lcount
|
||||
error("Duplicate label specified in line %s." % lcount)
|
||||
elif label in nlabs:
|
||||
gbl.lineno = lcount
|
||||
error("Label '%s' duplicates line number label" % label)
|
||||
labs.append(label)
|
||||
if l[0].upper()=='LABEL':
|
||||
if len(l) !=2:
|
||||
gbl.lineno = lcount
|
||||
error("Usage: LABEL <string>")
|
||||
label=l[1].upper()
|
||||
if label[0]=='$':
|
||||
gbl.lineno = lcount
|
||||
error("Variables are not permitted as labels")
|
||||
if label in labs:
|
||||
gbl.lineno = lcount
|
||||
error("Duplicate label specified in line %s" % lcount)
|
||||
elif label in nlabs:
|
||||
gbl.lineno = lcount
|
||||
error("Label '%s' duplicates line number label" % label)
|
||||
labs.append(label)
|
||||
|
||||
elif l[0].isdigit():
|
||||
label=l[0]
|
||||
elif l[0].isdigit():
|
||||
label=l[0]
|
||||
|
||||
if label in labs:
|
||||
gbl.lineno = lcount
|
||||
error("Line number '%s' duplicates LABEL." % label)
|
||||
if label in labs:
|
||||
gbl.lineno = lcount
|
||||
error("Line number '%s' duplicates LABEL" % label)
|
||||
|
||||
if not label in nlabs:
|
||||
nlabs.append(label)
|
||||
else:
|
||||
for i, a in enumerate(fdata):
|
||||
if a.label == label:
|
||||
fdata[i].label=''
|
||||
if not label in nlabs:
|
||||
nlabs.append(label)
|
||||
else:
|
||||
for i, a in enumerate(fdata):
|
||||
if a.label == label:
|
||||
fdata[i].label=''
|
||||
|
||||
else:
|
||||
label = None
|
||||
else:
|
||||
label = None
|
||||
|
||||
# Save the line, linenumber and (maybe) the label.
|
||||
# Save the line, linenumber and (maybe) the label.
|
||||
|
||||
fdata.append( dataStore(lcount, l, label))
|
||||
fdata.append( dataStore(lcount, l, label))
|
||||
|
||||
|
||||
inpath.close()
|
||||
inpath.close()
|
||||
|
||||
self.lineptr = 0
|
||||
self.lastline = len(fdata)
|
||||
self.lineptr = 0
|
||||
self.lastline = len(fdata)
|
||||
|
||||
|
||||
def toEof(self):
|
||||
""" Move pointer to End of File. """
|
||||
def toEof(self):
|
||||
""" Move pointer to End of File. """
|
||||
|
||||
self.lineptr=self.lastline+1
|
||||
self.que = []
|
||||
self.qnums = []
|
||||
self.lineptr=self.lastline+1
|
||||
self.que = []
|
||||
self.qnums = []
|
||||
|
||||
|
||||
def goto(self, l):
|
||||
""" Do a goto jump.
|
||||
def goto(self, l):
|
||||
""" Do a goto jump.
|
||||
|
||||
This isn't perfect, but is probably the way most GOTOs work. If
|
||||
inside a repeat/if then nothing more is processed. The jump is
|
||||
immediate. Of course, you'll run into problems with missing
|
||||
repeat/repeatend if you try it. Since all repeats are stacked
|
||||
back into the que, we just delete the que. Then we look for a
|
||||
matching label in the file line array.
|
||||
This isn't perfect, but is probably the way most GOTOs work. If
|
||||
inside a repeat/if then nothing more is processed. The jump is
|
||||
immediate. Of course, you'll run into problems with missing
|
||||
repeat/repeatend if you try it. Since all repeats are stacked
|
||||
back into the que, we just delete the que. Then we look for a
|
||||
matching label in the file line array.
|
||||
|
||||
Label search is linear. Not too efficient, but the lists
|
||||
will probably never be that long either.
|
||||
Label search is linear. Not too efficient, but the lists
|
||||
will probably never be that long either.
|
||||
|
||||
"""
|
||||
"""
|
||||
|
||||
if not l:
|
||||
error("No label specified")
|
||||
if not l:
|
||||
error("No label specified")
|
||||
|
||||
if self.que:
|
||||
self.que=[]
|
||||
if self.que:
|
||||
self.que=[]
|
||||
|
||||
for i,a in enumerate(self.fdata):
|
||||
if a.label == l:
|
||||
self.lineptr=i
|
||||
return
|
||||
for i,a in enumerate(self.fdata):
|
||||
if a.label == l:
|
||||
self.lineptr=i
|
||||
return
|
||||
|
||||
error("Label '%s' has not be set." % l)
|
||||
error("Label '%s' has not be set" % l)
|
||||
|
||||
|
||||
def push(self, q, nums):
|
||||
""" Push a list of lines back into the input stream.
|
||||
def push(self, q, nums):
|
||||
""" Push a list of lines back into the input stream.
|
||||
|
||||
Note: This is a list of semi-processed lines, no comments, etc.
|
||||
Note: This is a list of semi-processed lines, no comments, etc.
|
||||
|
||||
It's quicker to extend a list than to insert, so add to the end.
|
||||
Note: we reverse the original, extend() then reverse again, just
|
||||
in case the caller cares.
|
||||
It's quicker to extend a list than to insert, so add to the end.
|
||||
Note: we reverse the original, extend() then reverse again, just
|
||||
in case the caller cares.
|
||||
|
||||
nums is a list of linenumbers. Needed to report error lines.
|
||||
"""
|
||||
nums is a list of linenumbers. Needed to report error lines.
|
||||
"""
|
||||
|
||||
if not self.que:
|
||||
self.que = ['']
|
||||
self.qnums=[gbl.lineno]
|
||||
if not self.que:
|
||||
self.que = ['']
|
||||
self.qnums=[gbl.lineno]
|
||||
|
||||
|
||||
q.reverse()
|
||||
self.que.extend(q)
|
||||
q.reverse()
|
||||
q.reverse()
|
||||
self.que.extend(q)
|
||||
q.reverse()
|
||||
|
||||
nums.reverse()
|
||||
self.qnums.extend(nums)
|
||||
nums.reverse()
|
||||
nums.reverse()
|
||||
self.qnums.extend(nums)
|
||||
nums.reverse()
|
||||
|
||||
def read(self):
|
||||
""" Return a line.
|
||||
def read(self):
|
||||
""" Return a line.
|
||||
|
||||
This will return either a queued line or a line from the
|
||||
file (which was stored/processed earlier).
|
||||
"""
|
||||
This will return either a queued line or a line from the
|
||||
file (which was stored/processed earlier).
|
||||
"""
|
||||
|
||||
while 1:
|
||||
while 1:
|
||||
|
||||
# Return a queued line if possible.
|
||||
# Return a queued line if possible.
|
||||
|
||||
if self.que:
|
||||
ln = self.que.pop(-1)
|
||||
if self.que:
|
||||
ln = self.que.pop(-1)
|
||||
|
||||
gbl.lineno = self.qnums.pop()
|
||||
gbl.lineno = self.qnums.pop()
|
||||
|
||||
if not ln:
|
||||
continue
|
||||
if not ln:
|
||||
continue
|
||||
|
||||
return ln
|
||||
return ln
|
||||
|
||||
|
||||
# Return the next line in the file.
|
||||
# Return the next line in the file.
|
||||
|
||||
|
||||
if self.lineptr>=self.lastline:
|
||||
return None #### EOF
|
||||
if self.lineptr>=self.lastline:
|
||||
return None #### EOF
|
||||
|
||||
|
||||
ln=self.fdata[self.lineptr].data
|
||||
gbl.lineno = self.fdata[self.lineptr].lnum
|
||||
self.lineptr +=1
|
||||
ln=self.fdata[self.lineptr].data
|
||||
gbl.lineno = self.fdata[self.lineptr].lnum
|
||||
self.lineptr +=1
|
||||
|
||||
return ln
|
||||
return ln
|
||||
|
||||
|
||||
|
|
112
mma/MMA/gbl.py
112
mma/MMA/gbl.py
|
@ -18,47 +18,47 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bob van der Poel <bvdp@xplornet.com>
|
||||
Bob van der Poel <bob@mellowood.ca>
|
||||
|
||||
"""
|
||||
|
||||
import os
|
||||
|
||||
version = "1.0-rc2" # Version -- Oct 15/2006
|
||||
version = "1.1" # Version -- March 7/2007
|
||||
|
||||
""" mtrks is storage for the MIDI data as it is created.
|
||||
It is a dict of class Mtrk() instances. Keys are the
|
||||
midi channel numbers. Ie, mtrks[2] is for channel 2,
|
||||
etc. mtrks[0] is for the meta stuff.
|
||||
midi channel numbers. Ie, mtrks[2] is for channel 2,
|
||||
etc. mtrks[0] is for the meta stuff.
|
||||
"""
|
||||
|
||||
mtrks = {}
|
||||
|
||||
""" tnames is a dict of assigned track names. The keys are
|
||||
the track names; each entry is a pattern class instance.
|
||||
We have tnames['BASS-FOO'], etc.
|
||||
We have tnames['BASS-FOO'], etc.
|
||||
"""
|
||||
|
||||
tnames = {}
|
||||
|
||||
""" midiAssigns keeps track of channel/track assignments. The keys
|
||||
are midi channels (1..16), the data is a list of tracks assigned
|
||||
to each channel. The tracks are only added, not deleted. Right
|
||||
now this is only used in -c reporting.
|
||||
to each channel. The tracks are only added, not deleted. Right
|
||||
now this is only used in -c reporting.
|
||||
"""
|
||||
|
||||
midiAssigns={}
|
||||
for c in range(0,17):
|
||||
midiAssigns[c]=[]
|
||||
midiAssigns[c]=[]
|
||||
|
||||
""" midiAvail is a list with each entry representing a MIDI channel.
|
||||
As channels are allocated/deallocated the appropriated slot
|
||||
is inc/decremented.
|
||||
is inc/decremented.
|
||||
"""
|
||||
|
||||
midiAvail=[ 0 ] * 17 # slots 0..16, slot 0 is not used.
|
||||
|
||||
deletedTracks = [] # list of deleted tracks for -c report
|
||||
deletedTracks = [] # list of deleted tracks for -c report
|
||||
|
||||
""" This is a user constructed list of names/channels. The keys
|
||||
are names, data is a channel. Eg. midiChPrefs['BASS-SUS']==9
|
||||
|
@ -71,74 +71,76 @@ midiChPrefs={}
|
|||
""" Groove storage. Each entry in settingsGroove{} has a keyname
|
||||
of a saved groove.
|
||||
|
||||
lastGroove and currentGroove are used by macros
|
||||
lastGroove and currentGroove are used by macros
|
||||
"""
|
||||
|
||||
settingsGroove = {}
|
||||
settingsGroove = {}
|
||||
lastGroove = ''
|
||||
currentGroove = ''
|
||||
|
||||
|
||||
""" SeqRnd variable is a list. The first entry is a flag:(0, 1 or x):
|
||||
0 - not set
|
||||
1 - set
|
||||
2 - set for specific tracks, track list starts at position [1]
|
||||
1 - set
|
||||
2 - set for specific tracks, track list starts at position [1]
|
||||
"""
|
||||
|
||||
seqRnd = [0] # set if SEQRND has been set
|
||||
seqRnd = [0] # set if SEQRND has been set
|
||||
|
||||
|
||||
############# String constants ####################
|
||||
|
||||
|
||||
ext = ".mma" # extension for song/lib files.
|
||||
ext = ".mma" # extension for song/lib files.
|
||||
|
||||
|
||||
############## Tempo, and other midi positioning. #############
|
||||
|
||||
|
||||
BperQ = 192 # midi ticks per quarter note
|
||||
QperBar = 4 # Beats/bar, set with TIME
|
||||
tickOffset = 0 # offset of current bar in ticks
|
||||
tempo = 120 # current tempo
|
||||
seqSize = 1 # variation sequence table size
|
||||
seqCount = 0 # running count of variation
|
||||
BperQ = 192 # midi ticks per quarter note
|
||||
QperBar = 4 # Beats/bar, set with TIME
|
||||
tickOffset = 0 # offset of current bar in ticks
|
||||
tempo = 120 # current tempo
|
||||
seqSize = 1 # variation sequence table size
|
||||
seqCount = 0 # running count of variation
|
||||
|
||||
transpose = 0 # Transpose is global (ignored by drum tracks)
|
||||
transpose = 0 # Transpose is global (ignored by drum tracks)
|
||||
|
||||
lineno = -1 # used for error reporting
|
||||
lineno = -1 # used for error reporting
|
||||
|
||||
swingMode = 0 # defaults to 0, set to 1 for swing mode
|
||||
swingSkew = None # this is just for $_SwingMode macro
|
||||
|
||||
barNum = 0 # Current line number
|
||||
|
||||
synctick = 0 # flag, set if we want a tick on all tracks at offset 0
|
||||
|
||||
############# Path and search variables. #############
|
||||
|
||||
|
||||
libPath = ''
|
||||
for p in ( "c:\\mma\\lib", "/usr/local/share/mma/lib", "/usr/share/mma/lib", "./lib"):
|
||||
if os.path.isdir(p):
|
||||
libPath=p
|
||||
break
|
||||
for p in ( "c:\\mma\\lib", "/usr/local/share/mma/lib", "/usr/share/mma/lib", "./lib"):
|
||||
if os.path.isdir(p):
|
||||
libPath=p
|
||||
break
|
||||
|
||||
incPath = ''
|
||||
for p in ( "c:\\mma\\includes", "/usr/local/share/mma/includes",
|
||||
"/usr/share/mma/includes", "./includes"):
|
||||
if os.path.isdir(p):
|
||||
incPath=p
|
||||
break
|
||||
"/usr/share/mma/includes", "./includes"):
|
||||
if os.path.isdir(p):
|
||||
incPath=p
|
||||
break
|
||||
|
||||
autoLib = 'stdlib'
|
||||
|
||||
outPath = '' # Directory for MIDI file
|
||||
mmaStart = [] # list of START files
|
||||
mmaEnd = [] # list of END files
|
||||
mmaRC = None # user specified RC file, overrides defaults
|
||||
inpath = None # input file
|
||||
outPath = '' # Directory for MIDI file
|
||||
mmaStart = [] # list of START files
|
||||
mmaEnd = [] # list of END files
|
||||
mmaRC = None # user specified RC file, overrides defaults
|
||||
inpath = None # input file
|
||||
|
||||
midiFileType = 1 # type 1 file, SMF command can change to 0
|
||||
runningStatus = 1 # running status enabled
|
||||
midiFileType = 1 # type 1 file, SMF command can change to 0
|
||||
runningStatus = 1 # running status enabled
|
||||
|
||||
|
||||
############# Options. #############
|
||||
|
@ -146,24 +148,24 @@ runningStatus = 1 # running status enabled
|
|||
|
||||
""" These variables are all set from the command line in MMA.opts.py.
|
||||
It's a bit of an easy-way-out to have them all here, but I don't think
|
||||
it hurts too much.
|
||||
it hurts too much.
|
||||
"""
|
||||
|
||||
debug = Ldebug = 0
|
||||
pshow = Lpshow = 0
|
||||
seqshow = Lseqshow = 0
|
||||
showrun = Lshowrun = 0
|
||||
noWarn = LnoWarn = 0
|
||||
noOutput = LnoOutput = 0
|
||||
showExpand = LshowExpand = 0
|
||||
showFilenames = LshowFilenames = 0
|
||||
chshow = Lchshow = 0
|
||||
debug = Ldebug = 0
|
||||
pshow = Lpshow = 0
|
||||
seqshow = Lseqshow = 0
|
||||
showrun = Lshowrun = 0
|
||||
noWarn = LnoWarn = 0
|
||||
noOutput = LnoOutput = 0
|
||||
showExpand = LshowExpand = 0
|
||||
showFilenames = LshowFilenames = 0
|
||||
chshow = Lchshow = 0
|
||||
|
||||
outfile = None
|
||||
infile = None
|
||||
docs = 0
|
||||
maxBars = 500
|
||||
makeGrvDefs = 0
|
||||
cmdSMF = None
|
||||
outfile = None
|
||||
infile = None
|
||||
docs = 0
|
||||
maxBars = 500
|
||||
makeGrvDefs = 0
|
||||
cmdSMF = None
|
||||
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bob van der Poel <bvdp@xplornet.com>
|
||||
Bob van der Poel <bob@mellowood.ca>
|
||||
|
||||
"""
|
||||
|
||||
|
@ -29,110 +29,110 @@ from MMA.common import *
|
|||
|
||||
|
||||
def harmonize(hmode, note, chord):
|
||||
""" Get harmony note(s) for given chord. """
|
||||
""" Get harmony note(s) for given chord. """
|
||||
|
||||
hnotes = []
|
||||
hnotes = []
|
||||
|
||||
for tp in hmode.split('+'):
|
||||
for tp in hmode.split('+'):
|
||||
|
||||
if tp in ('2', '2BELOW'):
|
||||
hnotes.append( gethnote(note, chord) )
|
||||
if tp in ('2', '2BELOW'):
|
||||
hnotes.append( gethnote(note, chord) )
|
||||
|
||||
elif tp == '2ABOVE':
|
||||
hnotes.append( gethnote(note, chord)+12 )
|
||||
elif tp == '2ABOVE':
|
||||
hnotes.append( gethnote(note, chord)+12 )
|
||||
|
||||
elif tp in ( '3', '3BELOW'):
|
||||
a = gethnote(note, chord)
|
||||
b = gethnote(a, chord)
|
||||
hnotes.extend( [a, b] )
|
||||
elif tp in ( '3', '3BELOW'):
|
||||
a = gethnote(note, chord)
|
||||
b = gethnote(a, chord)
|
||||
hnotes.extend( [a, b] )
|
||||
|
||||
elif tp == '3ABOVE':
|
||||
a = gethnote(note, chord)
|
||||
b = gethnote(a, chord)
|
||||
hnotes.extend( [a+12, b+12] )
|
||||
elif tp == '3ABOVE':
|
||||
a = gethnote(note, chord)
|
||||
b = gethnote(a, chord)
|
||||
hnotes.extend( [a+12, b+12] )
|
||||
|
||||
elif tp in ('OPEN', "OPENBELOW"):
|
||||
a=gethnote(note, chord)
|
||||
hnotes.append( gethnote(a, chord))
|
||||
elif tp in ('OPEN', "OPENBELOW"):
|
||||
a=gethnote(note, chord)
|
||||
hnotes.append( gethnote(a, chord))
|
||||
|
||||
elif tp == 'OPENABOVE':
|
||||
a=gethnote(note, chord)
|
||||
hnotes.append( gethnote(a, chord) + 12 )
|
||||
elif tp == 'OPENABOVE':
|
||||
a=gethnote(note, chord)
|
||||
hnotes.append( gethnote(a, chord) + 12 )
|
||||
|
||||
elif tp in ('8', '8BELOW'):
|
||||
hnotes.append( note - 12 )
|
||||
elif tp in ('8', '8BELOW'):
|
||||
hnotes.append( note - 12 )
|
||||
|
||||
elif tp == '8ABOVE':
|
||||
hnotes.append( note + 12 )
|
||||
elif tp == '8ABOVE':
|
||||
hnotes.append( note + 12 )
|
||||
|
||||
elif tp in ('16', '16BELOW'):
|
||||
hnotes.append( note - (2 * 12) )
|
||||
elif tp in ('16', '16BELOW'):
|
||||
hnotes.append( note - (2 * 12) )
|
||||
|
||||
elif tp == '16ABOVE':
|
||||
hnotes.append( note + (2 * 12) )
|
||||
elif tp == '16ABOVE':
|
||||
hnotes.append( note + (2 * 12) )
|
||||
|
||||
elif tp in ('24', '24BELOW'):
|
||||
hnotes.append( note - (3 * 12) )
|
||||
elif tp in ('24', '24BELOW'):
|
||||
hnotes.append( note - (3 * 12) )
|
||||
|
||||
elif tp == '24ABOVE':
|
||||
hnotes.append( note + (3 * 12) )
|
||||
else:
|
||||
error("Unknown harmony type '%s'." % tp)
|
||||
elif tp == '24ABOVE':
|
||||
hnotes.append( note + (3 * 12) )
|
||||
else:
|
||||
error("Unknown harmony type '%s'" % tp)
|
||||
|
||||
""" Strip out duplicate notes from harmony list. Cute trick here,
|
||||
we use the note values as keys for a new dictionary, assign
|
||||
a null value, and return the list of keys.
|
||||
"""
|
||||
""" Strip out duplicate notes from harmony list. Cute trick here,
|
||||
we use the note values as keys for a new dictionary, assign
|
||||
a null value, and return the list of keys.
|
||||
"""
|
||||
|
||||
return dict([(i, None) for i in hnotes]).keys()
|
||||
return dict([(i, None) for i in hnotes]).keys()
|
||||
|
||||
|
||||
def gethnote(note, chord):
|
||||
""" Determine harmony notes for a note based on the chord.
|
||||
""" Determine harmony notes for a note based on the chord.
|
||||
|
||||
note - midi value of the note
|
||||
note - midi value of the note
|
||||
|
||||
chord - list of midi values for the chord
|
||||
chord - list of midi values for the chord
|
||||
|
||||
|
||||
This routine works by creating a chord list with all
|
||||
its notes having a value less than the note (remember, this
|
||||
is all MIDI values). We then grab notes from the end of
|
||||
the chord until one is found which is less than the original
|
||||
note.
|
||||
"""
|
||||
This routine works by creating a chord list with all
|
||||
its notes having a value less than the note (remember, this
|
||||
is all MIDI values). We then grab notes from the end of
|
||||
the chord until one is found which is less than the original
|
||||
note.
|
||||
"""
|
||||
|
||||
wm="No harmony note found since no chord, using note " + \
|
||||
"0 which will sound bad."
|
||||
wm="No harmony note found since no chord, using note " + \
|
||||
"0 which will sound bad"
|
||||
|
||||
|
||||
if not chord: # should never happen!
|
||||
warning(wm)
|
||||
return 0
|
||||
if not chord: # should never happen!
|
||||
warning(wm)
|
||||
return 0
|
||||
|
||||
ch = list(chord) # copy chord and sort
|
||||
ch.sort()
|
||||
ch = list(chord) # copy chord and sort
|
||||
ch.sort()
|
||||
|
||||
# ensure that the note is in the chord
|
||||
# ensure that the note is in the chord
|
||||
|
||||
while ch[-1] < note:
|
||||
for i,n in enumerate(ch):
|
||||
ch[i]+=12
|
||||
while ch[-1] < note:
|
||||
for i,n in enumerate(ch):
|
||||
ch[i]+=12
|
||||
|
||||
while ch[0] >= note:
|
||||
for i,v in enumerate(ch):
|
||||
ch[i]-=12
|
||||
while ch[0] >= note:
|
||||
for i,v in enumerate(ch):
|
||||
ch[i]-=12
|
||||
|
||||
# get one lower than the note
|
||||
# get one lower than the note
|
||||
|
||||
while 1:
|
||||
if not ch: # this probably can't happen
|
||||
warning(wm)
|
||||
return 0
|
||||
while 1:
|
||||
if not ch: # this probably can't happen
|
||||
warning(wm)
|
||||
return 0
|
||||
|
||||
h=ch.pop()
|
||||
if h<note: break
|
||||
h=ch.pop()
|
||||
if h<note: break
|
||||
|
||||
return h
|
||||
return h
|
||||
|
||||
|
||||
|
|
572
mma/MMA/lyric.py
572
mma/MMA/lyric.py
|
@ -2,7 +2,7 @@
|
|||
# lyric.py
|
||||
|
||||
"""
|
||||
This module is an integeral part of the program
|
||||
This module is an integeral part of the program
|
||||
MMA - Musical Midi Accompaniment.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
|
@ -19,8 +19,8 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bob van der Poel <bvdp@xplornet.com>
|
||||
|
||||
Bob van der Poel <bob@mellowood.ca>
|
||||
|
||||
"""
|
||||
|
||||
import gbl
|
||||
|
@ -29,320 +29,320 @@ from MMA.common import *
|
|||
|
||||
class Lyric:
|
||||
|
||||
textev = None # set if TEXT EVENTS (not recommended)
|
||||
barsplit = None # set if lyrics NOT split into sep. events for bar
|
||||
versenum = 1 # current verse number of lyric
|
||||
dupchords = 0 # set if we want chords as lyric events
|
||||
transpose = 0 # tranpose chord names (for dupchords only)
|
||||
|
||||
pushedLyrics = []
|
||||
textev = None # set if TEXT EVENTS (not recommended)
|
||||
barsplit = None # set if lyrics NOT split into sep. events for bar
|
||||
versenum = 1 # current verse number of lyric
|
||||
dupchords = 0 # set if we want chords as lyric events
|
||||
transpose = 0 # tranpose chord names (for dupchords only)
|
||||
|
||||
transNames = ( ('C', 'Db', 'D', 'Eb', 'E', 'F', 'Gb', 'G', 'Ab', 'A', 'Bb', 'B'),
|
||||
('C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B'))
|
||||
|
||||
transKey = 0 # 0==flat, 1=sharp
|
||||
|
||||
chordnames={
|
||||
'B#': 0, 'C' : 0, 'C#': 1, 'Db': 1,
|
||||
'D' : 2, 'D#': 3, 'Eb': 3, 'E' : 4,
|
||||
'Fb': 4, 'E#': 5, 'F' : 5, 'F#': 6,
|
||||
'Gb': 6, 'G' : 7, 'G#': 8, 'Ab': 8,
|
||||
'A' : 9, 'A#': 10,'Bb': 10,'B' : 11,
|
||||
'Cb':11 }
|
||||
pushedLyrics = []
|
||||
|
||||
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
transNames = ( ('C', 'Db', 'D', 'Eb', 'E', 'F', 'Gb', 'G', 'Ab', 'A', 'Bb', 'B'),
|
||||
('C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B'))
|
||||
|
||||
def setting(self):
|
||||
""" Called from macro. """
|
||||
transKey = 0 # 0==flat, 1=sharp
|
||||
|
||||
a="Event="
|
||||
|
||||
if self.textev: a+="Text"
|
||||
else: a+="Lyric"
|
||||
|
||||
a+=" Split="
|
||||
if self.barsplit: a+="Bar"
|
||||
else: a+="Normal"
|
||||
|
||||
a += " Verse=%s" % self.versenum
|
||||
|
||||
a += " Chords="
|
||||
if self.dupchords: a+="On"
|
||||
else: a+="Off"
|
||||
|
||||
a += " Transpose=%s" % self.transpose
|
||||
|
||||
a += " CNames="
|
||||
if self.transKey: a+="Sharp"
|
||||
else: a+="Flat"
|
||||
|
||||
return a
|
||||
|
||||
|
||||
def option(self, ln):
|
||||
""" Set a lyric option. """
|
||||
|
||||
for i, l in enumerate(ln):
|
||||
l=l.upper()
|
||||
|
||||
# Single word options
|
||||
|
||||
if l.upper()=="SET":
|
||||
|
||||
if i>=len(ln):
|
||||
s=''
|
||||
else:
|
||||
s=' '.join(ln[i+1:]).strip()
|
||||
|
||||
if not s.startswith('['):
|
||||
s = '[' + s + ']'
|
||||
|
||||
self.pushedLyrics.append(s)
|
||||
|
||||
break
|
||||
|
||||
|
||||
# All the rest are OPT=VALUE pairs
|
||||
|
||||
try:
|
||||
a,v = l.split('=')
|
||||
except:
|
||||
error("Lyric options must be in CMD=VALUE pairs.")
|
||||
|
||||
|
||||
if a == 'EVENT':
|
||||
if v == 'TEXT':
|
||||
self.textev = 1
|
||||
warning ("Lyric: Placing lyrics as TEXT EVENTS is not recommended.")
|
||||
|
||||
elif v == 'LYRIC':
|
||||
self.textev = None
|
||||
if gbl.debug:
|
||||
print "Lyric: lyrics set as LYRIC events."
|
||||
|
||||
else:
|
||||
error("Valid options for Lyric Event are TEXT or LYRIC.")
|
||||
|
||||
|
||||
elif a == 'SPLIT':
|
||||
if v == 'BAR':
|
||||
self.barsplit = 1
|
||||
if gbl.debug:
|
||||
print "Lyric: lyrics distributed thoughout bar."
|
||||
|
||||
elif v == 'NORMAL':
|
||||
self.barsplit = None
|
||||
if gbl.debug:
|
||||
print "Lyric: lyrics appear as one per bar."
|
||||
|
||||
else:
|
||||
error("Valid options for Lyric Split are BAR or NORMAL.")
|
||||
|
||||
|
||||
elif a == 'VERSE':
|
||||
if v.isdigit():
|
||||
self.versenum = int(v)
|
||||
|
||||
elif v == 'INC':
|
||||
self.versenum += 1
|
||||
|
||||
elif v == 'DEC':
|
||||
self.versenum -= 1
|
||||
|
||||
else:
|
||||
error("Valid options of Lyric Verse are <nn> or INC or DEC.")
|
||||
|
||||
if self.versenum < 1:
|
||||
error("Attempt to set Lyric Verse to %s. Values "
|
||||
"must be > 0." % self.versenum)
|
||||
|
||||
if gbl.debug:
|
||||
print "Lyric: verse number set to %s" % self.versenum
|
||||
chordnames={
|
||||
'B#': 0, 'C' : 0, 'C#': 1, 'Db': 1,
|
||||
'D' : 2, 'D#': 3, 'Eb': 3, 'E' : 4,
|
||||
'Fb': 4, 'E#': 5, 'F' : 5, 'F#': 6,
|
||||
'Gb': 6, 'G' : 7, 'G#': 8, 'Ab': 8,
|
||||
'A' : 9, 'A#': 10,'Bb': 10,'B' : 11,
|
||||
'Cb':11 }
|
||||
|
||||
|
||||
elif a == 'CHORDS':
|
||||
if v in ('1', 'ON'):
|
||||
self.dupchords = 1
|
||||
if gbl.debug:
|
||||
print "Lyric: chords are duplicated as lyrics."
|
||||
|
||||
elif v in ('0', 'OFF'):
|
||||
self.dupchords = 0
|
||||
if gbl.debug:
|
||||
print "Lyric: chords are NOT duplicated as lyrics."
|
||||
|
||||
else:
|
||||
error ("Expecting 'ON' or 'OFF' in Lyric directive, not 'CHORDS=%s'" % v)
|
||||
|
||||
elif a == 'TRANSPOSE':
|
||||
|
||||
v = stoi(v, "Lyric Tranpose expecting value, not %s" % v)
|
||||
|
||||
if v < -12 or v > 12:
|
||||
error("Lyric Tranpose %s out-of-range; must be -12..12." % v)
|
||||
|
||||
self.transpose = v
|
||||
|
||||
elif a == 'CNAMES':
|
||||
|
||||
if v in ('#', 'SHARP'):
|
||||
self.transKey = 1
|
||||
elif v in ('B', '&', 'FLAT'):
|
||||
self.transKey = 0
|
||||
|
||||
else:
|
||||
error("Lyric CNames expecting 'Sharp' or 'Flat', not '%s'" % v )
|
||||
|
||||
else:
|
||||
error("Usage: Lyric expecting EVENT, SPLIT, VERSE, CHORDS, TRANSPOSE, CNAMES or SET, "
|
||||
"not '%s'" % a )
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
|
||||
|
||||
|
||||
def setting(self):
|
||||
""" Called from macro. """
|
||||
|
||||
def leftovers(self):
|
||||
""" Just report leftovers on stack."""
|
||||
|
||||
if self.pushedLyrics:
|
||||
warning("Lyrics remaining on stack.")
|
||||
a="Event="
|
||||
|
||||
|
||||
def extract(self, ln, rpt):
|
||||
""" Extract lyric info from a chord line and place in META track.
|
||||
|
||||
Returns line and lyric as 2 strings.
|
||||
if self.textev: a+="Text"
|
||||
else: a+="Lyric"
|
||||
|
||||
The lyric is returned for debugging purposes, but it has been
|
||||
processed and inserted into the MIDI track.
|
||||
"""
|
||||
|
||||
a=ln.count('[')
|
||||
b=ln.count(']')
|
||||
|
||||
if a != b:
|
||||
error("Mismatched []s for lyrics found in chord line.")
|
||||
|
||||
if self.pushedLyrics:
|
||||
if a or b:
|
||||
error("Lyrics not permitted inline and as LYRIC SET")
|
||||
a+=" Split="
|
||||
if self.barsplit: a+="Bar"
|
||||
else: a+="Normal"
|
||||
|
||||
|
||||
ln = ln + self.pushedLyrics.pop(0)
|
||||
a=b=1 # flag that we have lyrics, count really doesn't matter
|
||||
|
||||
|
||||
if rpt > 1:
|
||||
if self.dupchords:
|
||||
error("Chord to lyrics not supported with bar repeat.")
|
||||
elif a or b:
|
||||
error("Bars with both repeat count and lyrics are not permitted.")
|
||||
a += " Verse=%s" % self.versenum
|
||||
|
||||
a += " Chords="
|
||||
if self.dupchords: a+="On"
|
||||
else: a+="Off"
|
||||
|
||||
a += " Transpose=%s" % self.transpose
|
||||
|
||||
a += " CNames="
|
||||
if self.transKey: a+="Sharp"
|
||||
else: a+="Flat"
|
||||
|
||||
return a
|
||||
|
||||
|
||||
ln, lyrics = pextract(ln, '[', ']')
|
||||
|
||||
def option(self, ln):
|
||||
""" Set a lyric option. """
|
||||
|
||||
""" If the CHORDS=ON option is set, make a copy of the chords and
|
||||
insert as lyric. This permits illegal chord lines, but they will
|
||||
be caught by the parser.
|
||||
"""
|
||||
|
||||
if self.dupchords:
|
||||
ly = []
|
||||
|
||||
for v in ln.split():
|
||||
v = v.replace('&', 'b')
|
||||
if v == 'z':
|
||||
v = 'N.C.'
|
||||
if 'z' in v:
|
||||
v = v.split('z')[0]
|
||||
while v.startswith('-'):
|
||||
v=v[1:]
|
||||
while v.startswith('+'):
|
||||
v=v[1:]
|
||||
for i, l in enumerate(ln):
|
||||
l=l.upper()
|
||||
|
||||
if self.transpose:
|
||||
tr=0 # Needed in case line is invalid!
|
||||
cn=v[0:2]
|
||||
if self.chordnames.has_key(cn):
|
||||
tr=self.chordnames[cn] + self.transpose
|
||||
|
||||
else:
|
||||
cn=v[0:1]
|
||||
if self.chordnames.has_key(cn):
|
||||
tr=self.chordnames[cn] + self.transpose
|
||||
# Single word options
|
||||
|
||||
while tr>=12: tr-=12
|
||||
while tr<=-12: tr+=12
|
||||
if l.upper()=="SET":
|
||||
|
||||
if tr:
|
||||
v = self.transNames[self.transKey][tr] + v[len(cn):]
|
||||
if i>=len(ln):
|
||||
s=''
|
||||
else:
|
||||
s=' '.join(ln[i+1:]).strip()
|
||||
|
||||
|
||||
ly.append(v)
|
||||
if not s.startswith('['):
|
||||
s = '[' + s + ']'
|
||||
|
||||
i=gbl.QperBar - len(ly)
|
||||
if i>0:
|
||||
ly.extend( ['/'] * i )
|
||||
lyrics.insert(0, ' '.join(ly) + '\\r')
|
||||
self.pushedLyrics.append(s)
|
||||
|
||||
break
|
||||
|
||||
|
||||
v=self.versenum
|
||||
|
||||
if len(lyrics) == 1:
|
||||
v=1
|
||||
# All the rest are OPT=VALUE pairs
|
||||
|
||||
if v > len(lyrics):
|
||||
lyrics = ''
|
||||
else:
|
||||
lyrics=lyrics[v-1]
|
||||
|
||||
if not len(lyrics):
|
||||
return (ln, [])
|
||||
try:
|
||||
a,v = l.split('=')
|
||||
except:
|
||||
error("Lyric options must be in CMD=VALUE pairs")
|
||||
|
||||
lyrics=lyrics.replace('\\r', ' \\r ')
|
||||
lyrics=lyrics.replace('\\n', ' \\n ')
|
||||
lyrics=lyrics.replace(' ', ' ')
|
||||
|
||||
if self.barsplit:
|
||||
lyrics = [lyrics]
|
||||
else:
|
||||
lyrics = lyrics.split()
|
||||
if a == 'EVENT':
|
||||
if v == 'TEXT':
|
||||
self.textev = 1
|
||||
warning ("Lyric: Placing lyrics as TEXT EVENTS is not recommended")
|
||||
|
||||
beat = 0
|
||||
bstep = gbl.QperBar / float(len(lyrics))
|
||||
elif v == 'LYRIC':
|
||||
self.textev = None
|
||||
if gbl.debug:
|
||||
print "Lyric: lyrics set as LYRIC events."
|
||||
|
||||
|
||||
for t, a in enumerate(lyrics):
|
||||
a,b = pextract(a, '<', '>', 1)
|
||||
else:
|
||||
error("Valid options for Lyric Event are TEXT or LYRIC")
|
||||
|
||||
if b and b[0]:
|
||||
beat = stof(b[0], "Expecting value in <%s> in lyric." % b)
|
||||
if beat < 1 or beat > gbl.QperBar+1:
|
||||
error("Offset in lyric <> must be 1 to %s." % gbl.QperBar)
|
||||
beat -= 1
|
||||
bstep = (gbl.QperBar-beat)/float((len(lyrics)-t))
|
||||
|
||||
a = a.replace('\\r', '\r')
|
||||
a = a.replace('\\n', '\n')
|
||||
elif a == 'SPLIT':
|
||||
if v == 'BAR':
|
||||
self.barsplit = 1
|
||||
if gbl.debug:
|
||||
print "Lyric: lyrics distributed thoughout bar."
|
||||
|
||||
if a and a != ' ':
|
||||
if not a.endswith('-'):
|
||||
a += ' '
|
||||
|
||||
p=getOffset(beat * gbl.BperQ)
|
||||
if self.textev:
|
||||
gbl.mtrks[0].addText(p, a)
|
||||
else:
|
||||
gbl.mtrks[0].addLyric(p, a)
|
||||
elif v == 'NORMAL':
|
||||
self.barsplit = None
|
||||
if gbl.debug:
|
||||
print "Lyric: lyrics appear as one per bar."
|
||||
|
||||
else:
|
||||
error("Valid options for Lyric Split are BAR or NORMAL")
|
||||
|
||||
|
||||
elif a == 'VERSE':
|
||||
if v.isdigit():
|
||||
self.versenum = int(v)
|
||||
|
||||
elif v == 'INC':
|
||||
self.versenum += 1
|
||||
|
||||
elif v == 'DEC':
|
||||
self.versenum -= 1
|
||||
|
||||
else:
|
||||
error("Valid options of Lyric Verse are <nn> or INC or DEC")
|
||||
|
||||
if self.versenum < 1:
|
||||
error("Attempt to set Lyric Verse to %s. Values "
|
||||
"must be > 0" % self.versenum)
|
||||
|
||||
if gbl.debug:
|
||||
print "Lyric: verse number set to %s" % self.versenum
|
||||
|
||||
|
||||
elif a == 'CHORDS':
|
||||
if v in ('1', 'ON'):
|
||||
self.dupchords = 1
|
||||
if gbl.debug:
|
||||
print "Lyric: chords are duplicated as lyrics."
|
||||
|
||||
elif v in ('0', 'OFF'):
|
||||
self.dupchords = 0
|
||||
if gbl.debug:
|
||||
print "Lyric: chords are NOT duplicated as lyrics."
|
||||
|
||||
else:
|
||||
error ("Expecting 'ON' or 'OFF' in Lyric directive, not 'CHORDS=%s'" % v)
|
||||
|
||||
elif a == 'TRANSPOSE':
|
||||
|
||||
v = stoi(v, "Lyric Tranpose expecting value, not %s" % v)
|
||||
|
||||
if v < -12 or v > 12:
|
||||
error("Lyric Tranpose %s out-of-range; must be -12..12" % v)
|
||||
|
||||
self.transpose = v
|
||||
|
||||
elif a == 'CNAMES':
|
||||
|
||||
if v in ('#', 'SHARP'):
|
||||
self.transKey = 1
|
||||
elif v in ('B', '&', 'FLAT'):
|
||||
self.transKey = 0
|
||||
|
||||
else:
|
||||
error("Lyric CNames expecting 'Sharp' or 'Flat', not '%s'" % v )
|
||||
|
||||
else:
|
||||
error("Usage: Lyric expecting EVENT, SPLIT, VERSE, CHORDS, TRANSPOSE, CNAMES or SET, "
|
||||
"not '%s'" % a )
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
def leftovers(self):
|
||||
""" Just report leftovers on stack."""
|
||||
|
||||
if self.pushedLyrics:
|
||||
warning("Lyrics remaining on stack")
|
||||
|
||||
|
||||
def extract(self, ln, rpt):
|
||||
""" Extract lyric info from a chord line and place in META track.
|
||||
|
||||
Returns line and lyric as 2 strings.
|
||||
|
||||
The lyric is returned for debugging purposes, but it has been
|
||||
processed and inserted into the MIDI track.
|
||||
"""
|
||||
|
||||
a=ln.count('[')
|
||||
b=ln.count(']')
|
||||
|
||||
if a != b:
|
||||
error("Mismatched []s for lyrics found in chord line")
|
||||
|
||||
if self.pushedLyrics:
|
||||
if a or b:
|
||||
error("Lyrics not permitted inline and as LYRIC SET")
|
||||
|
||||
|
||||
ln = ln + self.pushedLyrics.pop(0)
|
||||
a=b=1 # flag that we have lyrics, count really doesn't matter
|
||||
|
||||
|
||||
if rpt > 1:
|
||||
if self.dupchords:
|
||||
error("Chord to lyrics not supported with bar repeat")
|
||||
elif a or b:
|
||||
error("Bars with both repeat count and lyrics are not permitted")
|
||||
|
||||
|
||||
ln, lyrics = pextract(ln, '[', ']')
|
||||
|
||||
|
||||
""" If the CHORDS=ON option is set, make a copy of the chords and
|
||||
insert as lyric. This permits illegal chord lines, but they will
|
||||
be caught by the parser.
|
||||
"""
|
||||
|
||||
if self.dupchords:
|
||||
ly = []
|
||||
|
||||
for v in ln.split():
|
||||
v = v.replace('&', 'b')
|
||||
if v == 'z':
|
||||
v = 'N.C.'
|
||||
if 'z' in v:
|
||||
v = v.split('z')[0]
|
||||
while v.startswith('-'):
|
||||
v=v[1:]
|
||||
while v.startswith('+'):
|
||||
v=v[1:]
|
||||
|
||||
if self.transpose:
|
||||
tr=0 # Needed in case line is invalid!
|
||||
cn=v[0:2]
|
||||
if self.chordnames.has_key(cn):
|
||||
tr=self.chordnames[cn] + self.transpose
|
||||
|
||||
else:
|
||||
cn=v[0:1]
|
||||
if self.chordnames.has_key(cn):
|
||||
tr=self.chordnames[cn] + self.transpose
|
||||
|
||||
while tr>=12: tr-=12
|
||||
while tr<=-12: tr+=12
|
||||
|
||||
if tr:
|
||||
v = self.transNames[self.transKey][tr] + v[len(cn):]
|
||||
|
||||
|
||||
ly.append(v)
|
||||
|
||||
i=gbl.QperBar - len(ly)
|
||||
if i>0:
|
||||
ly.extend( ['/'] * i )
|
||||
lyrics.insert(0, ' '.join(ly) + '\\r')
|
||||
|
||||
|
||||
v=self.versenum
|
||||
|
||||
if len(lyrics) == 1:
|
||||
v=1
|
||||
|
||||
if v > len(lyrics):
|
||||
lyrics = ''
|
||||
else:
|
||||
lyrics=lyrics[v-1]
|
||||
|
||||
if not len(lyrics):
|
||||
return (ln, [])
|
||||
|
||||
lyrics=lyrics.replace('\\r', ' \\r ')
|
||||
lyrics=lyrics.replace('\\n', ' \\n ')
|
||||
lyrics=lyrics.replace(' ', ' ')
|
||||
|
||||
if self.barsplit:
|
||||
lyrics = [lyrics]
|
||||
else:
|
||||
lyrics = lyrics.split()
|
||||
|
||||
beat = 0
|
||||
bstep = gbl.QperBar / float(len(lyrics))
|
||||
|
||||
|
||||
for t, a in enumerate(lyrics):
|
||||
a,b = pextract(a, '<', '>', 1)
|
||||
|
||||
if b and b[0]:
|
||||
beat = stof(b[0], "Expecting value in <%s> in lyric" % b)
|
||||
if beat < 1 or beat > gbl.QperBar+1:
|
||||
error("Offset in lyric <> must be 1 to %s" % gbl.QperBar)
|
||||
beat -= 1
|
||||
bstep = (gbl.QperBar-beat)/float((len(lyrics)-t))
|
||||
|
||||
a = a.replace('\\r', '\r')
|
||||
a = a.replace('\\n', '\n')
|
||||
|
||||
if a and a != ' ':
|
||||
if not a.endswith('-'):
|
||||
a += ' '
|
||||
|
||||
p=getOffset(beat * gbl.BperQ)
|
||||
if self.textev:
|
||||
gbl.mtrks[0].addText(p, a)
|
||||
else:
|
||||
gbl.mtrks[0].addLyric(p, a)
|
||||
|
||||
beat += bstep
|
||||
|
||||
return (ln, lyrics)
|
||||
|
||||
beat += bstep
|
||||
|
||||
return (ln, lyrics)
|
||||
|
||||
|
||||
# Create a single instance of the Lyric Class.
|
||||
|
||||
|
|
914
mma/MMA/macro.py
914
mma/MMA/macro.py
File diff suppressed because it is too large
Load Diff
244
mma/MMA/main.py
244
mma/MMA/main.py
|
@ -19,7 +19,7 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bob van der Poel <bvdp@xplornet.com>
|
||||
Bob van der Poel <bob@mellowood.ca>
|
||||
|
||||
"""
|
||||
|
||||
|
@ -47,13 +47,13 @@ import MMA.options
|
|||
MMA.options.opts()
|
||||
|
||||
"""
|
||||
LibPath and IncPath are set in MMA.globals. Debug setting isn't set
|
||||
when the default is done.
|
||||
LibPath and IncPath are set in MMA.globals. Debug setting isn't set
|
||||
when the default is done.
|
||||
"""
|
||||
|
||||
if gbl.debug:
|
||||
print "Initialization has set LibPath set to", gbl.libPath
|
||||
print "Initialization has set IncPath set to", gbl.incPath
|
||||
print "Initialization has set LibPath set to", gbl.libPath
|
||||
print "Initialization has set IncPath set to", gbl.incPath
|
||||
|
||||
|
||||
#######################################
|
||||
|
@ -75,25 +75,25 @@ gbl.docs = 0
|
|||
|
||||
rcread=0
|
||||
|
||||
rcfiles = ('mmarc', 'c:\\mma\\mmarc', '~/.mmarc', '/usr/local/etc/mmarc', '/etc/mmarc' )
|
||||
rcfiles = ('mmarc', 'c:\\mma\\mmarc', '~/.mmarc', '/usr/local/etc/mmarc', '/etc/mmarc' )
|
||||
if gbl.mmaRC:
|
||||
rcfiles = [ gbl.mmaRC ]
|
||||
rcfiles = [ gbl.mmaRC ]
|
||||
|
||||
for i in rcfiles:
|
||||
f = locFile(i, None)
|
||||
if f:
|
||||
if gbl.showrun:
|
||||
print "Reading RC file '%s'" % f
|
||||
MMA.parse.parseFile(f)
|
||||
rcread+=1
|
||||
break
|
||||
else:
|
||||
if gbl.mmaRC:
|
||||
error("Specified init file '%s' not found." % gbl.mmaRC)
|
||||
f = locFile(i, None)
|
||||
if f:
|
||||
if gbl.showrun:
|
||||
print "Reading RC file '%s'" % f
|
||||
MMA.parse.parseFile(f)
|
||||
rcread+=1
|
||||
break
|
||||
else:
|
||||
if gbl.mmaRC:
|
||||
error("Specified init file '%s' not found" % gbl.mmaRC)
|
||||
|
||||
if not rcread:
|
||||
gbl.lineno = -1
|
||||
warning("No RC file was found or processed")
|
||||
gbl.lineno = -1
|
||||
warning("No RC file was found or processed")
|
||||
|
||||
|
||||
gbl.docs = docOption # Restore doc options
|
||||
|
@ -104,17 +104,17 @@ gbl.docs = docOption # Restore doc options
|
|||
# Note: This needs to be here, after reading of RC files
|
||||
|
||||
if gbl.makeGrvDefs:
|
||||
if gbl.infile:
|
||||
error("No filename is permitted with the -g option")
|
||||
from MMA.auto import libUpdate
|
||||
libUpdate() # update and EXIT
|
||||
if gbl.infile:
|
||||
error("No filename is permitted with the -g option")
|
||||
from MMA.auto import libUpdate
|
||||
libUpdate() # update and EXIT
|
||||
|
||||
|
||||
################################
|
||||
# We need an input file for anything after this point.
|
||||
|
||||
if not gbl.infile:
|
||||
MMA.options.usage("No input filename specified.")
|
||||
MMA.options.usage("No input filename specified.")
|
||||
|
||||
# Add filename to meta track.
|
||||
|
||||
|
@ -124,35 +124,35 @@ gbl.mtrks[0].addText(0, "Input filename: %s" % gbl.infile)
|
|||
# Just extract docs (-Dx) to stdout.
|
||||
|
||||
if docOption:
|
||||
f=locFile(gbl.infile, None)
|
||||
if not f:
|
||||
error("File '%s' not found." % gbl.infile)
|
||||
MMA.parse.parseFile(f)
|
||||
sys.exit(0)
|
||||
f=locFile(gbl.infile, None)
|
||||
if not f:
|
||||
error("File '%s' not found" % gbl.infile)
|
||||
MMA.parse.parseFile(f)
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
#########################################################
|
||||
# These cmdline options override settings in RC files
|
||||
|
||||
if gbl.cmdSMF:
|
||||
gbl.lineno = -1
|
||||
MMA.parse.setMidiFileType(['SMF=%s' % gbl.cmdSMF])
|
||||
gbl.lineno = -1
|
||||
MMA.parse.setMidiFileType(['SMF=%s' % gbl.cmdSMF])
|
||||
|
||||
|
||||
##########################################
|
||||
# Create the output filename.
|
||||
# If outfile was specified on cmd line then leave it alone.
|
||||
# Otherwise ...
|
||||
# 1. strip off the extension if it is .mma,
|
||||
# 2. append .mid
|
||||
# Otherwise ...
|
||||
# 1. strip off the extension if it is .mma,
|
||||
# 2. append .mid
|
||||
|
||||
if gbl.outfile:
|
||||
outfile = gbl.outfile
|
||||
outfile = gbl.outfile
|
||||
else:
|
||||
outfile, ext = os.path.splitext(gbl.infile)
|
||||
if ext != gbl.ext:
|
||||
outfile=gbl.infile
|
||||
outfile += '.mid'
|
||||
outfile, ext = os.path.splitext(gbl.infile)
|
||||
if ext != gbl.ext:
|
||||
outfile=gbl.infile
|
||||
outfile += '.mid'
|
||||
|
||||
|
||||
outfile=os.path.expanduser(outfile)
|
||||
|
@ -164,94 +164,94 @@ outfile=os.path.expanduser(outfile)
|
|||
# First the mmastart files
|
||||
|
||||
for f in gbl.mmaStart:
|
||||
fn = locFile(f, gbl.incPath)
|
||||
if not fn:
|
||||
warning("MmaStart file '%s' not found/processed." % fn)
|
||||
MMA.parse.parseFile(fn)
|
||||
gbl.lineno = -1
|
||||
fn = locFile(f, gbl.incPath)
|
||||
if not fn:
|
||||
warning("MmaStart file '%s' not found/processed" % fn)
|
||||
MMA.parse.parseFile(fn)
|
||||
gbl.lineno = -1
|
||||
|
||||
# The song file specified on the command line
|
||||
|
||||
f = locFile(gbl.infile, None)
|
||||
|
||||
if not f:
|
||||
gbl.lineno = -1
|
||||
error("Input file '%s' not found." % gbl.infile)
|
||||
gbl.lineno = -1
|
||||
error("Input file '%s' not found" % gbl.infile)
|
||||
|
||||
MMA.parse.parseFile(f)
|
||||
|
||||
# Finally, the mmaend files
|
||||
|
||||
for f in gbl.mmaEnd:
|
||||
fn = locFile(f, None)
|
||||
if not fn:
|
||||
warning("MmaEnd file '%s' not found/processed." % f)
|
||||
MMA.parse.parseFile(fn)
|
||||
fn = locFile(f, None)
|
||||
if not fn:
|
||||
warning("MmaEnd file '%s' not found/processed" % f)
|
||||
MMA.parse.parseFile(fn)
|
||||
|
||||
|
||||
#################################################
|
||||
# Just display the channel assignments (-c) and exit...
|
||||
|
||||
if gbl.chshow:
|
||||
print "\nFile '%s' parsed, but no MIDI file produced!" % gbl.infile
|
||||
print
|
||||
print "Tracks allocated:"
|
||||
k=gbl.tnames.keys()
|
||||
k.sort()
|
||||
max=0
|
||||
for a in k + gbl.deletedTracks:
|
||||
if len(a)>max:
|
||||
max = len(a)
|
||||
max+=1
|
||||
wrap=0
|
||||
for a in k:
|
||||
wrap += max
|
||||
if wrap>60:
|
||||
wrap = max
|
||||
print
|
||||
print " %-*s" %( max, a),
|
||||
print
|
||||
print
|
||||
if gbl.deletedTracks:
|
||||
print "Deleted Tracks:"
|
||||
wrap=0
|
||||
for a in gbl.deletedTracks:
|
||||
wrap += max
|
||||
if wrap>60:
|
||||
wrap=max
|
||||
print
|
||||
print " %-*s" %( max,a),
|
||||
print
|
||||
print
|
||||
print "Channel assignments:"
|
||||
for c, n in sorted(gbl.midiAssigns.items()):
|
||||
if n:
|
||||
wrap = 3
|
||||
print " %2s" % c,
|
||||
for nn in n:
|
||||
wrap += max
|
||||
if wrap>63:
|
||||
print "\n ",
|
||||
wrap=max+3
|
||||
print "%-*s" % (max,nn),
|
||||
print "\nFile '%s' parsed, but no MIDI file produced!" % gbl.infile
|
||||
print
|
||||
print "Tracks allocated:"
|
||||
k=gbl.tnames.keys()
|
||||
k.sort()
|
||||
max=0
|
||||
for a in k + gbl.deletedTracks:
|
||||
if len(a)>max:
|
||||
max = len(a)
|
||||
max+=1
|
||||
wrap=0
|
||||
for a in k:
|
||||
wrap += max
|
||||
if wrap>60:
|
||||
wrap = max
|
||||
print
|
||||
print " %-*s" %( max, a),
|
||||
print
|
||||
print
|
||||
if gbl.deletedTracks:
|
||||
print "Deleted Tracks:"
|
||||
wrap=0
|
||||
for a in gbl.deletedTracks:
|
||||
wrap += max
|
||||
if wrap>60:
|
||||
wrap=max
|
||||
print
|
||||
print " %-*s" %( max,a),
|
||||
print
|
||||
print
|
||||
print "Channel assignments:"
|
||||
for c, n in sorted(gbl.midiAssigns.items()):
|
||||
if n:
|
||||
wrap = 3
|
||||
print " %2s" % c,
|
||||
for nn in n:
|
||||
wrap += max
|
||||
if wrap>63:
|
||||
print "\n ",
|
||||
wrap=max+3
|
||||
print "%-*s" % (max,nn),
|
||||
|
||||
print
|
||||
print
|
||||
sys.exit(0)
|
||||
print
|
||||
print
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
####################################
|
||||
# Dry run, no output
|
||||
|
||||
if gbl.noOutput:
|
||||
warning( "Input file parsed successfully. No midi file generated.")
|
||||
sys.exit(0)
|
||||
warning( "Input file parsed successfully. No midi file generated")
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
##############################
|
||||
# Create the output (MIDI) file
|
||||
|
||||
gbl.lineno=-1 # disable line nums for error/warning
|
||||
gbl.lineno=-1 # disable line nums for error/warning
|
||||
|
||||
""" We fix the outPath now. This lets you set outpath in the song file.
|
||||
|
||||
|
@ -271,11 +271,11 @@ gbl.lineno=-1 # disable line nums for error/warning
|
|||
"""
|
||||
|
||||
if (not outfile.startswith('/')) and gbl.outPath and (not gbl.outfile):
|
||||
if gbl.outPath[0] in '.\\/':
|
||||
outfile = "%s/%s" % (gbl.outPath, outfile)
|
||||
else:
|
||||
head, tail = os.path.split(outfile)
|
||||
outfile = "%s/%s/%s" % (head, gbl.outPath, tail)
|
||||
if gbl.outPath[0] in '.\\/':
|
||||
outfile = "%s/%s" % (gbl.outPath, outfile)
|
||||
else:
|
||||
head, tail = os.path.split(outfile)
|
||||
outfile = "%s/%s/%s" % (head, gbl.outPath, tail)
|
||||
|
||||
fileExist = os.path.exists(outfile)
|
||||
|
||||
|
@ -285,11 +285,11 @@ fileExist = os.path.exists(outfile)
|
|||
"""
|
||||
|
||||
for n in gbl.tnames.values():
|
||||
if n.channel:
|
||||
n.doMidiClear()
|
||||
n.clearPending()
|
||||
if n.riff:
|
||||
warning("%s has pending Riff(s)" % n.name)
|
||||
if n.channel:
|
||||
n.doMidiClear()
|
||||
n.clearPending()
|
||||
if n.riff:
|
||||
warning("%s has pending Riff(s)" % n.name)
|
||||
|
||||
""" Check all the tracks and find total number used. When
|
||||
initializing each track (class) we made an initial entry
|
||||
|
@ -297,36 +297,36 @@ for n in gbl.tnames.values():
|
|||
track only has one entry we can safely skip the entire track.
|
||||
"""
|
||||
|
||||
trackCount=1 # account for meta track
|
||||
trackCount=1 # account for meta track
|
||||
|
||||
for n in sorted(gbl.mtrks.keys())[1:]: # check all but 0 (meta)
|
||||
if len(gbl.mtrks[n].miditrk) > 1:
|
||||
trackCount += 1
|
||||
for n in sorted(gbl.mtrks.keys())[1:]: # check all but 0 (meta)
|
||||
if len(gbl.mtrks[n].miditrk) > 1:
|
||||
trackCount += 1
|
||||
|
||||
if trackCount == 1: # only meta track
|
||||
if fileExist:
|
||||
print
|
||||
print "No data created. Did you remember to set a groove/sequence?"
|
||||
if fileExist:
|
||||
print "Existing file '%s' has not been modified." % outfile
|
||||
sys.exit(1)
|
||||
if fileExist:
|
||||
print
|
||||
print "No data created. Did you remember to set a groove/sequence?"
|
||||
if fileExist:
|
||||
print "Existing file '%s' has not been modified." % outfile
|
||||
sys.exit(1)
|
||||
|
||||
lyric.leftovers()
|
||||
|
||||
if fileExist:
|
||||
print "Overwriting existing",
|
||||
print "Overwriting existing",
|
||||
else:
|
||||
print "Creating new",
|
||||
print "Creating new",
|
||||
print "midi file (%s bars): '%s'" % (gbl.barNum, outfile)
|
||||
|
||||
try:
|
||||
out = file(outfile, 'wb')
|
||||
out = file(outfile, 'wb')
|
||||
except:
|
||||
error("Can't open file '%s' for writing." % outfile)
|
||||
error("Can't open file '%s' for writing" % outfile)
|
||||
|
||||
MMA.midi.writeTracks(out)
|
||||
out.close()
|
||||
|
||||
if gbl.debug:
|
||||
print "Completed processing file '%s'." % outfile
|
||||
print "Completed processing file '%s'." % outfile
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bob van der Poel <bvdp@xplornet.com>
|
||||
Bob van der Poel <bob@mellowood.ca>
|
||||
|
||||
This class is used to parse lines of MDEFINE and stores
|
||||
the sequences for later recall.
|
||||
|
@ -31,58 +31,58 @@ from MMA.common import *
|
|||
import MMA.midiC
|
||||
class Mdefine:
|
||||
|
||||
def __init__(self):
|
||||
self.defs = {}
|
||||
def __init__(self):
|
||||
self.defs = {}
|
||||
|
||||
def get(self, name):
|
||||
""" Return a predefine MIDI pattern."""
|
||||
def get(self, name):
|
||||
""" Return a predefine MIDI pattern."""
|
||||
|
||||
try:
|
||||
return self.defs[name]
|
||||
except:
|
||||
error("The MDEFINE pattern %s has not been defined." % name)
|
||||
try:
|
||||
return self.defs[name]
|
||||
except:
|
||||
error("The MDEFINE pattern %s has not been defined" % name)
|
||||
|
||||
|
||||
def set(self, name, ln):
|
||||
""" Parse a MDEFINE line.
|
||||
def set(self, name, ln):
|
||||
""" Parse a MDEFINE line.
|
||||
|
||||
The line must be in the form:
|
||||
The line must be in the form:
|
||||
|
||||
NAME <beat> <ctrl> <dat> [; ...]
|
||||
NAME <beat> <ctrl> <dat> [; ...]
|
||||
|
||||
"""
|
||||
"""
|
||||
|
||||
name = name.upper()
|
||||
name = name.upper()
|
||||
|
||||
ln=ln.rstrip('; ') # dump trailing ';' and whitespace
|
||||
ln = ln.split(';')
|
||||
evs = []
|
||||
for l in ln:
|
||||
l=l.split()
|
||||
ln=ln.rstrip('; ') # dump trailing ';' and whitespace
|
||||
ln = ln.split(';')
|
||||
evs = []
|
||||
for l in ln:
|
||||
l=l.split()
|
||||
|
||||
if len(l) == 1:
|
||||
evs.extend( self.get(l[0].upper() ))
|
||||
continue
|
||||
if len(l) == 1:
|
||||
evs.extend( self.get(l[0].upper() ))
|
||||
continue
|
||||
|
||||
if len(l) != 3:
|
||||
error("MDEFINE sequence must have 3 values: Beat, Ctrl, Datum")
|
||||
if len(l) != 3:
|
||||
error("MDEFINE sequence must have 3 values: Beat, Ctrl, Datum")
|
||||
|
||||
off=stof(l[0], "Value for offset must be integer/float")
|
||||
off=stof(l[0], "Value for offset must be integer/float")
|
||||
|
||||
c=MMA.midiC.ctrlToValue(l[1])
|
||||
if c < 0:
|
||||
c=stoi(l[1])
|
||||
if c < 0 or c > 0x7f:
|
||||
error("Controller values must be 0x00 to 0x7f.")
|
||||
c=MMA.midiC.ctrlToValue(l[1])
|
||||
if c < 0:
|
||||
c=stoi(l[1])
|
||||
if c < 0 or c > 0x7f:
|
||||
error("Controller values must be 0x00 to 0x7f")
|
||||
|
||||
d=stoi(l[2])
|
||||
if d < 0 or d > 0x7f:
|
||||
error("MIDI Control Datum value must be 0x00 to 0x7f.")
|
||||
d=stoi(l[2])
|
||||
if d < 0 or d > 0x7f:
|
||||
error("MIDI Control Datum value must be 0x00 to 0x7f")
|
||||
|
||||
|
||||
evs.append( [off, chr(c) + chr(d)])
|
||||
evs.append( [off, chr(c) + chr(d)])
|
||||
|
||||
self.defs[name]=evs
|
||||
self.defs[name]=evs
|
||||
|
||||
mdef = Mdefine()
|
||||
|
||||
|
|
722
mma/MMA/midi.py
722
mma/MMA/midi.py
|
@ -18,7 +18,7 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bob van der Poel <bvdp@xplornet.com>
|
||||
Bob van der Poel <bob@mellowood.ca>
|
||||
"""
|
||||
|
||||
|
||||
|
@ -32,142 +32,142 @@ import MMA.midiC
|
|||
splitChannels = []
|
||||
|
||||
def setSplitChannels(ln):
|
||||
""" Parser routine, sets up list of track to split. Overwrites existing. """
|
||||
""" Parser routine, sets up list of track to split. Overwrites existing. """
|
||||
|
||||
global splitChannels
|
||||
global splitChannels
|
||||
|
||||
splitChannels = []
|
||||
splitChannels = []
|
||||
|
||||
for a in ln:
|
||||
c = stoi(a)
|
||||
if c < 1 or c >16:
|
||||
error("SplitChannels: Expecting value 1 to 16, not %s." % c)
|
||||
splitChannels.append(c)
|
||||
for a in ln:
|
||||
c = stoi(a)
|
||||
if c < 1 or c >16:
|
||||
error("SplitChannels: Expecting value 1 to 16, not %s" % c)
|
||||
splitChannels.append(c)
|
||||
|
||||
if gbl.debug:
|
||||
print "SplitChannels: ",
|
||||
printList(splitChannels)
|
||||
if gbl.debug:
|
||||
print "SplitChannels: ",
|
||||
printList(splitChannels)
|
||||
|
||||
|
||||
####################
|
||||
|
||||
def writeTracks(out):
|
||||
""" Write the accumulated MIDI tracks to file. """
|
||||
""" Write the accumulated MIDI tracks to file. """
|
||||
|
||||
keys=gbl.mtrks.keys()
|
||||
keys.sort()
|
||||
keys=gbl.mtrks.keys()
|
||||
keys.sort()
|
||||
|
||||
""" For type 0 MIDI files all data is contained in 1 track.
|
||||
We take all our tracks and copy them to track 0, then
|
||||
set up keys[] so that only track 0 remains.
|
||||
"""
|
||||
""" For type 0 MIDI files all data is contained in 1 track.
|
||||
We take all our tracks and copy them to track 0, then
|
||||
set up keys[] so that only track 0 remains.
|
||||
"""
|
||||
|
||||
if gbl.midiFileType == 0:
|
||||
trk0=gbl.mtrks[0].miditrk
|
||||
for n in keys[1:]:
|
||||
trk=gbl.mtrks[n].miditrk
|
||||
for k,v in trk.items():
|
||||
if k in trk0:
|
||||
trk0[k].extend(v)
|
||||
else:
|
||||
trk0[k]=v
|
||||
keys=[0]
|
||||
if gbl.midiFileType == 0:
|
||||
trk0=gbl.mtrks[0].miditrk
|
||||
for n in keys[1:]:
|
||||
trk=gbl.mtrks[n].miditrk
|
||||
for k,v in trk.items():
|
||||
if k in trk0:
|
||||
trk0[k].extend(v)
|
||||
else:
|
||||
trk0[k]=v
|
||||
keys=[0]
|
||||
|
||||
# Write header
|
||||
# Write header
|
||||
|
||||
tcount = len(keys)
|
||||
out.write( mkHeader(tcount, gbl.BperQ, gbl.midiFileType) )
|
||||
tcount = len(keys)
|
||||
out.write( mkHeader(tcount, gbl.BperQ, gbl.midiFileType) )
|
||||
|
||||
# Write data chunks for each track
|
||||
# Write data chunks for each track
|
||||
|
||||
for n in keys:
|
||||
for n in keys:
|
||||
|
||||
if len(gbl.mtrks[n].miditrk):
|
||||
if len(gbl.mtrks[n].miditrk):
|
||||
|
||||
if gbl.debug:
|
||||
print "Writing <%s> ch=%s;" % \
|
||||
(gbl.mtrks[n].trackname, n),
|
||||
if gbl.debug:
|
||||
print "Writing <%s> ch=%s;" % \
|
||||
(gbl.mtrks[n].trackname, n),
|
||||
|
||||
if n in splitChannels and gbl.midiFileType:
|
||||
tcount += writeSplitTrack(n, out)
|
||||
else:
|
||||
gbl.mtrks[n].writeMidiTrack(out)
|
||||
|
||||
if n in splitChannels and gbl.midiFileType:
|
||||
tcount += writeSplitTrack(n, out)
|
||||
else:
|
||||
gbl.mtrks[n].writeMidiTrack(out)
|
||||
""" We have increased the track count! So, we need to
|
||||
fix the file header. This is offset 10/11 which contains
|
||||
the number of tracks. The counter tcount has been
|
||||
tracking this, so just seek, replace and seek back.
|
||||
"""
|
||||
|
||||
""" We have increased the track count! So, we need to
|
||||
fix the file header. This is offset 10/11 which contains
|
||||
the number of tracks. The counter tcount has been
|
||||
tracking this, so just seek, replace and seek back.
|
||||
"""
|
||||
|
||||
if tcount != len(keys):
|
||||
out.seek(0)
|
||||
out.write( mkHeader(tcount, gbl.BperQ, gbl.midiFileType) )
|
||||
out.seek(0, 2) # return to eof
|
||||
if tcount != len(keys):
|
||||
out.seek(0)
|
||||
out.write( mkHeader(tcount, gbl.BperQ, gbl.midiFileType) )
|
||||
out.seek(0, 2) # return to eof
|
||||
|
||||
|
||||
def writeSplitTrack(channel, out):
|
||||
""" Split a drum track into a separate track for the non-note
|
||||
stuff and then a track for each note.
|
||||
"""
|
||||
""" Split a drum track into a separate track for the non-note
|
||||
stuff and then a track for each note.
|
||||
"""
|
||||
|
||||
tr = gbl.mtrks[channel].miditrk # track to split
|
||||
tr = gbl.mtrks[channel].miditrk # track to split
|
||||
|
||||
""" A dict to store the split midi tracks. We'll end out with
|
||||
a track for each pitch which appears in the track and
|
||||
a track (labeled -1) to store every other than note on data.
|
||||
"""
|
||||
""" A dict to store the split midi tracks. We'll end out with
|
||||
a track for each pitch which appears in the track and
|
||||
a track (labeled -1) to store every other than note on data.
|
||||
"""
|
||||
|
||||
notes={}
|
||||
notes={}
|
||||
|
||||
onEvent = 0x90 + (channel-1)
|
||||
offEvent = 0x80 + (channel-1)
|
||||
onEvent = 0x90 + (channel-1)
|
||||
offEvent = 0x80 + (channel-1)
|
||||
|
||||
for offset in tr.keys():
|
||||
for x in range(len(tr[offset])-1, -1, -1):
|
||||
ev = tr[offset][x]
|
||||
if len(ev) == 3 and ( ord(ev[0]) in (onEvent, offEvent)):
|
||||
n = ord(ev[1])
|
||||
else:
|
||||
n = -1 # special value for non-note on events
|
||||
for offset in tr.keys():
|
||||
for x in range(len(tr[offset])-1, -1, -1):
|
||||
ev = tr[offset][x]
|
||||
if len(ev) == 3 and ( ord(ev[0]) in (onEvent, offEvent)):
|
||||
n = ord(ev[1])
|
||||
else:
|
||||
n = -1 # special value for non-note on events
|
||||
|
||||
if not notes.has_key(n): # create a new mtrk if needed
|
||||
notes[n]=Mtrk(10)
|
||||
if not notes.has_key(n): # create a new mtrk if needed
|
||||
notes[n]=Mtrk(10)
|
||||
|
||||
if offset in notes[n].miditrk: # copy event to new track
|
||||
notes[n].miditrk[offset].append(ev)
|
||||
else:
|
||||
notes[n].miditrk[offset]=[ev]
|
||||
if offset in notes[n].miditrk: # copy event to new track
|
||||
notes[n].miditrk[offset].append(ev)
|
||||
else:
|
||||
notes[n].miditrk[offset]=[ev]
|
||||
|
||||
if gbl.debug:
|
||||
print " Data has been split into %s tracks." % len(notes)
|
||||
if gbl.debug:
|
||||
print " Data has been split into %s tracks." % len(notes)
|
||||
|
||||
# Insert a channel name in all the new tracks.
|
||||
# Insert a channel name in all the new tracks.
|
||||
|
||||
for a in notes.keys():
|
||||
if a == -1:
|
||||
continue
|
||||
if channel == 10:
|
||||
m = "%s" % MMA.midiC.valueToDrum(a)
|
||||
else:
|
||||
m= "%s-%s" % (gbl.mtrks[channel].trackname, a)
|
||||
for a in notes.keys():
|
||||
if a == -1:
|
||||
continue
|
||||
if channel == 10:
|
||||
m = "%s" % MMA.midiC.valueToDrum(a)
|
||||
else:
|
||||
m= "%s-%s" % (gbl.mtrks[channel].trackname, a)
|
||||
|
||||
notes[a].addTrkName(0, m)
|
||||
notes[a].addTrkName(0, m)
|
||||
|
||||
for a in sorted(notes.keys()):
|
||||
notes[a].writeMidiTrack(out)
|
||||
for a in sorted(notes.keys()):
|
||||
notes[a].writeMidiTrack(out)
|
||||
|
||||
""" The split tracks have been written. Return the number of additional tracks
|
||||
so that the caller can properly update the midi file header. Note that
|
||||
len(notes)-1 IS CORRECT ... we've already figured on writing 1 track.
|
||||
"""
|
||||
""" The split tracks have been written. Return the number of additional tracks
|
||||
so that the caller can properly update the midi file header. Note that
|
||||
len(notes)-1 IS CORRECT ... we've already figured on writing 1 track.
|
||||
"""
|
||||
|
||||
return len(notes)-1
|
||||
return len(notes)-1
|
||||
|
||||
|
||||
def mkHeader(count, tempo, Mtype):
|
||||
|
||||
return "MThd" + intToLong(6) + intToWord(Mtype) + \
|
||||
intToWord(count) + intToWord(tempo)
|
||||
return "MThd" + intToLong(6) + intToWord(Mtype) + \
|
||||
intToWord(count) + intToWord(tempo)
|
||||
|
||||
|
||||
""" Midi track class. All the midi creation is done here.
|
||||
|
@ -176,384 +176,394 @@ def mkHeader(count, tempo, Mtype):
|
|||
|
||||
class Mtrk:
|
||||
|
||||
def __init__(self, channel):
|
||||
self.miditrk={}
|
||||
self.channel = channel-1
|
||||
self.trackname = ''
|
||||
self.lastEvent = [None] * 129
|
||||
def __init__(self, channel):
|
||||
self.miditrk={}
|
||||
self.channel = channel-1
|
||||
self.trackname = ''
|
||||
self.lastEvent = [None] * 129
|
||||
|
||||
|
||||
def delDup(self, offset, cmd):
|
||||
"""Delete a duplicate event. Used by timesig, etc. """
|
||||
def delDup(self, offset, cmd):
|
||||
"""Delete a duplicate event. Used by timesig, etc. """
|
||||
|
||||
tr=self.miditrk
|
||||
lg=len(cmd)
|
||||
if tr.has_key(offset):
|
||||
for i,a in enumerate(tr[offset]):
|
||||
if a[0:lg] == cmd:
|
||||
del tr[offset][i]
|
||||
tr=self.miditrk
|
||||
lg=len(cmd)
|
||||
if tr.has_key(offset):
|
||||
for i,a in enumerate(tr[offset]):
|
||||
if a[0:lg] == cmd:
|
||||
del tr[offset][i]
|
||||
|
||||
|
||||
def addTimeSig(self, offset, nn, dd, cc, bb):
|
||||
""" Create a midi time signature.
|
||||
def addTimeSig(self, offset, nn, dd, cc, bb):
|
||||
""" Create a midi time signature.
|
||||
|
||||
delta - midi delta offset
|
||||
nn = sig numerator, beats per measure
|
||||
dd - sig denominator, 2=quarter note, 3=eighth,
|
||||
cc - midi clocks/tick
|
||||
bb - # of 32nd notes in quarter (normally 8)
|
||||
delta - midi delta offset
|
||||
nn = sig numerator, beats per measure
|
||||
dd - sig denominator, 2=quarter note, 3=eighth,
|
||||
cc - midi clocks/tick
|
||||
bb - # of 32nd notes in quarter (normally 8)
|
||||
|
||||
This is only called by timeSig.set(). Don't
|
||||
call this directly since the timeSig.set() checks for
|
||||
duplicate settings.
|
||||
"""
|
||||
This is only called by timeSig.set(). Don't
|
||||
call this directly since the timeSig.set() checks for
|
||||
duplicate settings.
|
||||
"""
|
||||
|
||||
cmd = chr(0xff) + chr(0x58)
|
||||
self.delDup(offset, cmd) # NEEDED???
|
||||
self.addToTrack(offset, cmd + chr(0x04) + \
|
||||
chr(nn) + chr(dd) + chr(cc) + chr(bb) )
|
||||
cmd = chr(0xff) + chr(0x58)
|
||||
self.delDup(offset, cmd) # NEEDED???
|
||||
self.addToTrack(offset, cmd + chr(0x04) + \
|
||||
chr(nn) + chr(dd) + chr(cc) + chr(bb) )
|
||||
|
||||
|
||||
def addKeySig(self, offset, n, mi):
|
||||
""" Set the midi key signature. """
|
||||
def addKeySig(self, offset, n, mi):
|
||||
""" Set the midi key signature. """
|
||||
|
||||
cmd = chr(0xff) + chr(0x59)
|
||||
self.delDup(offset, cmd)
|
||||
self.addToTrack(offset, cmd + chr(0x02) + chr(n) + chr(mi) )
|
||||
cmd = chr(0xff) + chr(0x59)
|
||||
self.delDup(offset, cmd)
|
||||
self.addToTrack(offset, cmd + chr(0x02) + chr(n) + chr(mi) )
|
||||
|
||||
def addMarker(self, offset, msg):
|
||||
""" Create a midi MARKER event."""
|
||||
def addMarker(self, offset, msg):
|
||||
""" Create a midi MARKER event."""
|
||||
|
||||
self.addToTrack(offset, chr(0xff) + chr(0x06) + intToVarNumber(len(msg)) + msg )
|
||||
self.addToTrack(offset, chr(0xff) + chr(0x06) + intToVarNumber(len(msg)) + msg )
|
||||
|
||||
def addText(self, offset, msg):
|
||||
""" Create a midi TextEvent."""
|
||||
def addText(self, offset, msg):
|
||||
""" Create a midi TextEvent."""
|
||||
|
||||
self.addToTrack( offset, chr(0xff) + chr(0x01) + intToVarNumber(len(msg)) + msg )
|
||||
self.addToTrack( offset, chr(0xff) + chr(0x01) + intToVarNumber(len(msg)) + msg )
|
||||
|
||||
|
||||
def addLyric(self, offset, msg):
|
||||
""" Create a midi lyric event. """
|
||||
def addLyric(self, offset, msg):
|
||||
""" Create a midi lyric event. """
|
||||
|
||||
self.addToTrack( offset,
|
||||
chr(0xff) + chr(0x05) + intToVarNumber(len(msg)) + msg )
|
||||
self.addToTrack( offset,
|
||||
chr(0xff) + chr(0x05) + intToVarNumber(len(msg)) + msg )
|
||||
|
||||
|
||||
def addTrkName(self, offset, msg):
|
||||
""" Creates a midi track name event. """
|
||||
def addTrkName(self, offset, msg):
|
||||
""" Creates a midi track name event. """
|
||||
|
||||
offset = 0 # ignore user offset, always put this at 0
|
||||
offset = 0 # ignore user offset, always put this at 0
|
||||
|
||||
self.trackname = msg
|
||||
self.trackname = msg
|
||||
|
||||
cmd = chr(0xff) + chr(0x03)
|
||||
self.delDup(offset, cmd)
|
||||
self.addToTrack(offset, cmd + intToVarNumber(len(msg)) + msg )
|
||||
cmd = chr(0xff) + chr(0x03)
|
||||
self.delDup(offset, cmd)
|
||||
self.addToTrack(offset, cmd + intToVarNumber(len(msg)) + msg )
|
||||
|
||||
|
||||
def addProgChange( self, offset, program):
|
||||
""" Create a midi program change.
|
||||
def addProgChange( self, offset, program):
|
||||
""" Create a midi program change.
|
||||
|
||||
program - midi program
|
||||
program - midi program
|
||||
|
||||
Returns - packed string
|
||||
"""
|
||||
Returns - packed string
|
||||
"""
|
||||
|
||||
self.addToTrack(offset,
|
||||
chr(0xc0 | self.channel) + chr(program) )
|
||||
self.addToTrack(offset,
|
||||
chr(0xc0 | self.channel) + chr(program) )
|
||||
|
||||
|
||||
def addGlis(self, offset, v):
|
||||
""" Set the portamento. LowLevel MIDI.
|
||||
def addGlis(self, offset, v):
|
||||
""" Set the portamento. LowLevel MIDI.
|
||||
|
||||
This does 2 things:
|
||||
1. turns portamento on/off,
|
||||
2. sets the LSN rate.
|
||||
"""
|
||||
This does 2 things:
|
||||
1. turns portamento on/off,
|
||||
2. sets the LSN rate.
|
||||
"""
|
||||
|
||||
if v == 0:
|
||||
self.addToTrack(offset,
|
||||
chr(0xb0 | self.channel) + chr(0x41) + chr(0x00) )
|
||||
if v == 0:
|
||||
self.addToTrack(offset,
|
||||
chr(0xb0 | self.channel) + chr(0x41) + chr(0x00) )
|
||||
|
||||
else:
|
||||
self.addToTrack(offset,
|
||||
chr(0xb0 | self.channel) + chr(0x41) + chr(0x7f) )
|
||||
self.addToTrack(offset,
|
||||
chr(0xb0 | self.channel) + chr(0x05) + chr(v) )
|
||||
else:
|
||||
self.addToTrack(offset,
|
||||
chr(0xb0 | self.channel) + chr(0x41) + chr(0x7f) )
|
||||
self.addToTrack(offset,
|
||||
chr(0xb0 | self.channel) + chr(0x05) + chr(v) )
|
||||
|
||||
|
||||
|
||||
def addPan(self, offset, v):
|
||||
""" Set the lsb of the pan setting."""
|
||||
def addPan(self, offset, v):
|
||||
""" Set the lsb of the pan setting."""
|
||||
|
||||
self.addToTrack(offset,
|
||||
chr(0xb0 | self.channel) + chr(0x0a) + chr(v) )
|
||||
self.addToTrack(offset,
|
||||
chr(0xb0 | self.channel) + chr(0x0a) + chr(v) )
|
||||
|
||||
|
||||
def addCtl(self, offset, l):
|
||||
""" Add arbitary control sequence to track."""
|
||||
def addCtl(self, offset, l):
|
||||
""" Add arbitary control sequence to track."""
|
||||
|
||||
self.addToTrack(offset, chr(0xb0 | self.channel) + l)
|
||||
self.addToTrack(offset, chr(0xb0 | self.channel) + l)
|
||||
|
||||
|
||||
def addNoteOff(self, offset):
|
||||
""" Insert a "All Note Off" into the midi stream.
|
||||
def addNoteOff(self, offset):
|
||||
""" Insert a "All Note Off" into the midi stream.
|
||||
|
||||
Called from the cutTrack() function.
|
||||
"""
|
||||
Called from the cutTrack() function.
|
||||
"""
|
||||
|
||||
self.addToTrack(offset,
|
||||
chr(0xb0 | self.channel) + chr(0x7b) + chr(0) )
|
||||
self.addToTrack(offset,
|
||||
chr(0xb0 | self.channel) + chr(0x7b) + chr(0) )
|
||||
|
||||
|
||||
def addChannelVol(self, offset, v):
|
||||
""" Set the midi channel volume."""
|
||||
def addChannelVol(self, offset, v):
|
||||
""" Set the midi channel volume."""
|
||||
|
||||
self.addToTrack(offset,
|
||||
chr(0xb0 | self.channel) + chr(0x07) + chr(v) )
|
||||
self.addToTrack(offset,
|
||||
chr(0xb0 | self.channel) + chr(0x07) + chr(v) )
|
||||
|
||||
|
||||
def addTempo(self, offset, beats):
|
||||
""" Create a midi tempo meta event.
|
||||
def addTempo(self, offset, beats):
|
||||
""" Create a midi tempo meta event.
|
||||
|
||||
beats - beats per second
|
||||
beats - beats per second
|
||||
|
||||
Return - packed midi string
|
||||
"""
|
||||
Return - packed midi string
|
||||
"""
|
||||
|
||||
cmd = chr(0xff) + chr(0x51)
|
||||
self.delDup(offset, cmd)
|
||||
self.addToTrack( offset, cmd + chr(0x03) + intTo3Byte(60000000/beats) )
|
||||
cmd = chr(0xff) + chr(0x51)
|
||||
self.delDup(offset, cmd)
|
||||
self.addToTrack( offset, cmd + chr(0x03) + intTo3Byte(60000000/beats) )
|
||||
|
||||
|
||||
def writeMidiTrack(self, out):
|
||||
""" Create/write the MIDI track.
|
||||
def writeMidiTrack(self, out):
|
||||
""" Create/write the MIDI track.
|
||||
|
||||
We convert timing offsets to midi-deltas.
|
||||
"""
|
||||
We convert timing offsets to midi-deltas.
|
||||
"""
|
||||
|
||||
tr=self.miditrk
|
||||
tr=self.miditrk
|
||||
|
||||
if gbl.debug:
|
||||
ttl = 0
|
||||
lg=1
|
||||
for t in tr:
|
||||
a=len(tr[t])
|
||||
if a > lg:
|
||||
lg = a
|
||||
ttl += a
|
||||
print "Unique ts: %s; Ttl events %s; Average ev/ts %.2f" % \
|
||||
(len(tr), ttl, float(ttl)/len(tr) )
|
||||
""" To every MIDI track we generate we add (if the -0 flag
|
||||
was set) an on/off beep at offset 0. This makes for
|
||||
easier sync in multi-tracks.
|
||||
"""
|
||||
|
||||
last = 0
|
||||
if gbl.synctick and self.channel >= 0:
|
||||
self.addToTrack(0, chr(0x90 | self.channel) + chr(80) + chr(90) )
|
||||
self.addToTrack(1, chr(0x90 | self.channel) + chr(80) + chr(0) )
|
||||
|
||||
|
||||
if gbl.debug:
|
||||
ttl = 0
|
||||
lg=1
|
||||
for t in tr:
|
||||
a=len(tr[t])
|
||||
if a > lg:
|
||||
lg = a
|
||||
ttl += a
|
||||
print "Unique ts: %s; Ttl events %s; Average ev/ts %.2f" % \
|
||||
(len(tr), ttl, float(ttl)/len(tr) )
|
||||
|
||||
# Convert all events to MIDI deltas and store in
|
||||
# the track array/list
|
||||
last = 0
|
||||
|
||||
tdata=[] # empty track container
|
||||
lastSts=None # Running status tracker
|
||||
# Convert all events to MIDI deltas and store in
|
||||
# the track array/list
|
||||
|
||||
for a in sorted(tr.keys()):
|
||||
delta = a-last
|
||||
for d in tr[a]:
|
||||
tdata=[] # empty track container
|
||||
lastSts=None # Running status tracker
|
||||
|
||||
""" Running status check. For each packet compare
|
||||
the first byte with the first byte of the previous
|
||||
packet. If it is can be converted to running status
|
||||
we strip out byte 0. Note that valid running status
|
||||
byte are 0x80..0xef. 0xfx are system messages
|
||||
and are note suitable for running status.
|
||||
"""
|
||||
for a in sorted(tr.keys()):
|
||||
delta = a-last
|
||||
for d in tr[a]:
|
||||
|
||||
if len(d) > 1:
|
||||
if d[0] == lastSts:
|
||||
d=d[1:]
|
||||
else:
|
||||
lastSts = d[0]
|
||||
s=ord(lastSts)
|
||||
if s < 0x80 or s > 0xef or not gbl.runningStatus:
|
||||
lastSts = None
|
||||
""" Running status check. For each packet compare
|
||||
the first byte with the first byte of the previous
|
||||
packet. If it is can be converted to running status
|
||||
we strip out byte 0. Note that valid running status
|
||||
byte are 0x80..0xef. 0xfx are system messages
|
||||
and are note suitable for running status.
|
||||
"""
|
||||
|
||||
tdata.extend( [ intToVarNumber(delta) , d ] )
|
||||
delta = 0
|
||||
last = a
|
||||
if len(d) > 1:
|
||||
if d[0] == lastSts:
|
||||
d=d[1:]
|
||||
else:
|
||||
lastSts = d[0]
|
||||
s=ord(lastSts)
|
||||
if s < 0x80 or s > 0xef or not gbl.runningStatus:
|
||||
lastSts = None
|
||||
|
||||
# Add an EOF to the track (included in total track size)
|
||||
tdata.extend( [ intToVarNumber(delta) , d ] )
|
||||
delta = 0
|
||||
last = a
|
||||
|
||||
tdata.append( intToVarNumber(0))
|
||||
tdata.append( chr(0xff) + chr(0x2f) + chr(0x00) )
|
||||
# Add an EOF to the track (included in total track size)
|
||||
|
||||
tdata = ''.join(tdata)
|
||||
totsize = len(tdata)
|
||||
tdata.append( intToVarNumber(0))
|
||||
tdata.append( chr(0xff) + chr(0x2f) + chr(0x00) )
|
||||
|
||||
out.write("MTrk")
|
||||
out.write(intToLong(totsize))
|
||||
out.write( tdata )
|
||||
tdata = ''.join(tdata)
|
||||
totsize = len(tdata)
|
||||
|
||||
out.write("MTrk")
|
||||
out.write(intToLong(totsize))
|
||||
out.write( tdata )
|
||||
|
||||
def addPairToTrack(self, boffset, startRnd, duration, note, v, unify):
|
||||
""" Add a note on/off pair to a track.
|
||||
|
||||
boffset - offset into current bar
|
||||
startRnd - rand val start adjustment
|
||||
duration - note len
|
||||
note - midi value of note
|
||||
v - midi velocity
|
||||
unify - if set attempt to unify/compress on/offs
|
||||
def addPairToTrack(self, boffset, startRnd, duration, note, v, unify):
|
||||
""" Add a note on/off pair to a track.
|
||||
|
||||
This function tries its best to handle overlapping events.
|
||||
Easy to show effect with a table of note ON/OFF pairs. Both
|
||||
events are for the same note pitch.
|
||||
boffset - offset into current bar
|
||||
startRnd - rand val start adjustment
|
||||
duration - note len
|
||||
note - midi value of note
|
||||
v - midi velocity
|
||||
unify - if set attempt to unify/compress on/offs
|
||||
|
||||
Offsets | 200 | 300 | 320 | 420
|
||||
---------|--------|--------|-------|--------
|
||||
Pair1 | on | | off |
|
||||
Pair2 | | on | | off
|
||||
This function tries its best to handle overlapping events.
|
||||
Easy to show effect with a table of note ON/OFF pairs. Both
|
||||
events are for the same note pitch.
|
||||
|
||||
The logic here will delete the OFF event at 320 and
|
||||
insert a new OFF at 300. Result is that when playing
|
||||
Pair1 will turn off at 300 followed by the same note
|
||||
in Pair2 beginning sounded right after. Why the on/off?
|
||||
Remember: Velocities may be different!
|
||||
Offsets | 200 | 300 | 320 | 420
|
||||
---------|--------|--------|-------|--------
|
||||
Pair1 | on | | off |
|
||||
Pair2 | | on | | off
|
||||
|
||||
However, if the unify flag is set we should end up with:
|
||||
The logic here will delete the OFF event at 320 and
|
||||
insert a new OFF at 300. Result is that when playing
|
||||
Pair1 will turn off at 300 followed by the same note
|
||||
in Pair2 beginning sounded right after. Why the on/off?
|
||||
Remember: Velocities may be different!
|
||||
|
||||
Offsets | 200 | 300 | 320 | 420
|
||||
---------|--------|--------|-------|--------
|
||||
Pair1 | on | | |
|
||||
Pair2 | | | | off
|
||||
However, if the unify flag is set we should end up with:
|
||||
|
||||
Offsets | 200 | 300 | 320 | 420
|
||||
---------|--------|--------|-------|--------
|
||||
Pair1 | on | | |
|
||||
Pair2 | | | | off
|
||||
|
||||
"""
|
||||
|
||||
# Start/end offsets
|
||||
"""
|
||||
|
||||
onOffset = getOffset( boffset, startRnd)
|
||||
offOffset = onOffset + duration
|
||||
# Start/end offsets
|
||||
|
||||
# ON/OFF events
|
||||
onOffset = getOffset( boffset, startRnd)
|
||||
offOffset = onOffset + duration
|
||||
|
||||
onEvent = chr(0x90 | self.channel) + chr(note) + chr(v)
|
||||
offEvent = onEvent[:-1] + chr(0)
|
||||
# ON/OFF events
|
||||
|
||||
""" Check for overlap on last event set for this track and
|
||||
do some ugly trickry.
|
||||
onEvent = chr(0x90 | self.channel) + chr(note) + chr(v)
|
||||
offEvent = onEvent[:-1] + chr(0)
|
||||
|
||||
- The noOnFlag is set if we don't want to have the main
|
||||
routine add in the ON event. This is set when UNIFY is
|
||||
set and we have an overlap.
|
||||
""" Check for overlap on last event set for this track and
|
||||
do some ugly trickry.
|
||||
|
||||
- We set F to the stored event time for this note and,
|
||||
if it's in the same event range as the current event
|
||||
we loop though the saved events for this track. We are
|
||||
looking for a NOTE OFF event.
|
||||
- The noOnFlag is set if we don't want to have the main
|
||||
routine add in the ON event. This is set when UNIFY is
|
||||
set and we have an overlap.
|
||||
|
||||
- If we get a matching event we then delete it from the
|
||||
track. This requires 2 statements: one for an event
|
||||
list with only 1 event, a 2nd for multiple events.
|
||||
- We set F to the stored event time for this note and,
|
||||
if it's in the same event range as the current event
|
||||
we loop though the saved events for this track. We are
|
||||
looking for a NOTE OFF event.
|
||||
|
||||
- If UNIFY is NOT set we insert a NOTE OFF at the current
|
||||
on time. This replaces the OFF we just deleted.
|
||||
- If we get a matching event we then delete it from the
|
||||
track. This requires 2 statements: one for an event
|
||||
list with only 1 event, a 2nd for multiple events.
|
||||
|
||||
- If UNIFY is SET we skip the above step, and we set the
|
||||
noOnFlag so that the ON event isn't set.
|
||||
- If UNIFY is NOT set we insert a NOTE OFF at the current
|
||||
on time. This replaces the OFF we just deleted.
|
||||
|
||||
"""
|
||||
- If UNIFY is SET we skip the above step, and we set the
|
||||
noOnFlag so that the ON event isn't set.
|
||||
|
||||
noOnFlag = None
|
||||
"""
|
||||
|
||||
f=self.lastEvent[note]
|
||||
if f >= onOffset and f <= offOffset:
|
||||
tr=self.miditrk
|
||||
for i in range(len(tr[f])):
|
||||
if tr[f][i] == offEvent:
|
||||
if len(tr[f]) == 1:
|
||||
del(tr[f])
|
||||
else:
|
||||
del(tr[f][i])
|
||||
if not unify:
|
||||
self.addToTrack(onOffset, offEvent)
|
||||
else:
|
||||
noOnFlag=1
|
||||
break
|
||||
noOnFlag = None
|
||||
|
||||
if not noOnFlag:
|
||||
self.addToTrack(onOffset, onEvent )
|
||||
self.addToTrack(offOffset, offEvent )
|
||||
f=self.lastEvent[note]
|
||||
if f >= onOffset and f <= offOffset:
|
||||
tr=self.miditrk
|
||||
for i in range(len(tr[f])):
|
||||
if tr[f][i] == offEvent:
|
||||
if len(tr[f]) == 1:
|
||||
del(tr[f])
|
||||
else:
|
||||
del(tr[f][i])
|
||||
if not unify:
|
||||
self.addToTrack(onOffset, offEvent)
|
||||
else:
|
||||
noOnFlag=1
|
||||
break
|
||||
|
||||
# Save the NOTE OFF time for the next loop.
|
||||
if not noOnFlag:
|
||||
self.addToTrack(onOffset, onEvent )
|
||||
self.addToTrack(offOffset, offEvent )
|
||||
|
||||
self.lastEvent[note] = offOffset
|
||||
# Save the NOTE OFF time for the next loop.
|
||||
|
||||
self.lastEvent[note] = offOffset
|
||||
|
||||
def zapRangeTrack(self, start, end):
|
||||
""" Clear NoteOn events from track in range: start ... end.
|
||||
|
||||
This is called from the fermata function.
|
||||
def zapRangeTrack(self, start, end):
|
||||
""" Clear NoteOn events from track in range: start ... end.
|
||||
|
||||
We delete the entire event list (3 bytes) from the buffer. This
|
||||
can result in empty directory enteries, but that isn't a problem.
|
||||
"""
|
||||
This is called from the fermata function.
|
||||
|
||||
trk=self.miditrk
|
||||
for a in trk:
|
||||
if a>=start and a<=end:
|
||||
for i in range(len(trk[a])-1, -1, -1):
|
||||
e = trk[a][i]
|
||||
if len(e)==3 and ord(e[0]) & 0xF0 == 0x90 and ord(e[2]):
|
||||
del trk[a][i]
|
||||
We delete the entire event list (3 bytes) from the buffer. This
|
||||
can result in empty directory enteries, but that isn't a problem.
|
||||
"""
|
||||
|
||||
trk=self.miditrk
|
||||
for a in trk:
|
||||
if a>=start and a<=end:
|
||||
for i in range(len(trk[a])-1, -1, -1):
|
||||
e = trk[a][i]
|
||||
if len(e)==3 and ord(e[0]) & 0xF0 == 0x90 and ord(e[2]):
|
||||
del trk[a][i]
|
||||
|
||||
def addToTrack(self, offset, event):
|
||||
""" Add an event to a track.
|
||||
|
||||
MIDI data is saved as created in track structures.
|
||||
Each track has a miditrk dictionary entry which used
|
||||
the time offsets and keys and has the various events
|
||||
as data. Each event is packed string of bytes and
|
||||
the events are stored as a list in the order they are
|
||||
created. Our storage looks like:
|
||||
def addToTrack(self, offset, event):
|
||||
""" Add an event to a track.
|
||||
|
||||
miditrk[123] = [event1, event2, ...]
|
||||
"""
|
||||
MIDI data is saved as created in track structures.
|
||||
Each track has a miditrk dictionary entry which used
|
||||
the time offsets and keys and has the various events
|
||||
as data. Each event is packed string of bytes and
|
||||
the events are stored as a list in the order they are
|
||||
created. Our storage looks like:
|
||||
|
||||
if offset<0:
|
||||
offset=0
|
||||
miditrk[123] = [event1, event2, ...]
|
||||
"""
|
||||
|
||||
tr=self.miditrk
|
||||
if offset<0:
|
||||
offset=0
|
||||
|
||||
if offset in tr:
|
||||
tr[offset].append(event)
|
||||
else:
|
||||
tr[offset]=[event]
|
||||
tr=self.miditrk
|
||||
|
||||
if offset in tr:
|
||||
tr[offset].append(event)
|
||||
else:
|
||||
tr[offset]=[event]
|
||||
|
||||
|
||||
|
||||
|
||||
class TimeSig:
|
||||
""" Track and set the current time signature.
|
||||
""" Track and set the current time signature.
|
||||
|
||||
Timesigs are completely optional and are inserted into
|
||||
the MIDI file by addTimeSig(). MMA routines ignore timesig
|
||||
settings.
|
||||
"""
|
||||
Timesigs are completely optional and are inserted into
|
||||
the MIDI file by addTimeSig(). MMA routines ignore timesig
|
||||
settings.
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
""" Initialze to null value, user will never set to this."""
|
||||
def __init__(self):
|
||||
""" Initialze to null value, user will never set to this."""
|
||||
|
||||
self.lastsig = (None,None)
|
||||
self.lastsig = (None,None)
|
||||
|
||||
def set(self, nn, dd):
|
||||
""" Set timesig. If no change from last value, ignore. """
|
||||
def set(self, nn, dd):
|
||||
""" Set timesig. If no change from last value, ignore. """
|
||||
|
||||
if self.lastsig != (nn, dd):
|
||||
gbl.mtrks[0].addTimeSig(gbl.tickOffset, nn, dd, 48, 8)
|
||||
self.lastsig = (nn, dd)
|
||||
if self.lastsig != (nn, dd):
|
||||
gbl.mtrks[0].addTimeSig(gbl.tickOffset, nn, dd, 48, 8)
|
||||
self.lastsig = (nn, dd)
|
||||
|
||||
def get(self):
|
||||
""" Return existing timesig. """
|
||||
def get(self):
|
||||
""" Return existing timesig. """
|
||||
|
||||
return self.lastsig
|
||||
return self.lastsig
|
||||
|
||||
|
||||
timeSig = TimeSig()
|
||||
|
|
219
mma/MMA/midiC.py
219
mma/MMA/midiC.py
|
@ -18,207 +18,72 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bob van der Poel <bvdp@xplornet.com>
|
||||
Bob van der Poel <bob@mellowood.ca>
|
||||
|
||||
This module contains the constant names for the various
|
||||
MIDI controllers, and conversion routines.
|
||||
This module contains interface for MIDI constants and conversion routines.
|
||||
"""
|
||||
|
||||
from MMA.common import *
|
||||
|
||||
""" English names for midi instruments and drums.
|
||||
|
||||
These tables are used by the pattern classes to
|
||||
convert inst/drum names to midi values and by the
|
||||
doc routines to print tables.
|
||||
"""
|
||||
|
||||
# The drum names are valid for tones 27 to 87
|
||||
|
||||
drumNames=[
|
||||
'HighQ', 'Slap', 'ScratchPush', 'ScratchPull',
|
||||
'Sticks', 'SquareClick', 'MetronomeClick',
|
||||
'MetronomeBell', 'KickDrum2', 'KickDrum1',
|
||||
'SideKick', 'SnareDrum1', 'HandClap',
|
||||
'SnareDrum2', 'LowTom2', 'ClosedHiHat',
|
||||
'LowTom1', 'PedalHiHat', 'MidTom2', 'OpenHiHat',
|
||||
'MidTom1', 'HighTom2', 'CrashCymbal1',
|
||||
'HighTom1', 'RideCymbal1', 'ChineseCymbal',
|
||||
'RideBell', 'Tambourine', 'SplashCymbal',
|
||||
'CowBell', 'CrashCymbal2', 'VibraSlap',
|
||||
'RideCymbal2', 'HighBongo', 'LowBongo',
|
||||
'MuteHighConga', 'OpenHighConga', 'LowConga',
|
||||
'HighTimbale', 'LowTimbale', 'HighAgogo',
|
||||
'LowAgogo', 'Cabasa', 'Maracas',
|
||||
'ShortHiWhistle', 'LongLowWhistle', 'ShortGuiro',
|
||||
'LongGuiro', 'Claves', 'HighWoodBlock',
|
||||
'LowWoodBlock', 'MuteCuica', 'OpenCuica',
|
||||
'MuteTriangle', 'OpenTriangle', 'Shaker',
|
||||
'JingleBell', 'Castanets', 'MuteSudro',
|
||||
'OpenSudro' ]
|
||||
|
||||
upperDrumNames = [name.upper() for name in drumNames]
|
||||
|
||||
|
||||
voiceNames=[
|
||||
'Piano1', 'Piano2','Piano3',
|
||||
'Honky-TonkPiano', 'RhodesPiano', 'EPiano',
|
||||
'HarpsiChord', 'Clavinet', 'Celesta',
|
||||
'Glockenspiel', 'MusicBox', 'Vibraphone',
|
||||
'Marimba', 'Xylophone', 'TubularBells', 'Santur',
|
||||
'Organ1', 'Organ2', 'Organ3', 'ChurchOrgan',
|
||||
'ReedOrgan', 'Accordion', 'Harmonica',
|
||||
'Bandoneon', 'NylonGuitar', 'SteelGuitar',
|
||||
'JazzGuitar', 'CleanGuitar', 'MutedGuitar',
|
||||
'OverDriveGuitar', 'DistortonGuitar',
|
||||
'GuitarHarmonics', 'AcousticBass',
|
||||
'FingeredBass', 'PickedBass', 'FretlessBass',
|
||||
'SlapBass1', 'SlapBass2', 'SynthBass1',
|
||||
'SynthBass2', 'Violin', 'Viola', 'Cello',
|
||||
'ContraBass', 'TremoloStrings',
|
||||
'PizzicatoString', 'OrchestralHarp', 'Timpani',
|
||||
'Strings', 'SlowStrings', 'SynthStrings1',
|
||||
'SynthStrings2', 'ChoirAahs', 'VoiceOohs',
|
||||
'SynthVox', 'OrchestraHit', 'Trumpet',
|
||||
'Trombone', 'Tuba', 'MutedTrumpet', 'FrenchHorn',
|
||||
'BrassSection', 'SynthBrass1', 'SynthBrass2',
|
||||
'SopranoSax', 'AltoSax', 'TenorSax',
|
||||
'BaritoneSax', 'Oboe', 'EnglishHorn', 'Bassoon',
|
||||
'Clarinet', 'Piccolo', 'Flute', 'Recorder',
|
||||
'PanFlute', 'BottleBlow', 'Shakuhachi',
|
||||
'Whistle', 'Ocarina', 'SquareWave', 'SawWave',
|
||||
'SynCalliope', 'ChifferLead', 'Charang',
|
||||
'SoloVoice', '5thSawWave', 'Bass&Lead',
|
||||
'Fantasia', 'WarmPad', 'PolySynth', 'SpaceVoice',
|
||||
'BowedGlass', 'MetalPad', 'HaloPad', 'SweepPad',
|
||||
'IceRain', 'SoundTrack', 'Crystal', 'Atmosphere',
|
||||
'Brightness', 'Goblins', 'EchoDrops',
|
||||
'StarTheme', 'Sitar', 'Banjo', 'Shamisen',
|
||||
'Koto', 'Kalimba', 'BagPipe', 'Fiddle', 'Shanai',
|
||||
'TinkleBell', 'AgogoBells', 'SteelDrums',
|
||||
'WoodBlock', 'TaikoDrum', 'MelodicTom1',
|
||||
'SynthDrum', 'ReverseCymbal', 'GuitarFretNoise',
|
||||
'BreathNoise', 'SeaShore', 'BirdTweet',
|
||||
'TelephoneRing', 'HelicopterBlade',
|
||||
'Applause/Noise', 'GunShot' ]
|
||||
|
||||
|
||||
upperVoiceNames = [name.upper() for name in voiceNames]
|
||||
|
||||
ctrlNames = [
|
||||
### also see: http://www.midi.org/about-midi/table3.shtml
|
||||
|
||||
### 0-31 Double Precise Controllers
|
||||
### MSB (14-bits, 16,384 values)
|
||||
|
||||
'Bank', 'Modulation', 'Breath', 'Ctrl3',
|
||||
'Foot', 'Portamento', 'Data', 'Volume',
|
||||
'Balance', 'Ctrl9', 'Pan', 'Expression',
|
||||
'Effect1', 'Effect2', 'Ctrl14', 'Ctrl15',
|
||||
'General1','General2','General3','General4',
|
||||
'Ctrl20', 'Ctrl21', 'Ctrl22', 'Ctrl23',
|
||||
'Ctrl24', 'Ctrl25', 'Ctrl26', 'Ctrl27',
|
||||
'Ctrl28', 'Ctrl29', 'Ctrl30', 'Ctrl31',
|
||||
### 32-63 Double Precise Controllers
|
||||
### LSB (14-bits, 16,384 values)
|
||||
'BankLSB', 'ModulationLSB', 'BreathLSB',
|
||||
'Ctrl35', 'FootLSB', 'PortamentoLSB',
|
||||
'DataLSB','VolumeLSB','BalanceLSB',
|
||||
'Ctrl41','PanLSB','ExpressionLSB',
|
||||
'Effect1LSB', 'Effect2LSB','Ctrl46', 'Ctrl47',
|
||||
'General1LSB','General2LSB', 'General3LSB',
|
||||
'General4LSB', 'Ctrl52','Ctrl53', 'Ctrl54',
|
||||
'Ctrl55', 'Ctrl56', 'Ctrl57', 'Ctrl58',
|
||||
'Ctrl59', 'Ctrl60', 'Ctrl61', 'Ctrl62',
|
||||
'Ctrl63',
|
||||
|
||||
### 64-119 Single Precise Controllers
|
||||
### (7-bits, 128 values)
|
||||
|
||||
'Sustain', 'Portamento', 'Sostenuto',
|
||||
'SoftPedal', 'Legato', 'Hold2', 'Variation',
|
||||
'Resonance', 'ReleaseTime','AttackTime', 'Brightness',
|
||||
'DecayTime','VibratoRate','VibratoDepth', 'VibratoDelay',
|
||||
'Ctrl79','General5','General6','General7',
|
||||
'General8','PortamentoCtrl','Ctrl85','Ctrl86',
|
||||
'Ctrl87', 'Ctrl88', 'Ctrl89', 'Ctrl90',
|
||||
'Reverb', 'Tremolo', 'Chorus','Detune',
|
||||
'Phaser', 'DataInc','DataDec',
|
||||
'NonRegLSB', 'NonRegMSB',
|
||||
'RegParLSB', 'RegParMSB',
|
||||
'Ctrl102','Ctrl103','Ctrl104','Ctrl105',
|
||||
'Ctrl106','Ctrl107','Ctrl108','Ctrl109',
|
||||
'Ctrl110','Ctrl111','Ctrl112','Ctrl113',
|
||||
'Ctrl114','Ctrl115','Ctrl116','Ctrl117',
|
||||
'Ctrl118','Ctrl119',
|
||||
|
||||
### 120-127 Channel Mode Messages
|
||||
|
||||
'AllSoundsOff','ResetAll',
|
||||
'LocalCtrl','AllNotesOff',
|
||||
'OmniOff','OmniOn', 'PolyOff','PolyOn' ]
|
||||
|
||||
upperCtrlNames = [name.upper() for name in ctrlNames]
|
||||
|
||||
from MMA.miditables import *
|
||||
|
||||
def drumToValue(name):
|
||||
""" Get the value of the drum tone (-1==error). """
|
||||
""" Get the value of the drum tone (-1==error). """
|
||||
|
||||
try:
|
||||
v=int(name, 0)
|
||||
except:
|
||||
try:
|
||||
v = upperDrumNames.index(name.upper()) + 27
|
||||
except ValueError:
|
||||
error("Expecting a valid drum name or value for drum tone, not '%s'" % name)
|
||||
try:
|
||||
v=int(name, 0)
|
||||
except:
|
||||
try:
|
||||
v = upperDrumNames.index(name.upper()) + 27
|
||||
except ValueError:
|
||||
error("Expecting a valid drum name or value for drum tone, not '%s'" % name)
|
||||
|
||||
if v <0 or v > 127:
|
||||
error("Note in Drum Tone list must be 0..127, not %s" % v)
|
||||
if v <0 or v > 127:
|
||||
error("Note in Drum Tone list must be 0..127, not %s" % v)
|
||||
|
||||
return v
|
||||
return v
|
||||
|
||||
|
||||
def instToValue(name):
|
||||
""" Get the value of the instrument name (-1==error). """
|
||||
""" Get the value of the instrument name (-1==error). """
|
||||
|
||||
try:
|
||||
return upperVoiceNames.index(name.upper())
|
||||
except ValueError:
|
||||
return -1
|
||||
try:
|
||||
return upperVoiceNames.index(name.upper())
|
||||
except ValueError:
|
||||
return -1
|
||||
|
||||
def ctrlToValue(name):
|
||||
""" Get the value of the controler name (-1==error). """
|
||||
""" Get the value of the controler name (-1==error). """
|
||||
|
||||
try:
|
||||
return upperCtrlNames.index(name.upper())
|
||||
except ValueError:
|
||||
return -1
|
||||
try:
|
||||
return upperCtrlNames.index(name.upper())
|
||||
except ValueError:
|
||||
return -1
|
||||
|
||||
def valueToInst(val):
|
||||
""" Get the name of the inst. (or 'ERR'). """
|
||||
""" Get the name of the inst. (or 'ERR'). """
|
||||
|
||||
try:
|
||||
return voiceNames[val]
|
||||
except IndexError:
|
||||
return "ERROR"
|
||||
try:
|
||||
return voiceNames[val]
|
||||
except IndexError:
|
||||
return "ERROR"
|
||||
|
||||
|
||||
def valueToDrum(val):
|
||||
""" Get the name of the drum tone.
|
||||
""" Get the name of the drum tone.
|
||||
|
||||
We return the NAME of the tone, or the original value if there is
|
||||
no name associated with the value (only value 27 to 86 have names).
|
||||
"""
|
||||
We return the NAME of the tone, or the original value if there is
|
||||
no name associated with the value (only value 27 to 86 have names).
|
||||
"""
|
||||
|
||||
if val<27 or val>86:
|
||||
return str(val)
|
||||
else:
|
||||
return drumNames[val-27]
|
||||
if val<27 or val>86:
|
||||
return str(val)
|
||||
else:
|
||||
return drumNames[val-27]
|
||||
|
||||
def valueToCtrl(val):
|
||||
""" Get the name of the controller (or 'ERR'). """
|
||||
""" Get the name of the controller (or 'ERR'). """
|
||||
|
||||
try:
|
||||
return ctrlNames[val]
|
||||
except IndexError:
|
||||
return "ERROR"
|
||||
try:
|
||||
return ctrlNames[val]
|
||||
except IndexError:
|
||||
return "ERROR"
|
||||
|
|
|
@ -19,7 +19,7 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bob van der Poel <bvdp@xplornet.com>
|
||||
Bob van der Poel <bob@mellowood.ca>
|
||||
|
||||
"""
|
||||
|
||||
|
@ -38,482 +38,481 @@ offset = 0 # Current pointer into the MIDI file
|
|||
""" Helper functions
|
||||
|
||||
It might be better to have these
|
||||
functions setup in midiM.py ... but it's easier just
|
||||
now to have it here. The main problem is that we are
|
||||
reading from a buffer and don't know how many bytes to
|
||||
pass back and forth.
|
||||
functions setup in midiM.py ... but it's easier just
|
||||
now to have it here. The main problem is that we are
|
||||
reading from a buffer and don't know how many bytes to
|
||||
pass back and forth.
|
||||
"""
|
||||
|
||||
|
||||
def mvarlen():
|
||||
""" Convert variable length midi value to int. """
|
||||
""" Convert variable length midi value to int. """
|
||||
|
||||
global offset
|
||||
global offset
|
||||
|
||||
x=0L
|
||||
for i in range(4):
|
||||
x=0L
|
||||
for i in range(4):
|
||||
|
||||
try:
|
||||
byte=ord(midifile[offset])
|
||||
offset += 1
|
||||
except:
|
||||
error("Invalid MIDI file include (varlen->int).")
|
||||
try:
|
||||
byte=ord(midifile[offset])
|
||||
offset += 1
|
||||
except:
|
||||
error("Invalid MIDI file include (varlen->int)")
|
||||
|
||||
if byte < 0x80:
|
||||
x = ( x << 7 ) + byte
|
||||
break
|
||||
else:
|
||||
x = ( x << 7 ) + ( byte & 0x7f )
|
||||
if byte < 0x80:
|
||||
x = ( x << 7 ) + byte
|
||||
break
|
||||
else:
|
||||
x = ( x << 7 ) + ( byte & 0x7f )
|
||||
|
||||
return int(x)
|
||||
return int(x)
|
||||
|
||||
|
||||
def chars(count):
|
||||
""" Return 'count' chars from file (updates global pointer). """
|
||||
""" Return 'count' chars from file (updates global pointer). """
|
||||
|
||||
global offset
|
||||
global offset
|
||||
|
||||
bytes=midifile[offset:offset+count]
|
||||
offset+=count
|
||||
return bytes
|
||||
bytes=midifile[offset:offset+count]
|
||||
offset+=count
|
||||
return bytes
|
||||
|
||||
|
||||
def m1i():
|
||||
""" Get 1 byte (updates global pointer). """
|
||||
""" Get 1 byte (updates global pointer). """
|
||||
|
||||
global offset
|
||||
global offset
|
||||
|
||||
try:
|
||||
byte = midifile[offset]
|
||||
offset += 1
|
||||
except:
|
||||
error("Invalid MIDI file include (byte, offset=%s)." % offset)
|
||||
try:
|
||||
byte = midifile[offset]
|
||||
offset += 1
|
||||
except:
|
||||
error("Invalid MIDI file include (byte, offset=%s)" % offset)
|
||||
|
||||
return ord(byte)
|
||||
return ord(byte)
|
||||
|
||||
|
||||
def m32i():
|
||||
""" Convert 4 bytes to integer. """
|
||||
""" Convert 4 bytes to integer. """
|
||||
|
||||
global offset
|
||||
global offset
|
||||
|
||||
x = 0L
|
||||
for i in range(4):
|
||||
try:
|
||||
byte = midifile[offset]
|
||||
offset += 1
|
||||
except:
|
||||
error("Invalid MIDI file include (i32->int, offset=%s)." % offset)
|
||||
x = (x << 8) + ord(byte)
|
||||
x = 0L
|
||||
for i in range(4):
|
||||
try:
|
||||
byte = midifile[offset]
|
||||
offset += 1
|
||||
except:
|
||||
error("Invalid MIDI file include (i32->int, offset=%s)" % offset)
|
||||
x = (x << 8) + ord(byte)
|
||||
|
||||
return int(x)
|
||||
return int(x)
|
||||
|
||||
|
||||
def m16i():
|
||||
""" Convert 2 bytes to integer. """
|
||||
""" Convert 2 bytes to integer. """
|
||||
|
||||
global offset
|
||||
global offset
|
||||
|
||||
x = 0L
|
||||
for i in range(2):
|
||||
try:
|
||||
byte = midifile[offset]
|
||||
offset += 1
|
||||
except:
|
||||
error("Invalid MIDI file include (i16->int, offset=%s)." % offset)
|
||||
x = (x << 8) + ord(byte)
|
||||
x = 0L
|
||||
for i in range(2):
|
||||
try:
|
||||
byte = midifile[offset]
|
||||
offset += 1
|
||||
except:
|
||||
error("Invalid MIDI file include (i16->int, offset=%s)" % offset)
|
||||
x = (x << 8) + ord(byte)
|
||||
|
||||
return int(x)
|
||||
return int(x)
|
||||
|
||||
|
||||
######################################################
|
||||
## Main function, called from parser.
|
||||
|
||||
def midiinc(ln):
|
||||
""" Include a MIDI file into MMA generated files. """
|
||||
""" Include a MIDI file into MMA generated files. """
|
||||
|
||||
global midifile, offset
|
||||
global midifile, offset
|
||||
|
||||
filename = ''
|
||||
doLyric = 0
|
||||
doText = 0
|
||||
volAdjust = 100
|
||||
octAdjust = 0
|
||||
transpose = None
|
||||
channels = []
|
||||
filename = ''
|
||||
doLyric = 0
|
||||
doText = 0
|
||||
volAdjust = 100
|
||||
octAdjust = 0
|
||||
transpose = None
|
||||
channels = []
|
||||
|
||||
# These are the start/end points for the included file. They are in
|
||||
# beats, but are adjusted after the file is opened to ticks.
|
||||
# These are the start/end points for the included file. They are in
|
||||
# beats, but are adjusted after the file is opened to ticks.
|
||||
|
||||
istart=0
|
||||
iend = 0xffffff
|
||||
istart=0
|
||||
iend = 0xffffff
|
||||
|
||||
for a in ln:
|
||||
cmd, opt = a.split('=')
|
||||
for a in ln:
|
||||
cmd, opt = a.split('=')
|
||||
|
||||
cmd=cmd.upper()
|
||||
cmd=cmd.upper()
|
||||
|
||||
if cmd == 'FILE':
|
||||
filename = os.path.expanduser(opt)
|
||||
if cmd == 'FILE':
|
||||
filename = os.path.expanduser(opt)
|
||||
|
||||
elif cmd == 'VOLUME':
|
||||
volAdjust = stoi(opt)
|
||||
elif cmd == 'VOLUME':
|
||||
volAdjust = stoi(opt)
|
||||
|
||||
elif cmd == 'OCTAVE':
|
||||
octAdjust = stoi(opt)
|
||||
if octAdjust < -4 or octAdjust > 4:
|
||||
error("Octave adjustment must be -4 to 4, not %s." % opt)
|
||||
octAdjust *= 12
|
||||
elif cmd == 'OCTAVE':
|
||||
octAdjust = stoi(opt)
|
||||
if octAdjust < -4 or octAdjust > 4:
|
||||
error("Octave adjustment must be -4 to 4, not %s" % opt)
|
||||
octAdjust *= 12
|
||||
|
||||
elif cmd == 'TRANSPOSE':
|
||||
transpose = stoi(opt)
|
||||
if transpose < -24 or transpose > 24:
|
||||
error("Tranpose must be -24 to 24, not %s." % opt)
|
||||
elif cmd == 'TRANSPOSE':
|
||||
transpose = stoi(opt)
|
||||
if transpose < -24 or transpose > 24:
|
||||
error("Tranpose must be -24 to 24, not %s" % opt)
|
||||
|
||||
elif cmd == 'START':
|
||||
istart = stof(opt)
|
||||
elif cmd == 'START':
|
||||
istart = stof(opt)
|
||||
|
||||
elif cmd == 'END':
|
||||
iend = stof(opt)
|
||||
elif cmd == 'END':
|
||||
iend = stof(opt)
|
||||
|
||||
elif cmd == 'TEXT':
|
||||
opt=opt.upper()
|
||||
if opt in ("ON", 1):
|
||||
doText=1
|
||||
elif opt in ("OFF", 0):
|
||||
doText=0
|
||||
else:
|
||||
error("MidiInc Text= expecting 'ON' or 'OFF'")
|
||||
elif cmd == 'TEXT':
|
||||
opt=opt.upper()
|
||||
if opt in ("ON", 1):
|
||||
doText=1
|
||||
elif opt in ("OFF", 0):
|
||||
doText=0
|
||||
else:
|
||||
error("MidiInc Text= expecting 'ON' or 'OFF'")
|
||||
|
||||
|
||||
elif cmd == 'LYRIC' and opt != '0':
|
||||
opt=opt.upper()
|
||||
if opt in ("ON", 1):
|
||||
doLyric=1
|
||||
elif opt in ("OFF", 0):
|
||||
doLyric=0
|
||||
else:
|
||||
error("MidiInc Lyric= expecting 'ON' or 'OFF'")
|
||||
elif cmd == 'LYRIC' and opt != '0':
|
||||
opt=opt.upper()
|
||||
if opt in ("ON", 1):
|
||||
doLyric=1
|
||||
elif opt in ("OFF", 0):
|
||||
doLyric=0
|
||||
else:
|
||||
error("MidiInc Lyric= expecting 'ON' or 'OFF'")
|
||||
|
||||
# make sure this is last option ... it has to be a TRACKNAME=CHANNEL-NUMBER
|
||||
# make sure this is last option ... it has to be a TRACKNAME=CHANNEL-NUMBER
|
||||
|
||||
else:
|
||||
trackAlloc(cmd, 0)
|
||||
if not cmd in gbl.tnames:
|
||||
error("%s is not a valid MMA track." % cmd)
|
||||
else:
|
||||
trackAlloc(cmd, 0)
|
||||
if not cmd in gbl.tnames:
|
||||
error("%s is not a valid MMA track" % cmd)
|
||||
|
||||
ch = stoi(opt)
|
||||
if ch < 1 or ch > 16:
|
||||
error("MIDI channel for import must be 1..16, not %s." % ch)
|
||||
ch = stoi(opt)
|
||||
if ch < 1 or ch > 16:
|
||||
error("MIDI channel for import must be 1..16, not %s" % ch)
|
||||
|
||||
channels.append( (cmd, ch-1))
|
||||
channels.append( (cmd, ch-1))
|
||||
|
||||
|
||||
if not channels:
|
||||
if doLyric or doText:
|
||||
warning("MidiInc: no import channels specified, only text or lyrics imported.")
|
||||
else:
|
||||
error("MidiInc: A channel to import and a destination track must be specified.")
|
||||
if not channels:
|
||||
if doLyric or doText:
|
||||
warning("MidiInc: no import channels specified, only text or lyrics imported")
|
||||
else:
|
||||
error("MidiInc: A channel to import and a destination track must be specified")
|
||||
|
||||
if (istart >= iend) or (istart < 0) or (iend < 0):
|
||||
error("MidiInc range invalid: start=%s, end=%s" % (istart, iend))
|
||||
if (istart >= iend) or (istart < 0) or (iend < 0):
|
||||
error("MidiInc range invalid: start=%s, end=%s" % (istart, iend))
|
||||
|
||||
if gbl.debug:
|
||||
print "MidiInc: file=%s, Volume=%s, Octave=%s, Transpose=%s, Lyric=%s, Text=%s, Range=%s..%s"\
|
||||
% (filename, volAdjust, octAdjust, transpose, doLyric, doText, istart, iend)
|
||||
for t, ch in channels:
|
||||
print "MidiInc: Channel %s --> Track %s" % (ch+1, t)
|
||||
if gbl.debug:
|
||||
print "MidiInc: file=%s, Volume=%s, Octave=%s, Transpose=%s, Lyric=%s, Text=%s, Range=%s..%s"\
|
||||
% (filename, volAdjust, octAdjust, transpose, doLyric, doText, istart, iend)
|
||||
for t, ch in channels:
|
||||
print "MidiInc: Channel %s --> Track %s" % (ch+1, t)
|
||||
|
||||
# If transpose was NOT set, use the global transpose value
|
||||
# If transpose was NOT set, use the global transpose value
|
||||
|
||||
if transpose == None:
|
||||
transpose = gbl.transpose
|
||||
if transpose == None:
|
||||
transpose = gbl.transpose
|
||||
|
||||
octAdjust += transpose # this takes care of octave and transpose
|
||||
octAdjust += transpose # this takes care of octave and transpose
|
||||
|
||||
try:
|
||||
inpath = file(filename, "rb")
|
||||
except:
|
||||
error("Unable to open MIDI file %s for reading" % filename)
|
||||
try:
|
||||
inpath = file(filename, "rb")
|
||||
except:
|
||||
error("Unable to open MIDI file %s for reading" % filename)
|
||||
|
||||
midifile=inpath.read()
|
||||
inpath.close()
|
||||
midifile=inpath.read()
|
||||
inpath.close()
|
||||
|
||||
# Create our storage:
|
||||
# A dic with the channels 0-15 as keys for the midi note events
|
||||
# 2 lists for lyrics and text events. These have tuples for (time, text)
|
||||
# Create our storage:
|
||||
# A dic with the channels 0-15 as keys for the midi note events
|
||||
# 2 lists for lyrics and text events. These have tuples for (time, text)
|
||||
|
||||
events={}
|
||||
for c in range(0,16):
|
||||
events[c]=[]
|
||||
events={}
|
||||
for c in range(0,16):
|
||||
events[c]=[]
|
||||
|
||||
textEvs=[]
|
||||
lyricEvs=[]
|
||||
textEvs=[]
|
||||
lyricEvs=[]
|
||||
|
||||
# Ensure this is valid header
|
||||
# Ensure this is valid header
|
||||
|
||||
hd=midifile[0:4]
|
||||
if hd != 'MThd':
|
||||
error("Expecting 'HThd', %s not a standard midi file." % filename)
|
||||
hd=midifile[0:4]
|
||||
if hd != 'MThd':
|
||||
error("Expecting 'HThd', %s not a standard midi file" % filename)
|
||||
|
||||
offset = 4
|
||||
a = m32i()
|
||||
offset = 4
|
||||
a = m32i()
|
||||
|
||||
if a != 6:
|
||||
error("Expecting a 32 bit value of 6 in header")
|
||||
if a != 6:
|
||||
error("Expecting a 32 bit value of 6 in header")
|
||||
|
||||
format=m16i()
|
||||
format=m16i()
|
||||
|
||||
if format not in (0,1):
|
||||
error("MIDI file format %s not recognized" % format)
|
||||
if format not in (0,1):
|
||||
error("MIDI file format %s not recognized" % format)
|
||||
|
||||
ntracks=m16i()
|
||||
beatDivision=m16i()
|
||||
ntracks=m16i()
|
||||
beatDivision=m16i()
|
||||
|
||||
if beatDivision != gbl.BperQ:
|
||||
warning("MIDI file '%s' tick/beat of %s differs from MMA's "
|
||||
"%s. Will try to compensate." %
|
||||
(filename, beatDivision, gbl.BperQ))
|
||||
if beatDivision != gbl.BperQ:
|
||||
warning("MIDI file '%s' tick/beat of %s differs from MMA's "
|
||||
"%s. Will try to compensate" %
|
||||
(filename, beatDivision, gbl.BperQ))
|
||||
|
||||
# Adjust start/end to the file's tick
|
||||
# Adjust start/end to the file's tick
|
||||
|
||||
istart *= beatDivision
|
||||
iend *= beatDivision
|
||||
istart *= beatDivision
|
||||
iend *= beatDivision
|
||||
|
||||
midievents={}
|
||||
firstNote = 0xffffff
|
||||
midievents={}
|
||||
firstNote = 0xffffff
|
||||
|
||||
for tr in range(ntracks):
|
||||
tm=0
|
||||
for tr in range(ntracks):
|
||||
tm=0
|
||||
|
||||
hdr = midifile[offset:offset+4]
|
||||
offset+=4
|
||||
hdr = midifile[offset:offset+4]
|
||||
offset+=4
|
||||
|
||||
if hdr != 'MTrk':
|
||||
error("Malformed MIDI file in track header")
|
||||
trlen = m32i() # track length, not used?
|
||||
if hdr != 'MTrk':
|
||||
error("Malformed MIDI file in track header")
|
||||
trlen = m32i() # track length, not used?
|
||||
|
||||
lastevent = None
|
||||
lastevent = None
|
||||
|
||||
""" Parse the midi file. We have to parse off each event, even
|
||||
though many will just be thrown away. You can't just skip around
|
||||
in a midi file :) In the future we might decide to include meta
|
||||
stuff, etc. Or, we may not :) For now, we keep:
|
||||
- note on
|
||||
- note off
|
||||
- key pressure
|
||||
- control change
|
||||
- program change
|
||||
- channel pressure
|
||||
- pitch blend
|
||||
- text event
|
||||
- lyric event
|
||||
"""
|
||||
""" Parse the midi file. We have to parse off each event, even
|
||||
though many will just be thrown away. You can't just skip around
|
||||
in a midi file :) In the future we might decide to include meta
|
||||
stuff, etc. Or, we may not :) For now, we keep:
|
||||
- note on
|
||||
- note off
|
||||
- key pressure
|
||||
- control change
|
||||
- program change
|
||||
- channel pressure
|
||||
- pitch blend
|
||||
- text event
|
||||
- lyric event
|
||||
"""
|
||||
|
||||
while 1:
|
||||
tm += mvarlen() # adjust total offset by delta
|
||||
while 1:
|
||||
tm += mvarlen() # adjust total offset by delta
|
||||
|
||||
ev=m1i()
|
||||
ev=m1i()
|
||||
|
||||
if ev < 0x80:
|
||||
if not lastevent:
|
||||
error("Illegal running status in %s at %s" \
|
||||
% (midifile, offset))
|
||||
offset -= 1
|
||||
ev=lastevent
|
||||
if ev < 0x80:
|
||||
if not lastevent:
|
||||
error("Illegal running status in %s at %s" % (midifile, offset))
|
||||
offset -= 1
|
||||
ev=lastevent
|
||||
|
||||
|
||||
sValue = ev>>4 # Shift MSBs to get a 4 bit value
|
||||
channel = ev & 0x0f
|
||||
sValue = ev>>4 # Shift MSBs to get a 4 bit value
|
||||
channel = ev & 0x0f
|
||||
|
||||
if sValue == 0x8: # note off event
|
||||
if sValue == 0x8: # note off event
|
||||
|
||||
note=m1i()
|
||||
vel=m1i()
|
||||
note=m1i()
|
||||
vel=m1i()
|
||||
|
||||
if octAdjust and channel != 10:
|
||||
note += octAdjust
|
||||
if note < 0 or note > 127:
|
||||
continue
|
||||
if octAdjust and channel != 10:
|
||||
note += octAdjust
|
||||
if note < 0 or note > 127:
|
||||
continue
|
||||
|
||||
|
||||
events[channel].append([tm, ev & 0xf0, chr(note)+chr(vel)])
|
||||
events[channel].append([tm, ev & 0xf0, chr(note)+chr(vel)])
|
||||
|
||||
elif sValue == 0x9: # note on event
|
||||
if tm < firstNote:
|
||||
firstNote = tm
|
||||
elif sValue == 0x9: # note on event
|
||||
if tm < firstNote:
|
||||
firstNote = tm
|
||||
|
||||
note=m1i()
|
||||
vel=m1i()
|
||||
note=m1i()
|
||||
vel=m1i()
|
||||
|
||||
if octAdjust and channel != 10:
|
||||
note += octAdjust
|
||||
if note < 0 or note > 127:
|
||||
continue
|
||||
if octAdjust and channel != 10:
|
||||
note += octAdjust
|
||||
if note < 0 or note > 127:
|
||||
continue
|
||||
|
||||
if volAdjust != 100:
|
||||
vel = int( (vel*volAdjust)/100)
|
||||
if vel<0: vel=1
|
||||
if vel>127: vel=127
|
||||
if volAdjust != 100:
|
||||
vel = int( (vel*volAdjust)/100)
|
||||
if vel<0: vel=1
|
||||
if vel>127: vel=127
|
||||
|
||||
events[ev & 0xf].append([tm, ev & 0xf0, chr(note)+chr(vel)])
|
||||
events[ev & 0xf].append([tm, ev & 0xf0, chr(note)+chr(vel)])
|
||||
|
||||
elif sValue == 0xa: # key pressure
|
||||
events[ev & 0xf].append([tm, ev & 0xf0, chars(2)])
|
||||
elif sValue == 0xa: # key pressure
|
||||
events[ev & 0xf].append([tm, ev & 0xf0, chars(2)])
|
||||
|
||||
elif sValue == 0xb: # control change
|
||||
events[ev & 0xf].append([tm, ev & 0xf0, chars(2)])
|
||||
elif sValue == 0xb: # control change
|
||||
events[ev & 0xf].append([tm, ev & 0xf0, chars(2)])
|
||||
|
||||
elif sValue == 0xc: # program change
|
||||
events[ev & 0xf].append([tm, ev & 0xf0, chars(1)])
|
||||
elif sValue == 0xc: # program change
|
||||
events[ev & 0xf].append([tm, ev & 0xf0, chars(1)])
|
||||
|
||||
elif sValue == 0xd: # channel pressure
|
||||
events[ev & 0xf].append([tm, ev & 0xf0, chars(1)])
|
||||
elif sValue == 0xd: # channel pressure
|
||||
events[ev & 0xf].append([tm, ev & 0xf0, chars(1)])
|
||||
|
||||
elif sValue == 0xe: # pitch blend
|
||||
events[ev & 0xf].append([tm, ev & 0xf0, chars(2)])
|
||||
elif sValue == 0xe: # pitch blend
|
||||
events[ev & 0xf].append([tm, ev & 0xf0, chars(2)])
|
||||
|
||||
elif sValue == 0xf: # system, mostly ignored
|
||||
if ev == 0xff: # meta events
|
||||
a=m1i()
|
||||
elif sValue == 0xf: # system, mostly ignored
|
||||
if ev == 0xff: # meta events
|
||||
a=m1i()
|
||||
|
||||
if a == 0x00: # sequence number
|
||||
l=mvarlen()
|
||||
offset += l
|
||||
if a == 0x00: # sequence number
|
||||
l=mvarlen()
|
||||
offset += l
|
||||
|
||||
elif a == 0x01: # text (could be lyrics)
|
||||
textEvs.append((tm, chars(mvarlen())))
|
||||
elif a == 0x01: # text (could be lyrics)
|
||||
textEvs.append((tm, chars(mvarlen())))
|
||||
|
||||
elif a == 0x02: # copyright
|
||||
l=mvarlen()
|
||||
offset += l
|
||||
elif a == 0x02: # copyright
|
||||
l=mvarlen()
|
||||
offset += l
|
||||
|
||||
elif a == 0x03: # seq/track name
|
||||
l=mvarlen()
|
||||
offset += l
|
||||
elif a == 0x03: # seq/track name
|
||||
l=mvarlen()
|
||||
offset += l
|
||||
|
||||
elif a == 0x04: # instrument name
|
||||
l=mvarlen()
|
||||
offset += l
|
||||
elif a == 0x04: # instrument name
|
||||
l=mvarlen()
|
||||
offset += l
|
||||
|
||||
elif a == 0x05: # lyric
|
||||
lyricEvs.append((tm, chars(mvarlen())))
|
||||
elif a == 0x05: # lyric
|
||||
lyricEvs.append((tm, chars(mvarlen())))
|
||||
|
||||
elif a == 0x06: # marker
|
||||
l=mvarlen()
|
||||
offset += l
|
||||
elif a == 0x06: # marker
|
||||
l=mvarlen()
|
||||
offset += l
|
||||
|
||||
elif a == 0x07: # cue point
|
||||
l=mvarlen()
|
||||
offset += l
|
||||
elif a == 0x07: # cue point
|
||||
l=mvarlen()
|
||||
offset += l
|
||||
|
||||
elif a == 0x21: # midi port
|
||||
l=mvarlen()
|
||||
offset += l
|
||||
elif a == 0x21: # midi port
|
||||
l=mvarlen()
|
||||
offset += l
|
||||
|
||||
elif a == 0x2f: # end of track
|
||||
l=mvarlen()
|
||||
offset += l
|
||||
break
|
||||
elif a == 0x2f: # end of track
|
||||
l=mvarlen()
|
||||
offset += l
|
||||
break
|
||||
|
||||
elif a == 0x51: #tempo
|
||||
l=mvarlen()
|
||||
offset += l
|
||||
elif a == 0x51: #tempo
|
||||
l=mvarlen()
|
||||
offset += l
|
||||
|
||||
elif a == 0x54: # SMPTE offset
|
||||
l=mvarlen()
|
||||
offset += l
|
||||
elif a == 0x54: # SMPTE offset
|
||||
l=mvarlen()
|
||||
offset += l
|
||||
|
||||
elif a == 0x58: # time sig
|
||||
l=mvarlen()
|
||||
offset += l
|
||||
elif a == 0x58: # time sig
|
||||
l=mvarlen()
|
||||
offset += l
|
||||
|
||||
elif a == 0x59: # key sig
|
||||
l=mvarlen()
|
||||
offset += l
|
||||
elif a == 0x59: # key sig
|
||||
l=mvarlen()
|
||||
offset += l
|
||||
|
||||
else: # probably 0x7f, proprietary event
|
||||
l=mvarlen()
|
||||
offset += l
|
||||
else: # probably 0x7f, proprietary event
|
||||
l=mvarlen()
|
||||
offset += l
|
||||
|
||||
|
||||
elif ev == 0xf0: # system exclusive
|
||||
l=mvarlen()
|
||||
offset += l
|
||||
elif ev == 0xf0: # system exclusive
|
||||
l=mvarlen()
|
||||
offset += l
|
||||
|
||||
elif ev == 0xf2: # song position pointer, 2 bytes
|
||||
offset += 2
|
||||
elif ev == 0xf2: # song position pointer, 2 bytes
|
||||
offset += 2
|
||||
|
||||
elif ev == 0xf3: # song select, 1 byte
|
||||
offset += 1
|
||||
|
||||
else: # all others are single byte commands
|
||||
pass
|
||||
elif ev == 0xf3: # song select, 1 byte
|
||||
offset += 1
|
||||
|
||||
else: # all others are single byte commands
|
||||
pass
|
||||
|
||||
if ev >= 0x80 and ev <= 0xef:
|
||||
lastevent = ev
|
||||
if ev >= 0x80 and ev <= 0xef:
|
||||
lastevent = ev
|
||||
|
||||
|
||||
# Midi file parsed, add selected events to mma data
|
||||
# Midi file parsed, add selected events to mma data
|
||||
|
||||
beatad = gbl.BperQ / float(beatDivision)
|
||||
beatad = gbl.BperQ / float(beatDivision)
|
||||
|
||||
if doText:
|
||||
inst=0
|
||||
disc=0
|
||||
for tm,tx in textEvs:
|
||||
delta = tm-firstNote
|
||||
if delta >= istart and delta <= iend:
|
||||
gbl.mtrks[0].addText(gbl.tickOffset + int(delta * beatad), tx)
|
||||
inst+=1
|
||||
else:
|
||||
disc+=1
|
||||
if gbl.debug:
|
||||
print"MidiInc text events: %s inserted, %s out of range." % (inst, disc)
|
||||
|
||||
if doLyric:
|
||||
inst=0
|
||||
disc=0
|
||||
for tm, tx in lyricEvs:
|
||||
delta = tm-firstNote
|
||||
if delta >= istart and delta <= iend:
|
||||
gbl.mtrks[0].addLyric(gbl.tickOffset + int(delta * beatad), tx)
|
||||
inst+=1
|
||||
else:
|
||||
disc+=1
|
||||
if gbl.debug:
|
||||
print"MidiInc lyric events: %s inserted, %s out of range." % (inst, disc)
|
||||
|
||||
|
||||
for n,c in channels:
|
||||
if not len(events[c]):
|
||||
warning("No data to assign from imported channel %s to track %s." % (c+1, n))
|
||||
|
||||
inst=0
|
||||
disc=0
|
||||
for tr, ch in channels:
|
||||
t=gbl.tnames[tr]
|
||||
if not t.channel:
|
||||
t.setChannel()
|
||||
|
||||
t.clearPending()
|
||||
if t.voice[0] != t.ssvoice:
|
||||
gbl.mtrks[t.channel].addProgChange( gbl.tickOffset, t.voice[0])
|
||||
|
||||
channel = t.channel
|
||||
track = gbl.mtrks[channel]
|
||||
|
||||
for ev in events[ch]:
|
||||
delta = ev[0]-firstNote
|
||||
if delta >= istart and delta <= iend:
|
||||
track.addToTrack( gbl.tickOffset + int(delta * beatad),
|
||||
chr(ev[1] | channel-1) + ev[2] )
|
||||
inst+=1
|
||||
else:
|
||||
disc+=1
|
||||
|
||||
if gbl.debug:
|
||||
print"MidiInc events: %s inserted, %s out of range." % (inst, disc)
|
||||
if doText:
|
||||
inst=0
|
||||
disc=0
|
||||
for tm,tx in textEvs:
|
||||
delta = tm-firstNote
|
||||
if delta >= istart and delta <= iend:
|
||||
gbl.mtrks[0].addText(gbl.tickOffset + int(delta * beatad), tx)
|
||||
inst+=1
|
||||
else:
|
||||
disc+=1
|
||||
if gbl.debug:
|
||||
print"MidiInc text events: %s inserted, %s out of range." % (inst, disc)
|
||||
|
||||
if doLyric:
|
||||
inst=0
|
||||
disc=0
|
||||
for tm, tx in lyricEvs:
|
||||
delta = tm-firstNote
|
||||
if delta >= istart and delta <= iend:
|
||||
gbl.mtrks[0].addLyric(gbl.tickOffset + int(delta * beatad), tx)
|
||||
inst+=1
|
||||
else:
|
||||
disc+=1
|
||||
if gbl.debug:
|
||||
print"MidiInc lyric events: %s inserted, %s out of range." % (inst, disc)
|
||||
|
||||
|
||||
for n,c in channels:
|
||||
if not len(events[c]):
|
||||
warning("No data to assign from imported channel %s to track %s" % (c+1, n))
|
||||
|
||||
inst=0
|
||||
disc=0
|
||||
for tr, ch in channels:
|
||||
t=gbl.tnames[tr]
|
||||
if not t.channel:
|
||||
t.setChannel()
|
||||
|
||||
t.clearPending()
|
||||
if t.voice[0] != t.ssvoice:
|
||||
gbl.mtrks[t.channel].addProgChange( gbl.tickOffset, t.voice[0])
|
||||
|
||||
channel = t.channel
|
||||
track = gbl.mtrks[channel]
|
||||
|
||||
for ev in events[ch]:
|
||||
delta = ev[0]-firstNote
|
||||
if delta >= istart and delta <= iend:
|
||||
track.addToTrack( gbl.tickOffset + int(delta * beatad),
|
||||
chr(ev[1] | channel-1) + ev[2] )
|
||||
inst+=1
|
||||
else:
|
||||
disc+=1
|
||||
|
||||
if gbl.debug:
|
||||
print"MidiInc events: %s inserted, %s out of range." % (inst, disc)
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bob van der Poel <bvdp@xplornet.com>
|
||||
Bob van der Poel <bob@mellowood.ca>
|
||||
|
||||
This module contains the MIDI number (un)packing routines.
|
||||
|
||||
|
@ -29,29 +29,29 @@ MIDI expects.
|
|||
|
||||
|
||||
def intToWord(x):
|
||||
""" Convert INT to a 2 byte MSB LSB value. """
|
||||
""" Convert INT to a 2 byte MSB LSB value. """
|
||||
|
||||
return chr(x>>8 & 0xff) + chr(x & 0xff)
|
||||
return chr(x>>8 & 0xff) + chr(x & 0xff)
|
||||
|
||||
def intTo3Byte(x):
|
||||
""" Convert INT to a 3 byte MSB...LSB value. """
|
||||
""" Convert INT to a 3 byte MSB...LSB value. """
|
||||
|
||||
return intToLong(x)[1:]
|
||||
return intToLong(x)[1:]
|
||||
|
||||
def intToLong(x):
|
||||
""" Convert INT to a 4 byte MSB...LSB value. """
|
||||
""" Convert INT to a 4 byte MSB...LSB value. """
|
||||
|
||||
return intToWord(x>>16) + intToWord(x)
|
||||
return intToWord(x>>16) + intToWord(x)
|
||||
|
||||
|
||||
def intToVarNumber(x):
|
||||
""" Convert INT to a variable length MIDI value. """
|
||||
""" Convert INT to a variable length MIDI value. """
|
||||
|
||||
lst = chr(x & 0x7f)
|
||||
while 1:
|
||||
x = x >> 7
|
||||
if x:
|
||||
lst = chr((x & 0x7f) | 0x80) + lst
|
||||
else:
|
||||
return lst
|
||||
lst = chr(x & 0x7f)
|
||||
while 1:
|
||||
x = x >> 7
|
||||
if x:
|
||||
lst = chr((x & 0x7f) | 0x80) + lst
|
||||
else:
|
||||
return lst
|
||||
|
||||
|
|
166
mma/MMA/miditables.py
Normal file
166
mma/MMA/miditables.py
Normal file
|
@ -0,0 +1,166 @@
|
|||
|
||||
# miditables.py
|
||||
|
||||
"""
|
||||
This module is an integeral part of the program
|
||||
MMA - Musical Midi Accompaniment.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bob van der Poel <bob@mellowood.ca>
|
||||
|
||||
This module contains the constant names for the various
|
||||
MIDI controllers.
|
||||
|
||||
Having only the constants in this separate file permits to
|
||||
call this from other programs, mainly the mma doc creators.
|
||||
|
||||
"""
|
||||
|
||||
|
||||
|
||||
""" English names for midi instruments and drums.
|
||||
|
||||
These tables are used by the pattern classes to
|
||||
convert inst/drum names to midi values and by the
|
||||
doc routines to print tables.
|
||||
"""
|
||||
|
||||
# The drum names are valid for tones 27 to 87
|
||||
|
||||
drumNames=[
|
||||
'HighQ', 'Slap', 'ScratchPush', 'ScratchPull',
|
||||
'Sticks', 'SquareClick', 'MetronomeClick',
|
||||
'MetronomeBell', 'KickDrum2', 'KickDrum1',
|
||||
'SideKick', 'SnareDrum1', 'HandClap',
|
||||
'SnareDrum2', 'LowTom2', 'ClosedHiHat',
|
||||
'LowTom1', 'PedalHiHat', 'MidTom2', 'OpenHiHat',
|
||||
'MidTom1', 'HighTom2', 'CrashCymbal1',
|
||||
'HighTom1', 'RideCymbal1', 'ChineseCymbal',
|
||||
'RideBell', 'Tambourine', 'SplashCymbal',
|
||||
'CowBell', 'CrashCymbal2', 'VibraSlap',
|
||||
'RideCymbal2', 'HighBongo', 'LowBongo',
|
||||
'MuteHighConga', 'OpenHighConga', 'LowConga',
|
||||
'HighTimbale', 'LowTimbale', 'HighAgogo',
|
||||
'LowAgogo', 'Cabasa', 'Maracas',
|
||||
'ShortHiWhistle', 'LongLowWhistle', 'ShortGuiro',
|
||||
'LongGuiro', 'Claves', 'HighWoodBlock',
|
||||
'LowWoodBlock', 'MuteCuica', 'OpenCuica',
|
||||
'MuteTriangle', 'OpenTriangle', 'Shaker',
|
||||
'JingleBell', 'Castanets', 'MuteSudro',
|
||||
'OpenSudro' ]
|
||||
|
||||
upperDrumNames = [name.upper() for name in drumNames]
|
||||
|
||||
|
||||
voiceNames=[
|
||||
'Piano1', 'Piano2','Piano3',
|
||||
'Honky-TonkPiano', 'RhodesPiano', 'EPiano',
|
||||
'HarpsiChord', 'Clavinet', 'Celesta',
|
||||
'Glockenspiel', 'MusicBox', 'Vibraphone',
|
||||
'Marimba', 'Xylophone', 'TubularBells', 'Santur',
|
||||
'Organ1', 'Organ2', 'Organ3', 'ChurchOrgan',
|
||||
'ReedOrgan', 'Accordion', 'Harmonica',
|
||||
'Bandoneon', 'NylonGuitar', 'SteelGuitar',
|
||||
'JazzGuitar', 'CleanGuitar', 'MutedGuitar',
|
||||
'OverDriveGuitar', 'DistortonGuitar',
|
||||
'GuitarHarmonics', 'AcousticBass',
|
||||
'FingeredBass', 'PickedBass', 'FretlessBass',
|
||||
'SlapBass1', 'SlapBass2', 'SynthBass1',
|
||||
'SynthBass2', 'Violin', 'Viola', 'Cello',
|
||||
'ContraBass', 'TremoloStrings',
|
||||
'PizzicatoString', 'OrchestralHarp', 'Timpani',
|
||||
'Strings', 'SlowStrings', 'SynthStrings1',
|
||||
'SynthStrings2', 'ChoirAahs', 'VoiceOohs',
|
||||
'SynthVox', 'OrchestraHit', 'Trumpet',
|
||||
'Trombone', 'Tuba', 'MutedTrumpet', 'FrenchHorn',
|
||||
'BrassSection', 'SynthBrass1', 'SynthBrass2',
|
||||
'SopranoSax', 'AltoSax', 'TenorSax',
|
||||
'BaritoneSax', 'Oboe', 'EnglishHorn', 'Bassoon',
|
||||
'Clarinet', 'Piccolo', 'Flute', 'Recorder',
|
||||
'PanFlute', 'BottleBlow', 'Shakuhachi',
|
||||
'Whistle', 'Ocarina', 'SquareWave', 'SawWave',
|
||||
'SynCalliope', 'ChifferLead', 'Charang',
|
||||
'SoloVoice', '5thSawWave', 'Bass&Lead',
|
||||
'Fantasia', 'WarmPad', 'PolySynth', 'SpaceVoice',
|
||||
'BowedGlass', 'MetalPad', 'HaloPad', 'SweepPad',
|
||||
'IceRain', 'SoundTrack', 'Crystal', 'Atmosphere',
|
||||
'Brightness', 'Goblins', 'EchoDrops',
|
||||
'StarTheme', 'Sitar', 'Banjo', 'Shamisen',
|
||||
'Koto', 'Kalimba', 'BagPipe', 'Fiddle', 'Shanai',
|
||||
'TinkleBell', 'AgogoBells', 'SteelDrums',
|
||||
'WoodBlock', 'TaikoDrum', 'MelodicTom1',
|
||||
'SynthDrum', 'ReverseCymbal', 'GuitarFretNoise',
|
||||
'BreathNoise', 'SeaShore', 'BirdTweet',
|
||||
'TelephoneRing', 'HelicopterBlade',
|
||||
'Applause/Noise', 'GunShot' ]
|
||||
|
||||
|
||||
upperVoiceNames = [name.upper() for name in voiceNames]
|
||||
|
||||
ctrlNames = [
|
||||
### also see: http://www.midi.org/about-midi/table3.shtml
|
||||
|
||||
### 0-31 Double Precise Controllers
|
||||
### MSB (14-bits, 16,384 values)
|
||||
|
||||
'Bank', 'Modulation', 'Breath', 'Ctrl3',
|
||||
'Foot', 'Portamento', 'Data', 'Volume',
|
||||
'Balance', 'Ctrl9', 'Pan', 'Expression',
|
||||
'Effect1', 'Effect2', 'Ctrl14', 'Ctrl15',
|
||||
'General1','General2','General3','General4',
|
||||
'Ctrl20', 'Ctrl21', 'Ctrl22', 'Ctrl23',
|
||||
'Ctrl24', 'Ctrl25', 'Ctrl26', 'Ctrl27',
|
||||
'Ctrl28', 'Ctrl29', 'Ctrl30', 'Ctrl31',
|
||||
### 32-63 Double Precise Controllers
|
||||
### LSB (14-bits, 16,384 values)
|
||||
'BankLSB', 'ModulationLSB', 'BreathLSB',
|
||||
'Ctrl35', 'FootLSB', 'PortamentoLSB',
|
||||
'DataLSB','VolumeLSB','BalanceLSB',
|
||||
'Ctrl41','PanLSB','ExpressionLSB',
|
||||
'Effect1LSB', 'Effect2LSB','Ctrl46', 'Ctrl47',
|
||||
'General1LSB','General2LSB', 'General3LSB',
|
||||
'General4LSB', 'Ctrl52','Ctrl53', 'Ctrl54',
|
||||
'Ctrl55', 'Ctrl56', 'Ctrl57', 'Ctrl58',
|
||||
'Ctrl59', 'Ctrl60', 'Ctrl61', 'Ctrl62',
|
||||
'Ctrl63',
|
||||
|
||||
### 64-119 Single Precise Controllers
|
||||
### (7-bits, 128 values)
|
||||
|
||||
'Sustain', 'Portamento', 'Sostenuto',
|
||||
'SoftPedal', 'Legato', 'Hold2', 'Variation',
|
||||
'Resonance', 'ReleaseTime','AttackTime', 'Brightness',
|
||||
'DecayTime','VibratoRate','VibratoDepth', 'VibratoDelay',
|
||||
'Ctrl79','General5','General6','General7',
|
||||
'General8','PortamentoCtrl','Ctrl85','Ctrl86',
|
||||
'Ctrl87', 'Ctrl88', 'Ctrl89', 'Ctrl90',
|
||||
'Reverb', 'Tremolo', 'Chorus','Detune',
|
||||
'Phaser', 'DataInc','DataDec',
|
||||
'NonRegLSB', 'NonRegMSB',
|
||||
'RegParLSB', 'RegParMSB',
|
||||
'Ctrl102','Ctrl103','Ctrl104','Ctrl105',
|
||||
'Ctrl106','Ctrl107','Ctrl108','Ctrl109',
|
||||
'Ctrl110','Ctrl111','Ctrl112','Ctrl113',
|
||||
'Ctrl114','Ctrl115','Ctrl116','Ctrl117',
|
||||
'Ctrl118','Ctrl119',
|
||||
|
||||
### 120-127 Channel Mode Messages
|
||||
|
||||
'AllSoundsOff','ResetAll',
|
||||
'LocalCtrl','AllNotesOff',
|
||||
'OmniOff','OmniOn', 'PolyOff','PolyOn' ]
|
||||
|
||||
upperCtrlNames = [name.upper() for name in ctrlNames]
|
|
@ -2,7 +2,7 @@
|
|||
# notelen.py
|
||||
|
||||
"""
|
||||
This module is an integeral part of the program
|
||||
This module is an integeral part of the program
|
||||
MMA - Musical Midi Accompaniment.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
|
@ -19,8 +19,8 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bob van der Poel <bvdp@xplornet.com>
|
||||
|
||||
Bob van der Poel <bob@mellowood.ca>
|
||||
|
||||
|
||||
"""
|
||||
import gbl
|
||||
|
@ -28,103 +28,103 @@ from MMA.common import *
|
|||
|
||||
|
||||
noteLenTable = {
|
||||
'0' : 1, # special 0==1 midi tick
|
||||
'1' : gbl.BperQ * 4, # whole note
|
||||
'2' : gbl.BperQ * 2, # 1/2
|
||||
'23' : gbl.BperQ * 4 / 3, # 1/2 triplet
|
||||
'4' : gbl.BperQ, # 1/4
|
||||
'43' : gbl.BperQ * 2 / 3, # 1/4 triplet
|
||||
'8' : gbl.BperQ / 2, # 1/8
|
||||
'81' : None, # short 1/8 swing note
|
||||
'82' : None, # long 1/8 swing note
|
||||
'16' : gbl.BperQ / 4, # 1/16
|
||||
'32' : gbl.BperQ / 8, # 1/32
|
||||
'64' : gbl.BperQ / 16, # 1/64
|
||||
'6' : gbl.BperQ / 6, # 1/16 note triplet
|
||||
'3' : gbl.BperQ / 3, # 1/8 note triplet
|
||||
'5' : gbl.BperQ / 5 } # 1/8 note quintuplet
|
||||
'0' : 1, # special 0==1 midi tick
|
||||
'1' : gbl.BperQ * 4, # whole note
|
||||
'2' : gbl.BperQ * 2, # 1/2
|
||||
'23' : gbl.BperQ * 4 / 3, # 1/2 triplet
|
||||
'4' : gbl.BperQ, # 1/4
|
||||
'43' : gbl.BperQ * 2 / 3, # 1/4 triplet
|
||||
'8' : gbl.BperQ / 2, # 1/8
|
||||
'81' : None, # short 1/8 swing note
|
||||
'82' : None, # long 1/8 swing note
|
||||
'16' : gbl.BperQ / 4, # 1/16
|
||||
'32' : gbl.BperQ / 8, # 1/32
|
||||
'64' : gbl.BperQ / 16, # 1/64
|
||||
'6' : gbl.BperQ / 6, # 1/16 note triplet
|
||||
'3' : gbl.BperQ / 3, # 1/8 note triplet
|
||||
'5' : gbl.BperQ / 5 } # 1/8 note quintuplet
|
||||
|
||||
|
||||
def swingMode(ln):
|
||||
""" Enable/Disable Swing timing mode. """
|
||||
""" Enable/Disable Swing timing mode. """
|
||||
|
||||
|
||||
emsg = "Use: SwingMode [ On, Off, 0, 1 Skew=xx ]."
|
||||
|
||||
if not ln:
|
||||
error(emsg)
|
||||
|
||||
|
||||
for v in ln:
|
||||
emsg = "Use: SwingMode [ On, Off, 0, 1 Skew=xx ]."
|
||||
|
||||
a = v.upper()
|
||||
if not ln:
|
||||
error(emsg)
|
||||
|
||||
if a in ("ON", "1"):
|
||||
gbl.swingMode = 1
|
||||
continue
|
||||
|
||||
if a in ("OFF", "0"):
|
||||
gbl.swingMode = 0
|
||||
continue
|
||||
|
||||
if a.find('=')>1:
|
||||
a,b = a.split('=')
|
||||
for v in ln:
|
||||
|
||||
if a == 'SKEW':
|
||||
gbl.swingSkew = b
|
||||
v = int( stoi(b) * gbl.BperQ / 100)
|
||||
noteLenTable['81'] = v
|
||||
noteLenTable['82'] = gbl.BperQ - v
|
||||
continue
|
||||
a = v.upper()
|
||||
|
||||
error(emsg)
|
||||
if a in ("ON", "1"):
|
||||
gbl.swingMode = 1
|
||||
continue
|
||||
|
||||
if a in ("OFF", "0"):
|
||||
gbl.swingMode = 0
|
||||
continue
|
||||
|
||||
if a.find('=')>1:
|
||||
a,b = a.split('=')
|
||||
|
||||
if a == 'SKEW':
|
||||
gbl.swingSkew = b
|
||||
v = int( stoi(b) * gbl.BperQ / 100)
|
||||
noteLenTable['81'] = v
|
||||
noteLenTable['82'] = gbl.BperQ - v
|
||||
continue
|
||||
|
||||
error(emsg)
|
||||
|
||||
if gbl.debug:
|
||||
print "SwingMode: Status=%s, Skew Note lengths: %s and %s ticks." % \
|
||||
(gbl.swingMode, noteLenTable['81'], noteLenTable['82'])
|
||||
|
||||
if gbl.debug:
|
||||
print "SwingMode: Status=%s, Skew Note lengths: %s and %s ticks." % \
|
||||
(gbl.swingMode, noteLenTable['81'], noteLenTable['82'])
|
||||
|
||||
|
||||
swingMode(['Skew=66']) # Set the default swingskew values.
|
||||
|
||||
|
||||
|
||||
def getNoteLen(n):
|
||||
""" Convert a Note to a midi tick length.
|
||||
|
||||
Notes are 1==Whole, 4==Quarter, etc.
|
||||
Notes can be dotted or double dotted.
|
||||
Notes can be combined: 1+4 == 5 beats, 4. or 4+8 == dotted 1/4
|
||||
def getNoteLen(n):
|
||||
""" Convert a Note to a midi tick length.
|
||||
|
||||
Notes are 1==Whole, 4==Quarter, etc.
|
||||
Notes can be dotted or double dotted.
|
||||
Notes can be combined: 1+4 == 5 beats, 4. or 4+8 == dotted 1/4
|
||||
1-4 == 3 beats, 1-0 == 4 beats less a midi tick
|
||||
"""
|
||||
|
||||
length = 0
|
||||
|
||||
n=n.replace('-', '+-') # change "2-4" to "2+-4" for easier parsing
|
||||
n=n.replace('++-', '+-') # and in case we already used "+-", take out 2nd "+"
|
||||
|
||||
for a in str(n).split('+'):
|
||||
if a.endswith('..'):
|
||||
dot = 2
|
||||
a=a[:-2]
|
||||
elif a.endswith('.'):
|
||||
dot = 1
|
||||
a=a[:-1]
|
||||
else:
|
||||
dot = 0
|
||||
"""
|
||||
|
||||
try:
|
||||
if a.startswith('-'):
|
||||
i = noteLenTable[a[1:]] * -1
|
||||
else:
|
||||
i = noteLenTable[a]
|
||||
length = 0
|
||||
|
||||
except:
|
||||
error("Unknown note duration %s" % n )
|
||||
n=n.replace('-', '+-') # change "2-4" to "2+-4" for easier parsing
|
||||
n=n.replace('++-', '+-') # and in case we already used "+-", take out 2nd "+"
|
||||
|
||||
if dot == 2:
|
||||
i += i/2 + i/4
|
||||
elif dot == 1:
|
||||
i += i/2
|
||||
length += i
|
||||
|
||||
return length
|
||||
for a in str(n).split('+'):
|
||||
if a.endswith('..'):
|
||||
dot = 2
|
||||
a=a[:-2]
|
||||
elif a.endswith('.'):
|
||||
dot = 1
|
||||
a=a[:-1]
|
||||
else:
|
||||
dot = 0
|
||||
|
||||
try:
|
||||
if a.startswith('-'):
|
||||
i = noteLenTable[a[1:]] * -1
|
||||
else:
|
||||
i = noteLenTable[a]
|
||||
|
||||
except:
|
||||
error("Unknown note duration %s" % n )
|
||||
|
||||
if dot == 2:
|
||||
i += i/2 + i/4
|
||||
elif dot == 1:
|
||||
i += i/2
|
||||
length += i
|
||||
|
||||
return length
|
||||
|
|
|
@ -18,7 +18,7 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bob van der Poel <bvdp@xplornet.com>
|
||||
Bob van der Poel <bob@mellowood.ca>
|
||||
|
||||
"""
|
||||
|
||||
|
@ -38,188 +38,156 @@ from MMA.macro import macros
|
|||
|
||||
|
||||
def opts():
|
||||
""" Option parser. """
|
||||
""" Option parser. """
|
||||
|
||||
try:
|
||||
opts, args = getopt.gnu_getopt(sys.argv[1:],
|
||||
"dpsS:ri:wneom:f:M:cgGvD:", [] )
|
||||
try:
|
||||
opts, args = getopt.gnu_getopt(sys.argv[1:],
|
||||
"dpsS:ri:wneom:f:M:cgGvD:0", [] )
|
||||
|
||||
|
||||
except getopt.GetoptError:
|
||||
usage()
|
||||
except getopt.GetoptError:
|
||||
usage()
|
||||
|
||||
for o,a in opts:
|
||||
if o == '-d':
|
||||
gbl.debug = gbl.Ldebug = 1
|
||||
for o,a in opts:
|
||||
|
||||
if o == '-d':
|
||||
gbl.debug = gbl.Ldebug = 1
|
||||
|
||||
elif o == '-o':
|
||||
gbl.showFilenames = gbl.LshowFilenames = 1
|
||||
elif o == '-o':
|
||||
gbl.showFilenames = gbl.LshowFilenames = 1
|
||||
|
||||
elif o == '-p':
|
||||
gbl.pshow = gbl.Lpshow = 1
|
||||
elif o == '-p':
|
||||
gbl.pshow = gbl.Lpshow = 1
|
||||
|
||||
elif o == '-s':
|
||||
gbl.seqshow = gbl.Lseqshow = 1
|
||||
elif o == '-s':
|
||||
gbl.seqshow = gbl.Lseqshow = 1
|
||||
|
||||
elif o == '-S':
|
||||
ln = a.split('=', 1)
|
||||
macros.setvar(ln)
|
||||
elif o == '-S':
|
||||
ln = a.split('=', 1)
|
||||
macros.setvar(ln)
|
||||
|
||||
elif o == '-r':
|
||||
gbl.showrun = gbl.Lshowrun = 1
|
||||
elif o == '-r':
|
||||
gbl.showrun = gbl.Lshowrun = 1
|
||||
|
||||
elif o == '-w':
|
||||
gbl.noWarn = gbl.LnoWarn = 1
|
||||
elif o == '-w':
|
||||
gbl.noWarn = gbl.LnoWarn = 1
|
||||
|
||||
elif o == '-n':
|
||||
gbl.noOutput = gbl.LnoOutput = 1
|
||||
elif o == '-n':
|
||||
gbl.noOutput = gbl.LnoOutput = 1
|
||||
|
||||
elif o == '-e':
|
||||
gbl.showExpand = gbl.LshowExpand = 1
|
||||
elif o == '-e':
|
||||
gbl.showExpand = gbl.LshowExpand = 1
|
||||
|
||||
elif o == '-c':
|
||||
gbl.chshow = gbl.Lchshow = 1
|
||||
elif o == '-c':
|
||||
gbl.chshow = gbl.Lchshow = 1
|
||||
|
||||
elif o == '-f':
|
||||
gbl.outfile = a
|
||||
elif o == '-f':
|
||||
gbl.outfile = a
|
||||
|
||||
elif o == '-i':
|
||||
gbl.mmaRC = a
|
||||
elif o == '-i':
|
||||
gbl.mmaRC = a
|
||||
|
||||
elif o == '-g':
|
||||
gbl.makeGrvDefs = 1
|
||||
elif o == '-g':
|
||||
gbl.makeGrvDefs = 1
|
||||
|
||||
elif o == '-G':
|
||||
gbl.makeGrvDefs = 2
|
||||
elif o == '-G':
|
||||
gbl.makeGrvDefs = 2
|
||||
|
||||
elif o == '-m':
|
||||
try:
|
||||
a=int(a)
|
||||
except:
|
||||
error("Expecting -m arg to be a integer")
|
||||
gbl.maxBars = a
|
||||
elif o == '-m':
|
||||
try:
|
||||
a=int(a)
|
||||
except:
|
||||
error("Expecting -m arg to be a integer")
|
||||
gbl.maxBars = a
|
||||
|
||||
elif o == '-v':
|
||||
print "%s" % gbl.version
|
||||
sys.exit(0)
|
||||
elif o == '-v':
|
||||
print "%s" % gbl.version
|
||||
sys.exit(0)
|
||||
|
||||
elif o == '-M':
|
||||
if a in ['0', '1']:
|
||||
gbl.cmdSMF = a
|
||||
else:
|
||||
error("Only a '0' or '1' is permitted for the -M arg.")
|
||||
elif o == '-M':
|
||||
if a in ['0', '1']:
|
||||
gbl.cmdSMF = a
|
||||
else:
|
||||
error("Only a '0' or '1' is permitted for the -M arg")
|
||||
|
||||
elif o == '-D':
|
||||
if a == 'xl':
|
||||
gbl.docs = 1
|
||||
elif o == '-D':
|
||||
if a == 'xl':
|
||||
gbl.docs = 1
|
||||
|
||||
elif a == 'xh':
|
||||
gbl.docs = 2
|
||||
elif a == 'xh':
|
||||
gbl.docs = 2
|
||||
|
||||
elif a == 'k':
|
||||
elif a == 'k':
|
||||
|
||||
def pl(msg, lst):
|
||||
print msg,
|
||||
for i in sorted(lst.keys()):
|
||||
print i,
|
||||
print "\n"
|
||||
def pl(msg, lst):
|
||||
print msg,
|
||||
for i in sorted(lst.keys()):
|
||||
print i,
|
||||
print "\n"
|
||||
|
||||
pl("Base track names:", MMA.alloc.trkClasses )
|
||||
pl("Commands:", MMA.parse.simpleFuncs)
|
||||
pl("TrackCommands:", MMA.parse.trackFuncs)
|
||||
print "Not complete ... subcommands, comments, chords..."
|
||||
sys.exit(0)
|
||||
pl("Base track names:", MMA.alloc.trkClasses )
|
||||
pl("Commands:", MMA.parse.simpleFuncs)
|
||||
pl("TrackCommands:", MMA.parse.trackFuncs)
|
||||
print "Not complete ... subcommands, comments, chords..."
|
||||
sys.exit(0)
|
||||
|
||||
else:
|
||||
print "Unknown -D option."
|
||||
usage()
|
||||
|
||||
elif a == 'n':
|
||||
MMA.chords.docs()
|
||||
sys.exit(0)
|
||||
elif o == '-0':
|
||||
gbl.synctick = 1
|
||||
|
||||
elif a == 'da':
|
||||
MMA.docs.docDrumNames("a")
|
||||
sys.exit(0)
|
||||
else:
|
||||
usage() # unreachable??
|
||||
|
||||
elif a == 'dm':
|
||||
MMA.docs.docDrumNames("m")
|
||||
sys.exit(0)
|
||||
|
||||
elif a == 'ia':
|
||||
MMA.docs.docInstNames("a")
|
||||
sys.exit(0)
|
||||
|
||||
elif a == 'im':
|
||||
MMA.docs.docInstNames("m")
|
||||
sys.exit(0)
|
||||
|
||||
elif a == 'ca':
|
||||
MMA.docs.docCtrlNames("a")
|
||||
sys.exit(0)
|
||||
|
||||
elif a == 'cm':
|
||||
MMA.docs.docCtrlNames("m")
|
||||
sys.exit(0)
|
||||
|
||||
else:
|
||||
print "Unknown -D option."
|
||||
usage()
|
||||
|
||||
|
||||
else:
|
||||
usage() # unreachable??
|
||||
|
||||
if args:
|
||||
if gbl.infile:
|
||||
usage("Only one input filename is permitted.")
|
||||
gbl.infile = args.pop(0)
|
||||
if args:
|
||||
if gbl.infile:
|
||||
usage("Only one input filename is permitted.")
|
||||
gbl.infile = args.pop(0)
|
||||
|
||||
|
||||
def usage(msg=''):
|
||||
""" Usage message. """
|
||||
""" Usage message. """
|
||||
|
||||
txt=[
|
||||
"MMA - Musical Midi Accompaniment",
|
||||
" Copyright 2003-5, Bob van der Poel. Version %s" % gbl.version ,
|
||||
" Distributed under the terms of the GNU Public License.",
|
||||
" Usage: mma [opts ...] INFILE [opts ...]",
|
||||
"",
|
||||
"Options:",
|
||||
" -c display default Channel assignments",
|
||||
" -d enable lots of Debugging messages",
|
||||
" -Dk print list of MMA keywords",
|
||||
" -Dxl eXtract Latex doc blocks from file",
|
||||
" -Dxh eXtract HTML doc blocks from file",
|
||||
" -Dn print Note/chord table",
|
||||
" -Ddm print Midi drum names (by MIDI value)",
|
||||
" -Dda print Midi drum names (alphabetical)",
|
||||
" -Dim print Inst. names (by MIDI value)",
|
||||
" -Dia print Inst. names (alphabetical)",
|
||||
" -Dcm print Controller names (by value)",
|
||||
" -Dca print Controller names (alphabetical)",
|
||||
" -e show parsed/Expanded lines",
|
||||
" -f <file> set output Filename",
|
||||
" -g update Groove dependency database",
|
||||
" -G create Groove dependency database",
|
||||
" -i <file> specify init (mmarc) file",
|
||||
" -m <x> set Maxbars (default == 500)",
|
||||
" -M <x> set SMF to 0 or 1",
|
||||
" -n No generation of midi output",
|
||||
" -o show complete filenames when Opened",
|
||||
" -p display Patterns as they are defined",
|
||||
" -r display Running progress",
|
||||
" -s display Sequence info during run",
|
||||
" -S <var[=data]> Set macro 'var' to 'data'",
|
||||
" -v display Version number",
|
||||
" -w disable Warning messages" ]
|
||||
txt=[
|
||||
"MMA - Musical Midi Accompaniment",
|
||||
" Copyright 2003-5, Bob van der Poel. Version %s" % gbl.version ,
|
||||
" Distributed under the terms of the GNU Public License.",
|
||||
" Usage: mma [opts ...] INFILE [opts ...]",
|
||||
"",
|
||||
"Options:",
|
||||
" -c display default Channel assignments",
|
||||
" -d enable lots of Debugging messages",
|
||||
" -Dk print list of MMA keywords",
|
||||
" -Dxl eXtract Latex doc blocks from file",
|
||||
" -Dxh eXtract HTML doc blocks from file",
|
||||
" -e show parsed/Expanded lines",
|
||||
" -f <file> set output Filename",
|
||||
" -g update Groove dependency database",
|
||||
" -G create Groove dependency database",
|
||||
" -i <file> specify init (mmarc) file",
|
||||
" -m <x> set Maxbars (default == 500)",
|
||||
" -M <x> set SMF to 0 or 1",
|
||||
" -n No generation of midi output",
|
||||
" -o show complete filenames when Opened",
|
||||
" -p display Patterns as they are defined",
|
||||
" -r display Running progress",
|
||||
" -s display Sequence info during run",
|
||||
" -S <var[=data]> Set macro 'var' to 'data'",
|
||||
" -v display Version number",
|
||||
" -w disable Warning messages",
|
||||
" -0 create sync at start of all channel tracks" ]
|
||||
|
||||
|
||||
for a in txt:
|
||||
print a
|
||||
for a in txt:
|
||||
print a
|
||||
|
||||
if msg:
|
||||
print
|
||||
print msg
|
||||
if msg:
|
||||
print
|
||||
print msg
|
||||
|
||||
print
|
||||
sys.exit(1)
|
||||
print
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
|
|
2846
mma/MMA/parse.py
2846
mma/MMA/parse.py
File diff suppressed because it is too large
Load Diff
2946
mma/MMA/pat.py
2946
mma/MMA/pat.py
File diff suppressed because it is too large
Load Diff
228
mma/MMA/patAria.py
Normal file
228
mma/MMA/patAria.py
Normal file
|
@ -0,0 +1,228 @@
|
|||
|
||||
# patAria.py
|
||||
|
||||
"""
|
||||
This module is an integeral part of the program
|
||||
MMA - Musical Midi Accompaniment.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bob van der Poel <bob@mellowood.ca>
|
||||
|
||||
"""
|
||||
|
||||
|
||||
|
||||
import gbl
|
||||
from MMA.notelen import getNoteLen
|
||||
from MMA.common import *
|
||||
from MMA.harmony import harmonize
|
||||
from MMA.pat import PC, seqBump
|
||||
|
||||
import random
|
||||
|
||||
class Aria(PC):
|
||||
""" Pattern class for an aria (auto-melody) track. """
|
||||
|
||||
vtype = 'ARIA'
|
||||
notes = []
|
||||
selectDir = [1]
|
||||
noteptr = 0
|
||||
dirptr = 0
|
||||
lastChord = None
|
||||
lastStype = None
|
||||
lastRange = None
|
||||
|
||||
|
||||
|
||||
def restoreGroove(self, gname):
|
||||
""" Grooves are not saved/restored for aria tracks. But, seqsize is honored! """
|
||||
self.setSeqSize()
|
||||
|
||||
def saveGroove(self, gname):
|
||||
""" No save done for grooves. """
|
||||
pass
|
||||
|
||||
|
||||
def getPgroup(self, ev):
|
||||
""" Get group for aria pattern.
|
||||
|
||||
Fields - start, length, velocity
|
||||
|
||||
"""
|
||||
|
||||
if len(ev) != 3:
|
||||
error("There must be n groups of 3 in a pattern definition, "
|
||||
"not <%s>" % ' '.join(ev) )
|
||||
|
||||
a = struct()
|
||||
|
||||
a.offset = self.setBarOffset(ev[0])
|
||||
a.duration = getNoteLen( ev[1] )
|
||||
a.vol = stoi(ev[2], "Note volume in Aria definition not int")
|
||||
|
||||
return a
|
||||
|
||||
|
||||
def setScaletype(self, ln):
|
||||
""" Set scale type. """
|
||||
|
||||
ln = self.lnExpand(ln, "ScaleType")
|
||||
tmp = []
|
||||
|
||||
for n in ln:
|
||||
n = n.upper()
|
||||
if not n in ( 'CHROMATIC', 'AUTO', 'CHORD'):
|
||||
error("Unknown %s ScaleType. Only Chromatic, Scale and Chord are valid" % self.name)
|
||||
tmp.append(n)
|
||||
|
||||
self.scaleType = seqBump(tmp)
|
||||
|
||||
if gbl.debug:
|
||||
print "Set %s ScaleType: " % self.name,
|
||||
printList(self.scaleType)
|
||||
|
||||
|
||||
def setDirection(self, ln):
|
||||
""" Set direction for melody creation.
|
||||
|
||||
This function replaces the pattern function of the same name ...
|
||||
the command name is shared, the function is different. Note we
|
||||
need to use a different storage name as well since
|
||||
self.direction is managed in the PC class.
|
||||
"""
|
||||
|
||||
if not len(ln):
|
||||
error("There must be at least one value for %s Direction." % self.name)
|
||||
|
||||
self.selectDir = []
|
||||
for a in ln:
|
||||
if a.upper() == 'R':
|
||||
self.selectDir.append(a.upper())
|
||||
else:
|
||||
a=stoi(a, "Expecting integer value or 'r'.")
|
||||
if a < -4 or a > 4:
|
||||
error("Aria direction must be 'r' or -4 to 4, not '%s'" % a)
|
||||
self.selectDir.append(a)
|
||||
|
||||
if gbl.debug:
|
||||
print "Set %s Direction:" % self.name,
|
||||
printList(self.selectDir)
|
||||
|
||||
def restart(self):
|
||||
self.ssvoice = -1
|
||||
|
||||
|
||||
def trackBar(self, pattern, ctable):
|
||||
""" Do the aria bar.
|
||||
|
||||
Called from self.bar()
|
||||
|
||||
"""
|
||||
|
||||
sc = self.seq
|
||||
unify = self.unify[sc]
|
||||
|
||||
for p in pattern:
|
||||
ct = self.getChordInPos(p.offset, ctable)
|
||||
|
||||
if ct.ariaZ:
|
||||
continue
|
||||
|
||||
thisChord = ct.chord.tonic + ct.chord.chordType
|
||||
stype = self.scaleType[sc]
|
||||
range = self.chordRange[sc]
|
||||
|
||||
### Generate notelist if nesc.
|
||||
|
||||
if self.lastChord != thisChord or self.lastStype != stype or \
|
||||
self.lastRange != range:
|
||||
|
||||
self.lastChord = thisChord
|
||||
self.lastStype = stype
|
||||
self.lastRange = range
|
||||
|
||||
if stype == 'CHORD':
|
||||
notelist = ct.chord.noteList
|
||||
elif stype == 'CHROMATIC':
|
||||
notelist = [ ct.chord.rootNote + x for x in range(0,12)]
|
||||
else:
|
||||
notelist = list(ct.chord.scaleList)
|
||||
|
||||
o=0
|
||||
self.notes=[]
|
||||
|
||||
while range >= 1:
|
||||
for a in notelist:
|
||||
self.notes.append(a+o)
|
||||
o+=12
|
||||
range-=1
|
||||
|
||||
if range>0 and range<1: # for fractional scale lengths
|
||||
range = int(len(notelist) * range)
|
||||
if range < 2: # important, must be at least 2 notes in a scale
|
||||
range=2
|
||||
for a in notelist[:range]:
|
||||
self.notes.append(a+o)
|
||||
|
||||
# grab a note from the list
|
||||
|
||||
if self.dirptr >= len(self.selectDir):
|
||||
self.dirptr=0
|
||||
|
||||
a = self.selectDir[self.dirptr]
|
||||
if a == 'R':
|
||||
a = random.choice( (-1, 0, 1) )
|
||||
self.noteptr += a
|
||||
|
||||
if self.noteptr >= len(self.notes):
|
||||
if a > 0:
|
||||
self.noteptr = 0
|
||||
else:
|
||||
self.noteptr = len(self.notes)-1
|
||||
elif self.noteptr < 0:
|
||||
if a < 0:
|
||||
self.noteptr = len(self.notes)-1
|
||||
else:
|
||||
self.noteptr = 0
|
||||
|
||||
note = self.notes[self.noteptr]
|
||||
|
||||
self.dirptr += 1
|
||||
|
||||
# output
|
||||
|
||||
if not self.harmonyOnly[sc]:
|
||||
self.sendNote(
|
||||
p.offset,
|
||||
self.getDur(p.duration),
|
||||
self.adjustNote(note),
|
||||
self.adjustVolume(p.vol, p.offset))
|
||||
|
||||
|
||||
if self.harmony[sc]:
|
||||
h = harmonize(self.harmony[sc], note, ct.chord.noteList)
|
||||
for n in h:
|
||||
self.sendNote(
|
||||
p.offset,
|
||||
self.getDur(p.duration),
|
||||
self.adjustNote(n),
|
||||
self.adjustVolume(p.vol * self.harmonyVolume[sc], -1))
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -19,7 +19,7 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bob van der Poel <bvdp@xplornet.com>
|
||||
Bob van der Poel <bob@mellowood.ca>
|
||||
|
||||
"""
|
||||
|
||||
|
@ -34,128 +34,128 @@ from MMA.pat import PC
|
|||
|
||||
|
||||
class Arpeggio(PC):
|
||||
""" Pattern class for an arpeggio track. """
|
||||
""" Pattern class for an arpeggio track. """
|
||||
|
||||
vtype = 'ARPEGGIO'
|
||||
arpOffset = -1
|
||||
arpDirection = 1
|
||||
vtype = 'ARPEGGIO'
|
||||
arpOffset = -1
|
||||
arpDirection = 1
|
||||
|
||||
def getPgroup(self, ev):
|
||||
""" Get group for apreggio pattern.
|
||||
def getPgroup(self, ev):
|
||||
""" Get group for apreggio pattern.
|
||||
|
||||
Fields - start, length, volume
|
||||
"""
|
||||
Fields - start, length, volume
|
||||
"""
|
||||
|
||||
a = struct()
|
||||
if len(ev) != 3:
|
||||
error("There must be exactly 3 items in each group "
|
||||
"for apreggio define, not <%s>." % ' '.join(ev) )
|
||||
a = struct()
|
||||
if len(ev) != 3:
|
||||
error("There must be exactly 3 items in each group "
|
||||
"for apreggio define, not '%s'" % ' '.join(ev) )
|
||||
|
||||
a.offset = self.setBarOffset(ev[0])
|
||||
a.duration = getNoteLen(ev[1])
|
||||
a.vol = stoi(ev[2], "Type error in Arpeggio definition.")
|
||||
a.offset = self.setBarOffset(ev[0])
|
||||
a.duration = getNoteLen(ev[1])
|
||||
a.vol = stoi(ev[2], "Type error in Arpeggio definition")
|
||||
|
||||
return a
|
||||
return a
|
||||
|
||||
|
||||
def restart(self):
|
||||
self.ssvoice = -1
|
||||
self.arpOffset=-1
|
||||
self.arpDirection=1
|
||||
def restart(self):
|
||||
self.ssvoice = -1
|
||||
self.arpOffset=-1
|
||||
self.arpDirection=1
|
||||
|
||||
def trackBar(self, pattern, ctable):
|
||||
""" Do a arpeggio bar.
|
||||
def trackBar(self, pattern, ctable):
|
||||
""" Do a arpeggio bar.
|
||||
|
||||
Called from self.bar()
|
||||
Called from self.bar()
|
||||
|
||||
"""
|
||||
"""
|
||||
|
||||
sc = self.seq
|
||||
direct = self.direction[sc]
|
||||
sc = self.seq
|
||||
direct = self.direction[sc]
|
||||
|
||||
for p in pattern:
|
||||
tb = self.getChordInPos(p.offset, ctable)
|
||||
for p in pattern:
|
||||
tb = self.getChordInPos(p.offset, ctable)
|
||||
|
||||
if tb.arpeggioZ:
|
||||
continue
|
||||
if tb.arpeggioZ:
|
||||
continue
|
||||
|
||||
if direct == 'DOWN':
|
||||
self.arpDirection = -1
|
||||
if direct == 'DOWN':
|
||||
self.arpDirection = -1
|
||||
|
||||
if self.chordLimit:
|
||||
tb.chord.limit(self.chordLimit)
|
||||
if self.chordLimit:
|
||||
tb.chord.limit(self.chordLimit)
|
||||
|
||||
if self.compress[sc]:
|
||||
tb.chord.compress()
|
||||
if self.compress[sc]:
|
||||
tb.chord.compress()
|
||||
|
||||
if self.invert[sc]:
|
||||
tb.chord.invert(self.invert[sc])
|
||||
if self.invert[sc]:
|
||||
tb.chord.invert(self.invert[sc])
|
||||
|
||||
# This should be optimized, it recreates the chord for every pattern.
|
||||
# Problem is that one would need to check all the LIMIT, COMPRESS, etc
|
||||
# settings each for each bar as well, so it's probably just as easy to
|
||||
# leave it as is. Besides, this works.
|
||||
# This should be optimized, it recreates the chord for every pattern.
|
||||
# Problem is that one would need to check all the LIMIT, COMPRESS, etc
|
||||
# settings each for each bar as well, so it's probably just as easy to
|
||||
# leave it as is. Besides, this works.
|
||||
|
||||
ln = self.chordRange[sc]
|
||||
o = 0
|
||||
ourChord = []
|
||||
while ln >= 1:
|
||||
for a in tb.chord.noteList:
|
||||
ourChord.append(a+o)
|
||||
ln -= 1
|
||||
o += 12
|
||||
ln = self.chordRange[sc]
|
||||
o = 0
|
||||
ourChord = []
|
||||
while ln >= 1:
|
||||
for a in tb.chord.noteList:
|
||||
ourChord.append(a+o)
|
||||
ln -= 1
|
||||
o += 12
|
||||
|
||||
if ln > 0 and ln < 1: # for fractional lengths
|
||||
ln = int(tb.chord.noteListLen * ln)
|
||||
if ln < 2: # important, min of 2 notes in arp.
|
||||
ln=2
|
||||
for a in tb.chord.noteList[:ln]:
|
||||
ourChord.append(a+o)
|
||||
if ln > 0 and ln < 1: # for fractional lengths
|
||||
ln = int(tb.chord.noteListLen * ln)
|
||||
if ln < 2: # important, min of 2 notes in arp.
|
||||
ln=2
|
||||
for a in tb.chord.noteList[:ln]:
|
||||
ourChord.append(a+o)
|
||||
|
||||
if direct == 'BOTH':
|
||||
if self.arpOffset < 0:
|
||||
self.arpOffset = 1
|
||||
self.arpDirection = 1
|
||||
elif self.arpOffset >= len(ourChord):
|
||||
self.arpOffset = len(ourChord)-2
|
||||
self.arpDirection = -1
|
||||
if direct == 'BOTH':
|
||||
if self.arpOffset < 0:
|
||||
self.arpOffset = 1
|
||||
self.arpDirection = 1
|
||||
elif self.arpOffset >= len(ourChord):
|
||||
self.arpOffset = len(ourChord)-2
|
||||
self.arpDirection = -1
|
||||
|
||||
elif direct == 'UP':
|
||||
if self.arpOffset >= len(ourChord) or self.arpOffset < 0:
|
||||
self.arpOffset = 0
|
||||
self.arpDirection = 1
|
||||
elif direct == 'UP':
|
||||
if self.arpOffset >= len(ourChord) or self.arpOffset < 0:
|
||||
self.arpOffset = 0
|
||||
self.arpDirection = 1
|
||||
|
||||
elif direct == 'DOWN':
|
||||
if self.arpOffset < 0 or self.arpOffset >= len(ourChord):
|
||||
self.arpOffset = len(ourChord)-1
|
||||
self.arpDirection = -1
|
||||
elif direct == 'DOWN':
|
||||
if self.arpOffset < 0 or self.arpOffset >= len(ourChord):
|
||||
self.arpOffset = len(ourChord)-1
|
||||
self.arpDirection = -1
|
||||
|
||||
if direct == 'RANDOM':
|
||||
note = random.choice(ourChord)
|
||||
else:
|
||||
note = ourChord[self.arpOffset]
|
||||
if direct == 'RANDOM':
|
||||
note = random.choice(ourChord)
|
||||
else:
|
||||
note = ourChord[self.arpOffset]
|
||||
|
||||
self.arpOffset += self.arpDirection
|
||||
self.arpOffset += self.arpDirection
|
||||
|
||||
|
||||
if not self.harmonyOnly[sc]:
|
||||
self.sendNote(
|
||||
p.offset,
|
||||
self.getDur(p.duration),
|
||||
self.adjustNote(note),
|
||||
self.adjustVolume(p.vol, p.offset) )
|
||||
if not self.harmonyOnly[sc]:
|
||||
self.sendNote(
|
||||
p.offset,
|
||||
self.getDur(p.duration),
|
||||
self.adjustNote(note),
|
||||
self.adjustVolume(p.vol, p.offset) )
|
||||
|
||||
|
||||
if self.harmony[sc]:
|
||||
h = harmonize(self.harmony[sc], note, ourChord)
|
||||
for n in h:
|
||||
self.sendNote(
|
||||
p.offset,
|
||||
self.getDur(p.duration),
|
||||
self.adjustNote(n),
|
||||
self.adjustVolume(p.vol * self.harmonyVolume[sc], -1) )
|
||||
if self.harmony[sc]:
|
||||
h = harmonize(self.harmony[sc], note, ourChord)
|
||||
for n in h:
|
||||
self.sendNote(
|
||||
p.offset,
|
||||
self.getDur(p.duration),
|
||||
self.adjustNote(n),
|
||||
self.adjustVolume(p.vol * self.harmonyVolume[sc], -1) )
|
||||
|
||||
|
||||
tb.chord.reset() # important, other tracks chord object
|
||||
tb.chord.reset() # important, other tracks chord object
|
||||
|
||||
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
|
||||
# patBass.py
|
||||
# patBass.py
|
||||
|
||||
"""
|
||||
This module is an integeral part of the program
|
||||
This module is an integeral part of the program
|
||||
MMA - Musical Midi Accompaniment.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
|
@ -19,10 +19,10 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bob van der Poel <bvdp@xplornet.com>
|
||||
|
||||
Bob van der Poel <bob@mellowood.ca>
|
||||
|
||||
"""
|
||||
|
||||
|
||||
|
||||
|
||||
import gbl
|
||||
|
@ -33,102 +33,102 @@ from MMA.pat import PC
|
|||
|
||||
|
||||
class Bass(PC):
|
||||
""" Pattern class for a bass track. """
|
||||
""" Pattern class for a bass track. """
|
||||
|
||||
vtype = 'BASS'
|
||||
|
||||
def getPgroup(self, ev):
|
||||
""" Get group for bass pattern.
|
||||
|
||||
Fields - start, length, note, volume
|
||||
|
||||
"""
|
||||
|
||||
if len(ev) != 4:
|
||||
error("There must be n groups of 4 in a pattern definition, "
|
||||
"not <%s>." % ' '.join(ev) )
|
||||
vtype = 'BASS'
|
||||
|
||||
a = struct()
|
||||
def getPgroup(self, ev):
|
||||
""" Get group for bass pattern.
|
||||
|
||||
a.offset = self.setBarOffset(ev[0])
|
||||
a.duration = getNoteLen( ev[1] )
|
||||
Fields - start, length, note, volume
|
||||
|
||||
offset = ev[2]
|
||||
n=offset[0]
|
||||
if n in "1234567":
|
||||
a.noteoffset = int(n)-1
|
||||
else:
|
||||
error("Note offset in Bass must be '1'...'7', not '%s'" % n )
|
||||
|
||||
n = offset[1:2]
|
||||
if n == "#":
|
||||
a.accidental = 1
|
||||
ptr = 2
|
||||
elif n == 'b' or n == 'b' or n == '&':
|
||||
a.accidental = -1
|
||||
ptr = 2
|
||||
else:
|
||||
a.accidental = 0
|
||||
ptr = 1
|
||||
|
||||
a.addoctave = 0
|
||||
"""
|
||||
|
||||
for n in ev[2][ptr:]:
|
||||
if n == '+':
|
||||
a.addoctave += 12
|
||||
elif n == '-':
|
||||
a.addoctave -= 12
|
||||
|
||||
else:
|
||||
error("Only '- + # b &' are permitted after a noteoffset, not '%s'" % n)
|
||||
|
||||
a.vol = stoi(ev[3], "Note volume in Bass definition not int.")
|
||||
|
||||
return a
|
||||
if len(ev) != 4:
|
||||
error("There must be n groups of 4 in a pattern definition, "
|
||||
"not <%s>" % ' '.join(ev) )
|
||||
|
||||
def restart(self):
|
||||
self.ssvoice = -1
|
||||
|
||||
a = struct()
|
||||
|
||||
def trackBar(self, pattern, ctable):
|
||||
""" Do the bass bar.
|
||||
|
||||
Called from self.bar()
|
||||
|
||||
"""
|
||||
|
||||
sc = self.seq
|
||||
unify = self.unify[sc]
|
||||
a.offset = self.setBarOffset(ev[0])
|
||||
a.duration = getNoteLen( ev[1] )
|
||||
|
||||
offset = ev[2]
|
||||
n=offset[0]
|
||||
if n in "1234567":
|
||||
a.noteoffset = int(n)-1
|
||||
else:
|
||||
error("Note offset in Bass must be '1'...'7', not '%s'" % n )
|
||||
|
||||
n = offset[1:2]
|
||||
if n == "#":
|
||||
a.accidental = 1
|
||||
ptr = 2
|
||||
elif n == 'b' or n == 'b' or n == '&':
|
||||
a.accidental = -1
|
||||
ptr = 2
|
||||
else:
|
||||
a.accidental = 0
|
||||
ptr = 1
|
||||
|
||||
a.addoctave = 0
|
||||
|
||||
for n in ev[2][ptr:]:
|
||||
if n == '+':
|
||||
a.addoctave += 12
|
||||
elif n == '-':
|
||||
a.addoctave -= 12
|
||||
|
||||
else:
|
||||
error("Only '- + # b &' are permitted after a noteoffset, not '%s'" % n)
|
||||
|
||||
a.vol = stoi(ev[3], "Note volume in Bass definition not int")
|
||||
|
||||
return a
|
||||
|
||||
def restart(self):
|
||||
self.ssvoice = -1
|
||||
|
||||
|
||||
def trackBar(self, pattern, ctable):
|
||||
""" Do the bass bar.
|
||||
|
||||
Called from self.bar()
|
||||
|
||||
"""
|
||||
|
||||
sc = self.seq
|
||||
unify = self.unify[sc]
|
||||
|
||||
for p in pattern:
|
||||
ct = self.getChordInPos(p.offset, ctable)
|
||||
|
||||
if ct.bassZ:
|
||||
continue
|
||||
|
||||
|
||||
note = ct.chord.scaleList[p.noteoffset] + p.addoctave + p.accidental
|
||||
|
||||
|
||||
if not self.harmonyOnly[sc]:
|
||||
self.sendNote(
|
||||
p.offset,
|
||||
self.getDur(p.duration),
|
||||
self.adjustNote(note),
|
||||
self.adjustVolume(p.vol, p.offset))
|
||||
|
||||
|
||||
if self.harmony[sc]:
|
||||
h = harmonize(self.harmony[sc], note, ct.chord.noteList)
|
||||
for n in h:
|
||||
self.sendNote(
|
||||
p.offset,
|
||||
self.getDur(p.duration),
|
||||
self.adjustNote(n),
|
||||
self.adjustVolume(p.vol * self.harmonyVolume[sc], -1))
|
||||
|
||||
for p in pattern:
|
||||
ct = self.getChordInPos(p.offset, ctable)
|
||||
|
||||
if ct.bassZ:
|
||||
continue
|
||||
|
||||
|
||||
note = ct.chord.scaleList[p.noteoffset] + p.addoctave + p.accidental
|
||||
|
||||
|
||||
if not self.harmonyOnly[sc]:
|
||||
self.sendNote(
|
||||
p.offset,
|
||||
self.getDur(p.duration),
|
||||
self.adjustNote(note),
|
||||
self.adjustVolume(p.vol, p.offset))
|
||||
|
||||
|
||||
if self.harmony[sc]:
|
||||
h = harmonize(self.harmony[sc], note, ct.chord.noteList)
|
||||
for n in h:
|
||||
self.sendNote(
|
||||
p.offset,
|
||||
self.getDur(p.duration),
|
||||
self.adjustNote(n),
|
||||
self.adjustVolume(p.vol * self.harmonyVolume[sc], -1))
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bob van der Poel <bvdp@xplornet.com>
|
||||
Bob van der Poel <bob@mellowood.ca>
|
||||
|
||||
"""
|
||||
|
||||
|
@ -29,240 +29,376 @@ import random
|
|||
import gbl
|
||||
from MMA.notelen import getNoteLen
|
||||
from MMA.common import *
|
||||
from MMA.pat import PC
|
||||
from MMA.pat import PC, seqBump
|
||||
|
||||
|
||||
|
||||
class Chord(PC):
|
||||
""" Pattern class for a chord track. """
|
||||
""" Pattern class for a chord track. """
|
||||
|
||||
vtype = 'CHORD'
|
||||
vtype = 'CHORD'
|
||||
|
||||
|
||||
def getPgroup(self, ev):
|
||||
""" Get group for chord pattern.
|
||||
def setVoicing(self, ln):
|
||||
""" set the Voicing Mode options. Only valid for CHORDS. """
|
||||
|
||||
Tuples: [start, length, volume (,volume ...) ]
|
||||
"""
|
||||
for l in ln:
|
||||
try:
|
||||
mode, val = l.upper().split('=')
|
||||
except:
|
||||
error("Each Voicing option must contain a '=', not '%s'" % l)
|
||||
|
||||
if len(ev) < 3:
|
||||
error("There must be at least 3 items in each group "
|
||||
"of a chord pattern definition, not <%s>." % ' '.join(ev))
|
||||
|
||||
a = struct()
|
||||
if mode == 'MODE':
|
||||
valid= ("-", "OPTIMAL", "NONE", "ROOT", "COMPRESSED", "INVERT")
|
||||
|
||||
a.offset = self.setBarOffset(ev[0])
|
||||
a.duration = getNoteLen(ev[1])
|
||||
if not val in valid:
|
||||
error("Valid Voicing Modes are: %s" % " ".join(valid))
|
||||
|
||||
vv = ev[2:]
|
||||
if len(vv)>8:
|
||||
error("Only 8 volumes are permitted in Chord definition, not %s." % len(vv))
|
||||
if val in ('-', 'NONE',"ROOT"):
|
||||
val = None
|
||||
|
||||
a.vol = [0] * 8
|
||||
for i,v in enumerate(vv):
|
||||
v=stoi(v, "Expecting integer in volume list for Chord definition.")
|
||||
a.vol[i]=v
|
||||
|
||||
for i in range(i+1,8): # force remaining volumes
|
||||
a.vol[i]=v
|
||||
if val and (max(self.invert) + max(self.compress)):
|
||||
warning("Setting both VoicingMode and Invert/Compress is not a good idea")
|
||||
|
||||
return a
|
||||
""" When we set voicing mode we always reset this. This forces
|
||||
the voicingmode code to restart its rotations.
|
||||
"""
|
||||
|
||||
def restart(self):
|
||||
self.ssvoice = -1
|
||||
self.lastChord = None
|
||||
self.lastChord = []
|
||||
|
||||
self.voicing.mode = val
|
||||
|
||||
def chordVoicing(self, chord, vMove):
|
||||
""" Voicing algorithm by Alain Brenzikofer. """
|
||||
|
||||
elif mode == 'RANGE':
|
||||
val = stoi(val, "Argument for %s Voicing Range "
|
||||
"must be a value" % self.name)
|
||||
|
||||
sc = self.seq
|
||||
vmode=self.voicing.mode
|
||||
if val < 1 or val > 30:
|
||||
error("Voicing Range '%s' out-of-range; "
|
||||
"must be 1 to 30" % val)
|
||||
|
||||
if vmode == "OPTIMAL":
|
||||
self.voicing.range = val
|
||||
|
||||
# Initialize with a voicing around centerNote
|
||||
|
||||
chord.center1(self.lastChord)
|
||||
elif mode == 'CENTER':
|
||||
val = stoi(val, "Argument for %s Voicing Center "
|
||||
"must be a value" % self.name)
|
||||
|
||||
# Adjust range and center
|
||||
if val < 1 or val > 12:
|
||||
error("Voicing Center %s out-of-range; "
|
||||
"must be 1 to 12" % val)
|
||||
|
||||
if not (self.voicing.bcount or self.voicing.random):
|
||||
chord.center2(self.voicing.center, self.voicing.range/2)
|
||||
self.voicing.center = val
|
||||
|
||||
elif mode == 'RMOVE':
|
||||
val = stoi(val, "Argument for %s Voicing Random "
|
||||
"must be a value" % self.name)
|
||||
|
||||
# Move voicing
|
||||
if val < 0 or val > 100:
|
||||
error("Voicing Random value must be 0 to 100 "
|
||||
"not %s" % val)
|
||||
|
||||
elif self.lastChord:
|
||||
if (self.lastChord != chord.noteList ) and vMove:
|
||||
chord.center2(self.voicing.center,self.voicing.range/2)
|
||||
vMove = 0
|
||||
self.voicing.random = val
|
||||
self.voicing.bcount = 0
|
||||
|
||||
# Update voicingCenter
|
||||
elif mode == 'MOVE':
|
||||
val = stoi(val, "Argument for %s Voicing Move "
|
||||
"must be a value" % self.name)
|
||||
|
||||
sum=0
|
||||
for n in chord.noteList:
|
||||
sum += n
|
||||
c=sum/chord.noteListLen
|
||||
if val < 0 :
|
||||
error("Voicing Move (bar count) must >= 0, not %s" % val)
|
||||
if val > 20:
|
||||
warning("Voicing Move (bar count) %s is quite large" % val)
|
||||
|
||||
""" If using random voicing move it it's possible to
|
||||
get way off the selected octave. This check ensures
|
||||
that the centerpoint stays in a tight range.
|
||||
Note that if using voicingMove manually (not random)
|
||||
it is quite possible to move the chord centers to very
|
||||
low or high keyboard positions!
|
||||
"""
|
||||
self.voicing.bcount = val
|
||||
self.voicing.random = 0
|
||||
|
||||
if self.voicing.random:
|
||||
if c < -4: c=0
|
||||
elif c >4: c=4
|
||||
self.voicing.center=c
|
||||
elif mode == 'DIR':
|
||||
val = stoi(val, "Argument for %s Voicing Dir (move direction) "
|
||||
"must be a value" % self.name)
|
||||
|
||||
if not val in (1,0,-1):
|
||||
error("Voicing Move Dir -1, 0 or 1, not %s" % val)
|
||||
|
||||
elif vmode == "COMPRESSED":
|
||||
chord.compress()
|
||||
self.voicing.dir = val
|
||||
|
||||
elif vmode == "INVERT":
|
||||
if chord.rootNote < -2:
|
||||
chord.invert(1)
|
||||
|
||||
elif chord.rootNote > 2:
|
||||
chord.invert(-1)
|
||||
chord.compress()
|
||||
if gbl.debug:
|
||||
v=self.voicing
|
||||
print "Set %s Voicing MODE=%s" % (self.name, v.mode),
|
||||
print "RANGE=%s CENTER=%s" % (v.range, v.center),
|
||||
print "RMOVE=%s MOVE=%s DIR=%s" % (v.random, v.bcount, v.dir)
|
||||
|
||||
self.lastChord = chord.noteList[:]
|
||||
|
||||
return vMove
|
||||
def setDupRoot(self, ln):
|
||||
""" set/unset root duplication. Only for CHORDs """
|
||||
|
||||
|
||||
def trackBar(self, pattern, ctable):
|
||||
""" Do a chord bar. Called from self.bar() """
|
||||
ln=self.lnExpand(ln, 'DupRoot')
|
||||
tmp = []
|
||||
|
||||
sc = self.seq
|
||||
unify = self.unify[sc]
|
||||
for n in ln:
|
||||
n = stoi(n, "Argument for %s DupRoot must be a value" % self.name)
|
||||
|
||||
""" Set voicing move ONCE at the top of each bar.
|
||||
The voicing code resets vmove to 0 the first
|
||||
time it's used. That way only one movement is
|
||||
done in a bar.
|
||||
"""
|
||||
if n < -9 or n > 9:
|
||||
error("DupRoot %s out-of-range; must be -9 to 9" % n)
|
||||
|
||||
vmove = 0
|
||||
tmp.append( n * 12 )
|
||||
|
||||
if self.voicing.random:
|
||||
if random.randrange(100) <= self.voicing.random:
|
||||
vmove = random.choice((-1,1))
|
||||
elif self.voicing.bcount and self.voicing.dir:
|
||||
vmove = self.voicing.dir
|
||||
self.dupRoot = seqBump(tmp)
|
||||
|
||||
if gbl.debug:
|
||||
print "Set %s DupRoot to " % self.name,
|
||||
printList(ln)
|
||||
|
||||
for p in pattern:
|
||||
tb = self.getChordInPos(p.offset, ctable)
|
||||
|
||||
if tb.chordZ:
|
||||
continue
|
||||
def setStrum(self, ln):
|
||||
""" Set Strum time. """
|
||||
|
||||
self.crDupRoot = self.dupRoot[sc]
|
||||
ln=self.lnExpand(ln, 'Strum')
|
||||
tmp = []
|
||||
|
||||
vmode = self.voicing.mode
|
||||
vols = p.vol[0:tb.chord.noteListLen]
|
||||
for n in ln:
|
||||
n = stoi(n, "Argument for %s Strum must be an integer" % self.name)
|
||||
|
||||
# Limit the chord notes. This works even if THERE IS A VOICINGMODE!
|
||||
if n < 0 or n > 100:
|
||||
error("Strum %s out-of-range; must be 0..100" % n)
|
||||
|
||||
if self.chordLimit:
|
||||
tb.chord.limit(self.chordLimit)
|
||||
tmp.append(n)
|
||||
|
||||
""" Compress chord into single octave if 'compress' is set
|
||||
We do it here, before octave, transpose and invert!
|
||||
Ignored if we have a VOICINGMODE.
|
||||
"""
|
||||
self.strum = seqBump(tmp)
|
||||
|
||||
if self.compress[sc] and not vmode:
|
||||
tb.chord.compress()
|
||||
if gbl.debug:
|
||||
print "Set %s Strum to %s" % (self.name, self.strum)
|
||||
|
||||
# Do the voicing stuff.
|
||||
|
||||
if vmode:
|
||||
vmove=self.chordVoicing(tb.chord, vmove)
|
||||
def getPgroup(self, ev):
|
||||
""" Get group for chord pattern.
|
||||
|
||||
# Invert.
|
||||
Tuples: [start, length, volume (,volume ...) ]
|
||||
"""
|
||||
|
||||
if self.invert[sc]:
|
||||
tb.chord.invert(self.invert[sc])
|
||||
if len(ev) < 3:
|
||||
error("There must be at least 3 items in each group "
|
||||
"of a chord pattern definition, not <%s>" % ' '.join(ev))
|
||||
|
||||
# Set STRUM flags
|
||||
a = struct()
|
||||
|
||||
strumAdjust = self.strum[sc]
|
||||
strumOffset = 0
|
||||
sd = self.direction[sc]
|
||||
if sd=='BOTH':
|
||||
sd = 'BOTHDOWN'
|
||||
if sd == 'BOTHDOWN':
|
||||
sd = 'BOTHUP'
|
||||
elif sd == 'BOTHUP':
|
||||
sd = 'BOTHDOWN'
|
||||
a.offset = self.setBarOffset(ev[0])
|
||||
a.duration = getNoteLen(ev[1])
|
||||
|
||||
if strumAdjust and sd in ('DOWN', 'BOTHDOWN'):
|
||||
strumOffset += strumAdjust * tb.chord.noteListLen
|
||||
strumAdjust = -strumAdjust
|
||||
vv = ev[2:]
|
||||
if len(vv)>8:
|
||||
error("Only 8 volumes are permitted in Chord definition, not %s" % len(vv))
|
||||
|
||||
a.vol = [0] * 8
|
||||
for i,v in enumerate(vv):
|
||||
v=stoi(v, "Expecting integer in volume list for Chord definition")
|
||||
a.vol[i]=v
|
||||
|
||||
""" Voicing adjustment for 'jazz' or altered chords. If a chord (most
|
||||
likely something like a M7 or flat-9 ends up with any 2 adjacent
|
||||
notes separated by a single tone an unconfortable dissonance results.
|
||||
This little check compares all notes in the chord and will cut the
|
||||
volume of one note to reduce the disonance. Usually this will be
|
||||
the root note volume being decreased.
|
||||
"""
|
||||
for i in range(i+1,8): # force remaining volumes
|
||||
a.vol[i]=v
|
||||
|
||||
nl=tb.chord.noteList
|
||||
l=len(nl)
|
||||
for j in range(l-1):
|
||||
r = nl[j]
|
||||
for i in range(j+1, l):
|
||||
if nl[i] in (r-1, r+1, r-13, r+13) and vols[i] >= vols[0]:
|
||||
vols[j] = vols[i]/2
|
||||
break
|
||||
return a
|
||||
|
||||
loo = zip(nl, vols) # this is a note/volume array of tuples
|
||||
def restart(self):
|
||||
self.ssvoice = -1
|
||||
self.lastChord = None
|
||||
|
||||
|
||||
""" Duplicate the root. This can be set from a DupRoot command
|
||||
or by chordVoicing(). Notes:
|
||||
- The volume for the added root will be the average of the chord
|
||||
notes (ignoring OFF notes) divided by 2.
|
||||
- If the new note (after transpose and octave adjustments
|
||||
is out of MIDI range it will be ignored.
|
||||
"""
|
||||
def chordVoicing(self, chord, vMove):
|
||||
""" Voicing algorithm by Alain Brenzikofer. """
|
||||
|
||||
if self.crDupRoot:
|
||||
root = tb.chord.rootNote + self.crDupRoot
|
||||
t = root + self.octave[sc] + gbl.transpose
|
||||
if t >=0 and t < 128:
|
||||
v=0
|
||||
c=0
|
||||
for vv in vols:
|
||||
if vv:
|
||||
v += vv
|
||||
c += 2
|
||||
v /= c
|
||||
loo.append( (tb.chord.rootNote + self.crDupRoot, v))
|
||||
|
||||
for note, v in sorted(loo): # sorting low-to-high notes. Mainly for STRUM.
|
||||
self.sendNote(
|
||||
p.offset+strumOffset,
|
||||
self.getDur(p.duration),
|
||||
self.adjustNote(note),
|
||||
self.adjustVolume( v, p.offset) )
|
||||
sc = self.seq
|
||||
vmode=self.voicing.mode
|
||||
|
||||
strumOffset += strumAdjust
|
||||
if vmode == "OPTIMAL":
|
||||
|
||||
tb.chord.reset() # important, other tracks chord object
|
||||
# Initialize with a voicing around centerNote
|
||||
|
||||
# Adjust the voicingMove counter at the end of the bar
|
||||
chord.center1(self.lastChord)
|
||||
|
||||
if self.voicing.bcount:
|
||||
self.voicing.bcount -= 1
|
||||
# Adjust range and center
|
||||
|
||||
if not (self.voicing.bcount or self.voicing.random):
|
||||
chord.center2(self.voicing.center, self.voicing.range/2)
|
||||
|
||||
|
||||
# Move voicing
|
||||
|
||||
elif self.lastChord:
|
||||
if (self.lastChord != chord.noteList ) and vMove:
|
||||
chord.center2(self.voicing.center,self.voicing.range/2)
|
||||
vMove = 0
|
||||
|
||||
# Update voicingCenter
|
||||
|
||||
sum=0
|
||||
for n in chord.noteList:
|
||||
sum += n
|
||||
c=sum/chord.noteListLen
|
||||
|
||||
""" If using random voicing move it it's possible to
|
||||
get way off the selected octave. This check ensures
|
||||
that the centerpoint stays in a tight range.
|
||||
Note that if using voicingMove manually (not random)
|
||||
it is quite possible to move the chord centers to very
|
||||
low or high keyboard positions!
|
||||
"""
|
||||
|
||||
if self.voicing.random:
|
||||
if c < -4: c=0
|
||||
elif c >4: c=4
|
||||
self.voicing.center=c
|
||||
|
||||
|
||||
elif vmode == "COMPRESSED":
|
||||
chord.compress()
|
||||
|
||||
elif vmode == "INVERT":
|
||||
if chord.rootNote < -2:
|
||||
chord.invert(1)
|
||||
|
||||
elif chord.rootNote > 2:
|
||||
chord.invert(-1)
|
||||
chord.compress()
|
||||
|
||||
self.lastChord = chord.noteList[:]
|
||||
|
||||
return vMove
|
||||
|
||||
|
||||
def trackBar(self, pattern, ctable):
|
||||
""" Do a chord bar. Called from self.bar() """
|
||||
|
||||
sc = self.seq
|
||||
unify = self.unify[sc]
|
||||
|
||||
""" Set voicing move ONCE at the top of each bar.
|
||||
The voicing code resets vmove to 0 the first
|
||||
time it's used. That way only one movement is
|
||||
done in a bar.
|
||||
"""
|
||||
|
||||
vmove = 0
|
||||
|
||||
if self.voicing.random:
|
||||
if random.randrange(100) <= self.voicing.random:
|
||||
vmove = random.choice((-1,1))
|
||||
elif self.voicing.bcount and self.voicing.dir:
|
||||
vmove = self.voicing.dir
|
||||
|
||||
|
||||
for p in pattern:
|
||||
tb = self.getChordInPos(p.offset, ctable)
|
||||
|
||||
if tb.chordZ:
|
||||
continue
|
||||
|
||||
self.crDupRoot = self.dupRoot[sc]
|
||||
|
||||
vmode = self.voicing.mode
|
||||
vols = p.vol[0:tb.chord.noteListLen]
|
||||
|
||||
# Limit the chord notes. This works even if THERE IS A VOICINGMODE!
|
||||
|
||||
if self.chordLimit:
|
||||
tb.chord.limit(self.chordLimit)
|
||||
|
||||
""" Compress chord into single octave if 'compress' is set
|
||||
We do it here, before octave, transpose and invert!
|
||||
Ignored if we have a VOICINGMODE.
|
||||
"""
|
||||
|
||||
if self.compress[sc] and not vmode:
|
||||
tb.chord.compress()
|
||||
|
||||
# Do the voicing stuff.
|
||||
|
||||
if vmode:
|
||||
vmove=self.chordVoicing(tb.chord, vmove)
|
||||
|
||||
# Invert.
|
||||
|
||||
if self.invert[sc]:
|
||||
tb.chord.invert(self.invert[sc])
|
||||
|
||||
# Set STRUM flags
|
||||
|
||||
strumAdjust = self.strum[sc]
|
||||
strumOffset = 0
|
||||
sd = self.direction[sc]
|
||||
if sd=='BOTH':
|
||||
sd = 'BOTHDOWN'
|
||||
if sd == 'BOTHDOWN':
|
||||
sd = 'BOTHUP'
|
||||
elif sd == 'BOTHUP':
|
||||
sd = 'BOTHDOWN'
|
||||
|
||||
if strumAdjust and sd in ('DOWN', 'BOTHDOWN'):
|
||||
strumOffset += strumAdjust * tb.chord.noteListLen
|
||||
strumAdjust = -strumAdjust
|
||||
|
||||
|
||||
""" Voicing adjustment for 'jazz' or altered chords. If a chord (most
|
||||
likely something like a M7 or flat-9 ends up with any 2 adjacent
|
||||
notes separated by a single tone an unconfortable dissonance results.
|
||||
This little check compares all notes in the chord and will cut the
|
||||
volume of one note to reduce the disonance. Usually this will be
|
||||
the root note volume being decreased.
|
||||
"""
|
||||
|
||||
nl=tb.chord.noteList
|
||||
l=len(nl)
|
||||
for j in range(l-1):
|
||||
r = nl[j]
|
||||
for i in range(j+1, l):
|
||||
if nl[i] in (r-1, r+1, r-13, r+13) and vols[i] >= vols[0]:
|
||||
vols[j] = vols[i]/2
|
||||
break
|
||||
|
||||
loo = zip(nl, vols) # this is a note/volume array of tuples
|
||||
|
||||
|
||||
""" Duplicate the root. This can be set from a DupRoot command
|
||||
or by chordVoicing(). Notes:
|
||||
- The volume for the added root will be the average of the chord
|
||||
notes (ignoring OFF notes) divided by 2.
|
||||
- If the new note (after transpose and octave adjustments
|
||||
is out of MIDI range it will be ignored.
|
||||
"""
|
||||
|
||||
if self.crDupRoot:
|
||||
root = tb.chord.rootNote + self.crDupRoot
|
||||
t = root + self.octave[sc] + gbl.transpose
|
||||
if t >=0 and t < 128:
|
||||
v=0
|
||||
c=0
|
||||
for vv in vols:
|
||||
if vv:
|
||||
v += vv
|
||||
c += 2
|
||||
v /= c
|
||||
loo.append( (tb.chord.rootNote + self.crDupRoot, v))
|
||||
|
||||
for note, v in sorted(loo): # sorting low-to-high notes. Mainly for STRUM.
|
||||
self.sendNote(
|
||||
p.offset+strumOffset,
|
||||
self.getDur(p.duration),
|
||||
self.adjustNote(note),
|
||||
self.adjustVolume( v, p.offset) )
|
||||
|
||||
strumOffset += strumAdjust
|
||||
|
||||
tb.chord.reset() # important, other tracks chord object
|
||||
|
||||
# Adjust the voicingMove counter at the end of the bar
|
||||
|
||||
if self.voicing.bcount:
|
||||
self.voicing.bcount -= 1
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
# patDrum.py
|
||||
|
||||
"""
|
||||
This module is an integeral part of the program
|
||||
This module is an integeral part of the program
|
||||
MMA - Musical Midi Accompaniment.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
|
@ -19,8 +19,8 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bob van der Poel <bvdp@xplornet.com>
|
||||
|
||||
Bob van der Poel <bob@mellowood.ca>
|
||||
|
||||
"""
|
||||
|
||||
import gbl
|
||||
|
@ -31,73 +31,84 @@ from MMA.pat import PC, seqBump
|
|||
|
||||
|
||||
class Drum(PC):
|
||||
""" Pattern class for a drum track. """
|
||||
""" Pattern class for a drum track. """
|
||||
|
||||
vtype = 'DRUM'
|
||||
toneList = [38]
|
||||
vtype = 'DRUM'
|
||||
toneList = [38]
|
||||
|
||||
def setTone(self, ln):
|
||||
""" Set a tone list. Only valid for DRUMs.
|
||||
ln[] is not nesc. the right length.
|
||||
"""
|
||||
|
||||
ln=self.lnExpand(ln, 'Tone')
|
||||
tmp = []
|
||||
|
||||
for n in ln:
|
||||
tmp.append(MMA.translate.dtable.get(n))
|
||||
def __init__(self, ln):
|
||||
""" init for drum track. """
|
||||
|
||||
self.toneList = seqBump( tmp )
|
||||
PC.__init__(self, ln)
|
||||
|
||||
self.setChannel('10')
|
||||
if not gbl.mtrks[self.channel].trackname:
|
||||
gbl.mtrks[self.channel].addTrkName(0, 'Drum')
|
||||
|
||||
def restart(self):
|
||||
self.ssvoice = -1
|
||||
|
||||
|
||||
def getPgroup(self, ev):
|
||||
""" Get group for a drum pattern.
|
||||
|
||||
Fields - start, length, volume
|
||||
"""
|
||||
|
||||
def setTone(self, ln):
|
||||
""" Set a tone list. Only valid for DRUMs.
|
||||
ln[] is not nesc. the right length.
|
||||
"""
|
||||
|
||||
if len(ev) != 3:
|
||||
error("There must be at exactly 3 items in each "
|
||||
"group of a drum define, not <%s>." % ' '.join(ev) )
|
||||
ln=self.lnExpand(ln, 'Tone')
|
||||
tmp = []
|
||||
|
||||
for n in ln:
|
||||
tmp.append(MMA.translate.dtable.get(n))
|
||||
|
||||
self.toneList = seqBump( tmp )
|
||||
|
||||
|
||||
def restart(self):
|
||||
self.ssvoice = -1
|
||||
|
||||
|
||||
def getPgroup(self, ev):
|
||||
""" Get group for a drum pattern.
|
||||
|
||||
Fields - start, length, volume
|
||||
"""
|
||||
|
||||
if len(ev) != 3:
|
||||
error("There must be at exactly 3 items in each "
|
||||
"group of a drum define, not <%s>" % ' '.join(ev) )
|
||||
|
||||
a = struct()
|
||||
|
||||
a.offset = self.setBarOffset(ev[0])
|
||||
a.duration = getNoteLen(ev[1])
|
||||
a.vol = stoi(ev[2], "Type error in Drum volume")
|
||||
|
||||
return a
|
||||
|
||||
|
||||
|
||||
def trackBar(self, pattern, ctable):
|
||||
""" Do a drum bar.
|
||||
|
||||
Called from self.bar()
|
||||
|
||||
"""
|
||||
|
||||
sc = self.seq
|
||||
|
||||
for p in pattern:
|
||||
tb = self.getChordInPos(p.offset, ctable)
|
||||
|
||||
if tb.drumZ:
|
||||
continue
|
||||
|
||||
self.sendNote(
|
||||
p.offset,
|
||||
self.getDur(p.duration),
|
||||
self.toneList[sc],
|
||||
self.adjustVolume(p.vol, p.offset) )
|
||||
|
||||
a = struct()
|
||||
|
||||
a.offset = self.setBarOffset(ev[0])
|
||||
a.duration = getNoteLen(ev[1])
|
||||
a.vol = stoi(ev[2], "Type error in Drum volume.")
|
||||
|
||||
return a
|
||||
|
||||
|
||||
|
||||
def trackBar(self, pattern, ctable):
|
||||
""" Do a drum bar.
|
||||
|
||||
Called from self.bar()
|
||||
|
||||
"""
|
||||
|
||||
sc = self.seq
|
||||
|
||||
for p in pattern:
|
||||
tb = self.getChordInPos(p.offset, ctable)
|
||||
|
||||
if tb.drumZ:
|
||||
continue
|
||||
|
||||
self.sendNote(
|
||||
p.offset,
|
||||
self.getDur(p.duration),
|
||||
self.toneList[sc],
|
||||
self.adjustVolume(p.vol, p.offset) )
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -19,197 +19,213 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bob van der Poel <bvdp@xplornet.com>
|
||||
Bob van der Poel <bob@mellowood.ca>
|
||||
|
||||
"""
|
||||
|
||||
|
||||
|
||||
|
||||
import random
|
||||
|
||||
from MMA.harmony import harmonize
|
||||
from MMA.notelen import getNoteLen
|
||||
import gbl
|
||||
from MMA.common import *
|
||||
from MMA.pat import PC
|
||||
from MMA.pat import PC, seqBump
|
||||
|
||||
|
||||
class Scale(PC):
|
||||
""" Pattern class for a Scale track. """
|
||||
""" Pattern class for a Scale track. """
|
||||
|
||||
vtype = 'SCALE'
|
||||
vtype = 'SCALE'
|
||||
|
||||
lastNote = -1
|
||||
lastChord = None
|
||||
lastStype = None
|
||||
lastDirect = 1
|
||||
lastRange = 0
|
||||
sOffset = 0
|
||||
notes = None
|
||||
dirfact = 1
|
||||
lastNote = -1
|
||||
lastChord = None
|
||||
lastStype = None
|
||||
lastDirect = 1
|
||||
lastRange = 0
|
||||
sOffset = 0
|
||||
notes = None
|
||||
dirfact = 1
|
||||
|
||||
def getPgroup(self, ev):
|
||||
""" Get group for scale patterns.
|
||||
def getPgroup(self, ev):
|
||||
""" Get group for scale patterns.
|
||||
|
||||
Fields - start, length, volume
|
||||
"""
|
||||
Fields - start, length, volume
|
||||
"""
|
||||
|
||||
|
||||
if len(ev) != 3:
|
||||
error("There must be at exactly 3 items in each group "
|
||||
"in a Scale definition, not <%s>." % ' '.join(ev))
|
||||
if len(ev) != 3:
|
||||
error("There must be at exactly 3 items in each group "
|
||||
"in a Scale definition, not <%s>." % ' '.join(ev))
|
||||
|
||||
a = struct()
|
||||
a = struct()
|
||||
|
||||
a.offset = self.setBarOffset(ev[0])
|
||||
a.duration = getNoteLen(ev[1])
|
||||
a.vol = stoi(ev[2], "Type error in Scale definition")
|
||||
a.offset = self.setBarOffset(ev[0])
|
||||
a.duration = getNoteLen(ev[1])
|
||||
a.vol = stoi(ev[2], "Type error in Scale definition")
|
||||
|
||||
|
||||
return a
|
||||
return a
|
||||
|
||||
def restart(self):
|
||||
self.ssvoice = -1
|
||||
self.lastNote = -1
|
||||
self.lastChord = None
|
||||
self.lastStype = None
|
||||
self.lastDirect = 1
|
||||
self.lastRange = 0
|
||||
self.sOffset = 0
|
||||
self.notes = None
|
||||
self.dirfact = 1
|
||||
def setScaletype(self, ln):
|
||||
""" Set scale type. """
|
||||
|
||||
def trackBar(self, pattern, ctable):
|
||||
""" Do a scale bar.
|
||||
ln = self.lnExpand(ln, "ScaleType")
|
||||
tmp = []
|
||||
|
||||
Called from self.bar()
|
||||
"""
|
||||
for n in ln:
|
||||
n = n.upper()
|
||||
if not n in ( 'CHROMATIC', 'AUTO'):
|
||||
error("Unknown %s ScaleType. Only Chromatic and Auto are valid" % self.name)
|
||||
tmp.append(n)
|
||||
|
||||
sc = self.seq
|
||||
direct = self.direction[sc]
|
||||
unify = self.unify[sc]
|
||||
self.scaleType = seqBump(tmp)
|
||||
|
||||
# If the range or direction has changed, we just start
|
||||
# with a new scale.
|
||||
if gbl.debug:
|
||||
print "Set %s ScaleType to " % self.name,
|
||||
printList(ln)
|
||||
|
||||
|
||||
t = self.chordRange[sc]
|
||||
if t != self.lastRange:
|
||||
self.lastRange = t
|
||||
self.lastChord = None
|
||||
def restart(self):
|
||||
self.ssvoice = -1
|
||||
self.lastNote = -1
|
||||
self.lastChord = None
|
||||
self.lastStype = None
|
||||
self.lastDirect = 1
|
||||
self.lastRange = 0
|
||||
self.sOffset = 0
|
||||
self.notes = None
|
||||
self.dirfact = 1
|
||||
|
||||
if self.lastDirect != direct:
|
||||
self.lastDirect = direct
|
||||
self.lastChord = None
|
||||
def trackBar(self, pattern, ctable):
|
||||
""" Do a scale bar.
|
||||
|
||||
for p in pattern:
|
||||
Called from self.bar()
|
||||
"""
|
||||
|
||||
tb = self.getChordInPos(p.offset, ctable)
|
||||
sc = self.seq
|
||||
direct = self.direction[sc]
|
||||
unify = self.unify[sc]
|
||||
|
||||
if tb.scaleZ:
|
||||
continue
|
||||
# If the range or direction has changed, we just start
|
||||
# with a new scale.
|
||||
|
||||
|
||||
thisChord = tb.chord.tonic + tb.chord.chordType
|
||||
stype = self.scaleType[sc]
|
||||
t = self.chordRange[sc]
|
||||
if t != self.lastRange:
|
||||
self.lastRange = t
|
||||
self.lastChord = None
|
||||
|
||||
if thisChord != self.lastChord or stype != self.lastStype:
|
||||
self.lastChord = thisChord
|
||||
self.lastStype = stype
|
||||
if self.lastDirect != direct:
|
||||
self.lastDirect = direct
|
||||
self.lastChord = None
|
||||
|
||||
if stype == 'CHROMATIC':
|
||||
notelist = [ tb.chord.rootNote + x for x in range(0,12)]
|
||||
for p in pattern:
|
||||
|
||||
else:
|
||||
notelist = list(tb.chord.scaleList)
|
||||
tb = self.getChordInPos(p.offset, ctable)
|
||||
|
||||
""" Get the current scale and append enuf copies
|
||||
together for RANGE setting. If Range happens
|
||||
to be 0 or 1 we end up with a single copy.
|
||||
"""
|
||||
|
||||
ln=self.chordRange[sc] # RANGE 1...x (def. == 1)
|
||||
|
||||
o=0
|
||||
self.notes = []
|
||||
|
||||
while ln >= 1:
|
||||
for a in notelist:
|
||||
self.notes.append(a+o)
|
||||
o+=12
|
||||
ln-=1
|
||||
|
||||
if ln>0 and ln<1: # for fractional scale lengths
|
||||
ln = int(len(notelist) * ln)
|
||||
if ln < 2: # important, must be at least 2 notes in a scale
|
||||
ln=2
|
||||
for a in notelist[:ln]:
|
||||
self.notes.append(a+o)
|
||||
|
||||
if direct == 'DOWN':
|
||||
self.dirfact = -1
|
||||
if self.lastNote == -1:
|
||||
self.sOffset = len(self.notes)-1
|
||||
else:
|
||||
self.sOffset = 0
|
||||
|
||||
if self.lastNote > -1:
|
||||
if self.lastNote in self.notes:
|
||||
self.sOffset = self.notes.index(self.lastNote)
|
||||
|
||||
else:
|
||||
self.sOffset=len(self.notes)-1
|
||||
for i, a in enumerate(self.notes):
|
||||
if a>self.lastNote:
|
||||
self.sOffset = i
|
||||
break
|
||||
if tb.scaleZ:
|
||||
continue
|
||||
|
||||
|
||||
# Keep offset into note list in range
|
||||
thisChord = tb.chord.tonic + tb.chord.chordType
|
||||
stype = self.scaleType[sc]
|
||||
|
||||
# only > end of list if BOTH or UP
|
||||
if thisChord != self.lastChord or stype != self.lastStype:
|
||||
self.lastChord = thisChord
|
||||
self.lastStype = stype
|
||||
|
||||
if self.sOffset >= len(self.notes):
|
||||
if direct == 'BOTH':
|
||||
self.dirfact = -1
|
||||
self.sOffset = len(self.notes)-2
|
||||
else: ## UP
|
||||
self.sOffset = 0
|
||||
if stype == 'CHROMATIC':
|
||||
notelist = [ tb.chord.rootNote + x for x in range(0,12)]
|
||||
|
||||
else:
|
||||
notelist = list(tb.chord.scaleList)
|
||||
|
||||
# only < start of list if DOWN or BOTH
|
||||
""" Get the current scale and append enuf copies
|
||||
together for RANGE setting. If Range happens
|
||||
to be 0 or 1 we end up with a single copy.
|
||||
"""
|
||||
|
||||
elif self.sOffset < 0:
|
||||
if direct == 'BOTH':
|
||||
self.dirfact = 1
|
||||
self.sOffset = 1
|
||||
else: ## DOWN
|
||||
self.sOffset = len(self.notes)-1
|
||||
ln=self.chordRange[sc] # RANGE 1...x (def. == 1)
|
||||
|
||||
if direct == 'RANDOM':
|
||||
note = random.choice(self.notes)
|
||||
else:
|
||||
note = self.notes[self.sOffset]
|
||||
self.sOffset += self.dirfact
|
||||
o=0
|
||||
self.notes = []
|
||||
|
||||
self.lastNote = note
|
||||
while ln >= 1:
|
||||
for a in notelist:
|
||||
self.notes.append(a+o)
|
||||
o+=12
|
||||
ln-=1
|
||||
|
||||
if not self.harmonyOnly[sc]:
|
||||
self.sendNote(
|
||||
p.offset,
|
||||
self.getDur(p.duration),
|
||||
self.adjustNote(note),
|
||||
self.adjustVolume(p.vol, p.offset))
|
||||
if ln>0 and ln<1: # for fractional scale lengths
|
||||
ln = int(len(notelist) * ln)
|
||||
if ln < 2: # important, must be at least 2 notes in a scale
|
||||
ln=2
|
||||
for a in notelist[:ln]:
|
||||
self.notes.append(a+o)
|
||||
|
||||
if direct == 'DOWN':
|
||||
self.dirfact = -1
|
||||
if self.lastNote == -1:
|
||||
self.sOffset = len(self.notes)-1
|
||||
else:
|
||||
self.sOffset = 0
|
||||
|
||||
if self.lastNote > -1:
|
||||
if self.lastNote in self.notes:
|
||||
self.sOffset = self.notes.index(self.lastNote)
|
||||
|
||||
else:
|
||||
self.sOffset=len(self.notes)-1
|
||||
for i, a in enumerate(self.notes):
|
||||
if a>self.lastNote:
|
||||
self.sOffset = i
|
||||
break
|
||||
|
||||
|
||||
if self.harmony[sc]:
|
||||
ch = self.getChordInPos(p.offset, ctable).chord.noteList
|
||||
h = harmonize(self.harmony[sc], note, ch)
|
||||
for n in h:
|
||||
self.sendNote(
|
||||
p.offset,
|
||||
self.getDur(p.duration),
|
||||
self.adjustNote(n),
|
||||
self.adjustVolume(self.harmonyVolume[sc] * p.vol, -1) )
|
||||
# Keep offset into note list in range
|
||||
|
||||
# only > end of list if BOTH or UP
|
||||
|
||||
if self.sOffset >= len(self.notes):
|
||||
if direct == 'BOTH':
|
||||
self.dirfact = -1
|
||||
self.sOffset = len(self.notes)-2
|
||||
else: ## UP
|
||||
self.sOffset = 0
|
||||
|
||||
# only < start of list if DOWN or BOTH
|
||||
|
||||
elif self.sOffset < 0:
|
||||
if direct == 'BOTH':
|
||||
self.dirfact = 1
|
||||
self.sOffset = 1
|
||||
else: ## DOWN
|
||||
self.sOffset = len(self.notes)-1
|
||||
|
||||
if direct == 'RANDOM':
|
||||
note = random.choice(self.notes)
|
||||
else:
|
||||
note = self.notes[self.sOffset]
|
||||
self.sOffset += self.dirfact
|
||||
|
||||
self.lastNote = note
|
||||
|
||||
if not self.harmonyOnly[sc]:
|
||||
self.sendNote(
|
||||
p.offset,
|
||||
self.getDur(p.duration),
|
||||
self.adjustNote(note),
|
||||
self.adjustVolume(p.vol, p.offset))
|
||||
|
||||
|
||||
if self.harmony[sc]:
|
||||
ch = self.getChordInPos(p.offset, ctable).chord.noteList
|
||||
h = harmonize(self.harmony[sc], note, ch)
|
||||
for n in h:
|
||||
self.sendNote(
|
||||
p.offset,
|
||||
self.getDur(p.duration),
|
||||
self.adjustNote(n),
|
||||
self.adjustVolume(self.harmonyVolume[sc] * p.vol, -1) )
|
||||
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bob van der Poel <bvdp@xplornet.com>
|
||||
Bob van der Poel <bob@mellowood.ca>
|
||||
|
||||
"""
|
||||
|
||||
|
@ -34,500 +34,512 @@ import MMA.volume
|
|||
|
||||
|
||||
class NoteList:
|
||||
def __init__(self, length):
|
||||
self.dur = length
|
||||
self.velocity = []
|
||||
self.nl = []
|
||||
def __init__(self, length):
|
||||
self.dur = length
|
||||
self.velocity = []
|
||||
self.nl = []
|
||||
|
||||
|
||||
##############################
|
||||
|
||||
class Melody(PC):
|
||||
""" The melody and solo tracks are identical, expect that
|
||||
the solo tracks DO NOT get saved in grooves and are only
|
||||
initialized once.
|
||||
"""
|
||||
""" The melody and solo tracks are identical, expect that
|
||||
the solo tracks DO NOT get saved in grooves and are only
|
||||
initialized once.
|
||||
"""
|
||||
|
||||
vtype = 'MELODY'
|
||||
drumType = None
|
||||
vtype = 'MELODY'
|
||||
drumType = None
|
||||
|
||||
endTilde = []
|
||||
drumTone = 38
|
||||
|
||||
endTilde = []
|
||||
drumTone = 38
|
||||
def setDrumType(self):
|
||||
""" Set this track to be a drum track. """
|
||||
|
||||
def setDrumType(self):
|
||||
""" Set this track to be a drum track. """
|
||||
if self.channel:
|
||||
error("You cannot change a track to DRUM once it has been used")
|
||||
|
||||
if self.channel:
|
||||
error("You cannot change a track to DRUM once it has been used.")
|
||||
self.drumType = 1
|
||||
self.setChannel('10')
|
||||
|
||||
self.drumType = 1
|
||||
self.setChannel('10')
|
||||
|
||||
def definePattern(self, name, ln):
|
||||
error("Melody/solo patterns cannot be defined")
|
||||
|
||||
def definePattern(self, name, ln):
|
||||
error("Melody/solo patterns cannot be defined.")
|
||||
|
||||
def restart(self):
|
||||
self.ssvoice = -1
|
||||
|
||||
def restart(self):
|
||||
self.ssvoice = -1
|
||||
def setTone(self, ln):
|
||||
""" A solo track can have a tone, if it is DRUMTYPE."""
|
||||
|
||||
def setTone(self, ln):
|
||||
""" A solo track can have a tone, if it is DRUMTYPE."""
|
||||
if not self.drumType:
|
||||
error("You must set a Solo track to DrumType before setting Tone")
|
||||
|
||||
if not self.drumType:
|
||||
error("You must set a Solo track to DrumType before setting Tone.")
|
||||
if len(ln) > 1:
|
||||
error("Only 1 value permitted for Drum Tone in Solo tracks")
|
||||
|
||||
if len(ln) > 1:
|
||||
error("Only 1 value permitted for Drum Tone in Solo tracks.")
|
||||
self.drumTone = MMA.translate.dtable.get(ln[0])
|
||||
|
||||
self.drumTone = MMA.translate.dtable.get(ln[0])
|
||||
|
||||
def getLine(self, pat, ctable):
|
||||
""" Extract a melodyline for solo/melody tracks.
|
||||
|
||||
This is only called from trackbar(), but it's nicer
|
||||
to isolate it here.
|
||||
|
||||
def getLine(self, pat, ctable):
|
||||
""" Extract a melodyline for solo/melody tracks.
|
||||
|
||||
This is only called from trackbar(), but it's nicer
|
||||
to isolate it here.
|
||||
"""
|
||||
RETURNS: notes structure. This is a dictionary. Each key represents
|
||||
an offset in MIDI ticks in the current bar. The data for
|
||||
each entry is an array of notes, a duration and velocity:
|
||||
|
||||
sc = self.seq
|
||||
barEnd = gbl.BperQ*gbl.QperBar
|
||||
notes[offset].dur - duration in ticks
|
||||
notes[offset].velocity[] - velocity for notes
|
||||
notes[offset].defaultVel - default velocity for this offset
|
||||
notes[offset].nl[] - list of notes (if the only note value
|
||||
is None this is a rest placeholder)
|
||||
|
||||
acc=keySig.getAcc()
|
||||
"""
|
||||
|
||||
# list of notename to midivalues
|
||||
sc = self.seq
|
||||
barEnd = gbl.BperQ*gbl.QperBar
|
||||
|
||||
midiNotes = {'c':0, 'd':2, 'e':4, 'f':5, 'g':7, 'a':9, 'b':11, 'r':None }
|
||||
acc=keySig.getAcc()
|
||||
|
||||
""" The initial string is in the format "1ab;4c;;4r;". The trailing
|
||||
';' is important and needed. If we don't have this requirement
|
||||
we can't tell if the last note is a repeat of the previous. For
|
||||
example, if we have coded "2a;2a;" as "2a;;" and we didn't
|
||||
have the 'must end with ;' rule, we end up with "2a;" and
|
||||
then we make this into 2 notes...or do we? Easiest just to
|
||||
insist that all bars end with a ";".
|
||||
"""
|
||||
# list of notename to midivalues
|
||||
|
||||
if not pat.endswith(';'):
|
||||
error("All Solo strings must end with a ';'")
|
||||
midiNotes = {'c':0, 'd':2, 'e':4, 'f':5, 'g':7, 'a':9, 'b':11, 'r':None }
|
||||
|
||||
""" Take our list of note/value pairs and decode into
|
||||
a list of midi values. Quite ugly.
|
||||
"""
|
||||
""" The initial string is in the format "1ab;4c;;4r;". The trailing
|
||||
';' is important and needed. If we don't have this requirement
|
||||
we can't tell if the last note is a repeat of the previous. For
|
||||
example, if we have coded "2a;2a;" as "2a;;" and we didn't
|
||||
have the 'must end with ;' rule, we end up with "2a;" and
|
||||
then we make this into 2 notes...or do we? Easiest just to
|
||||
insist that all bars end with a ";".
|
||||
"""
|
||||
|
||||
if gbl.swingMode:
|
||||
len8 = getNoteLen('8')
|
||||
len81 = getNoteLen('81')
|
||||
len82 = getNoteLen('82')
|
||||
onBeats = [ x * gbl.BperQ for x in range(gbl.QperBar)]
|
||||
offBeats = [ (x * gbl.BperQ + len8) for x in range(gbl.QperBar)]
|
||||
if not pat.endswith(';'):
|
||||
error("All Solo strings must end with a ';'")
|
||||
|
||||
""" Take our list of note/value pairs and decode into
|
||||
a list of midi values. Quite ugly.
|
||||
"""
|
||||
|
||||
length = getNoteLen('4') # default note length
|
||||
lastc = '' # last parsed note
|
||||
velocity = 90 # intial/default velocity for solo notes
|
||||
harmony = self.harmony[sc]
|
||||
harmOnly = self.harmonyOnly[sc]
|
||||
if gbl.swingMode:
|
||||
len8 = getNoteLen('8')
|
||||
len81 = getNoteLen('81')
|
||||
len82 = getNoteLen('82')
|
||||
onBeats = [ x * gbl.BperQ for x in range(gbl.QperBar)]
|
||||
offBeats = [ (x * gbl.BperQ + len8) for x in range(gbl.QperBar)]
|
||||
|
||||
notes={} # A dict of NoteList, keys == offset
|
||||
|
||||
if self.drumType:
|
||||
isdrum = 1
|
||||
lastc = str(self.drumTone)
|
||||
else:
|
||||
isdrum = None
|
||||
length = getNoteLen('4') # default note length
|
||||
lastc = '' # last parsed note
|
||||
velocity = 90 # intial/default velocity for solo notes
|
||||
|
||||
pat = pat.replace(' ', '').split(';')[:-1]
|
||||
notes={} # A dict of NoteList, keys == offset
|
||||
|
||||
# set initial offset into bar
|
||||
if self.drumType:
|
||||
isdrum = 1
|
||||
lastc = str(self.drumTone)
|
||||
else:
|
||||
isdrum = None
|
||||
|
||||
if pat[0].startswith("~"):
|
||||
pat[0]=pat[0][1:]
|
||||
if not self.endTilde or self.endTilde[1] != gbl.tickOffset:
|
||||
error("Previous line did not end with '~'.")
|
||||
else:
|
||||
offset = self.endTilde[0]
|
||||
else:
|
||||
offset = 0
|
||||
lastOffset = None
|
||||
pat = pat.replace(' ', '').split(';')[:-1]
|
||||
|
||||
# Strip off trailing ~
|
||||
# set initial offset into bar
|
||||
|
||||
if pat[-1].endswith("~"):
|
||||
self.endTilde = [1, gbl.tickOffset + (gbl.BperQ * gbl.QperBar) ]
|
||||
pat[-1]=pat[-1][:-1]
|
||||
else:
|
||||
self.endTilde = []
|
||||
if pat[0].startswith("~"):
|
||||
pat[0]=pat[0][1:]
|
||||
if not self.endTilde or self.endTilde[1] != gbl.tickOffset:
|
||||
error("Previous line did not end with '~'")
|
||||
else:
|
||||
offset = self.endTilde[0]
|
||||
else:
|
||||
offset = 0
|
||||
lastOffset = None
|
||||
|
||||
# Strip off trailing ~
|
||||
|
||||
# Begin parse loop
|
||||
if pat[-1].endswith("~"):
|
||||
self.endTilde = [1, gbl.tickOffset + (gbl.BperQ * gbl.QperBar) ]
|
||||
pat[-1]=pat[-1][:-1]
|
||||
else:
|
||||
self.endTilde = []
|
||||
|
||||
for a in pat:
|
||||
if a == '<>':
|
||||
continue
|
||||
|
||||
if offset >= barEnd:
|
||||
error("Attempt to start Solo note '%s' after end of bar." % a)
|
||||
# Begin parse loop
|
||||
|
||||
# strip out all '<volume>' setting and adjust velocity
|
||||
for a in pat:
|
||||
if a == '<>':
|
||||
continue
|
||||
|
||||
a, vls = pextract(a, "<", ">")
|
||||
if vls:
|
||||
if len(vls) > 1:
|
||||
error("Only 1 volume string is permitted per note-set")
|
||||
if offset >= barEnd:
|
||||
error("Attempt to start Solo note '%s' after end of bar" % a)
|
||||
|
||||
vls = vls[0].upper().strip()
|
||||
if not vls in MMA.volume.vols:
|
||||
error("%s string Expecting a valid volume, not '%s'" % \
|
||||
(self.name, vls))
|
||||
velocity *= MMA.volume.vols[vls]
|
||||
# strip out all '<volume>' setting and adjust velocity
|
||||
|
||||
a, vls = pextract(a, "<", ">")
|
||||
if vls:
|
||||
if len(vls) > 1:
|
||||
error("Only 1 volume string is permitted per note-set")
|
||||
|
||||
""" Split the chord chunk into a note length and notes. Each
|
||||
part of this is optional and defaults to the previously
|
||||
parsed value.
|
||||
"""
|
||||
vls = vls[0].upper().strip()
|
||||
if not vls in MMA.volume.vols:
|
||||
error("%s string Expecting a valid volume, not '%s'" % \
|
||||
(self.name, vls))
|
||||
velocity *= MMA.volume.vols[vls]
|
||||
|
||||
i = 0
|
||||
while i < len(a):
|
||||
if not a[i] in '1234568.+':
|
||||
break
|
||||
else:
|
||||
i+=1
|
||||
|
||||
if i:
|
||||
l=getNoteLen(a[0:i])
|
||||
c=a[i:]
|
||||
else:
|
||||
l=length
|
||||
c=a
|
||||
""" Split the chord chunk into a note length and notes. Each
|
||||
part of this is optional and defaults to the previously
|
||||
parsed value.
|
||||
"""
|
||||
|
||||
if not c:
|
||||
c=lastc
|
||||
if not c:
|
||||
error("You must specify the first note in a solo line")
|
||||
i = 0
|
||||
while i < len(a):
|
||||
if not a[i] in '1234568.+':
|
||||
break
|
||||
else:
|
||||
i+=1
|
||||
|
||||
length = l # set defaults for next loop
|
||||
lastc = c
|
||||
if i:
|
||||
l=getNoteLen(a[0:i])
|
||||
c=a[i:]
|
||||
else:
|
||||
l=length
|
||||
c=a
|
||||
|
||||
if not c:
|
||||
c=lastc
|
||||
if not c:
|
||||
error("You must specify the first note in a solo line")
|
||||
|
||||
""" Convert the note part into a series of midi values
|
||||
Notes can be a single note, or a series of notes. And
|
||||
each note can be a letter a-g (or r), a '#,&,n' plus
|
||||
a series of '+'s or '-'s. Drum solos must have each
|
||||
note separated by ','s: "Snare1,Kick1,44".
|
||||
"""
|
||||
length = l # set defaults for next loop
|
||||
lastc = c
|
||||
|
||||
if isdrum:
|
||||
c=c.split(',')
|
||||
else:
|
||||
c=list(c)
|
||||
|
||||
while c:
|
||||
""" Convert the note part into a series of midi values
|
||||
Notes can be a single note, or a series of notes. And
|
||||
each note can be a letter a-g (or r), a '#,&,n' plus
|
||||
a series of '+'s or '-'s. Drum solos must have each
|
||||
note separated by ','s: "Snare1,Kick1,44".
|
||||
"""
|
||||
|
||||
# Parse off note name or 'r' for a rest
|
||||
if isdrum:
|
||||
c=c.split(',')
|
||||
else:
|
||||
c=list(c)
|
||||
|
||||
name = c.pop(0)
|
||||
while c:
|
||||
|
||||
if name == 'r' and (offset in notes or c):
|
||||
error("You cannot combine a rest with a note in "
|
||||
"a chord for solos.")
|
||||
# Parse off note name or 'r' for a rest
|
||||
|
||||
name = c.pop(0)
|
||||
|
||||
if not isdrum:
|
||||
if not name in midiNotes:
|
||||
error("%s encountered illegal note name '%s'."
|
||||
% (self.name, name))
|
||||
if name == 'r' and (offset in notes or c):
|
||||
error("You cannot combine a rest with a note in a chord for solos")
|
||||
|
||||
v = midiNotes[ name ]
|
||||
|
||||
# Parse out a "#', '&' or 'n' accidental.
|
||||
if not isdrum:
|
||||
if not name in midiNotes:
|
||||
error("%s encountered illegal note name '%s'"
|
||||
% (self.name, name))
|
||||
|
||||
if c and c[0]=='#':
|
||||
c.pop(0)
|
||||
acc[name] = 1
|
||||
v = midiNotes[ name ]
|
||||
|
||||
elif c and c[0]=='&':
|
||||
c.pop(0)
|
||||
acc[name] = -1
|
||||
# Parse out a "#', '&' or 'n' accidental.
|
||||
|
||||
elif c and c[0]=='n':
|
||||
c.pop(0)
|
||||
acc[name] = 0
|
||||
if c and c[0]=='#':
|
||||
c.pop(0)
|
||||
acc[name] = 1
|
||||
|
||||
if v != None:
|
||||
v += acc[name]
|
||||
elif c and c[0]=='&':
|
||||
c.pop(0)
|
||||
acc[name] = -1
|
||||
|
||||
# Parse out +/- (or series) for octave
|
||||
elif c and c[0]=='n':
|
||||
c.pop(0)
|
||||
acc[name] = 0
|
||||
|
||||
if c and c[0] == '+':
|
||||
while c and c[0] == '+':
|
||||
c.pop(0)
|
||||
v += 12
|
||||
elif c and c[0] == '-':
|
||||
while c and c[0] == '-':
|
||||
c.pop(0)
|
||||
v -= 12
|
||||
if v != None:
|
||||
v += acc[name]
|
||||
|
||||
else:
|
||||
if not name: # just for leading '.'s
|
||||
continue
|
||||
if name == 'r':
|
||||
v = midiNotes[ name ]
|
||||
elif name == '*':
|
||||
v = self.drumTone
|
||||
else:
|
||||
v = MMA.translate.dtable.get(name)
|
||||
# Parse out +/- (or series) for octave
|
||||
|
||||
if c and c[0] == '+':
|
||||
while c and c[0] == '+':
|
||||
c.pop(0)
|
||||
v += 12
|
||||
elif c and c[0] == '-':
|
||||
while c and c[0] == '-':
|
||||
c.pop(0)
|
||||
v -= 12
|
||||
|
||||
""" Swingmode -- This tests for successive 8ths on/off beat
|
||||
If found, the first is converted to 'long' 8th, the 2nd to a 'short'
|
||||
and the offset for the 2nd is adjusted to comp. for the 'long'.
|
||||
"""
|
||||
else:
|
||||
if not name: # just for leading '.'s
|
||||
continue
|
||||
if name == 'r':
|
||||
v = midiNotes[ name ]
|
||||
elif name == '*':
|
||||
v = self.drumTone
|
||||
else:
|
||||
v = MMA.translate.dtable.get(name)
|
||||
|
||||
if gbl.swingMode and l==len8 and \
|
||||
offset in offBeats and \
|
||||
lastOffset in onBeats and \
|
||||
lastOffset in notes:
|
||||
if notes[lastOffset].dur == len8:
|
||||
offset = lastOffset + len81
|
||||
notes[lastOffset].dur = len81
|
||||
l=len82
|
||||
|
||||
""" Swingmode -- This tests for successive 8ths on/off beat
|
||||
If found, the first is converted to 'long' 8th, the 2nd to a 'short'
|
||||
and the offset for the 2nd is adjusted to comp. for the 'long'.
|
||||
"""
|
||||
|
||||
# create a new note[] entry for this offset
|
||||
if gbl.swingMode and l==len8 and \
|
||||
offset in offBeats and \
|
||||
lastOffset in onBeats and \
|
||||
lastOffset in notes:
|
||||
if notes[lastOffset].dur == len8:
|
||||
offset = lastOffset + len81
|
||||
notes[lastOffset].dur = len81
|
||||
l=len82
|
||||
|
||||
if not offset in notes:
|
||||
notes[offset] = NoteList(l)
|
||||
|
||||
# add note event to note[] array
|
||||
# create a new note[] entry for this offset
|
||||
|
||||
notes[offset].nl.append(v)
|
||||
notes[offset].velocity.append(self.adjustVolume(velocity, offset))
|
||||
if not offset in notes:
|
||||
notes[offset] = NoteList(l)
|
||||
|
||||
""" Do harmony. This is done for each chord as they are
|
||||
parsed out. So, after parsing out the "16g" from the solo
|
||||
string "4a;16g;4c;" we add the harmony notes to the 'g' note.
|
||||
# add note event to note[] array
|
||||
|
||||
The chord is not processed if this is a "drum-type", if there is
|
||||
more than one note in the chord (we assume user harmony),
|
||||
if the chord for the current beat is a 'z', or if the note
|
||||
is a 'rest' (note==None).
|
||||
"""
|
||||
notes[offset].nl.append(v)
|
||||
notes[offset].velocity.append(self.adjustVolume(velocity, offset))
|
||||
|
||||
if harmony and offset in notes and not isdrum:
|
||||
nn=notes[offset]
|
||||
notes[offset].defaultVel = velocity # needed for addHarmony()
|
||||
|
||||
if len(nn.nl) == 1 and nn.nl[0] != None:
|
||||
tb = self.getChordInPos(offset, ctable)
|
||||
lastOffset = offset
|
||||
offset += l
|
||||
|
||||
if not tb.chordZ:
|
||||
h = harmonize(harmony, nn.nl[0], tb.chord.bnoteList)
|
||||
|
||||
if offset <= barEnd:
|
||||
if self.endTilde:
|
||||
error("Tilde at end of bar has no effect")
|
||||
|
||||
""" If harmonyonly set then drop note, substitute harmony,
|
||||
else append harmony notes to chord.
|
||||
"""
|
||||
else:
|
||||
if self.endTilde:
|
||||
self.endTilde[0]=offset-barEnd
|
||||
else:
|
||||
warning("%s, end of last note overlaps end of bar by %2.3f "
|
||||
"beat(s)." % (self.name, (offset-barEnd)/float(gbl.BperQ)))
|
||||
|
||||
for i in range(len(h)):
|
||||
nn.velocity.append(self.adjustVolume(velocity *
|
||||
self.harmonyVolume[sc], offset))
|
||||
return notes
|
||||
|
||||
if harmOnly:
|
||||
nn.nl = h
|
||||
else:
|
||||
nn.nl.extend(h)
|
||||
|
||||
lastOffset = offset
|
||||
offset += l
|
||||
def addHarmony(self, notes, ctable):
|
||||
""" Add harmony to solo notes. """
|
||||
|
||||
sc=self.seq
|
||||
|
||||
if offset <= barEnd:
|
||||
if self.endTilde:
|
||||
error("Tilde at end of bar has no effect.")
|
||||
harmony = self.harmony[sc]
|
||||
harmOnly = self.harmonyOnly[sc]
|
||||
|
||||
|
||||
for offset in notes:
|
||||
nn = notes[offset]
|
||||
|
||||
if len(nn.nl) == 1 and nn.nl[0] != None:
|
||||
tb = self.getChordInPos(offset, ctable)
|
||||
|
||||
if tb.chordZ:
|
||||
continue
|
||||
|
||||
else:
|
||||
if self.endTilde:
|
||||
self.endTilde[0]=offset-barEnd
|
||||
else:
|
||||
warning("%s, end of last note overlaps end of bar by %2.3f "
|
||||
"beat(s)." % (self.name, (offset-barEnd)/float(gbl.BperQ)))
|
||||
h = harmonize(harmony, nn.nl[0], tb.chord.bnoteList)
|
||||
|
||||
return notes
|
||||
""" If harmonyonly set then drop note, substitute harmony,
|
||||
else append harmony notes to chord.
|
||||
"""
|
||||
|
||||
if harmOnly:
|
||||
nn.nl = h
|
||||
nn.velocity = []
|
||||
off=0
|
||||
else:
|
||||
nn.nl.extend(h)
|
||||
off=1
|
||||
|
||||
# Create velocites for harmony note(s)
|
||||
|
||||
def trackBar(self, pat, ctable):
|
||||
""" Do the solo/melody line. Called from self.bar() """
|
||||
for i in range(off,len(nn.nl)):
|
||||
nn.velocity.append(self.adjustVolume(nn.defaultVel *
|
||||
self.harmonyVolume[sc], offset))
|
||||
|
||||
notes = self.getLine(pat, ctable)
|
||||
return notes
|
||||
|
||||
""" The notes structure is a dictionary. Each key represents an offset
|
||||
in MIDI ticks in the current bar. The data for each entry is an array
|
||||
of notes, a duration and velocity:
|
||||
|
||||
notes[offset].dur - duration in ticks
|
||||
notes[offset].velocity[] - velocity for notes
|
||||
notes[offset].nl[] - list of notes (if the only note value is None
|
||||
this is a rest placeholder)
|
||||
|
||||
"""
|
||||
def trackBar(self, pat, ctable):
|
||||
""" Do the solo/melody line. Called from self.bar() """
|
||||
|
||||
sc=self.seq
|
||||
unify = self.unify[sc]
|
||||
notes = self.getLine(pat, ctable)
|
||||
|
||||
rptr = self.mallet
|
||||
if self.harmony[self.seq] and not self.drumType:
|
||||
self.addHarmony(notes, ctable)
|
||||
|
||||
for offset in sorted(notes.keys()):
|
||||
nn=notes[offset]
|
||||
sc=self.seq
|
||||
unify = self.unify[sc]
|
||||
|
||||
for n,v in zip(nn.nl, nn.velocity):
|
||||
if n == None: # skip rests
|
||||
continue
|
||||
rptr = self.mallet
|
||||
|
||||
if not self.drumType: # octave, transpose
|
||||
n = self.adjustNote(n)
|
||||
for offset in sorted(notes.keys()):
|
||||
nn=notes[offset]
|
||||
|
||||
self.sendNote( offset, self.getDur(nn.dur), n, v)
|
||||
for n,v in zip(nn.nl, nn.velocity):
|
||||
if n == None: # skip rests
|
||||
continue
|
||||
|
||||
if not self.drumType: # octave, transpose
|
||||
n = self.adjustNote(n)
|
||||
|
||||
self.sendNote( offset, self.getDur(nn.dur), n, v)
|
||||
|
||||
|
||||
|
||||
class Solo(Melody):
|
||||
""" Pattern class for a solo track. """
|
||||
""" Pattern class for a solo track. """
|
||||
|
||||
vtype = 'SOLO'
|
||||
vtype = 'SOLO'
|
||||
|
||||
|
||||
# Grooves are not saved/restored for solo tracks.
|
||||
# Grooves are not saved/restored for solo tracks.
|
||||
|
||||
def restoreGroove(self, gname):
|
||||
self.setSeqSize()
|
||||
def restoreGroove(self, gname):
|
||||
self.setSeqSize()
|
||||
|
||||
def saveGroove(self, gname):
|
||||
pass
|
||||
def saveGroove(self, gname):
|
||||
pass
|
||||
|
||||
|
||||
##################################
|
||||
|
||||
""" Keysignature. This is only used in the solo/melody tracks so it
|
||||
probably makes sense to have the parse routine here as well. To
|
||||
contain everything in one location we make a single instance class
|
||||
of the whole mess.
|
||||
contain everything in one location we make a single instance class
|
||||
of the whole mess.
|
||||
"""
|
||||
|
||||
class KeySig:
|
||||
|
||||
def __init__(self):
|
||||
self.kSig = 0
|
||||
def __init__(self):
|
||||
self.kSig = 0
|
||||
|
||||
majKy = { "C" : 0, "G" : 1, "D" : 2,
|
||||
"A" : 3, "E" : 4, "B" : 5,
|
||||
"F#": 6, "C#": 7, "F" : -1,
|
||||
"Bb": -2, "Eb": -3, "Ab": -4,
|
||||
"Db": -5, "Gb": -6, "Cb": -7 }
|
||||
majKy = { "C" : 0, "G" : 1, "D" : 2,
|
||||
"A" : 3, "E" : 4, "B" : 5,
|
||||
"F#": 6, "C#": 7, "F" : -1,
|
||||
"Bb": -2, "Eb": -3, "Ab": -4,
|
||||
"Db": -5, "Gb": -6, "Cb": -7 }
|
||||
|
||||
minKy = { "A" : 0, "E" : 1, "B" : 2,
|
||||
"F#": 3, "C#": 4, "G#": 5,
|
||||
"D#": 6, "A#": 7, "D" : -1,
|
||||
"G" : -2, "C" : -3, "F" : -4,
|
||||
"Bb": -5, "Eb": -6, "Ab": -7 }
|
||||
minKy = { "A" : 0, "E" : 1, "B" : 2,
|
||||
"F#": 3, "C#": 4, "G#": 5,
|
||||
"D#": 6, "A#": 7, "D" : -1,
|
||||
"G" : -2, "C" : -3, "F" : -4,
|
||||
"Bb": -5, "Eb": -6, "Ab": -7 }
|
||||
|
||||
def set(self,ln):
|
||||
""" Set the keysignature. Used by solo tracks."""
|
||||
def set(self,ln):
|
||||
""" Set the keysignature. Used by solo tracks."""
|
||||
|
||||
mi = 0
|
||||
mi = 0
|
||||
|
||||
if len(ln) < 1 or len(ln) > 2:
|
||||
error("KeySig only takes 1 or 2 arguments.")
|
||||
if len(ln) < 1 or len(ln) > 2:
|
||||
error("KeySig only takes 1 or 2 arguments")
|
||||
|
||||
if len(ln) == 2:
|
||||
l=ln[1][0:3].upper()
|
||||
if l == 'MIN':
|
||||
mi=1
|
||||
elif l == 'MAJ':
|
||||
mi=0
|
||||
else:
|
||||
error("KeySig 2nd arg must be 'Major' or 'Minor', not '%s'" % ln[1])
|
||||
if len(ln) == 2:
|
||||
l=ln[1][0:3].upper()
|
||||
if l == 'MIN':
|
||||
mi=1
|
||||
elif l == 'MAJ':
|
||||
mi=0
|
||||
else:
|
||||
error("KeySig 2nd arg must be 'Major' or 'Minor', not '%s'" % ln[1])
|
||||
|
||||
l=ln[0]
|
||||
l=ln[0]
|
||||
|
||||
t=l[0].upper() + l[1:]
|
||||
t=l[0].upper() + l[1:]
|
||||
|
||||
if mi and t in self.minKy:
|
||||
self.kSig = self.minKy[t]
|
||||
elif not mi and t in self.majKy:
|
||||
self.kSig = self.majKy[t]
|
||||
elif l[0] in "ABCDEFG":
|
||||
error("There is no key signature name: '%s'" % l)
|
||||
if mi and t in self.minKy:
|
||||
self.kSig = self.minKy[t]
|
||||
elif not mi and t in self.majKy:
|
||||
self.kSig = self.majKy[t]
|
||||
elif l[0] in "ABCDEFG":
|
||||
error("There is no key signature name: '%s'" % l)
|
||||
|
||||
else:
|
||||
c=l[0]
|
||||
f=l[1].upper()
|
||||
else:
|
||||
c=l[0]
|
||||
f=l[1].upper()
|
||||
|
||||
if not f in ("B", "&", "#"):
|
||||
error("2nd char in KeySig must be 'b' or '#', not '%s'" % f)
|
||||
if not f in ("B", "&", "#"):
|
||||
error("2nd char in KeySig must be 'b' or '#', not '%s'" % f)
|
||||
|
||||
if not c in "01234567":
|
||||
error("1st char in KeySig must be digit 0..7, not '%s'" % c)
|
||||
if not c in "01234567":
|
||||
error("1st char in KeySig must be digit 0..7, not '%s'" % c)
|
||||
|
||||
self.kSig = int(c)
|
||||
self.kSig = int(c)
|
||||
|
||||
if f in ('B', '&'):
|
||||
self.kSig = -self.kSig
|
||||
if f in ('B', '&'):
|
||||
self.kSig = -self.kSig
|
||||
|
||||
|
||||
if not c in "01234567":
|
||||
error("1st char in KeySig must be digit 0..7, not '%s'" % c)
|
||||
if not c in "01234567":
|
||||
error("1st char in KeySig must be digit 0..7, not '%s'" % c)
|
||||
|
||||
|
||||
# Set the midi meta track with the keysig. This doen't do anything
|
||||
# in the playback, but other programs may use it.
|
||||
# Set the midi meta track with the keysig. This doen't do anything
|
||||
# in the playback, but other programs may use it.
|
||||
|
||||
n = self.kSig
|
||||
if n < 0:
|
||||
n = 256 + n
|
||||
n = self.kSig
|
||||
if n < 0:
|
||||
n = 256 + n
|
||||
|
||||
gbl.mtrks[0].addKeySig(gbl.tickOffset, n, mi)
|
||||
gbl.mtrks[0].addKeySig(gbl.tickOffset, n, mi)
|
||||
|
||||
if gbl.debug:
|
||||
n = self.kSig
|
||||
if n >= 0:
|
||||
f = "Sharps"
|
||||
else:
|
||||
f = "Flats"
|
||||
if gbl.debug:
|
||||
n = self.kSig
|
||||
if n >= 0:
|
||||
f = "Sharps"
|
||||
else:
|
||||
f = "Flats"
|
||||
|
||||
print "KeySig set to %s %s" % (abs(n), f)
|
||||
print "KeySig set to %s %s" % (abs(n), f)
|
||||
|
||||
|
||||
def getAcc(self):
|
||||
""" The solo parser needs to know which notes are accidentals.
|
||||
This is simple with a keysig table. There is an entry for each note,
|
||||
either -1,0,1 corresponding to flat,natural,sharp. We populate
|
||||
the table for each bar from the keysig value. As we process
|
||||
the bar data we update the table. There is one flaw here---in
|
||||
real music an accidental for a note in a give octave does not
|
||||
effect the following same-named notes in different octaves.
|
||||
In this routine IT DOES.
|
||||
def getAcc(self):
|
||||
""" The solo parser needs to know which notes are accidentals.
|
||||
This is simple with a keysig table. There is an entry for each note,
|
||||
either -1,0,1 corresponding to flat,natural,sharp. We populate
|
||||
the table for each bar from the keysig value. As we process
|
||||
the bar data we update the table. There is one flaw here---in
|
||||
real music an accidental for a note in a give octave does not
|
||||
effect the following same-named notes in different octaves.
|
||||
In this routine IT DOES.
|
||||
|
||||
NOTE: This is recreated for each bar of music for each solo/melody track.
|
||||
"""
|
||||
NOTE: This is recreated for each bar of music for each solo/melody track.
|
||||
"""
|
||||
|
||||
acc = {'a':0, 'b':0, 'c':0, 'd':0, 'e':0, 'f':0, 'g':0 }
|
||||
ks=self.kSig
|
||||
acc = {'a':0, 'b':0, 'c':0, 'd':0, 'e':0, 'f':0, 'g':0 }
|
||||
ks=self.kSig
|
||||
|
||||
if ks < 0:
|
||||
for a in range( abs(ks) ):
|
||||
acc[ ['b','e','a','d','g','c','f'][a] ] = -1
|
||||
if ks < 0:
|
||||
for a in range( abs(ks) ):
|
||||
acc[ ['b','e','a','d','g','c','f'][a] ] = -1
|
||||
|
||||
else:
|
||||
for a in range(ks):
|
||||
acc[ ['f','c','g','d','a','e','b'][a] ] = 1
|
||||
else:
|
||||
for a in range(ks):
|
||||
acc[ ['f','c','g','d','a','e','b'][a] ] = 1
|
||||
|
||||
return acc
|
||||
return acc
|
||||
|
||||
|
||||
keySig=KeySig() # single instance
|
||||
|
||||
|
||||
#######################
|
||||
|
||||
""" When solos are included in a chord/data line they are
|
||||
|
@ -539,83 +551,83 @@ autoSoloTracks = [ 'SOLO', 'SOLO-1', 'SOLO-2', 'SOLO-3' ]
|
|||
|
||||
|
||||
def setAutoSolo(ln):
|
||||
""" Set the order and names of tracks to use when assigning
|
||||
automatic solos (specified on chord lines in {}s).
|
||||
"""
|
||||
""" Set the order and names of tracks to use when assigning
|
||||
automatic solos (specified on chord lines in {}s).
|
||||
"""
|
||||
|
||||
global autoSoloTracks
|
||||
global autoSoloTracks
|
||||
|
||||
if not len(ln):
|
||||
error("You must specify at least one track for autosolos.")
|
||||
if not len(ln):
|
||||
error("You must specify at least one track for autosolos")
|
||||
|
||||
autoSoloTracks = []
|
||||
for n in ln:
|
||||
n=n.upper()
|
||||
MMA.alloc.trackAlloc(n, 1)
|
||||
if gbl.tnames[n].vtype not in ('MELODY', 'SOLO'):
|
||||
error("All autotracks must be Melody or Solo tracks, "
|
||||
"not %s." % gbl.tnames[n].vtype)
|
||||
autoSoloTracks = []
|
||||
for n in ln:
|
||||
n=n.upper()
|
||||
MMA.alloc.trackAlloc(n, 1)
|
||||
if gbl.tnames[n].vtype not in ('MELODY', 'SOLO'):
|
||||
error("All autotracks must be Melody or Solo tracks, not %s" % gbl.tnames[n].vtype)
|
||||
|
||||
autoSoloTracks.append(n)
|
||||
autoSoloTracks.append(n)
|
||||
|
||||
if gbl.debug:
|
||||
print "AutoSolo track names:",
|
||||
for a in autoSoloTracks:
|
||||
print a,
|
||||
print
|
||||
if gbl.debug:
|
||||
print "AutoSolo track names:",
|
||||
for a in autoSoloTracks:
|
||||
print a,
|
||||
print
|
||||
|
||||
|
||||
|
||||
###############
|
||||
|
||||
|
||||
def extractSolo(ln, rptcount):
|
||||
""" Parser calls this to extract solo strings. """
|
||||
""" Parser calls this to extract solo strings. """
|
||||
|
||||
a = ln.count('{')
|
||||
b = ln.count('}')
|
||||
a = ln.count('{')
|
||||
b = ln.count('}')
|
||||
|
||||
if a != b:
|
||||
error("Mismatched {}s for solo found in chord line.")
|
||||
if a != b:
|
||||
error("Mismatched {}s for solo found in chord line")
|
||||
|
||||
if a:
|
||||
if rptcount > 1:
|
||||
error("Bars with both repeat count and solos are not permitted.")
|
||||
if a:
|
||||
if rptcount > 1:
|
||||
error("Bars with both repeat count and solos are not permitted")
|
||||
|
||||
ln, solo = pextract(ln, '{', '}')
|
||||
ln, solo = pextract(ln, '{', '}')
|
||||
|
||||
if len(solo) > len(autoSoloTracks):
|
||||
error("Too many melody/solo riffs in chord line. %s used, "
|
||||
"only %s defined." % (len(solo), len(autoSoloTracks)) )
|
||||
if len(solo) > len(autoSoloTracks):
|
||||
error("Too many melody/solo riffs in chord line. %s used, "
|
||||
"only %s defined" % (len(solo), len(autoSoloTracks)) )
|
||||
|
||||
|
||||
firstSolo = solo[0][:] # save for autoharmony tracks
|
||||
firstSolo = solo[0][:] # save for autoharmony tracks
|
||||
|
||||
""" We have the solo information. Now we loop though each "solo" and:
|
||||
1. Ensure or Create a MMA track for the solo
|
||||
2. Push the solo data into a Riff for the given track.
|
||||
"""
|
||||
|
||||
for s, trk in zip(solo, autoSoloTracks):
|
||||
MMA.alloc.trackAlloc(trk, 1)
|
||||
gbl.tnames[trk].setRiff( s.strip() )
|
||||
|
||||
|
||||
""" After all the solo data is interpreted and sent to the
|
||||
correct track, we check any leftover tracks. If any of these
|
||||
tracks are empty of data AND are harmonyonly the note
|
||||
data from the first track is interpeted again for that
|
||||
track. Tricky: the max() is needed since harmonyonly can
|
||||
have different setting for each bar...this way
|
||||
the copy is done if ANY bar in the seq has harmonyonly set.
|
||||
""" We have the solo information. Now we loop though each "solo" and:
|
||||
1. Ensure or Create a MMA track for the solo
|
||||
2. Push the solo data into a Riff for the given track.
|
||||
"""
|
||||
|
||||
for t in autoSoloTracks[1:]:
|
||||
if gbl.tnames.has_key(t) and gbl.tnames[t].riff == [] \
|
||||
and max(gbl.tnames[t].harmonyOnly):
|
||||
gbl.tnames[t].setRiff( firstSolo[:] )
|
||||
for s, trk in zip(solo, autoSoloTracks):
|
||||
MMA.alloc.trackAlloc(trk, 1)
|
||||
gbl.tnames[trk].setRiff( s.strip() )
|
||||
|
||||
if gbl.debug:
|
||||
print "%s duplicated to %s for HarmonyOnly." % (trk, t)
|
||||
|
||||
return ln
|
||||
""" After all the solo data is interpreted and sent to the
|
||||
correct track, we check any leftover tracks. If any of these
|
||||
tracks are empty of data AND are harmonyonly the note
|
||||
data from the first track is interpeted again for that
|
||||
track. Tricky: the max() is needed since harmonyonly can
|
||||
have different setting for each bar...this way
|
||||
the copy is done if ANY bar in the seq has harmonyonly set.
|
||||
"""
|
||||
|
||||
for t in autoSoloTracks[1:]:
|
||||
if gbl.tnames.has_key(t) and gbl.tnames[t].riff == [] \
|
||||
and max(gbl.tnames[t].harmonyOnly):
|
||||
gbl.tnames[t].setRiff( firstSolo[:] )
|
||||
|
||||
if gbl.debug:
|
||||
print "%s duplicated to %s for HarmonyOnly." % (trk, t)
|
||||
|
||||
return ln
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
# patWalk.py
|
||||
|
||||
"""
|
||||
This module is an integeral part of the program
|
||||
This module is an integeral part of the program
|
||||
MMA - Musical Midi Accompaniment.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
|
@ -19,8 +19,8 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bob van der Poel <bvdp@xplornet.com>
|
||||
|
||||
Bob van der Poel <bob@mellowood.ca>
|
||||
|
||||
"""
|
||||
|
||||
|
||||
|
@ -34,131 +34,131 @@ from MMA.pat import PC
|
|||
|
||||
|
||||
class Walk(PC):
|
||||
""" Pattern class for a walking bass track. """
|
||||
""" Pattern class for a walking bass track. """
|
||||
|
||||
vtype = 'WALK'
|
||||
walkChoice = 0
|
||||
|
||||
def getPgroup(self, ev):
|
||||
""" Get group for walking bass pattern.
|
||||
|
||||
Fields - start, length, volume
|
||||
"""
|
||||
vtype = 'WALK'
|
||||
walkChoice = 0
|
||||
|
||||
if len(ev) != 3:
|
||||
error("There must be at exactly 3 items in each group in "
|
||||
"a Walking Bass definition, not <%s>." % ' '.join(ev))
|
||||
def getPgroup(self, ev):
|
||||
""" Get group for walking bass pattern.
|
||||
|
||||
a = struct()
|
||||
|
||||
a.offset = self.setBarOffset(ev[0])
|
||||
a.duration = getNoteLen(ev[1])
|
||||
a.vol = stoi(ev[2], "Type error in Walking Bass definition")
|
||||
Fields - start, length, volume
|
||||
"""
|
||||
|
||||
return a
|
||||
|
||||
if len(ev) != 3:
|
||||
error("There must be at exactly 3 items in each group in "
|
||||
"a Walking Bass definition, not <%s>" % ' '.join(ev))
|
||||
|
||||
def restart(self):
|
||||
self.ssvoice = -1
|
||||
self.walkChoice = 0
|
||||
|
||||
|
||||
def trackBar(self, pattern, ctable):
|
||||
""" Do a waling bass bar.
|
||||
|
||||
Called from self.bar()
|
||||
|
||||
"""
|
||||
a = struct()
|
||||
|
||||
sc=self.seq
|
||||
dir = self.direction[sc]
|
||||
unify = self.unify[sc]
|
||||
|
||||
for p in pattern:
|
||||
|
||||
tb = self.getChordInPos(p.offset, ctable)
|
||||
|
||||
if tb.walkZ:
|
||||
continue
|
||||
|
||||
root = tb.chord.rootNote # root note of chord
|
||||
a.offset = self.setBarOffset(ev[0])
|
||||
a.duration = getNoteLen(ev[1])
|
||||
a.vol = stoi(ev[2], "Type error in Walking Bass definition")
|
||||
|
||||
""" Create a note list from the current scale. We do
|
||||
this for each beat, but it's pretty fast. The note
|
||||
list is simply notes 0..6 of the scale PLUS notes
|
||||
1..5 reversed. So, a Cmajor chord would result in
|
||||
the note list (0,2,4,5,7,9,7,5,4,2).
|
||||
|
||||
Note that we deliberately skip the 7th. Too often
|
||||
the chord is a Major but the melody note will be
|
||||
the dom. 7th and the M7 will sound off. So, just
|
||||
err on the side of caution.
|
||||
|
||||
If DIR is UP or DOWN we don't append the 2nd half
|
||||
of the scale.
|
||||
|
||||
If DIR is DOWN we reverse the order as well.
|
||||
"""
|
||||
|
||||
wNotes = list(tb.chord.scaleList[0:6])
|
||||
if dir not in ('UP', 'DOWN'):
|
||||
b = list(tb.chord.scaleList[1:5])
|
||||
b.reverse()
|
||||
wNotes += b
|
||||
|
||||
if dir == 'DOWN':
|
||||
wNotes.reverse()
|
||||
|
||||
|
||||
# Ensure that the offset is in range.
|
||||
|
||||
if self.walkChoice >= len(wNotes) or self.walkChoice < 0:
|
||||
self.walkChoice = 0
|
||||
|
||||
""" Even with a walking bass it's nice to have the chord root on
|
||||
beat 1 ... not all the time, but most. This bit of code ensures
|
||||
that more that 50% of beat ones will have the root.
|
||||
"""
|
||||
|
||||
|
||||
if p.offset == 0 and random.choice((0,1)):
|
||||
self.walkChoice=0
|
||||
|
||||
note = wNotes[self.walkChoice]
|
||||
|
||||
""" Adjust offset for NEXT TIME. If the direction is
|
||||
up/down we just increment the pointer. If we have
|
||||
direction set to RANDOM then we select either -1,
|
||||
0 or 1 with equal change for moving up, down or
|
||||
not-at-all. With BOTH we have a preference to move up.
|
||||
"""
|
||||
|
||||
|
||||
if dir in ('UP', 'DOWN'):
|
||||
self.walkChoice += 1
|
||||
elif dir == 'RANDOM':
|
||||
self.walkChoice += random.choice((0,1,-1))
|
||||
else: # BOTH
|
||||
self.walkChoice += random.choice( (-1,0,0,2,2,1,1,1,1,1,1,1))
|
||||
|
||||
|
||||
if not self.harmonyOnly[sc]:
|
||||
self.sendNote(
|
||||
p.offset,
|
||||
self.getDur(p.duration),
|
||||
self.adjustNote(note),
|
||||
self.adjustVolume(p.vol, p.offset) )
|
||||
return a
|
||||
|
||||
|
||||
if self.harmony[sc]:
|
||||
ch = self.getChordInPos(p.offset, ctable).chord.noteList
|
||||
h = harmonize(self.harmony[sc], note, ch)
|
||||
for n in h:
|
||||
self.sendNote(
|
||||
p.offset,
|
||||
self.getDur(p.duration),
|
||||
self.adjustNote(n),
|
||||
self.adjustVolume(p.vol * self.harmonyVolume[sc], -1) )
|
||||
def restart(self):
|
||||
self.ssvoice = -1
|
||||
self.walkChoice = 0
|
||||
|
||||
|
||||
def trackBar(self, pattern, ctable):
|
||||
""" Do a waling bass bar.
|
||||
|
||||
Called from self.bar()
|
||||
|
||||
"""
|
||||
|
||||
sc=self.seq
|
||||
dir = self.direction[sc]
|
||||
unify = self.unify[sc]
|
||||
|
||||
for p in pattern:
|
||||
|
||||
tb = self.getChordInPos(p.offset, ctable)
|
||||
|
||||
if tb.walkZ:
|
||||
continue
|
||||
|
||||
root = tb.chord.rootNote # root note of chord
|
||||
|
||||
""" Create a note list from the current scale. We do
|
||||
this for each beat, but it's pretty fast. The note
|
||||
list is simply notes 0..6 of the scale PLUS notes
|
||||
1..5 reversed. So, a Cmajor chord would result in
|
||||
the note list (0,2,4,5,7,9,7,5,4,2).
|
||||
|
||||
Note that we deliberately skip the 7th. Too often
|
||||
the chord is a Major but the melody note will be
|
||||
the dom. 7th and the M7 will sound off. So, just
|
||||
err on the side of caution.
|
||||
|
||||
If DIR is UP or DOWN we don't append the 2nd half
|
||||
of the scale.
|
||||
|
||||
If DIR is DOWN we reverse the order as well.
|
||||
"""
|
||||
|
||||
wNotes = list(tb.chord.scaleList[0:6])
|
||||
if dir not in ('UP', 'DOWN'):
|
||||
b = list(tb.chord.scaleList[1:5])
|
||||
b.reverse()
|
||||
wNotes += b
|
||||
|
||||
if dir == 'DOWN':
|
||||
wNotes.reverse()
|
||||
|
||||
|
||||
# Ensure that the offset is in range.
|
||||
|
||||
if self.walkChoice >= len(wNotes) or self.walkChoice < 0:
|
||||
self.walkChoice = 0
|
||||
|
||||
""" Even with a walking bass it's nice to have the chord root on
|
||||
beat 1 ... not all the time, but most. This bit of code ensures
|
||||
that more that 50% of beat ones will have the root.
|
||||
"""
|
||||
|
||||
|
||||
if p.offset == 0 and random.choice((0,1)):
|
||||
self.walkChoice=0
|
||||
|
||||
note = wNotes[self.walkChoice]
|
||||
|
||||
""" Adjust offset for NEXT TIME. If the direction is
|
||||
up/down we just increment the pointer. If we have
|
||||
direction set to RANDOM then we select either -1,
|
||||
0 or 1 with equal change for moving up, down or
|
||||
not-at-all. With BOTH we have a preference to move up.
|
||||
"""
|
||||
|
||||
|
||||
if dir in ('UP', 'DOWN'):
|
||||
self.walkChoice += 1
|
||||
elif dir == 'RANDOM':
|
||||
self.walkChoice += random.choice((0,1,-1))
|
||||
else: # BOTH
|
||||
self.walkChoice += random.choice( (-1,0,0,2,2,1,1,1,1,1,1,1))
|
||||
|
||||
|
||||
if not self.harmonyOnly[sc]:
|
||||
self.sendNote(
|
||||
p.offset,
|
||||
self.getDur(p.duration),
|
||||
self.adjustNote(note),
|
||||
self.adjustVolume(p.vol, p.offset) )
|
||||
|
||||
|
||||
if self.harmony[sc]:
|
||||
ch = self.getChordInPos(p.offset, ctable).chord.noteList
|
||||
h = harmonize(self.harmony[sc], note, ch)
|
||||
for n in h:
|
||||
self.sendNote(
|
||||
p.offset,
|
||||
self.getDur(p.duration),
|
||||
self.adjustNote(n),
|
||||
self.adjustVolume(p.vol * self.harmonyVolume[sc], -1) )
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bob van der Poel <bvdp@xplornet.com>
|
||||
Bob van der Poel <bob@mellowood.ca>
|
||||
|
||||
|
||||
This module handles voice name translations.
|
||||
|
@ -32,114 +32,116 @@ from MMA.common import *
|
|||
|
||||
|
||||
""" Translation table for VOICE. This is ONLY used when a voice is set
|
||||
from the VOICE command. If a translation exists the translation is
|
||||
substituted. """
|
||||
from the VOICE command. If a translation exists the translation is
|
||||
substituted.
|
||||
"""
|
||||
|
||||
|
||||
class Vtable:
|
||||
|
||||
def __init__(self):
|
||||
self.table = {}
|
||||
def __init__(self):
|
||||
self.table = {}
|
||||
|
||||
def retlist(self):
|
||||
def retlist(self):
|
||||
|
||||
l=[]
|
||||
for n in sorted(self.table.keys()):
|
||||
l.append("%s=%s" % (n.title(), self.table[n]))
|
||||
l=[]
|
||||
for n in sorted(self.table.keys()):
|
||||
l.append("%s=%s" % (n.title(), self.table[n]))
|
||||
|
||||
return ' '.join(l)
|
||||
return ' '.join(l)
|
||||
|
||||
|
||||
def set(self, ln):
|
||||
""" Set a name/alias for voice translation, called from parser. """
|
||||
def set(self, ln):
|
||||
""" Set a name/alias for voice translation, called from parser. """
|
||||
|
||||
if not ln:
|
||||
self.table = {}
|
||||
if gbl.debug:
|
||||
print "Voice Translaion table reset."
|
||||
if not ln:
|
||||
self.table = {}
|
||||
if gbl.debug:
|
||||
print "Voice Translaion table reset."
|
||||
|
||||
return
|
||||
return
|
||||
|
||||
for l in ln:
|
||||
l=l.upper()
|
||||
if l.count('=') != 1:
|
||||
error("Each translation pair must be in the format Voice=Alias")
|
||||
v,a = l.split('=')
|
||||
self.table[v] = a
|
||||
for l in ln:
|
||||
l=l.upper()
|
||||
if l.count('=') != 1:
|
||||
error("Each translation pair must be in the format Voice=Alias")
|
||||
v,a = l.split('=')
|
||||
self.table[v] = a
|
||||
|
||||
if gbl.debug:
|
||||
print "Voice Translations: ",
|
||||
for l in ln:
|
||||
print l,
|
||||
print
|
||||
if gbl.debug:
|
||||
print "Voice Translations: ",
|
||||
for l in ln:
|
||||
print l,
|
||||
print
|
||||
|
||||
def get(self, name):
|
||||
""" Return a translation or original. """
|
||||
def get(self, name):
|
||||
""" Return a translation or original. """
|
||||
|
||||
name=name.upper()
|
||||
if self.table.has_key(name):
|
||||
return self.table[name]
|
||||
name=name.upper()
|
||||
if self.table.has_key(name):
|
||||
return self.table[name]
|
||||
|
||||
else:
|
||||
return name
|
||||
else:
|
||||
return name
|
||||
|
||||
vtable=Vtable() # Create single class instance.
|
||||
vtable=Vtable() # Create single class instance.
|
||||
|
||||
|
||||
""" This is just like the Vtable, but it is used for DRUM TONES. We use
|
||||
this translation when a TONE is set for a drum in setTone() and when a
|
||||
tone is selected in a Solo/Melody DRUM track. """
|
||||
this translation when a TONE is set for a drum in setTone() and when a
|
||||
tone is selected in a Solo/Melody DRUM track.
|
||||
"""
|
||||
|
||||
class Dtable:
|
||||
|
||||
def __init__(self):
|
||||
self.table = {}
|
||||
def __init__(self):
|
||||
self.table = {}
|
||||
|
||||
def retlist(self):
|
||||
def retlist(self):
|
||||
|
||||
l=[]
|
||||
for n in sorted(self.table.keys()):
|
||||
l.append("%s=%s" % ( MMA.midiC.valueToDrum(n),
|
||||
MMA.midiC.valueToDrum(self.table[n])))
|
||||
l=[]
|
||||
for n in sorted(self.table.keys()):
|
||||
l.append("%s=%s" % ( MMA.midiC.valueToDrum(n),
|
||||
MMA.midiC.valueToDrum(self.table[n])))
|
||||
|
||||
return ' '.join(l)
|
||||
return ' '.join(l)
|
||||
|
||||
|
||||
def set(self, ln):
|
||||
""" Set a name/alias for drum tone translation, called from parser. """
|
||||
def set(self, ln):
|
||||
""" Set a name/alias for drum tone translation, called from parser. """
|
||||
|
||||
if not ln:
|
||||
self.table = {}
|
||||
if gbl.debug:
|
||||
print "DrumTone Translaion table reset."
|
||||
if not ln:
|
||||
self.table = {}
|
||||
if gbl.debug:
|
||||
print "DrumTone Translaion table reset."
|
||||
|
||||
return
|
||||
return
|
||||
|
||||
for l in ln:
|
||||
l=l.upper()
|
||||
if l.count('=') != 1:
|
||||
error("Each translation pair must be in the format Voice=Alias")
|
||||
v,a = l.split('=')
|
||||
for l in ln:
|
||||
l=l.upper()
|
||||
if l.count('=') != 1:
|
||||
error("Each translation pair must be in the format Voice=Alias")
|
||||
v,a = l.split('=')
|
||||
|
||||
v=MMA.midiC.drumToValue(v)
|
||||
a=MMA.midiC.drumToValue(a)
|
||||
v=MMA.midiC.drumToValue(v)
|
||||
a=MMA.midiC.drumToValue(a)
|
||||
|
||||
self.table[v] = a
|
||||
if gbl.debug:
|
||||
print "DrumTone Translation: %s=%s" % \
|
||||
(MMA.midiC.valueToDrum(v), MMA.midiC.valueToDrum(a))
|
||||
self.table[v] = a
|
||||
if gbl.debug:
|
||||
print "DrumTone Translation: %s=%s" % \
|
||||
(MMA.midiC.valueToDrum(v), MMA.midiC.valueToDrum(a))
|
||||
|
||||
|
||||
def get(self, name):
|
||||
""" Return a translation or original. """
|
||||
def get(self, name):
|
||||
""" Return a translation or original. """
|
||||
|
||||
v=MMA.midiC.drumToValue(name)
|
||||
v=MMA.midiC.drumToValue(name)
|
||||
|
||||
if self.table.has_key(v):
|
||||
return self.table[v]
|
||||
if self.table.has_key(v):
|
||||
return self.table[v]
|
||||
|
||||
else:
|
||||
return v
|
||||
else:
|
||||
return v
|
||||
|
||||
|
||||
|
||||
|
@ -147,105 +149,106 @@ dtable=Dtable()
|
|||
|
||||
|
||||
""" Volume adjustment. Again, similar to voice/tone translations,
|
||||
but this is for the volume. The table creates a percentage adjustment
|
||||
for tones/voices specified. When a TRACK VOLUME is set in
|
||||
MMApat.setVolume() the routine checks here for an adjustment. """
|
||||
but this is for the volume. The table creates a percentage adjustment
|
||||
for tones/voices specified. When a TRACK VOLUME is set in
|
||||
MMApat.setVolume() the routine checks here for an adjustment.
|
||||
"""
|
||||
|
||||
class VoiceVolTable:
|
||||
|
||||
def __init__(self):
|
||||
self.table = {}
|
||||
def __init__(self):
|
||||
self.table = {}
|
||||
|
||||
def retlist(self):
|
||||
l=[]
|
||||
for n in sorted(self.table.keys()):
|
||||
l.append("%s=%s" % ( MMA.midiC.valueToInst(n), self.table[n]))
|
||||
def retlist(self):
|
||||
l=[]
|
||||
for n in sorted(self.table.keys()):
|
||||
l.append("%s=%s" % ( MMA.midiC.valueToInst(n), self.table[n]))
|
||||
|
||||
return ' '.join(l)
|
||||
return ' '.join(l)
|
||||
|
||||
|
||||
def set(self, ln):
|
||||
""" Set a name/alias for voice volume adjustment, called from parser. """
|
||||
def set(self, ln):
|
||||
""" Set a name/alias for voice volume adjustment, called from parser. """
|
||||
|
||||
if not ln:
|
||||
self.table = {}
|
||||
if gbl.debug:
|
||||
print "Voice Volume Adjustment table reset."
|
||||
if not ln:
|
||||
self.table = {}
|
||||
if gbl.debug:
|
||||
print "Voice Volume Adjustment table reset."
|
||||
|
||||
return
|
||||
return
|
||||
|
||||
for l in ln:
|
||||
l=l.upper()
|
||||
if l.count('=') != 1:
|
||||
error("Each translation pair must be in the format Voice=Ajustment")
|
||||
v,a = l.split('=')
|
||||
for l in ln:
|
||||
l=l.upper()
|
||||
if l.count('=') != 1:
|
||||
error("Each translation pair must be in the format Voice=Ajustment")
|
||||
v,a = l.split('=')
|
||||
|
||||
v=MMA.midiC.instToValue(v)
|
||||
a=stoi(a)
|
||||
if a<1 or a>200:
|
||||
error("Voice volume adjustments must be in range 1 to 200, not %." % a)
|
||||
self.table[v] = a/100.
|
||||
if gbl.debug:
|
||||
print "Voice Volume Adjustment: %s=%s" % (MMA.midiC.valueToInst(v), a)
|
||||
v=MMA.midiC.instToValue(v)
|
||||
a=stoi(a)
|
||||
if a<1 or a>200:
|
||||
error("Voice volume adjustments must be in range 1 to 200, not %s" % a)
|
||||
self.table[v] = a/100.
|
||||
if gbl.debug:
|
||||
print "Voice Volume Adjustment: %s=%s" % (MMA.midiC.valueToInst(v), a)
|
||||
|
||||
|
||||
def get(self, v, vol):
|
||||
""" Return an adjusted value or original. """
|
||||
def get(self, v, vol):
|
||||
""" Return an adjusted value or original. """
|
||||
|
||||
if self.table.has_key(v):
|
||||
vol = int(vol * self.table[v])
|
||||
if self.table.has_key(v):
|
||||
vol = int(vol * self.table[v])
|
||||
|
||||
return vol
|
||||
return vol
|
||||
|
||||
|
||||
voiceVolTable=VoiceVolTable()
|
||||
|
||||
class DrumVolTable:
|
||||
|
||||
def __init__(self):
|
||||
self.table = {}
|
||||
def __init__(self):
|
||||
self.table = {}
|
||||
|
||||
def retlist(self):
|
||||
def retlist(self):
|
||||
|
||||
l=[]
|
||||
for n in sorted(self.table.keys()):
|
||||
l.append("%s=%s" % ( MMA.midiC.valueToDrum(n), self.table[n]))
|
||||
l=[]
|
||||
for n in sorted(self.table.keys()):
|
||||
l.append("%s=%s" % ( MMA.midiC.valueToDrum(n), self.table[n]))
|
||||
|
||||
return ' '.join(l)
|
||||
return ' '.join(l)
|
||||
|
||||
|
||||
def set(self, ln):
|
||||
""" Set a name/alias for voice volume adjustment, called from parser. """
|
||||
def set(self, ln):
|
||||
""" Set a name/alias for voice volume adjustment, called from parser. """
|
||||
|
||||
if not ln:
|
||||
self.table = {}
|
||||
if gbl.debug:
|
||||
print "Drum Volume Adjustment table reset."
|
||||
if not ln:
|
||||
self.table = {}
|
||||
if gbl.debug:
|
||||
print "Drum Volume Adjustment table reset."
|
||||
|
||||
return
|
||||
return
|
||||
|
||||
for l in ln:
|
||||
l=l.upper()
|
||||
if l.count('=') != 1:
|
||||
error("Each translation pair must be in the format Drum=Ajustment")
|
||||
v,a = l.split('=')
|
||||
for l in ln:
|
||||
l=l.upper()
|
||||
if l.count('=') != 1:
|
||||
error("Each translation pair must be in the format Drum=Ajustment")
|
||||
v,a = l.split('=')
|
||||
|
||||
v=MMA.midiC.instToValue(v)
|
||||
a=stoi(a)
|
||||
if a<1 or a>200:
|
||||
error("Drum volume adjustments must be in range 1 to 200, not %." % a)
|
||||
self.table[v] = a/100.
|
||||
if gbl.debug:
|
||||
print "Drum Volume Adjustment: %s=%s" % (MMA.midiC.valueToDrum(v), a)
|
||||
v=MMA.midiC.instToValue(v)
|
||||
a=stoi(a)
|
||||
if a<1 or a>200:
|
||||
error("Drum volume adjustments must be in range 1 to 200, not %s" % a)
|
||||
self.table[v] = a/100.
|
||||
if gbl.debug:
|
||||
print "Drum Volume Adjustment: %s=%s" % (MMA.midiC.valueToDrum(v), a)
|
||||
|
||||
|
||||
def get(self, v, vol):
|
||||
""" Return an adjusted value or original. """
|
||||
def get(self, v, vol):
|
||||
""" Return an adjusted value or original. """
|
||||
|
||||
if self.table.has_key(v):
|
||||
vol = int(vol * self.table[v])
|
||||
if self.table.has_key(v):
|
||||
vol = int(vol * self.table[v])
|
||||
|
||||
return vol
|
||||
return vol
|
||||
|
||||
|
||||
drumVolTable=DrumVolTable()
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
# volume.py
|
||||
|
||||
"""
|
||||
This module is an integeral part of the program
|
||||
This module is an integeral part of the program
|
||||
MMA - Musical Midi Accompaniment.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
|
@ -19,8 +19,8 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Bob van der Poel <bvdp@xplornet.com>
|
||||
|
||||
Bob van der Poel <bob@mellowood.ca>
|
||||
|
||||
"""
|
||||
|
||||
from MMA.common import *
|
||||
|
@ -28,20 +28,20 @@ from MMA.common import *
|
|||
|
||||
""" Volumes are specified in musical terms, but converted to
|
||||
midi velocities. This table has a list of percentage changes
|
||||
to apply to the current volume. Used in both track and global
|
||||
situations. Note that the volume for 'ffff' is 200%--this will
|
||||
most likely generate velocities outside the midi range of 0..127.
|
||||
But that's fine since mma will adjust volumes into the valid
|
||||
range. Using very high percentages will ensure that 'ffff' notes
|
||||
are (most likely) sounded with a maximum velocity.
|
||||
to apply to the current volume. Used in both track and global
|
||||
situations. Note that the volume for 'ffff' is 200%--this will
|
||||
most likely generate velocities outside the midi range of 0..127.
|
||||
But that's fine since mma will adjust volumes into the valid
|
||||
range. Using very high percentages will ensure that 'ffff' notes
|
||||
are (most likely) sounded with a maximum velocity.
|
||||
"""
|
||||
|
||||
vols={ 'OFF': 0.00, 'PPPP': 0.05, 'PPP': 0.10,
|
||||
'PP': 0.25, 'P': 0.40, 'MP': 0.70,
|
||||
'M': 1.00, 'MF': 1.10, 'F': 1.30,
|
||||
'FF': 1.60, 'FFF': 1.80, 'FFFF': 2.00 }
|
||||
'M': 1.00, 'MF': 1.10, 'F': 1.30,
|
||||
'FF': 1.60, 'FFF': 1.80, 'FFFF': 2.00 }
|
||||
|
||||
volume = vols['M'] # default global volume
|
||||
volume = vols['M'] # default global volume
|
||||
lastVolume = volume
|
||||
futureVol = []
|
||||
vTRatio = .6
|
||||
|
@ -49,158 +49,160 @@ vMRatio = 1-vTRatio
|
|||
|
||||
|
||||
def adjvolume(ln):
|
||||
""" Adjust the ratio used in the volume table and track/global ratio. """
|
||||
""" Adjust the ratio used in the volume table and track/global ratio. """
|
||||
|
||||
global vols, vTRatio, vMRatio
|
||||
|
||||
if not ln:
|
||||
error("Use: AdjustVolume DYN=RATIO [..].")
|
||||
global vols, vTRatio, vMRatio
|
||||
|
||||
for l in ln:
|
||||
if not ln:
|
||||
error("Use: AdjustVolume DYN=RATIO [..]")
|
||||
|
||||
try:
|
||||
v,r = l.split('=')
|
||||
except:
|
||||
error("AdjustVolume expecting DYN=RATIO pair, not '%s'." % l)
|
||||
|
||||
v=v.upper()
|
||||
for l in ln:
|
||||
|
||||
if v == 'RATIO':
|
||||
try:
|
||||
v,r = l.split('=')
|
||||
except:
|
||||
error("AdjustVolume expecting DYN=RATIO pair, not '%s'" % l)
|
||||
|
||||
r=stof(r)
|
||||
v=v.upper()
|
||||
|
||||
if r<0 or r>100:
|
||||
error("VolumeRatio must be value 0 to 100.")
|
||||
if v == 'RATIO':
|
||||
|
||||
vTRatio = r/100
|
||||
vMRatio = 1-vTRatio
|
||||
r=stof(r)
|
||||
|
||||
elif v in vols:
|
||||
vols[v] = calcVolume(r, vols[v])
|
||||
|
||||
else:
|
||||
error("Dynamic '%s' for AdjustVolume is unknown." % v )
|
||||
|
||||
if r<0 or r>100:
|
||||
error("VolumeRatio must be value 0 to 100")
|
||||
|
||||
vTRatio = r/100
|
||||
vMRatio = 1-vTRatio
|
||||
|
||||
elif v in vols:
|
||||
vols[v] = calcVolume(r, vols[v])
|
||||
|
||||
else:
|
||||
error("Dynamic '%s' for AdjustVolume is unknown" % v )
|
||||
|
||||
|
||||
if gbl.debug:
|
||||
print "Volume Ratio: %s%% Track / %s%% Master" % ( vTRatio * 100, vMRatio * 100)
|
||||
print "Volume table:",
|
||||
for a in vols:
|
||||
print "%s=%s" % (a, int(vols[a] * 100)),
|
||||
print
|
||||
|
||||
|
||||
if gbl.debug:
|
||||
print "Volume Ratio: %s%% Track / %s%% Master" % ( vTRatio * 100, vMRatio * 100)
|
||||
print "Volume table:",
|
||||
for a in vols:
|
||||
print "%s=%s" % (a, int(vols[a] * 100)),
|
||||
print
|
||||
|
||||
|
||||
|
||||
def calcVolume(new, old):
|
||||
""" Calculate a new volume "new" possibly adjusting from "old". """
|
||||
""" Calculate a new volume "new" possibly adjusting from "old". """
|
||||
|
||||
if new[0] == '-' or new[0] == '+':
|
||||
a = stoi(new, "Volume expecting value for %% adjustment, not %s." % new)
|
||||
v = old + (old * a/100.)
|
||||
if new[0] == '-' or new[0] == '+':
|
||||
a = stoi(new, "Volume expecting value for %% adjustment, not %s" % new)
|
||||
v = old + (old * a/100.)
|
||||
|
||||
elif new[0] in "0123456789":
|
||||
v = stoi(new, "Volume expecting value, not '%s'" % new) / 100.
|
||||
|
||||
else:
|
||||
new = new.upper()
|
||||
|
||||
adj = None
|
||||
|
||||
if '+' in new:
|
||||
new,adj = new.split('+')
|
||||
elif '-' in new:
|
||||
new,adj = new.split('-')
|
||||
adj = '-' + adj
|
||||
elif new[0] in "0123456789":
|
||||
v = stoi(new, "Volume expecting value, not '%s'" % new) / 100.
|
||||
|
||||
if not new in vols:
|
||||
error("Unknown volume '%s'." % new)
|
||||
else:
|
||||
new = new.upper()
|
||||
|
||||
v=vols[new]
|
||||
adj = None
|
||||
|
||||
if adj:
|
||||
a = stoi(adj, "Volume expecting adjustment value, not %s." % adj)
|
||||
v += (v * (a/100.))
|
||||
if '+' in new:
|
||||
new,adj = new.split('+')
|
||||
elif '-' in new:
|
||||
new,adj = new.split('-')
|
||||
adj = '-' + adj
|
||||
|
||||
return v
|
||||
if not new in vols:
|
||||
error("Unknown volume '%s'" % new)
|
||||
|
||||
v=vols[new]
|
||||
|
||||
if adj:
|
||||
a = stoi(adj, "Volume expecting adjustment value, not %s" % adj)
|
||||
v += (v * (a/100.))
|
||||
|
||||
return v
|
||||
|
||||
|
||||
def setVolume(ln):
|
||||
""" Set master volume. """
|
||||
""" Set master volume. """
|
||||
|
||||
global volume, lastVolume
|
||||
|
||||
lastVolume = volume
|
||||
|
||||
if len(ln) != 1:
|
||||
error ("Use: Volume DYNAMIC.")
|
||||
global volume, lastVolume
|
||||
|
||||
volume = calcVolume(ln[0], volume)
|
||||
|
||||
if gbl.debug:
|
||||
print "Volume: %s%%" % volume
|
||||
lastVolume = volume
|
||||
|
||||
if len(ln) != 1:
|
||||
error ("Use: Volume DYNAMIC")
|
||||
|
||||
volume = calcVolume(ln[0], volume)
|
||||
|
||||
if gbl.debug:
|
||||
print "Volume: %s%%" % volume
|
||||
|
||||
|
||||
# The next 2 are called from the parser.
|
||||
|
||||
def setCresc(ln):
|
||||
setCrescendo(1, ln)
|
||||
setCrescendo(1, ln)
|
||||
|
||||
def setDecresc(ln):
|
||||
setCrescendo(-1, ln)
|
||||
|
||||
setCrescendo(-1, ln)
|
||||
|
||||
|
||||
def setCrescendo(dir, ln):
|
||||
""" Combined (de)cresc() """
|
||||
|
||||
global futureVol, volume, lastVolume
|
||||
""" Combined (de)cresc() """
|
||||
|
||||
lastVolume = volume
|
||||
global futureVol, volume, lastVolume
|
||||
|
||||
if len(ln) == 3:
|
||||
setVolume([ln[0]])
|
||||
ln=ln[1:]
|
||||
lastVolume = volume
|
||||
|
||||
|
||||
futureVol = fvolume(dir, volume, ln)
|
||||
if len(ln) not in (2, 3):
|
||||
error("Usage: (De)Cresc [start-Dynamic] final-Dynamic bar-count")
|
||||
|
||||
if len(ln) == 3:
|
||||
setVolume([ln[0]])
|
||||
ln=ln[1:]
|
||||
|
||||
futureVol = fvolume(dir, volume, ln)
|
||||
|
||||
|
||||
# Used by both the 2 funcs above and from TRACK.setCresc()
|
||||
|
||||
def fvolume(dir, startvol, ln):
|
||||
""" Create a list of future vols. Called by (De)Cresc. """
|
||||
""" Create a list of future vols. Called by (De)Cresc. """
|
||||
|
||||
# Get destination volume
|
||||
|
||||
destvol = calcVolume(ln[0], startvol)
|
||||
# Get destination volume
|
||||
|
||||
bcount = stoi(ln[1], "Type error in bar count for (De)Cresc, '%s'." % ln[1] )
|
||||
|
||||
if bcount <= 0:
|
||||
error("Bar count for (De)Cresc must be postive.")
|
||||
|
||||
if dir > 0 and destvol < startvol:
|
||||
warning("Cresc volume less than current setting. " )
|
||||
|
||||
elif dir < 0 and destvol > startvol:
|
||||
warning("Decresc volume greater than current setting. " )
|
||||
|
||||
elif destvol == startvol:
|
||||
warning("(De)Cresc volume equal to current setting. " )
|
||||
destvol = calcVolume(ln[0], startvol)
|
||||
|
||||
bcount -= 1
|
||||
step = ( destvol-startvol ) / bcount
|
||||
bcount = stoi(ln[1], "Type error in bar count for (De)Cresc, '%s'" % ln[1] )
|
||||
|
||||
volList=[startvol]
|
||||
|
||||
for a in range(bcount-1):
|
||||
startvol += step
|
||||
volList.append( startvol)
|
||||
|
||||
volList.append(destvol)
|
||||
if bcount <= 0:
|
||||
error("Bar count for (De)Cresc must be postive")
|
||||
|
||||
if dir > 0 and destvol < startvol:
|
||||
warning("Cresc volume less than current setting" )
|
||||
|
||||
elif dir < 0 and destvol > startvol:
|
||||
warning("Decresc volume greater than current setting" )
|
||||
|
||||
elif destvol == startvol:
|
||||
warning("(De)Cresc volume equal to current setting" )
|
||||
|
||||
bcount -= 1
|
||||
step = ( destvol-startvol ) / bcount
|
||||
|
||||
volList=[startvol]
|
||||
|
||||
for a in range(bcount-1):
|
||||
startvol += step
|
||||
volList.append( startvol)
|
||||
|
||||
volList.append(destvol)
|
||||
|
||||
return volList
|
||||
|
||||
return volList
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -15,15 +15,40 @@ def okay(msg):
|
|||
# Simple python script to install mma from tarball
|
||||
# This should be fixed to be more versatile. Volunteers?
|
||||
|
||||
###########################################
|
||||
####### Banner, get destination
|
||||
# Before we do anything, make sure we have an up-to-date python.
|
||||
|
||||
pyMaj=2
|
||||
pyMin=4
|
||||
|
||||
if sys.version_info[0] < pyMaj or sys.version_info[1] < pyMin:
|
||||
print
|
||||
print "You need a more current version of Python to run MMA and this install script."
|
||||
print "We're looking for something equal or greater than version %s.%s" % \
|
||||
(pyMaj,pyMin)
|
||||
print "Current Python version is ", sys.version
|
||||
print
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
# Banner. Check to make sure user has root permissions.
|
||||
|
||||
print """
|
||||
This script will install mma, the standard library and the
|
||||
python modules.
|
||||
"""
|
||||
|
||||
YOU WILL NEED TO BE LOGGED IN AS ROOT TO CONTINUE!
|
||||
try:
|
||||
u=os.getuid()
|
||||
except:
|
||||
u=1
|
||||
|
||||
if u:
|
||||
okay("""You do not appear to be running this script as 'root' user.
|
||||
Continuing will probably cause all kinds of strange errors
|
||||
and a generally unsatisfactory experience. But, we can try...
|
||||
""")
|
||||
|
||||
print """
|
||||
We recommend that you install the package with this script
|
||||
in the default locations. This script will create a
|
||||
directory 'mma' in /usr/local/share. If this isn't
|
||||
|
@ -48,6 +73,7 @@ bin='/usr/local/bin/mma'
|
|||
|
||||
if os.path.exists(bin):
|
||||
okay("Existing mma executable '%s' is being overwritten." % bin)
|
||||
os.remove(bin)
|
||||
|
||||
print "Copying mma to", bin
|
||||
|
||||
|
|
|
@ -48,15 +48,17 @@ information from the each library file:
|
|||
|
||||
<LI> The file description from the "Doc Note" directive.
|
||||
|
||||
<LI> Any user variables documented in "DocVar" directives.
|
||||
|
||||
<LI> Each groove description: This is the optional text following a
|
||||
<em>DefGroove</em> directive.
|
||||
|
||||
<UL>
|
||||
<LI> The sequence size. This is extracted from the current groove
|
||||
<UL>
|
||||
<LI> The sequence size. This is extracted from the current groove
|
||||
information and was set with the <em>SeqSize</em> directive. It is
|
||||
displayed in a small box after the groove description.
|
||||
|
||||
<LI> A "summary" of the voices used in the groove. Note that a
|
||||
<LI> A "summary" of the voices used in the groove. Note that a
|
||||
different voice or MIDI note is possible for each bar in the
|
||||
sequence size; however, this listing only lists the selection for
|
||||
the first bar.
|
||||
|
@ -65,86 +67,99 @@ information from the each library file:
|
|||
</UL>
|
||||
|
||||
<P>If you find that you don't have some of the grooves listed below in your distribution
|
||||
you need to run the program mklibdoc.py to update these docs. Not all style files are
|
||||
distributed in the default MMA distribution.
|
||||
you need to run the program mklibdoc.py to update these docs. Not all style files are
|
||||
distributed in the default MMA distribution.
|
||||
|
||||
<HR Size=3pt>
|
||||
<CENTER> <H2> Index </H2> </CENTER>
|
||||
|
||||
<ul><li> <A Href=#stdlib> <h2> Stdlib </h2> </a> </li>
|
||||
<li> <A Href=#kara> <h2> Kara </h2> </a> </li></ul><HR Size=3pt><P><h3>These grooves can be used from a program just by using their name.</h3>
|
||||
<li> <A Href=#kara> <h2> Kara </h2> </a> </li>
|
||||
<li> <A Href=#yamaha> <h2> Yamaha </h2> </a> </li></ul><HR Size=3pt><P><h3>These grooves can be used from a program just by using their name.</h3>
|
||||
<A Name =stdlib></a>
|
||||
<h2> Stdlib </h2>
|
||||
<ul>
|
||||
<li> <A Href = stdlib/folk.html> stdlib/folk.mma </a> </li>
|
||||
<li> <A Href = stdlib/rhumba.html> stdlib/rhumba.mma </a> </li>
|
||||
<li> <A Href = stdlib/tango.html> stdlib/tango.mma </a> </li>
|
||||
<li> <A Href = stdlib/waltz.html> stdlib/waltz.mma </a> </li>
|
||||
<li> <A Href = stdlib/50srock.html> stdlib/50srock.mma </a> </li>
|
||||
<li> <A Href = stdlib/60srock.html> stdlib/60srock.mma </a> </li>
|
||||
<li> <A Href = stdlib/8beat.html> stdlib/8beat.mma </a> </li>
|
||||
<li> <A Href = stdlib/blues.html> stdlib/blues.mma </a> </li>
|
||||
<li> <A Href = stdlib/foxtrot.html> stdlib/foxtrot.mma </a> </li>
|
||||
<li> <A Href = stdlib/jazz-54.html> stdlib/jazz-54.mma </a> </li>
|
||||
<li> <A Href = stdlib/swing.html> stdlib/swing.mma </a> </li>
|
||||
<li> <A Href = stdlib/march.html> stdlib/march.mma </a> </li>
|
||||
<li> <A Href = stdlib/ballad.html> stdlib/ballad.mma </a> </li>
|
||||
<li> <A Href = stdlib/ballad128.html> stdlib/ballad128.mma </a> </li>
|
||||
<li> <A Href = stdlib/basicrock.html> stdlib/basicrock.mma </a> </li>
|
||||
<li> <A Href = stdlib/beguine.html> stdlib/beguine.mma </a> </li>
|
||||
<li> <A Href = stdlib/dixie.html> stdlib/dixie.mma </a> </li>
|
||||
<li> <A Href = stdlib/calypso.html> stdlib/calypso.mma </a> </li>
|
||||
<li> <A Href = stdlib/bigband.html> stdlib/bigband.mma </a> </li>
|
||||
<li> <A Href = stdlib/jazzwaltz.html> stdlib/jazzwaltz.mma </a> </li>
|
||||
<li> <A Href = stdlib/softrock.html> stdlib/softrock.mma </a> </li>
|
||||
<li> <A Href = stdlib/countryswing.html> stdlib/countryswing.mma </a> </li>
|
||||
<li> <A Href = stdlib/bluegrass.html> stdlib/bluegrass.mma </a> </li>
|
||||
<li> <A Href = stdlib/polka.html> stdlib/polka.mma </a> </li>
|
||||
<li> <A Href = stdlib/blues.html> stdlib/blues.mma </a> </li>
|
||||
<li> <A Href = stdlib/boggiewoggie.html> stdlib/boggiewoggie.mma </a> </li>
|
||||
<li> <A Href = stdlib/bolero.html> stdlib/bolero.mma </a> </li>
|
||||
<li> <A Href = stdlib/bossanova.html> stdlib/bossanova.mma </a> </li>
|
||||
<li> <A Href = stdlib/broadway.html> stdlib/broadway.mma </a> </li>
|
||||
<li> <A Href = stdlib/calypso.html> stdlib/calypso.mma </a> </li>
|
||||
<li> <A Href = stdlib/chacha.html> stdlib/chacha.mma </a> </li>
|
||||
<li> <A Href = stdlib/countryblues.html> stdlib/countryblues.mma </a> </li>
|
||||
<li> <A Href = stdlib/countryswing.html> stdlib/countryswing.mma </a> </li>
|
||||
<li> <A Href = stdlib/countrywaltz.html> stdlib/countrywaltz.mma </a> </li>
|
||||
<li> <A Href = stdlib/desert.html> stdlib/desert.mma </a> </li>
|
||||
<li> <A Href = stdlib/dixie.html> stdlib/dixie.mma </a> </li>
|
||||
<li> <A Href = stdlib/dixiemarch.html> stdlib/dixiemarch.mma </a> </li>
|
||||
<li> <A Href = stdlib/easyswing.html> stdlib/easyswing.mma </a> </li>
|
||||
<li> <A Href = stdlib/fastblues.html> stdlib/fastblues.mma </a> </li>
|
||||
<li> <A Href = stdlib/folk.html> stdlib/folk.mma </a> </li>
|
||||
<li> <A Href = stdlib/foxtrot.html> stdlib/foxtrot.mma </a> </li>
|
||||
<li> <A Href = stdlib/frenchwaltz.html> stdlib/frenchwaltz.mma </a> </li>
|
||||
<li> <A Href = stdlib/guitarballad.html> stdlib/guitarballad.mma </a> </li>
|
||||
<li> <A Href = stdlib/hillcountry.html> stdlib/hillcountry.mma </a> </li>
|
||||
<li> <A Href = stdlib/jazz-54.html> stdlib/jazz-54.mma </a> </li>
|
||||
<li> <A Href = stdlib/jazzguitar.html> stdlib/jazzguitar.mma </a> </li>
|
||||
<li> <A Href = stdlib/jazzwaltz.html> stdlib/jazzwaltz.mma </a> </li>
|
||||
<li> <A Href = stdlib/jive.html> stdlib/jive.mma </a> </li>
|
||||
<li> <A Href = stdlib/lfusion.html> stdlib/lfusion.mma </a> </li>
|
||||
<li> <A Href = stdlib/lighttango.html> stdlib/lighttango.mma </a> </li>
|
||||
<li> <A Href = stdlib/lullaby.html> stdlib/lullaby.mma </a> </li>
|
||||
<li> <A Href = stdlib/mambo.html> stdlib/mambo.mma </a> </li>
|
||||
<li> <A Href = stdlib/march.html> stdlib/march.mma </a> </li>
|
||||
<li> <A Href = stdlib/merengue.html> stdlib/merengue.mma </a> </li>
|
||||
<li> <A Href = stdlib/metronome.html> stdlib/metronome.mma </a> </li>
|
||||
<li> <A Href = stdlib/rockballad.html> stdlib/rockballad.mma </a> </li>
|
||||
<li> <A Href = stdlib/ballad.html> stdlib/ballad.mma </a> </li>
|
||||
<li> <A Href = stdlib/metronome3.html> stdlib/metronome3.mma </a> </li>
|
||||
<li> <A Href = stdlib/modernjazz.html> stdlib/modernjazz.mma </a> </li>
|
||||
<li> <A Href = stdlib/pianoballad.html> stdlib/pianoballad.mma </a> </li>
|
||||
<li> <A Href = stdlib/polka.html> stdlib/polka.mma </a> </li>
|
||||
<li> <A Href = stdlib/popballad.html> stdlib/popballad.mma </a> </li>
|
||||
<li> <A Href = stdlib/quickstep.html> stdlib/quickstep.mma </a> </li>
|
||||
<li> <A Href = stdlib/rb.html> stdlib/rb.mma </a> </li>
|
||||
<li> <A Href = stdlib/rhumba.html> stdlib/rhumba.mma </a> </li>
|
||||
<li> <A Href = stdlib/rock-128.html> stdlib/rock-128.mma </a> </li>
|
||||
<li> <A Href = stdlib/rockballad.html> stdlib/rockballad.mma </a> </li>
|
||||
<li> <A Href = stdlib/samba.html> stdlib/samba.mma </a> </li>
|
||||
<li> <A Href = stdlib/shuffleboggie.html> stdlib/shuffleboggie.mma </a> </li>
|
||||
<li> <A Href = stdlib/ska.html> stdlib/ska.mma </a> </li>
|
||||
<li> <A Href = stdlib/slowblues.html> stdlib/slowblues.mma </a> </li>
|
||||
<li> <A Href = stdlib/countrywaltz.html> stdlib/countrywaltz.mma </a> </li>
|
||||
<li> <A Href = stdlib/frenchwaltz.html> stdlib/frenchwaltz.mma </a> </li>
|
||||
<li> <A Href = stdlib/vienesewaltz.html> stdlib/vienesewaltz.mma </a> </li>
|
||||
<li> <A Href = stdlib/50srock.html> stdlib/50srock.mma </a> </li>
|
||||
<li> <A Href = stdlib/metronome3.html> stdlib/metronome3.mma </a> </li>
|
||||
<li> <A Href = stdlib/rock-128.html> stdlib/rock-128.mma </a> </li>
|
||||
<li> <A Href = stdlib/slowjazz.html> stdlib/slowjazz.mma </a> </li>
|
||||
<li> <A Href = stdlib/jive.html> stdlib/jive.mma </a> </li>
|
||||
<li> <A Href = stdlib/modernjazz.html> stdlib/modernjazz.mma </a> </li>
|
||||
<li> <A Href = stdlib/lfusion.html> stdlib/lfusion.mma </a> </li>
|
||||
<li> <A Href = stdlib/zydeco.html> stdlib/zydeco.mma </a> </li>
|
||||
<li> <A Href = stdlib/60srock.html> stdlib/60srock.mma </a> </li>
|
||||
<li> <A Href = stdlib/countryblues.html> stdlib/countryblues.mma </a> </li>
|
||||
<li> <A Href = stdlib/rb.html> stdlib/rb.mma </a> </li>
|
||||
<li> <A Href = stdlib/bolero.html> stdlib/bolero.mma </a> </li>
|
||||
<li> <A Href = stdlib/basicrock.html> stdlib/basicrock.mma </a> </li>
|
||||
<li> <A Href = stdlib/boggiewoggie.html> stdlib/boggiewoggie.mma </a> </li>
|
||||
<li> <A Href = stdlib/lighttango.html> stdlib/lighttango.mma </a> </li>
|
||||
<li> <A Href = stdlib/desert.html> stdlib/desert.mma </a> </li>
|
||||
<li> <A Href = stdlib/dixiemarch.html> stdlib/dixiemarch.mma </a> </li>
|
||||
<li> <A Href = stdlib/slowcountry.html> stdlib/slowcountry.mma </a> </li>
|
||||
<li> <A Href = stdlib/hillcountry.html> stdlib/hillcountry.mma </a> </li>
|
||||
<li> <A Href = stdlib/samba.html> stdlib/samba.mma </a> </li>
|
||||
<li> <A Href = stdlib/quickstep.html> stdlib/quickstep.mma </a> </li>
|
||||
<li> <A Href = stdlib/broadway.html> stdlib/broadway.mma </a> </li>
|
||||
<li> <A Href = stdlib/softshoe.html> stdlib/softshoe.mma </a> </li>
|
||||
<li> <A Href = stdlib/pianoballad.html> stdlib/pianoballad.mma </a> </li>
|
||||
<li> <A Href = stdlib/guitarballad.html> stdlib/guitarballad.mma </a> </li>
|
||||
<li> <A Href = stdlib/son.html> stdlib/son.mma </a> </li>
|
||||
<li> <A Href = stdlib/mambo.html> stdlib/mambo.mma </a> </li>
|
||||
<li> <A Href = stdlib/chacha.html> stdlib/chacha.mma </a> </li>
|
||||
<li> <A Href = stdlib/merengue.html> stdlib/merengue.mma </a> </li>
|
||||
<li> <A Href = stdlib/slowbolero.html> stdlib/slowbolero.mma </a> </li>
|
||||
<li> <A Href = stdlib/slowcountry.html> stdlib/slowcountry.mma </a> </li>
|
||||
<li> <A Href = stdlib/slowjazz.html> stdlib/slowjazz.mma </a> </li>
|
||||
<li> <A Href = stdlib/softrock.html> stdlib/softrock.mma </a> </li>
|
||||
<li> <A Href = stdlib/softshoe.html> stdlib/softshoe.mma </a> </li>
|
||||
<li> <A Href = stdlib/son.html> stdlib/son.mma </a> </li>
|
||||
<li> <A Href = stdlib/swing.html> stdlib/swing.mma </a> </li>
|
||||
<li> <A Href = stdlib/tango.html> stdlib/tango.mma </a> </li>
|
||||
<li> <A Href = stdlib/vienesewaltz.html> stdlib/vienesewaltz.mma </a> </li>
|
||||
<li> <A Href = stdlib/waltz.html> stdlib/waltz.mma </a> </li>
|
||||
<li> <A Href = stdlib/zydeco.html> stdlib/zydeco.mma </a> </li>
|
||||
</ul>
|
||||
<P><h3>Use the following grooves with a "use" directive.</h3>
|
||||
<A Name =kara></a>
|
||||
<h2> Kara </h2>
|
||||
<ul>
|
||||
<li> <A Href = kara/K50s_rock.html> kara/K50s_rock.mma </a> </li>
|
||||
<li> <A Href = kara/twi.html> kara/twi.mma </a> </li>
|
||||
<li> <A Href = kara/Kfunk1.html> kara/Kfunk1.mma </a> </li>
|
||||
<li> <A Href = kara/twi.html> kara/twi.mma </a> </li>
|
||||
</ul>
|
||||
<A Name =yamaha></a>
|
||||
<h2> Yamaha </h2>
|
||||
<ul>
|
||||
<li> <A Href = yamaha/mambo.html> yamaha/mambo.mma </a> </li>
|
||||
<li> <A Href = yamaha/quando-g.s280.html> yamaha/quando-g.s280.mma </a> </li>
|
||||
<li> <A Href = yamaha/w-rock.html> yamaha/w-rock.mma </a> </li>
|
||||
<li> <A Href = yamaha/western.html> yamaha/western.mma </a> </li>
|
||||
</ul>
|
||||
<BR>
|
||||
<HR Size=3pt>
|
||||
|
@ -153,4 +168,4 @@ information from the each library file:
|
|||
<P>It is a part of the MMA distribution
|
||||
and is protected by the same copyrights as MMA (the GNU General Public License).
|
||||
|
||||
<P> Created: Sun Oct 15 11:26:36 2006<HTML>
|
||||
<P> Created: Wed Mar 7 11:50:18 2007<HTML>
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:45 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:15 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>K50S_Rock</H1>
|
||||
|
@ -21,7 +21,6 @@
|
|||
<LI><A Href=#50sFill-In-DD>50sFill-In-DD</a>
|
||||
</ul>
|
||||
<A Name=50sMain-A></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> 50sMain-A </H2>
|
||||
|
@ -39,7 +38,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=50sFill-In-AA></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> 50sFill-In-AA </H2>
|
||||
|
@ -57,7 +55,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=50sIntro-A></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> 50sIntro-A </H2>
|
||||
|
@ -75,7 +72,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=50sEnding-A></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> 50sEnding-A </H2>
|
||||
|
@ -96,7 +92,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=50sMain-B></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> 50sMain-B </H2>
|
||||
|
@ -114,7 +109,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=50sFill-In-BB></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> 50sFill-In-BB </H2>
|
||||
|
@ -133,7 +127,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=50sFill-In-BA></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> 50sFill-In-BA </H2>
|
||||
|
@ -152,7 +145,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=50sIntro-B></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> 50sIntro-B </H2>
|
||||
|
@ -171,7 +163,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=50sEnding-B></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> 50sEnding-B </H2>
|
||||
|
@ -193,7 +184,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=50sMain-C></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> 50sMain-C </H2>
|
||||
|
@ -212,7 +202,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=50sFill-In-CC></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> 50sFill-In-CC </H2>
|
||||
|
@ -232,7 +221,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=50sIntro-C></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> 50sIntro-C </H2>
|
||||
|
@ -251,7 +239,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=50sEnding-C></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> 50sEnding-C </H2>
|
||||
|
@ -273,7 +260,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=50sMain-D></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> 50sMain-D </H2>
|
||||
|
@ -291,7 +277,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=50sFill-In-DD></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> 50sFill-In-DD </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:45 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:16 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Kfunk1</H1>
|
||||
|
@ -14,7 +14,6 @@
|
|||
<LI><A Href=#Ending-A>Ending-A</a>
|
||||
</ul>
|
||||
<A Name=Main-A></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Main-A </H2>
|
||||
|
@ -35,7 +34,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Fill-In-AA></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Fill-In-AA </H2>
|
||||
|
@ -57,7 +55,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Fill-In-AB></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Fill-In-AB </H2>
|
||||
|
@ -80,7 +77,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Main-B></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Main-B </H2>
|
||||
|
@ -104,7 +100,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Fill-In-BA></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Fill-In-BA </H2>
|
||||
|
@ -130,7 +125,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Fill-In-BB></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Fill-In-BB </H2>
|
||||
|
@ -155,7 +149,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Intro-A></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Intro-A </H2>
|
||||
|
@ -179,7 +172,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Ending-A></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Ending-A </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:45 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:16 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Twi</H1>
|
||||
|
@ -14,7 +14,6 @@
|
|||
<LI><A Href=#Ending-B>Ending-B</a>
|
||||
</ul>
|
||||
<A Name=Main-A></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Main-A </H2>
|
||||
|
@ -32,7 +31,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Fill-In-AA></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Fill-In-AA </H2>
|
||||
|
@ -51,7 +49,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Fill-In-AB></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Fill-In-AB </H2>
|
||||
|
@ -73,7 +70,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Main-B></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Main-B </H2>
|
||||
|
@ -94,7 +90,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Fill-In-BA></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Fill-In-BA </H2>
|
||||
|
@ -116,7 +111,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Fill-In-BB></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Fill-In-BB </H2>
|
||||
|
@ -136,7 +130,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Intro-B></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Intro-B </H2>
|
||||
|
@ -155,7 +148,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Ending-B></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Ending-B </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:37 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:03 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>50Srock</H1>
|
||||
|
@ -12,7 +12,6 @@
|
|||
<LI><A Href=#50sRockEnd>50sRockEnd</a>
|
||||
</ul>
|
||||
<A Name=50sRock></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> 50sRock </H2>
|
||||
|
@ -32,7 +31,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=50sRockSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> 50sRockSus </H2>
|
||||
|
@ -53,7 +51,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=50sRock1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> 50sRock1 </H2>
|
||||
|
@ -73,7 +70,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=50sRock1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> 50sRock1Sus </H2>
|
||||
|
@ -94,7 +90,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=50sRockIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> 50sRockIntro </H2>
|
||||
|
@ -114,7 +109,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=50sRockEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> 50sRockEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:39 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:03 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>60Srock</H1>
|
||||
|
@ -11,7 +11,6 @@
|
|||
<LI><A Href=#60sRockEnd>60sRockEnd</a>
|
||||
</ul>
|
||||
<A Name=60sRock></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> 60sRock </H2>
|
||||
|
@ -30,7 +29,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=60sRock1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> 60sRock1 </H2>
|
||||
|
@ -48,7 +46,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=60sRockSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> 60sRockSus </H2>
|
||||
|
@ -68,7 +65,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=60sRock1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> 60sRock1Sus </H2>
|
||||
|
@ -87,7 +83,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=60sRockEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> 60sRockEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:29 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:03 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>8Beat</H1>
|
||||
|
@ -8,10 +8,10 @@
|
|||
<LI><A Href=#8BeatSus>8BeatSus</a>
|
||||
<LI><A Href=#8Beat1>8Beat1</a>
|
||||
<LI><A Href=#8Beat1Sus>8Beat1Sus</a>
|
||||
<LI><A Href=#8BeatIntro>8BeatIntro</a>
|
||||
<LI><A Href=#8BeatEnd>8BeatEnd</a>
|
||||
</ul>
|
||||
<A Name=8Beat></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> 8Beat </H2>
|
||||
|
@ -30,7 +30,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=8BeatSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> 8BeatSus </H2>
|
||||
|
@ -50,7 +49,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=8Beat1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> 8Beat1 </H2>
|
||||
|
@ -70,7 +68,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=8Beat1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> 8Beat1Sus </H2>
|
||||
|
@ -90,8 +87,25 @@
|
|||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=8BeatIntro></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> 8BeatIntro </H2>
|
||||
Straight-ahead four bar introduction. <B>(4)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Bass </TD> <TD> FingeredBass </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> Honky-TonkPiano </TD></TR>
|
||||
<TR><TD> Chord-Guitar </TD> <TD> CleanGuitar </TD></TR>
|
||||
<TR><TD> Drum-Chh </TD> <TD> ClosedHiHat </TD></TR>
|
||||
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||
<TR><TD> Drum-Ohh </TD> <TD> OpenHiHat </TD></TR>
|
||||
<TR><TD> Drum-Snare </TD> <TD> SnareDrum1 </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=8BeatEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> 8BeatEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:35 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:04 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Ballad</H1>
|
||||
|
@ -12,9 +12,9 @@
|
|||
<LI><A Href=#BalladIntro1>BalladIntro1</a>
|
||||
<LI><A Href=#BalladIntro2>BalladIntro2</a>
|
||||
<LI><A Href=#BalladEnd>BalladEnd</a>
|
||||
<LI><A Href=#Ballad1End>Ballad1End</a>
|
||||
</ul>
|
||||
<A Name=Ballad></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Ballad </H2>
|
||||
|
@ -40,7 +40,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BalladSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BalladSus </H2>
|
||||
|
@ -67,7 +66,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Ballad1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Ballad1 </H2>
|
||||
|
@ -93,7 +91,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Ballad1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Ballad1Sus </H2>
|
||||
|
@ -120,7 +117,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BalladIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BalladIntro </H2>
|
||||
|
@ -142,7 +138,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BalladIntro1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BalladIntro1 </H2>
|
||||
|
@ -163,7 +158,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BalladIntro2></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BalladIntro2 </H2>
|
||||
|
@ -185,7 +179,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BalladEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BalladEnd </H2>
|
||||
|
@ -210,5 +203,30 @@
|
|||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Ballad1End></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Ballad1End </H2>
|
||||
A simpler 4 bar ending. We still have a harp, but it's doing quarter note arpeggios. <B>(4)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Arpeggio </TD> <TD> OrchestralHarp </TD></TR>
|
||||
<TR><TD> Bass </TD> <TD> FretlessBass </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> Atmosphere </TD></TR>
|
||||
<TR><TD> Drum-Bongo </TD> <TD> LowBongo </TD></TR>
|
||||
<TR><TD> Drum-Cabasa </TD> <TD> Cabasa </TD></TR>
|
||||
<TR><TD> Drum-Cym </TD> <TD> RideCymbal1 </TD></TR>
|
||||
<TR><TD> Drum-Hh </TD> <TD> PedalHiHat </TD></TR>
|
||||
<TR><TD> Drum-Hiconga </TD> <TD> MuteHighConga </TD></TR>
|
||||
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||
<TR><TD> Drum-Loconga </TD> <TD> LowConga </TD></TR>
|
||||
<TR><TD> Drum-Mutetri </TD> <TD> MuteTriangle </TD></TR>
|
||||
<TR><TD> Drum-Opentri </TD> <TD> OpenTriangle </TD></TR>
|
||||
<TR><TD> Drum-Shake </TD> <TD> Shaker </TD></TR>
|
||||
<TR><TD> Drum-Tamb </TD> <TD> Tambourine </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
|
||||
</Body></HTML>
|
||||
|
|
113
mma/docs/html/lib/stdlib/ballad128.html
Normal file
113
mma/docs/html/lib/stdlib/ballad128.html
Normal file
|
@ -0,0 +1,113 @@
|
|||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:04 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Ballad128</H1>
|
||||
<P>A 12/8 Ballad. Written for "Memory" This is written in 4/4, so, when figuring tempo use a dotted quarter for the beat count.
|
||||
<ul>
|
||||
<LI><A Href=#Ballad128>Ballad128</a>
|
||||
<LI><A Href=#Ballad128Plus>Ballad128Plus</a>
|
||||
<LI><A Href=#Ballad128Sus>Ballad128Sus</a>
|
||||
<LI><A Href=#Ballad128SusPlus>Ballad128SusPlus</a>
|
||||
<LI><A Href=#Ballad128Intro>Ballad128Intro</a>
|
||||
<LI><A Href=#Ballad128End>Ballad128End</a>
|
||||
</ul>
|
||||
<A Name=Ballad128></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Ballad128 </H2>
|
||||
A very simple, relaxed 12/8 ballad pattern. <B>(4)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> OrchestralHarp </TD></TR>
|
||||
<TR><TD> Drum-Kick </TD> <TD> SideKick </TD></TR>
|
||||
<TR><TD> Drum-Snare </TD> <TD> SnareDrum2 </TD></TR>
|
||||
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Ballad128Plus></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Ballad128Plus </H2>
|
||||
Adds arpeggiated . <B>(4)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Arpeggio </TD> <TD> Piano1 </TD></TR>
|
||||
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> OrchestralHarp </TD></TR>
|
||||
<TR><TD> Drum-Kick </TD> <TD> SideKick </TD></TR>
|
||||
<TR><TD> Drum-Snare </TD> <TD> SnareDrum2 </TD></TR>
|
||||
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Ballad128Sus></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Ballad128Sus </H2>
|
||||
Add in sustained TremoloStrings <B>(4)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> OrchestralHarp </TD></TR>
|
||||
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
|
||||
<TR><TD> Drum-Kick </TD> <TD> SideKick </TD></TR>
|
||||
<TR><TD> Drum-Snare </TD> <TD> SnareDrum2 </TD></TR>
|
||||
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Ballad128SusPlus></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Ballad128SusPlus </H2>
|
||||
Sustained strings and apreggiating piano. <B>(4)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Arpeggio </TD> <TD> Piano1 </TD></TR>
|
||||
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> OrchestralHarp </TD></TR>
|
||||
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
|
||||
<TR><TD> Drum-Kick </TD> <TD> SideKick </TD></TR>
|
||||
<TR><TD> Drum-Snare </TD> <TD> SnareDrum2 </TD></TR>
|
||||
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Ballad128Intro></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Ballad128Intro </H2>
|
||||
This 4 bar intro plays bass notes and harp arpeggios. It pretty much assumes a 7th chord on the 4th bar. <B>(4)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Arpeggio </TD> <TD> OrchestralHarp </TD></TR>
|
||||
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
||||
<TR><TD> Bass-Intro </TD> <TD> OrchestralHarp </TD></TR>
|
||||
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Ballad128End></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Ballad128End </H2>
|
||||
A 2 bar ending. <B>(2)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> OrchestralHarp </TD></TR>
|
||||
<TR><TD> Drum-Kick </TD> <TD> SideKick </TD></TR>
|
||||
<TR><TD> Drum-Snare </TD> <TD> SnareDrum2 </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
|
||||
</Body></HTML>
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:40 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:04 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Basicrock</H1>
|
||||
|
@ -11,7 +11,6 @@
|
|||
<LI><A Href=#BasicRockEnd>BasicRockEnd</a>
|
||||
</ul>
|
||||
<A Name=BasicRock></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BasicRock </H2>
|
||||
|
@ -31,7 +30,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BasicRockSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BasicRockSus </H2>
|
||||
|
@ -52,7 +50,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BasicRock4></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BasicRock4 </H2>
|
||||
|
@ -71,7 +68,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BasicRock4Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BasicRock4Sus </H2>
|
||||
|
@ -91,7 +87,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BasicRockEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BasicRockEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:31 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:04 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Beguine</H1>
|
||||
|
@ -11,9 +11,9 @@
|
|||
<LI><A Href=#BeguineFill>BeguineFill</a>
|
||||
<LI><A Href=#BeguineIntro>BeguineIntro</a>
|
||||
<LI><A Href=#BeguineEnd>BeguineEnd</a>
|
||||
<LI><A Href=#Beguine2End>Beguine2End</a>
|
||||
</ul>
|
||||
<A Name=Beguine></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Beguine </H2>
|
||||
|
@ -35,7 +35,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BeguineSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BeguineSus </H2>
|
||||
|
@ -58,7 +57,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Beguine1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Beguine1 </H2>
|
||||
|
@ -81,7 +79,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Beguine1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Beguine1Sus </H2>
|
||||
|
@ -105,7 +102,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BeguineFill></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BeguineFill </H2>
|
||||
|
@ -127,7 +123,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BeguineIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BeguineIntro </H2>
|
||||
|
@ -149,7 +144,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BeguineEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BeguineEnd </H2>
|
||||
|
@ -171,5 +165,25 @@
|
|||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Beguine2End></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Beguine2End </H2>
|
||||
A more abrupt 2 bar ending. <B>(2)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Bass </TD> <TD> FretlessBass </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> Piano2 </TD></TR>
|
||||
<TR><TD> Drum </TD> <TD> Claves </TD></TR>
|
||||
<TR><TD> Drum-Hconga </TD> <TD> MuteHighConga </TD></TR>
|
||||
<TR><TD> Drum-Hh </TD> <TD> ClosedHiHat </TD></TR>
|
||||
<TR><TD> Drum-Lconga </TD> <TD> LowConga </TD></TR>
|
||||
<TR><TD> Drum-Maraca </TD> <TD> Maracas </TD></TR>
|
||||
<TR><TD> Drum-Toms1 </TD> <TD> MidTom1 </TD></TR>
|
||||
<TR><TD> Drum-Toms2 </TD> <TD> MidTom2 </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
|
||||
</Body></HTML>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:32 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:04 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Bigband</H1>
|
||||
|
@ -13,6 +13,7 @@
|
|||
<LI><A Href=#BigBand8>BigBand8</a>
|
||||
<LI><A Href=#BigBand8Sus>BigBand8Sus</a>
|
||||
<LI><A Href=#BigBandFill>BigBandFill</a>
|
||||
<LI><A Href=#BigBand1Fill>BigBand1Fill</a>
|
||||
<LI><A Href=#BigBandIntro>BigBandIntro</a>
|
||||
<LI><A Href=#BigBandEnd>BigBandEnd</a>
|
||||
<LI><A Href=#BigBand1End>BigBand1End</a>
|
||||
|
@ -20,7 +21,6 @@
|
|||
<LI><A Href=#BigBand4End>BigBand4End</a>
|
||||
</ul>
|
||||
<A Name=BigBand></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BigBand </H2>
|
||||
|
@ -39,7 +39,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BigBandSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BigBandSus </H2>
|
||||
|
@ -58,7 +57,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BigBandPlus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BigBandPlus </H2>
|
||||
|
@ -78,7 +76,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BigBandSusPlus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BigBandSusPlus </H2>
|
||||
|
@ -98,7 +95,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BigBand1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BigBand1 </H2>
|
||||
|
@ -118,7 +114,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BigBand1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BigBand1Sus </H2>
|
||||
|
@ -139,7 +134,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BigBand8></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BigBand8 </H2>
|
||||
|
@ -159,7 +153,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BigBand8Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BigBand8Sus </H2>
|
||||
|
@ -180,7 +173,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BigBandFill></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BigBandFill </H2>
|
||||
|
@ -196,8 +188,25 @@
|
|||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BigBand1Fill></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BigBand1Fill </H2>
|
||||
Louder, 4 in the bar fill. <B>(1)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> Trombone </TD></TR>
|
||||
<TR><TD> Chord-Hits1 </TD> <TD> MutedTrumpet </TD></TR>
|
||||
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
||||
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||
<TR><TD> Drum-Ride </TD> <TD> RideCymbal1 </TD></TR>
|
||||
<TR><TD> Drum-Snare </TD> <TD> SnareDrum1 </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BigBandIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BigBandIntro </H2>
|
||||
|
@ -216,7 +225,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BigBandEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BigBandEnd </H2>
|
||||
|
@ -234,7 +242,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BigBand1End></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BigBand1End </H2>
|
||||
|
@ -253,7 +260,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BigBand2End></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BigBand2End </H2>
|
||||
|
@ -272,7 +278,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BigBand4End></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BigBand4End </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:33 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:05 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Bluegrass</H1>
|
||||
|
@ -12,7 +12,6 @@
|
|||
<LI><A Href=#BlueGrassEnd>BlueGrassEnd</a>
|
||||
</ul>
|
||||
<A Name=BlueGrass></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BlueGrass </H2>
|
||||
|
@ -30,7 +29,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BlueGrassClap></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BlueGrassClap </H2>
|
||||
|
@ -49,7 +47,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BlueGrassBottle></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BlueGrassBottle </H2>
|
||||
|
@ -69,7 +66,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BlueGrassBottleClap></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BlueGrassBottleClap </H2>
|
||||
|
@ -89,7 +85,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BlueGrassSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BlueGrassSus </H2>
|
||||
|
@ -108,7 +103,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BlueGrassEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BlueGrassEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:30 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:05 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Blues</H1>
|
||||
|
@ -14,7 +14,6 @@
|
|||
<LI><A Href=#BluesEnd>BluesEnd</a>
|
||||
</ul>
|
||||
<A Name=Blues></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Blues </H2>
|
||||
|
@ -32,7 +31,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BluesTriple></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BluesTriple </H2>
|
||||
|
@ -50,7 +48,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BluesSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BluesSus </H2>
|
||||
|
@ -69,7 +66,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BluesTripleSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BluesTripleSus </H2>
|
||||
|
@ -88,7 +84,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Blues1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Blues1 </H2>
|
||||
|
@ -107,7 +102,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Blues1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Blues1Sus </H2>
|
||||
|
@ -127,7 +121,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BluesIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BluesIntro </H2>
|
||||
|
@ -145,7 +138,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BluesEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BluesEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:40 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:05 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Boggiewoggie</H1>
|
||||
|
@ -11,7 +11,6 @@
|
|||
<LI><A Href=#BoggieWoggieEnd>BoggieWoggieEnd</a>
|
||||
</ul>
|
||||
<A Name=BoggieWoggie></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BoggieWoggie </H2>
|
||||
|
@ -25,7 +24,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BoggieWoggie1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BoggieWoggie1 </H2>
|
||||
|
@ -39,7 +37,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BoggieWoggie2></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BoggieWoggie2 </H2>
|
||||
|
@ -53,7 +50,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BoggieWoggie3></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BoggieWoggie3 </H2>
|
||||
|
@ -67,7 +63,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BoggieWoggieEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BoggieWoggieEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:40 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:05 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Bolero</H1>
|
||||
|
@ -18,7 +18,6 @@
|
|||
<LI><A Href=#Bolero1End>Bolero1End</a>
|
||||
</ul>
|
||||
<A Name=Bolero></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Bolero </H2>
|
||||
|
@ -38,7 +37,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BoleroFill></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BoleroFill </H2>
|
||||
|
@ -59,7 +57,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BoleroSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BoleroSus </H2>
|
||||
|
@ -80,7 +77,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BoleroSusFill></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BoleroSusFill </H2>
|
||||
|
@ -102,7 +98,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BoleroIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BoleroIntro </H2>
|
||||
|
@ -122,7 +117,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BoleroEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BoleroEnd </H2>
|
||||
|
@ -143,7 +137,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Bolero1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Bolero1 </H2>
|
||||
|
@ -161,7 +154,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Bolero1Fill></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Bolero1Fill </H2>
|
||||
|
@ -180,7 +172,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Bolero1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Bolero1Sus </H2>
|
||||
|
@ -199,7 +190,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Bolero1SusFill></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Bolero1SusFill </H2>
|
||||
|
@ -219,7 +209,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Bolero1Intro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Bolero1Intro </H2>
|
||||
|
@ -237,7 +226,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Bolero1End></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Bolero1End </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:33 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:05 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Bossanova</H1>
|
||||
|
@ -7,6 +7,8 @@
|
|||
<LI><A Href=#BossaNova>BossaNova</a>
|
||||
<LI><A Href=#BossaNovaSus>BossaNovaSus</a>
|
||||
<LI><A Href=#BossaNova1Sus>BossaNova1Sus</a>
|
||||
<LI><A Href=#BossaNova2Sus>BossaNova2Sus</a>
|
||||
<LI><A Href=#BossaNova3Sus>BossaNova3Sus</a>
|
||||
<LI><A Href=#BossaNovaFill>BossaNovaFill</a>
|
||||
<LI><A Href=#BossaNovaIntro>BossaNovaIntro</a>
|
||||
<LI><A Href=#BossaNovaIntro8>BossaNovaIntro8</a>
|
||||
|
@ -15,7 +17,6 @@
|
|||
<LI><A Href=#BossaNova2End>BossaNova2End</a>
|
||||
</ul>
|
||||
<A Name=BossaNova></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BossaNova </H2>
|
||||
|
@ -38,7 +39,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BossaNovaSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BossaNovaSus </H2>
|
||||
|
@ -62,7 +62,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BossaNova1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BossaNova1Sus </H2>
|
||||
|
@ -85,8 +84,54 @@
|
|||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BossaNova2Sus></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BossaNova2Sus </H2>
|
||||
Basic Bossa with decending string pattern. <B>(4)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Bass </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Bass-Sus </TD> <TD> Strings </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Drum </TD> <TD> Cabasa </TD></TR>
|
||||
<TR><TD> Drum-Chh </TD> <TD> ClosedHiHat </TD></TR>
|
||||
<TR><TD> Drum-Clave </TD> <TD> Claves </TD></TR>
|
||||
<TR><TD> Drum-Kick </TD> <TD> KickDrum2 </TD></TR>
|
||||
<TR><TD> Drum-Lowbongo </TD> <TD> LowBongo </TD></TR>
|
||||
<TR><TD> Drum-Lowconga </TD> <TD> LowConga </TD></TR>
|
||||
<TR><TD> Drum-Muteconga </TD> <TD> MuteHighConga </TD></TR>
|
||||
<TR><TD> Drum-Openhiconga </TD> <TD> OpenHighConga </TD></TR>
|
||||
<TR><TD> Drum-Sidekick </TD> <TD> SideKick </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BossaNova3Sus></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BossaNova3Sus </H2>
|
||||
A combination of BossaNova1Sus and BossaNova2Sus. Alternating bars of decending strings with full chords. <B>(4)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Bass </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Bass-Sus </TD> <TD> Strings </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Chord-Sus </TD> <TD> Strings </TD></TR>
|
||||
<TR><TD> Drum </TD> <TD> Cabasa </TD></TR>
|
||||
<TR><TD> Drum-Chh </TD> <TD> ClosedHiHat </TD></TR>
|
||||
<TR><TD> Drum-Clave </TD> <TD> Claves </TD></TR>
|
||||
<TR><TD> Drum-Kick </TD> <TD> KickDrum2 </TD></TR>
|
||||
<TR><TD> Drum-Lowbongo </TD> <TD> LowBongo </TD></TR>
|
||||
<TR><TD> Drum-Lowconga </TD> <TD> LowConga </TD></TR>
|
||||
<TR><TD> Drum-Muteconga </TD> <TD> MuteHighConga </TD></TR>
|
||||
<TR><TD> Drum-Openhiconga </TD> <TD> OpenHighConga </TD></TR>
|
||||
<TR><TD> Drum-Sidekick </TD> <TD> SideKick </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BossaNovaFill></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BossaNovaFill </H2>
|
||||
|
@ -110,7 +155,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BossaNovaIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BossaNovaIntro </H2>
|
||||
|
@ -133,7 +177,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BossaNovaIntro8></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BossaNovaIntro8 </H2>
|
||||
|
@ -156,7 +199,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BossaNovaEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BossaNovaEnd </H2>
|
||||
|
@ -180,7 +222,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BossaNova1End></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BossaNova1End </H2>
|
||||
|
@ -205,7 +246,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BossaNova2End></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BossaNova2End </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:42 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:06 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Broadway</H1>
|
||||
|
@ -12,7 +12,6 @@
|
|||
<LI><A Href=#BroadWayEnd>BroadWayEnd</a>
|
||||
</ul>
|
||||
<A Name=Broadway></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Broadway </H2>
|
||||
|
@ -32,7 +31,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Broadway1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Broadway1 </H2>
|
||||
|
@ -53,7 +51,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BroadwaySus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BroadwaySus </H2>
|
||||
|
@ -74,7 +71,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Broadway1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Broadway1Sus </H2>
|
||||
|
@ -96,7 +92,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BroadwayIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BroadwayIntro </H2>
|
||||
|
@ -116,7 +111,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=BroadWayEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> BroadWayEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:32 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:06 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Calypso</H1>
|
||||
|
@ -11,7 +11,6 @@
|
|||
<LI><A Href=#CalypsoEnd>CalypsoEnd</a>
|
||||
</ul>
|
||||
<A Name=Calypso></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Calypso </H2>
|
||||
|
@ -28,7 +27,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=CalypsoSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CalypsoSus </H2>
|
||||
|
@ -46,7 +44,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Calypso1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Calypso1 </H2>
|
||||
|
@ -63,7 +60,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Calypso1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Calypso1Sus </H2>
|
||||
|
@ -81,7 +77,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=CalypsoEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CalypsoEnd </H2>
|
||||
|
|
|
@ -1,18 +1,41 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:44 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:06 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Chacha</H1>
|
||||
<P>A popular, albeit somewhat dated and make trite by Americanized versions, The Cha-Cha-Cha remains a popular rhythm with broad audience appeal. I've used ``Rico Vacilon'' as a demo. This file was mostly developed from the patterns in``Latin Rhythms: Mystery Unraveled'' by Victor Lopez.
|
||||
<P>The Cha-Cha-Cha remains a popular rhythm with broad audience appeal, despite the fact that it is somewhat dated and made trite by Americanized versions. I've used "Rico Vacilon" as a demo. This file was mostly developed from the patterns in "Latin Rhythms: Mystery Unraveled" by Victor Lopez.
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Variables </H2>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="100%">
|
||||
<TR>
|
||||
<TD Valign=Top> <B> ArpeggioOctave </B> </TD>
|
||||
<TD Valign=Top> The Octave setting for the flute arpeggios (default=7) </TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD Valign=Top> <B> ArpeggioVoice </B> </TD>
|
||||
<TD Valign=Top> Voice for the ChaCha1 Arpeggios (default=Flute) </TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD Valign=Top> <B> ScaleVoice </B> </TD>
|
||||
<TD Valign=Top> Voice for the accending scale in ChaCha1Fill (default=Flute) </TD>
|
||||
</TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<ul>
|
||||
<LI><A Href=#ChaCha>ChaCha</a>
|
||||
<LI><A Href=#ChaCha1>ChaCha1</a>
|
||||
<LI><A Href=#ChaChaSus>ChaChaSus</a>
|
||||
<LI><A Href=#ChaCha1Sus>ChaCha1Sus</a>
|
||||
<LI><A Href=#ChaChaFill>ChaChaFill</a>
|
||||
<LI><A Href=#ChaCha1Fill>ChaCha1Fill</a>
|
||||
<LI><A Href=#ChaChaIntro>ChaChaIntro</a>
|
||||
<LI><A Href=#ChaChaEnd>ChaChaEnd</a>
|
||||
</ul>
|
||||
<A Name=ChaCha></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> ChaCha </H2>
|
||||
|
@ -35,7 +58,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=ChaCha1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> ChaCha1 </H2>
|
||||
|
@ -59,7 +81,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=ChaChaSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> ChaChaSus </H2>
|
||||
|
@ -83,7 +104,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=ChaCha1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> ChaCha1Sus </H2>
|
||||
|
@ -107,8 +127,52 @@
|
|||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=ChaChaFill></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> ChaChaFill </H2>
|
||||
A one bar fill. <B>(1)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Bass </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> Piano1 </TD></TR>
|
||||
<TR><TD> Drum-Clave </TD> <TD> Claves </TD></TR>
|
||||
<TR><TD> Drum-Hconga </TD> <TD> MuteHighConga </TD></TR>
|
||||
<TR><TD> Drum-Hh </TD> <TD> RideCymbal1 </TD></TR>
|
||||
<TR><TD> Drum-Htom </TD> <TD> HighTom2 </TD></TR>
|
||||
<TR><TD> Drum-Lconga </TD> <TD> LowConga </TD></TR>
|
||||
<TR><TD> Drum-Lguiro </TD> <TD> LongGuiro </TD></TR>
|
||||
<TR><TD> Drum-Mtom </TD> <TD> MidTom2 </TD></TR>
|
||||
<TR><TD> Drum-Sguiro </TD> <TD> ShortGuiro </TD></TR>
|
||||
<TR><TD> Drum-Snare </TD> <TD> SnareDrum1 </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=ChaCha1Fill></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> ChaCha1Fill </H2>
|
||||
Fill with accending flute run. Makes a good section introduction. <B>(1)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Bass </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> Piano1 </TD></TR>
|
||||
<TR><TD> Drum-Clave </TD> <TD> Claves </TD></TR>
|
||||
<TR><TD> Drum-Hconga </TD> <TD> MuteHighConga </TD></TR>
|
||||
<TR><TD> Drum-Hh </TD> <TD> RideCymbal1 </TD></TR>
|
||||
<TR><TD> Drum-Htom </TD> <TD> HighTom2 </TD></TR>
|
||||
<TR><TD> Drum-Lconga </TD> <TD> LowConga </TD></TR>
|
||||
<TR><TD> Drum-Lguiro </TD> <TD> LongGuiro </TD></TR>
|
||||
<TR><TD> Drum-Mtom </TD> <TD> MidTom2 </TD></TR>
|
||||
<TR><TD> Drum-Sguiro </TD> <TD> ShortGuiro </TD></TR>
|
||||
<TR><TD> Drum-Snare </TD> <TD> SnareDrum1 </TD></TR>
|
||||
<TR><TD> Scale </TD> <TD> Flute </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=ChaChaIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> ChaChaIntro </H2>
|
||||
|
@ -131,7 +195,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=ChaChaEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> ChaChaEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:39 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:06 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Countryblues</H1>
|
||||
|
@ -19,7 +19,6 @@
|
|||
<LI><A Href=#CountryBluesEnd>CountryBluesEnd</a>
|
||||
</ul>
|
||||
<A Name=CountryBlues></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountryBlues </H2>
|
||||
|
@ -38,7 +37,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=CountryBluesSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountryBluesSus </H2>
|
||||
|
@ -58,7 +56,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=CountryBluesWalk></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountryBluesWalk </H2>
|
||||
|
@ -76,7 +73,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=CountryBluesWalkSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountryBluesWalkSus </H2>
|
||||
|
@ -95,7 +91,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=CountryBlues1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountryBlues1 </H2>
|
||||
|
@ -114,7 +109,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=CountryBlues1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountryBlues1Sus </H2>
|
||||
|
@ -134,7 +128,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=CountryBlues1Walk></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountryBlues1Walk </H2>
|
||||
|
@ -152,7 +145,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=CountryBlues1WalkSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountryBlues1WalkSus </H2>
|
||||
|
@ -171,7 +163,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=CountryBluesFill></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountryBluesFill </H2>
|
||||
|
@ -191,7 +182,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=CountryBluesWalkFill></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountryBluesWalkFill </H2>
|
||||
|
@ -210,7 +200,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=CountryBlues1Fill></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountryBlues1Fill </H2>
|
||||
|
@ -230,7 +219,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=CountryBlues1WalkFill></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountryBlues1WalkFill </H2>
|
||||
|
@ -249,7 +237,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=CountryBluesEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountryBluesEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:33 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:06 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Countryswing</H1>
|
||||
|
@ -14,7 +14,6 @@
|
|||
<LI><A Href=#CountrySwingEnd>CountrySwingEnd</a>
|
||||
</ul>
|
||||
<A Name=CountrySwing></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountrySwing </H2>
|
||||
|
@ -31,7 +30,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=CountrySwingSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountrySwingSus </H2>
|
||||
|
@ -49,7 +47,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=CountrySwing1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountrySwing1 </H2>
|
||||
|
@ -67,7 +64,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=CountrySwing1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountrySwing1Sus </H2>
|
||||
|
@ -86,7 +82,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=CountrySwing2></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountrySwing2 </H2>
|
||||
|
@ -104,7 +99,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=CountrySwing2Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountrySwing2Sus </H2>
|
||||
|
@ -123,7 +117,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=CountrySwingIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountrySwingIntro </H2>
|
||||
|
@ -139,7 +132,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=CountrySwingEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountrySwingEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:36 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:07 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Countrywaltz</H1>
|
||||
|
@ -19,7 +19,6 @@
|
|||
<LI><A Href=#CountryWaltzEnd>CountryWaltzEnd</a>
|
||||
</ul>
|
||||
<A Name=CountryWaltz></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountryWaltz </H2>
|
||||
|
@ -36,7 +35,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=CountryWaltzSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountryWaltzSus </H2>
|
||||
|
@ -54,7 +52,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=CountryWaltz1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountryWaltz1 </H2>
|
||||
|
@ -72,7 +69,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=CountryWaltz1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountryWaltz1Sus </H2>
|
||||
|
@ -91,7 +87,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=CountryWaltz2></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountryWaltz2 </H2>
|
||||
|
@ -109,7 +104,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=CountryWaltz2Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountryWaltz2Sus </H2>
|
||||
|
@ -128,7 +122,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=CountryWaltzWalk></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountryWaltzWalk </H2>
|
||||
|
@ -145,7 +138,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=CountryWaltzWalkSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountryWaltzWalkSus </H2>
|
||||
|
@ -163,7 +155,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=CountryWaltz1Walk></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountryWaltz1Walk </H2>
|
||||
|
@ -181,7 +172,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Countrywaltz2Walk></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Countrywaltz2Walk </H2>
|
||||
|
@ -199,7 +189,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=CountryWaltz1SusWalk></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountryWaltz1SusWalk </H2>
|
||||
|
@ -218,7 +207,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=CountryWaltz2SusWalk></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountryWaltz2SusWalk </H2>
|
||||
|
@ -237,7 +225,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=CountryWaltzEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> CountryWaltzEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:41 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:07 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Desert</H1>
|
||||
|
@ -10,7 +10,6 @@
|
|||
<LI><A Href=#DesertEnd>DesertEnd</a>
|
||||
</ul>
|
||||
<A Name=Desert></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Desert </H2>
|
||||
|
@ -28,7 +27,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=DesertSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> DesertSus </H2>
|
||||
|
@ -47,7 +45,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=DesertFill></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> DesertFill </H2>
|
||||
|
@ -66,7 +63,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=DesertEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> DesertEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:31 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:07 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Dixie</H1>
|
||||
|
@ -12,7 +12,6 @@
|
|||
<LI><A Href=#DixieEnd>DixieEnd</a>
|
||||
</ul>
|
||||
<A Name=Dixie></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Dixie </H2>
|
||||
|
@ -31,7 +30,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Dixie1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Dixie1 </H2>
|
||||
|
@ -50,7 +48,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Dixie2></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Dixie2 </H2>
|
||||
|
@ -70,7 +67,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Dixie3></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Dixie3 </H2>
|
||||
|
@ -90,7 +86,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=DixieStrum></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> DixieStrum </H2>
|
||||
|
@ -109,7 +104,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=DixieEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> DixieEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:41 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:07 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Dixiemarch</H1>
|
||||
|
@ -12,7 +12,6 @@
|
|||
<LI><A Href=#DixieMarchEnd>DixieMarchEnd</a>
|
||||
</ul>
|
||||
<A Name=DixieMarch></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> DixieMarch </H2>
|
||||
|
@ -29,7 +28,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=DixieMarchPlus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> DixieMarchPlus </H2>
|
||||
|
@ -47,7 +45,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=DixieMarchSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> DixieMarchSus </H2>
|
||||
|
@ -65,7 +62,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=DixieMarchSusPlus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> DixieMarchSusPlus </H2>
|
||||
|
@ -84,7 +80,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=DixieMarchIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> DixieMarchIntro </H2>
|
||||
|
@ -101,7 +96,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=DixieMarchEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> DixieMarchEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:34 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:07 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Easyswing</H1>
|
||||
|
@ -29,7 +29,6 @@
|
|||
<LI><A Href=#EasySwingEnd>EasySwingEnd</a>
|
||||
</ul>
|
||||
<A Name=EasySwing></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> EasySwing </H2>
|
||||
|
@ -46,7 +45,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=EasySwingSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> EasySwingSus </H2>
|
||||
|
@ -64,7 +62,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=EasySwingFill></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> EasySwingFill </H2>
|
||||
|
@ -82,7 +79,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=EasySwingWalk></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> EasySwingWalk </H2>
|
||||
|
@ -98,7 +94,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=EasySwingWalkSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> EasySwingWalkSus </H2>
|
||||
|
@ -115,7 +110,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=EasySwingWalkFill></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> EasySwingWalkFill </H2>
|
||||
|
@ -133,7 +127,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=EasySwing1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> EasySwing1 </H2>
|
||||
|
@ -150,7 +143,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=EasySwing1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> EasySwing1Sus </H2>
|
||||
|
@ -168,7 +160,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=EasySwing1Fill></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> EasySwing1Fill </H2>
|
||||
|
@ -186,7 +177,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=EasySwing2></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> EasySwing2 </H2>
|
||||
|
@ -203,7 +193,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=EasySwing2Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> EasySwing2Sus </H2>
|
||||
|
@ -221,7 +210,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=EasySwing2Fill></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> EasySwing2Fill </H2>
|
||||
|
@ -239,7 +227,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=EasySwing42></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> EasySwing42 </H2>
|
||||
|
@ -256,7 +243,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=EasySwing42Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> EasySwing42Sus </H2>
|
||||
|
@ -274,7 +260,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=EasySwing42Fill></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> EasySwing42Fill </H2>
|
||||
|
@ -292,7 +277,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=EasySwing42Walk></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> EasySwing42Walk </H2>
|
||||
|
@ -308,7 +292,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=EasySwing42WalkSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> EasySwing42WalkSus </H2>
|
||||
|
@ -325,7 +308,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=EasySwing42WalkFill></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> EasySwing42WalkFill </H2>
|
||||
|
@ -342,7 +324,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=EasySwingIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> EasySwingIntro </H2>
|
||||
|
@ -358,7 +339,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=EasySwingIntro1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> EasySwingIntro1 </H2>
|
||||
|
@ -374,7 +354,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=EasySwingIntro2></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> EasySwingIntro2 </H2>
|
||||
|
@ -390,7 +369,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=EasySwingIntro3></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> EasySwingIntro3 </H2>
|
||||
|
@ -407,7 +385,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=EasySwingEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> EasySwingEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:34 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:07 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Fastblues</H1>
|
||||
|
@ -13,7 +13,6 @@
|
|||
<LI><A Href=#FastBluesEnd>FastBluesEnd</a>
|
||||
</ul>
|
||||
<A Name=FastBlues></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FastBlues </H2>
|
||||
|
@ -33,7 +32,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FastBluesSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FastBluesSus </H2>
|
||||
|
@ -54,7 +52,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FastBluesWalk></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FastBluesWalk </H2>
|
||||
|
@ -74,7 +71,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FastBluesWalkSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FastBluesWalkSus </H2>
|
||||
|
@ -95,7 +91,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FastBlues1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FastBlues1 </H2>
|
||||
|
@ -116,7 +111,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FastBlues1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FastBlues1Sus </H2>
|
||||
|
@ -138,7 +132,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FastBluesEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FastBluesEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:28 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:08 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Folk</H1>
|
||||
|
@ -11,7 +11,6 @@
|
|||
<LI><A Href=#FolkEnd>FolkEnd</a>
|
||||
</ul>
|
||||
<A Name=Folk></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Folk </H2>
|
||||
|
@ -26,7 +25,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FolkWalk></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FolkWalk </H2>
|
||||
|
@ -41,7 +39,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FolkArticulated></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FolkArticulated </H2>
|
||||
|
@ -58,7 +55,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FolkIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FolkIntro </H2>
|
||||
|
@ -73,7 +69,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FolkEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FolkEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:30 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:08 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Foxtrot</H1>
|
||||
|
@ -16,7 +16,6 @@
|
|||
<LI><A Href=#FoxTrot1End>FoxTrot1End</a>
|
||||
</ul>
|
||||
<A Name=Foxtrot></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Foxtrot </H2>
|
||||
|
@ -36,7 +35,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FoxtrotSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FoxtrotSus </H2>
|
||||
|
@ -57,7 +55,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FoxTrotPlus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FoxTrotPlus </H2>
|
||||
|
@ -78,7 +75,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FoxTrotSusPlus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FoxTrotSusPlus </H2>
|
||||
|
@ -100,7 +96,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Foxtrot1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Foxtrot1 </H2>
|
||||
|
@ -122,7 +117,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FoxTrot1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FoxTrot1Sus </H2>
|
||||
|
@ -145,7 +139,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FoxTrotIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FoxTrotIntro </H2>
|
||||
|
@ -165,7 +158,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FoxtrotFill></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FoxtrotFill </H2>
|
||||
|
@ -185,7 +177,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FoxTrotEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FoxTrotEnd </H2>
|
||||
|
@ -203,7 +194,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FoxTrot1End></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FoxTrot1End </H2>
|
||||
|
|
|
@ -1,35 +1,70 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:36 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:08 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Frenchwaltz</H1>
|
||||
<P>These try to do the "French Cafe" sound.
|
||||
<P>These try to do the "French Cafe" sound. The song "Pigalle" works quite well with this. Note the setting of the BassRegister variable which tries to emulate the "switches" on a real accordion. In this case we have an accordion with three reed banks labeled "L", "M" and "H"--this will make large changes to the accordion um-pa-pa stuff
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Variables </H2>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="100%">
|
||||
<TR>
|
||||
<TD Valign=Top> <B> BassRegister </B> </TD>
|
||||
<TD Valign=Top> Sets the bass register, 1=L 2=LM 3=LH 4=LMH 5=M 6=MH 7=H (Default=4). </TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD Valign=Top> <B> CSeq </B> </TD>
|
||||
<TD Valign=Top> Internal, Chord sequence list, </TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD Valign=Top> <B> BSeq </B> </TD>
|
||||
<TD Valign=Top> Internal, Bass sequence list. </TD>
|
||||
</TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<ul>
|
||||
<LI><A Href=#FrenchWaltz>FrenchWaltz</a>
|
||||
<LI><A Href=#FrenchWaltzSus>FrenchWaltzSus</a>
|
||||
<LI><A Href=#FrenchWaltz1>FrenchWaltz1</a>
|
||||
<LI><A Href=#FrenchWaltz1Fill>FrenchWaltz1Fill</a>
|
||||
<LI><A Href=#FrenchWaltz1Sus>FrenchWaltz1Sus</a>
|
||||
<LI><A Href=#FrenchWaltz1FillSus>FrenchWaltz1FillSus</a>
|
||||
<LI><A Href=#FrenchWaltz2>FrenchWaltz2</a>
|
||||
<LI><A Href=#FrenchWaltz2Fill>FrenchWaltz2Fill</a>
|
||||
<LI><A Href=#FrenchWaltz2Sus>FrenchWaltz2Sus</a>
|
||||
<LI><A Href=#FrenchWaltz2FillSus>FrenchWaltz2FillSus</a>
|
||||
<LI><A Href=#FrenchWaltz3>FrenchWaltz3</a>
|
||||
<LI><A Href=#FrenchWaltz3Fill>FrenchWaltz3Fill</a>
|
||||
<LI><A Href=#FrenchWaltz2Sus>FrenchWaltz2Sus</a>
|
||||
<LI><A Href=#FrenchWaltz3FillSus>FrenchWaltz3FillSus</a>
|
||||
<LI><A Href=#FrenchWaltzIntro>FrenchWaltzIntro</a>
|
||||
<LI><A Href=#FrenchWaltzEnd>FrenchWaltzEnd</a>
|
||||
<LI><A Href=#FrenchWaltz1End>FrenchWaltz1End</a>
|
||||
</ul>
|
||||
<A Name=FrenchWaltz></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FrenchWaltz </H2>
|
||||
Accordion umm-paa. Ya either love it or hate it! <B>(8)</B>
|
||||
Accordion umm-pa-pa. Ya either love it or hate it! <B>(8)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Bass </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Bass-H </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Bass-L </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Bass-M </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-Guitar </TD> <TD> NylonGuitar </TD></TR>
|
||||
<TR><TD> Chord-H </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-L </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-M </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Drum-Tam </TD> <TD> Tambourine </TD></TR>
|
||||
<TR><TD> Drum-Tri </TD> <TD> OpenTriangle </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FrenchWaltzSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FrenchWaltzSus </H2>
|
||||
|
@ -37,9 +72,13 @@
|
|||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Bass </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Bass-H </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Bass-L </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Bass-M </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-Guitar </TD> <TD> NylonGuitar </TD></TR>
|
||||
<TR><TD> Chord-H </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-L </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-M </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-Sus </TD> <TD> Strings </TD></TR>
|
||||
<TR><TD> Drum-Tam </TD> <TD> Tambourine </TD></TR>
|
||||
<TR><TD> Drum-Tri </TD> <TD> OpenTriangle </TD></TR>
|
||||
|
@ -47,7 +86,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FrenchWaltz1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FrenchWaltz1 </H2>
|
||||
|
@ -56,15 +94,37 @@
|
|||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Arpeggio </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Bass </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Bass-H </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Bass-L </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Bass-M </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-Guitar </TD> <TD> NylonGuitar </TD></TR>
|
||||
<TR><TD> Chord-H </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-L </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-M </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Drum-Tam </TD> <TD> Tambourine </TD></TR>
|
||||
<TR><TD> Drum-Tri </TD> <TD> OpenTriangle </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FrenchWaltz1Fill></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FrenchWaltz1Fill </H2>
|
||||
Adds an accending run. <B>(8)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Arpeggio </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-H </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-L </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-M </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Drum-Tam </TD> <TD> Tambourine </TD></TR>
|
||||
<TR><TD> Drum-Tri </TD> <TD> OpenTriangle </TD></TR>
|
||||
<TR><TD> Scale </TD> <TD> Accordion </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FrenchWaltz1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FrenchWaltz1Sus </H2>
|
||||
|
@ -73,16 +133,219 @@
|
|||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Arpeggio </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Bass </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Bass-H </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Bass-L </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Bass-M </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-Guitar </TD> <TD> NylonGuitar </TD></TR>
|
||||
<TR><TD> Chord-H </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-L </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-M </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-Sus </TD> <TD> Strings </TD></TR>
|
||||
<TR><TD> Drum-Tam </TD> <TD> Tambourine </TD></TR>
|
||||
<TR><TD> Drum-Tri </TD> <TD> OpenTriangle </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FrenchWaltz1FillSus></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FrenchWaltz1FillSus </H2>
|
||||
Arpeggios, run and sustained strings. <B>(8)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Arpeggio </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-H </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-L </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-M </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-Sus </TD> <TD> Strings </TD></TR>
|
||||
<TR><TD> Drum-Tam </TD> <TD> Tambourine </TD></TR>
|
||||
<TR><TD> Drum-Tri </TD> <TD> OpenTriangle </TD></TR>
|
||||
<TR><TD> Scale </TD> <TD> Accordion </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FrenchWaltz2></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FrenchWaltz2 </H2>
|
||||
A simple, little counter melody on a piano. <B>(8)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Arpeggio </TD> <TD> Piano1 </TD></TR>
|
||||
<TR><TD> Bass-H </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Bass-L </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Bass-M </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-Guitar </TD> <TD> NylonGuitar </TD></TR>
|
||||
<TR><TD> Chord-H </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-L </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-M </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Drum-Tam </TD> <TD> Tambourine </TD></TR>
|
||||
<TR><TD> Drum-Tri </TD> <TD> OpenTriangle </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FrenchWaltz2Fill></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FrenchWaltz2Fill </H2>
|
||||
Add a piano run to the counter melody. <B>(8)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Arpeggio </TD> <TD> Piano1 </TD></TR>
|
||||
<TR><TD> Chord-H </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-L </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-M </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Drum-Tam </TD> <TD> Tambourine </TD></TR>
|
||||
<TR><TD> Drum-Tri </TD> <TD> OpenTriangle </TD></TR>
|
||||
<TR><TD> Scale </TD> <TD> Piano1 </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FrenchWaltz2Sus></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FrenchWaltz2Sus </H2>
|
||||
Piano counter melody and sustained strings. <B>(8)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Arpeggio </TD> <TD> Piano1 </TD></TR>
|
||||
<TR><TD> Bass-H </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Bass-L </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Bass-M </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-Guitar </TD> <TD> NylonGuitar </TD></TR>
|
||||
<TR><TD> Chord-H </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-L </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-M </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-Sus </TD> <TD> Strings </TD></TR>
|
||||
<TR><TD> Drum-Tam </TD> <TD> Tambourine </TD></TR>
|
||||
<TR><TD> Drum-Tri </TD> <TD> OpenTriangle </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FrenchWaltz2FillSus></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FrenchWaltz2FillSus </H2>
|
||||
Piano counter melody and run with sustained strings. <B>(8)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Arpeggio </TD> <TD> Piano1 </TD></TR>
|
||||
<TR><TD> Chord-H </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-L </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-M </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-Sus </TD> <TD> Strings </TD></TR>
|
||||
<TR><TD> Drum-Tam </TD> <TD> Tambourine </TD></TR>
|
||||
<TR><TD> Drum-Tri </TD> <TD> OpenTriangle </TD></TR>
|
||||
<TR><TD> Scale </TD> <TD> Piano1 </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FrenchWaltz3></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FrenchWaltz3 </H2>
|
||||
A simple, little counter melody on a viola. <B>(8)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Arpeggio </TD> <TD> Viola </TD></TR>
|
||||
<TR><TD> Bass-H </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Bass-L </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Bass-M </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-Guitar </TD> <TD> NylonGuitar </TD></TR>
|
||||
<TR><TD> Chord-H </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-L </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-M </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Drum-Tam </TD> <TD> Tambourine </TD></TR>
|
||||
<TR><TD> Drum-Tri </TD> <TD> OpenTriangle </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FrenchWaltz3Fill></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FrenchWaltz3Fill </H2>
|
||||
Add a string run to the counter melody. <B>(8)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Arpeggio </TD> <TD> Viola </TD></TR>
|
||||
<TR><TD> Chord-H </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-L </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-M </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Drum-Tam </TD> <TD> Tambourine </TD></TR>
|
||||
<TR><TD> Drum-Tri </TD> <TD> OpenTriangle </TD></TR>
|
||||
<TR><TD> Scale </TD> <TD> Viola </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FrenchWaltz2Sus></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FrenchWaltz2Sus </H2>
|
||||
Viola counter melody and sustained strings. <B>(8)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Arpeggio </TD> <TD> Viola </TD></TR>
|
||||
<TR><TD> Bass-H </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Bass-L </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Bass-M </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-Guitar </TD> <TD> NylonGuitar </TD></TR>
|
||||
<TR><TD> Chord-H </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-L </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-M </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-Sus </TD> <TD> Strings </TD></TR>
|
||||
<TR><TD> Drum-Tam </TD> <TD> Tambourine </TD></TR>
|
||||
<TR><TD> Drum-Tri </TD> <TD> OpenTriangle </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FrenchWaltz3FillSus></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FrenchWaltz3FillSus </H2>
|
||||
Viola counter melody and run with sustained strings. <B>(8)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Arpeggio </TD> <TD> Viola </TD></TR>
|
||||
<TR><TD> Chord-H </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-L </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-M </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-Sus </TD> <TD> Strings </TD></TR>
|
||||
<TR><TD> Drum-Tam </TD> <TD> Tambourine </TD></TR>
|
||||
<TR><TD> Drum-Tri </TD> <TD> OpenTriangle </TD></TR>
|
||||
<TR><TD> Scale </TD> <TD> Viola </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FrenchWaltzIntro></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FrenchWaltzIntro </H2>
|
||||
A 4 bar intro. <B>(8)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Bass-H </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Bass-L </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Bass-M </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-Guitar </TD> <TD> NylonGuitar </TD></TR>
|
||||
<TR><TD> Chord-H </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-L </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-M </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Drum-Tam </TD> <TD> Tambourine </TD></TR>
|
||||
<TR><TD> Drum-Tri </TD> <TD> OpenTriangle </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FrenchWaltzEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FrenchWaltzEnd </H2>
|
||||
|
@ -90,8 +353,12 @@
|
|||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Bass </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Bass-H </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Bass-L </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Bass-M </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-H </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-L </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-M </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Drum-Tam </TD> <TD> Tambourine </TD></TR>
|
||||
<TR><TD> Drum-Tri </TD> <TD> OpenTriangle </TD></TR>
|
||||
<TR><TD> Scale </TD> <TD> Strings </TD></TR>
|
||||
|
@ -99,7 +366,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=FrenchWaltz1End></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> FrenchWaltz1End </H2>
|
||||
|
@ -107,8 +373,12 @@
|
|||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Bass </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Bass-H </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Bass-L </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Bass-M </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-H </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-L </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-M </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Drum-Tam </TD> <TD> Tambourine </TD></TR>
|
||||
<TR><TD> Drum-Tri </TD> <TD> OpenTriangle </TD></TR>
|
||||
<TR><TD> Scale </TD> <TD> Accordion </TD></TR>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:43 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:08 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Guitarballad</H1>
|
||||
|
@ -12,7 +12,6 @@
|
|||
<LI><A Href=#GuitarBalladEnd>GuitarBalladEnd</a>
|
||||
</ul>
|
||||
<A Name=GuitarBallad></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> GuitarBallad </H2>
|
||||
|
@ -30,7 +29,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=GuitarBallad1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> GuitarBallad1 </H2>
|
||||
|
@ -49,7 +47,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=GuitarBalladSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> GuitarBalladSus </H2>
|
||||
|
@ -68,7 +65,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=GuitarBallad1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> GuitarBallad1Sus </H2>
|
||||
|
@ -88,7 +84,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=GuitarBalladIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> GuitarBalladIntro </H2>
|
||||
|
@ -106,7 +101,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=GuitarBalladEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> GuitarBalladEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:41 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:08 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Hillcountry</H1>
|
||||
|
@ -13,7 +13,6 @@
|
|||
<LI><A Href=#HillCountryEnd>HillCountryEnd</a>
|
||||
</ul>
|
||||
<A Name=HillCountry></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> HillCountry </H2>
|
||||
|
@ -29,7 +28,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=HillCountryPlus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> HillCountryPlus </H2>
|
||||
|
@ -46,7 +44,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=HillCountrySus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> HillCountrySus </H2>
|
||||
|
@ -63,7 +60,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=HillCountrySusPlus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> HillCountrySusPlus </H2>
|
||||
|
@ -81,7 +77,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=HillCountryFill></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> HillCountryFill </H2>
|
||||
|
@ -97,7 +92,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=HillCountryIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> HillCountryIntro </H2>
|
||||
|
@ -113,7 +107,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=HillCountryEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> HillCountryEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:30 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:09 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Jazz-54</H1>
|
||||
|
@ -9,7 +9,6 @@
|
|||
<LI><A Href=#Jazz54Intro>Jazz54Intro</a>
|
||||
</ul>
|
||||
<A Name=Jazz54></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Jazz54 </H2>
|
||||
|
@ -26,7 +25,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Jazz54Walk></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Jazz54Walk </H2>
|
||||
|
@ -43,7 +41,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Jazz54Intro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Jazz54Intro </H2>
|
||||
|
|
320
mma/docs/html/lib/stdlib/jazzguitar.html
Normal file
320
mma/docs/html/lib/stdlib/jazzguitar.html
Normal file
|
@ -0,0 +1,320 @@
|
|||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:09 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Jazzguitar</H1>
|
||||
<P>For jazz ballads. This has ONLY a guitar (well, expect for the sustained versions). Mostly chords, but some bass and arpeggio is included. The song "Django" is a bit of a demo.
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Variables </H2>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="100%">
|
||||
<TR>
|
||||
<TD Valign=Top> <B> SustainVoice </B> </TD>
|
||||
<TD Valign=Top> Voice for the sustained versions (default=TremoloStrings). </TD>
|
||||
</TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<ul>
|
||||
<LI><A Href=#JazzGuitar>JazzGuitar</a>
|
||||
<LI><A Href=#JazzGuitarWalk>JazzGuitarWalk</a>
|
||||
<LI><A Href=#JazzGuitar1>JazzGuitar1</a>
|
||||
<LI><A Href=#JazzGuitar1Walk>JazzGuitar1Walk</a>
|
||||
<LI><A Href=#JazzGuitar2>JazzGuitar2</a>
|
||||
<LI><A Href=#JazzGuitar2Walk>JazzGuitar2Walk</a>
|
||||
<LI><A Href=#JazzGuitar3>JazzGuitar3</a>
|
||||
<LI><A Href=#JazzGuitar3Walk>JazzGuitar3Walk</a>
|
||||
<LI><A Href=#JazzGuitarSus>JazzGuitarSus</a>
|
||||
<LI><A Href=#JazzGuitar1Sus>JazzGuitar1Sus</a>
|
||||
<LI><A Href=#JazzGuitar2Sus>JazzGuitar2Sus</a>
|
||||
<LI><A Href=#JazzGuitar3Sus>JazzGuitar3Sus</a>
|
||||
<LI><A Href=#JazzGuitarWalkSus>JazzGuitarWalkSus</a>
|
||||
<LI><A Href=#JazzGuitar1WalkSus>JazzGuitar1WalkSus</a>
|
||||
<LI><A Href=#JazzGuitar2WalkSus>JazzGuitar2WalkSus</a>
|
||||
<LI><A Href=#JazzGuitar3WalkSus>JazzGuitar3WalkSus</a>
|
||||
<LI><A Href=#JazzGuitarIntro>JazzGuitarIntro</a>
|
||||
<LI><A Href=#JazzGuitar1Intro>JazzGuitar1Intro</a>
|
||||
<LI><A Href=#JazzGuitarEnd>JazzGuitarEnd</a>
|
||||
<LI><A Href=#JazzGuitarEnd1>JazzGuitarEnd1</a>
|
||||
</ul>
|
||||
<A Name=JazzGuitar></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JazzGuitar </H2>
|
||||
A very basic 4 to the bar accompaniment. <B>(4)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Bass </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JazzGuitarWalk></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JazzGuitarWalk </H2>
|
||||
Changes the bass pattern to walking. <B>(4)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Walk </TD> <TD> JazzGuitar </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JazzGuitar1></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JazzGuitar1 </H2>
|
||||
Our basic pattern with arpeggios every 4th bar. <B>(4)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Arpeggio </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Bass </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JazzGuitar1Walk></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JazzGuitar1Walk </H2>
|
||||
Walking bass with arpeggios every 4th bar. <B>(4)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Arpeggio </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Walk </TD> <TD> JazzGuitar </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JazzGuitar2></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JazzGuitar2 </H2>
|
||||
Basic pattern with more strum and syncopation. <B>(4)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Bass </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JazzGuitar2Walk></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JazzGuitar2Walk </H2>
|
||||
The strum pattern with walking bass <B>(4)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Walk </TD> <TD> JazzGuitar </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JazzGuitar3></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JazzGuitar3 </H2>
|
||||
Add arpeggios every 4 bars to the syncopated strumming. <B>(4)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Arpeggio </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Bass </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JazzGuitar3Walk></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JazzGuitar3Walk </H2>
|
||||
Aprpeggios and walking bass. <B>(4)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Arpeggio </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Walk </TD> <TD> JazzGuitar </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JazzGuitarSus></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JazzGuitarSus </H2>
|
||||
Sustained strings added to basic pattern. <B>(4)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Bass </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JazzGuitar1Sus></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JazzGuitar1Sus </H2>
|
||||
Sustained strings added to JazzGuitar1. <B>(4)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Arpeggio </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Bass </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JazzGuitar2Sus></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JazzGuitar2Sus </H2>
|
||||
Sustained strings added to JazzGuitar2. <B>(4)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Bass </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JazzGuitar3Sus></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JazzGuitar3Sus </H2>
|
||||
Sustained strings added to JazzGuitar3 <B>(4)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Arpeggio </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Bass </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JazzGuitarWalkSus></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JazzGuitarWalkSus </H2>
|
||||
Sustained strings added to JazzGuitarWalk. <B>(4)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
|
||||
<TR><TD> Walk </TD> <TD> JazzGuitar </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JazzGuitar1WalkSus></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JazzGuitar1WalkSus </H2>
|
||||
Sustained strings added to JazzGuitarWalk1. <B>(4)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Arpeggio </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
|
||||
<TR><TD> Walk </TD> <TD> JazzGuitar </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JazzGuitar2WalkSus></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JazzGuitar2WalkSus </H2>
|
||||
Sustained strings added to JazzGuitarWalk2. <B>(4)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
|
||||
<TR><TD> Walk </TD> <TD> JazzGuitar </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JazzGuitar3WalkSus></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JazzGuitar3WalkSus </H2>
|
||||
Sustained strings added to JazzGuitarWalk3. <B>(4)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Arpeggio </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
|
||||
<TR><TD> Walk </TD> <TD> JazzGuitar </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JazzGuitarIntro></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JazzGuitarIntro </H2>
|
||||
A 4 bar, arpeggiating introduction. <B>(4)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Arpeggio </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Bass </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JazzGuitar1Intro></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JazzGuitar1Intro </H2>
|
||||
A 4 bar intro with a bass run on bar 4. <B>(4)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Bass </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JazzGuitarEnd></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JazzGuitarEnd </H2>
|
||||
Soft, 2 bar ending. <B>(2)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Bass </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JazzGuitarEnd1></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JazzGuitarEnd1 </H2>
|
||||
Soft, 1 bar ending. <B>(1)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Bass </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
|
||||
</Body></HTML>
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:32 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:09 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Jazzwaltz</H1>
|
||||
|
@ -15,7 +15,6 @@
|
|||
<LI><A Href=#JazzWaltz1End>JazzWaltz1End</a>
|
||||
</ul>
|
||||
<A Name=JazzWaltz></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JazzWaltz </H2>
|
||||
|
@ -34,7 +33,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JazzWaltzSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JazzWaltzSus </H2>
|
||||
|
@ -54,7 +52,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JazzWaltz1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JazzWaltz1 </H2>
|
||||
|
@ -74,7 +71,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JazzWaltz1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JazzWaltz1Sus </H2>
|
||||
|
@ -95,7 +91,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JazzWaltzIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JazzWaltzIntro </H2>
|
||||
|
@ -114,7 +109,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JazzWaltzIntro8></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JazzWaltzIntro8 </H2>
|
||||
|
@ -133,7 +127,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JazzWaltzFill></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JazzWaltzFill </H2>
|
||||
|
@ -151,7 +144,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JazzWaltzEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JazzWaltzEnd </H2>
|
||||
|
@ -169,7 +161,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JazzWaltz1End></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JazzWaltz1End </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:38 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:09 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Jive</H1>
|
||||
|
@ -20,7 +20,6 @@
|
|||
<LI><A Href=#JiveEnd>JiveEnd</a>
|
||||
</ul>
|
||||
<A Name=Jive></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Jive </H2>
|
||||
|
@ -38,7 +37,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JiveClap></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JiveClap </H2>
|
||||
|
@ -57,7 +55,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JiveSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JiveSus </H2>
|
||||
|
@ -76,7 +73,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JiveClapSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JiveClapSus </H2>
|
||||
|
@ -96,7 +92,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JivePlus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JivePlus </H2>
|
||||
|
@ -115,7 +110,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JiveSusPlus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JiveSusPlus </H2>
|
||||
|
@ -135,7 +129,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Jive1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Jive1 </H2>
|
||||
|
@ -153,7 +146,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Jive1Clap></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Jive1Clap </H2>
|
||||
|
@ -172,7 +164,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Jive1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Jive1Sus </H2>
|
||||
|
@ -191,7 +182,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Jive1ClapSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Jive1ClapSus </H2>
|
||||
|
@ -211,7 +201,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Jive1Plus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Jive1Plus </H2>
|
||||
|
@ -230,7 +219,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Jive1SusPlus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Jive1SusPlus </H2>
|
||||
|
@ -250,7 +238,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JiveIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JiveIntro </H2>
|
||||
|
@ -269,7 +256,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=JiveEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> JiveEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:38 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:09 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Lfusion</H1>
|
||||
|
@ -12,7 +12,6 @@
|
|||
<LI><A Href=#Lfusion1End>Lfusion1End</a>
|
||||
</ul>
|
||||
<A Name=LFusion></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> LFusion </H2>
|
||||
|
@ -41,7 +40,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=LFusionSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> LFusionSus </H2>
|
||||
|
@ -70,7 +68,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=LFusion1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> LFusion1 </H2>
|
||||
|
@ -98,7 +95,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=LFusion1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> LFusion1Sus </H2>
|
||||
|
@ -127,7 +123,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=LFusionEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> LFusionEnd </H2>
|
||||
|
@ -150,7 +145,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Lfusion1End></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Lfusion1End </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:40 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:09 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Lighttango</H1>
|
||||
|
@ -8,11 +8,11 @@
|
|||
<LI><A Href=#LightTangoSus>LightTangoSus</a>
|
||||
<LI><A Href=#LightTango1>LightTango1</a>
|
||||
<LI><A Href=#LightTango1Sus>LightTango1Sus</a>
|
||||
<LI><A Href=#LightTangoFill>LightTangoFill</a>
|
||||
<LI><A Href=#LightTangoIntro>LightTangoIntro</a>
|
||||
<LI><A Href=#LightTangoEnd>LightTangoEnd</a>
|
||||
</ul>
|
||||
<A Name=LightTango></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> LightTango </H2>
|
||||
|
@ -33,7 +33,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=LightTangoSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> LightTangoSus </H2>
|
||||
|
@ -55,7 +54,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=LightTango1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> LightTango1 </H2>
|
||||
|
@ -76,7 +74,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=LightTango1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> LightTango1Sus </H2>
|
||||
|
@ -97,8 +94,26 @@
|
|||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=LightTangoFill></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> LightTangoFill </H2>
|
||||
A one bar fill pattern. <B>(1)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
||||
<TR><TD> Bass-Piano </TD> <TD> Piano1 </TD></TR>
|
||||
<TR><TD> Chord-Accordion </TD> <TD> Accordion </TD></TR>
|
||||
<TR><TD> Chord-Guitar </TD> <TD> NylonGuitar </TD></TR>
|
||||
<TR><TD> Drum-Clave </TD> <TD> Claves </TD></TR>
|
||||
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
||||
<TR><TD> Drum-Snare </TD> <TD> SnareDrum1 </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=LightTangoIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> LightTangoIntro </H2>
|
||||
|
@ -119,7 +134,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=LightTangoEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> LightTangoEnd </H2>
|
||||
|
|
125
mma/docs/html/lib/stdlib/lullaby.html
Normal file
125
mma/docs/html/lib/stdlib/lullaby.html
Normal file
|
@ -0,0 +1,125 @@
|
|||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:10 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Lullaby</H1>
|
||||
<P>Gentle, soft lullaby in 4. Written for "Good Night".
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Variables </H2>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="100%">
|
||||
<TR>
|
||||
<TD Valign=Top> <B> ChordVoice </B> </TD>
|
||||
<TD Valign=Top> Voice used in Chord tracks (defaults to JazzGuitar). </TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD Valign=Top> <B> ChordOctave </B> </TD>
|
||||
<TD Valign=Top> Octave for Chord track (default 4) </TD>
|
||||
</TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<ul>
|
||||
<LI><A Href=#Lullaby>Lullaby</a>
|
||||
<LI><A Href=#Lullaby1>Lullaby1</a>
|
||||
<LI><A Href=#LullabyWalk>LullabyWalk</a>
|
||||
<LI><A Href=#LullabySus>LullabySus</a>
|
||||
<LI><A Href=#Lullaby1Sus>Lullaby1Sus</a>
|
||||
<LI><A Href=#LullabyWalkSus>LullabyWalkSus</a>
|
||||
<LI><A Href=#LullabyEnd>LullabyEnd</a>
|
||||
</ul>
|
||||
<A Name=Lullaby></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Lullaby </H2>
|
||||
Just a solo guitar in 4. <B>(1)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Lullaby1></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Lullaby1 </H2>
|
||||
Adds in a bit of bass. <B>(1)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Bass </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=LullabyWalk></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> LullabyWalk </H2>
|
||||
Adds an 8th note walking bass line. <B>(1)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Walk </TD> <TD> JazzGuitar </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=LullabySus></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> LullabySus </H2>
|
||||
Add some sustained strings to our guitar. <B>(1)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Chord-Sus </TD> <TD> SlowStrings </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Lullaby1Sus></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Lullaby1Sus </H2>
|
||||
A bit of bass with the strings. <B>(1)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Bass </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Chord-Sus </TD> <TD> SlowStrings </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=LullabyWalkSus></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> LullabyWalkSus </H2>
|
||||
Strings and walking bass. <B>(1)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Chord-Sus </TD> <TD> SlowStrings </TD></TR>
|
||||
<TR><TD> Walk </TD> <TD> JazzGuitar </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=LullabyEnd></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> LullabyEnd </H2>
|
||||
Two half notes on the guitar. <B>(1)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
|
||||
</Body></HTML>
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:44 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:10 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Mambo</H1>
|
||||
|
@ -16,7 +16,6 @@
|
|||
<LI><A Href=#MamboEnd>MamboEnd</a>
|
||||
</ul>
|
||||
<A Name=Mambo></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Mambo </H2>
|
||||
|
@ -37,7 +36,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Mambo1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Mambo1 </H2>
|
||||
|
@ -58,7 +56,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Mambo2></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Mambo2 </H2>
|
||||
|
@ -80,7 +77,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Mambo3></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Mambo3 </H2>
|
||||
|
@ -102,7 +98,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=MamboSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> MamboSus </H2>
|
||||
|
@ -124,7 +119,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Mambo1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Mambo1Sus </H2>
|
||||
|
@ -146,7 +140,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Mambo2Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Mambo2Sus </H2>
|
||||
|
@ -169,7 +162,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Mambo3Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Mambo3Sus </H2>
|
||||
|
@ -192,7 +184,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=MamboIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> MamboIntro </H2>
|
||||
|
@ -213,7 +204,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=MamboEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> MamboEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:31 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:10 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>March</H1>
|
||||
|
@ -15,7 +15,6 @@
|
|||
<LI><A Href=#MarchEnd>MarchEnd</a>
|
||||
</ul>
|
||||
<A Name=MilIntro4></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> MilIntro4 </H2>
|
||||
|
@ -29,7 +28,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=MilIntro2></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> MilIntro2 </H2>
|
||||
|
@ -43,7 +41,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=March></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> March </H2>
|
||||
|
@ -61,7 +58,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=March1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> March1 </H2>
|
||||
|
@ -80,7 +76,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=March1Slow></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> March1Slow </H2>
|
||||
|
@ -98,7 +93,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=March2></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> March2 </H2>
|
||||
|
@ -116,7 +110,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=March3></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> March3 </H2>
|
||||
|
@ -136,7 +129,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=March4></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> March4 </H2>
|
||||
|
@ -155,7 +147,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=MarchEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> MarchEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:44 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:10 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Merengue</H1>
|
||||
|
@ -14,7 +14,6 @@
|
|||
<LI><A Href=#MerengueEnd>MerengueEnd</a>
|
||||
</ul>
|
||||
<A Name=Merengue></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Merengue </H2>
|
||||
|
@ -34,7 +33,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Merengue1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Merengue1 </H2>
|
||||
|
@ -54,7 +52,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Merengue2></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Merengue2 </H2>
|
||||
|
@ -75,7 +72,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=MerengueSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> MerengueSus </H2>
|
||||
|
@ -96,7 +92,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Merengue1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Merengue1Sus </H2>
|
||||
|
@ -117,7 +112,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Merengue2Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Merengue2Sus </H2>
|
||||
|
@ -139,7 +133,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=MerengueIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> MerengueIntro </H2>
|
||||
|
@ -159,7 +152,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=MerengueEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> MerengueEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:34 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:10 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Metronome</H1>
|
||||
|
@ -9,7 +9,6 @@
|
|||
<LI><A Href=#Metronome2-4>Metronome2-4</a>
|
||||
</ul>
|
||||
<A Name=Metronome2></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Metronome2 </H2>
|
||||
|
@ -23,7 +22,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Metronome4></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Metronome4 </H2>
|
||||
|
@ -37,7 +35,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Metronome2-4></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Metronome2-4 </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:37 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:11 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Metronome3</H1>
|
||||
|
@ -7,7 +7,6 @@
|
|||
<LI><A Href=#Metronome3>Metronome3</a>
|
||||
</ul>
|
||||
<A Name=Metronome3></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Metronome3 </H2>
|
||||
|
|
|
@ -1,8 +1,22 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:38 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:11 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Modernjazz</H1>
|
||||
<P>A jazz style which has a bit of raunch and swing. Works well with Peggy Lee's "Fever".
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Variables </H2>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="100%">
|
||||
<TR>
|
||||
<TD Valign=Top> <B> ApreggioVoice </B> </TD>
|
||||
<TD Valign=Top> Voice for the alternating apreggios in ModernJazz1 (Default=MutedTrumpet). Also used in Introduction and Ending. </TD>
|
||||
</TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<ul>
|
||||
<LI><A Href=#ModernJazz>ModernJazz</a>
|
||||
<LI><A Href=#ModernJazz1>ModernJazz1</a>
|
||||
|
@ -12,7 +26,6 @@
|
|||
<LI><A Href=#ModernJazzEnd>ModernJazzEnd</a>
|
||||
</ul>
|
||||
<A Name=ModernJazz></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> ModernJazz </H2>
|
||||
|
@ -32,7 +45,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=ModernJazz1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> ModernJazz1 </H2>
|
||||
|
@ -54,7 +66,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=ModernJazzSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> ModernJazzSus </H2>
|
||||
|
@ -75,7 +86,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=ModernJazz1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> ModernJazz1Sus </H2>
|
||||
|
@ -98,7 +108,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=ModernJazzIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> ModernJazzIntro </H2>
|
||||
|
@ -118,7 +127,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=ModernJazzEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> ModernJazzEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:43 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:11 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Pianoballad</H1>
|
||||
|
@ -12,7 +12,6 @@
|
|||
<LI><A Href=#PianoBalladEnd>PianoBalladEnd</a>
|
||||
</ul>
|
||||
<A Name=PianoBallad></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> PianoBallad </H2>
|
||||
|
@ -30,7 +29,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=PianoBallad1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> PianoBallad1 </H2>
|
||||
|
@ -49,7 +47,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=PianoBalladSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> PianoBalladSus </H2>
|
||||
|
@ -68,7 +65,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=PianoBallad1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> PianoBallad1Sus </H2>
|
||||
|
@ -88,7 +84,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=PianoBalladIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> PianoBalladIntro </H2>
|
||||
|
@ -106,7 +101,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=PianoBalladEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> PianoBalladEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:33 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:11 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Polka</H1>
|
||||
|
@ -16,7 +16,6 @@
|
|||
<LI><A Href=#PolkaEnd>PolkaEnd</a>
|
||||
</ul>
|
||||
<A Name=Polka></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Polka </H2>
|
||||
|
@ -36,7 +35,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=PolkaSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> PolkaSus </H2>
|
||||
|
@ -57,7 +55,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=PolkaArp></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> PolkaArp </H2>
|
||||
|
@ -78,7 +75,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=PolkaSusArp></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> PolkaSusArp </H2>
|
||||
|
@ -100,7 +96,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Polka1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Polka1 </H2>
|
||||
|
@ -120,7 +115,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Polka1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Polka1Sus </H2>
|
||||
|
@ -141,7 +135,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Polka1Arp></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Polka1Arp </H2>
|
||||
|
@ -162,7 +155,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Polka1SusArp></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Polka1SusArp </H2>
|
||||
|
@ -184,7 +176,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=PolkaIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> PolkaIntro </H2>
|
||||
|
@ -203,7 +194,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=PolkaEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> PolkaEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:35 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:11 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Popballad</H1>
|
||||
|
@ -7,10 +7,11 @@
|
|||
<LI><A Href=#PopBallad>PopBallad</a>
|
||||
<LI><A Href=#PopBallad1>PopBallad1</a>
|
||||
<LI><A Href=#PopBallad2>PopBallad2</a>
|
||||
<LI><A Href=#PopBalladSus>PopBalladSus</a>
|
||||
<LI><A Href=#PopBalladIntro>PopBalladIntro</a>
|
||||
<LI><A Href=#PopBalladEnd>PopBalladEnd</a>
|
||||
</ul>
|
||||
<A Name=PopBallad></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> PopBallad </H2>
|
||||
|
@ -31,7 +32,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=PopBallad1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> PopBallad1 </H2>
|
||||
|
@ -55,7 +55,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=PopBallad2></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> PopBallad2 </H2>
|
||||
|
@ -74,8 +73,48 @@
|
|||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=PopBalladSus></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> PopBalladSus </H2>
|
||||
A slightly lighter version, with strings. <B>(4)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Arpeggio </TD> <TD> Atmosphere </TD></TR>
|
||||
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> Piano2 </TD></TR>
|
||||
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
|
||||
<TR><TD> Drum-Cabasa </TD> <TD> Cabasa </TD></TR>
|
||||
<TR><TD> Drum-Cym </TD> <TD> CrashCymbal1 </TD></TR>
|
||||
<TR><TD> Drum-Hh </TD> <TD> ClosedHiHat </TD></TR>
|
||||
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||
<TR><TD> Drum-Shake </TD> <TD> Shaker </TD></TR>
|
||||
<TR><TD> Drum-Snare </TD> <TD> SnareDrum1 </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=PopBalladIntro></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> PopBalladIntro </H2>
|
||||
A simple introduction. <B>(4)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Arpeggio </TD> <TD> Atmosphere </TD></TR>
|
||||
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> Piano2 </TD></TR>
|
||||
<TR><TD> Drum-Cabasa </TD> <TD> Cabasa </TD></TR>
|
||||
<TR><TD> Drum-Cym </TD> <TD> CrashCymbal1 </TD></TR>
|
||||
<TR><TD> Drum-Hh </TD> <TD> ClosedHiHat </TD></TR>
|
||||
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||
<TR><TD> Drum-Shake </TD> <TD> Shaker </TD></TR>
|
||||
<TR><TD> Drum-Snare </TD> <TD> SnareDrum1 </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=PopBalladEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> PopBalladEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:42 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:11 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Quickstep</H1>
|
||||
|
@ -14,7 +14,6 @@
|
|||
<LI><A Href=#QuickStepEnd>QuickStepEnd</a>
|
||||
</ul>
|
||||
<A Name=QuickStep></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> QuickStep </H2>
|
||||
|
@ -32,7 +31,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=QuickStepHit></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> QuickStepHit </H2>
|
||||
|
@ -51,7 +49,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=QuickStepSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> QuickStepSus </H2>
|
||||
|
@ -70,7 +67,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=QuickStepHitSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> QuickStepHitSus </H2>
|
||||
|
@ -90,7 +86,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=QuickStepDuh></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> QuickStepDuh </H2>
|
||||
|
@ -109,7 +104,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=QuickStepDuhSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> QuickStepDuhSus </H2>
|
||||
|
@ -129,7 +123,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=QuickStepIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> QuickStepIntro </H2>
|
||||
|
@ -147,7 +140,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=QuickStepEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> QuickStepEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:39 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:12 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Rb</H1>
|
||||
|
@ -10,7 +10,6 @@
|
|||
<LI><A Href=#R&BEnd>R&BEnd</a>
|
||||
</ul>
|
||||
<A Name=R&B></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> R&B </H2>
|
||||
|
@ -32,7 +31,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=R&BSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> R&BSus </H2>
|
||||
|
@ -54,7 +52,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=R&BIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> R&BIntro </H2>
|
||||
|
@ -75,7 +72,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=R&BEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> R&BEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:29 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:12 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Rhumba</H1>
|
||||
|
@ -23,7 +23,6 @@
|
|||
<LI><A Href=#RhumbaEnd1>RhumbaEnd1</a>
|
||||
</ul>
|
||||
<A Name=Rhumba></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Rhumba </H2>
|
||||
|
@ -45,7 +44,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=RhumbaSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> RhumbaSus </H2>
|
||||
|
@ -68,7 +66,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=RhumbaTriple></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> RhumbaTriple </H2>
|
||||
|
@ -89,7 +86,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=RhumbaTripleSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> RhumbaTripleSus </H2>
|
||||
|
@ -111,7 +107,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=RhumbaTriple12></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> RhumbaTriple12 </H2>
|
||||
|
@ -132,7 +127,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=RhumbaTriple12Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> RhumbaTriple12Sus </H2>
|
||||
|
@ -154,7 +148,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=RhumbaTriple34></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> RhumbaTriple34 </H2>
|
||||
|
@ -176,7 +169,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=RhumbaTriple34Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> RhumbaTriple34Sus </H2>
|
||||
|
@ -198,7 +190,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Rhumba1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Rhumba1 </H2>
|
||||
|
@ -221,7 +212,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Rhumba1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Rhumba1Sus </H2>
|
||||
|
@ -245,7 +235,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Rhumba2></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Rhumba2 </H2>
|
||||
|
@ -268,7 +257,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Rhumba2Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Rhumba2Sus </H2>
|
||||
|
@ -292,7 +280,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Rhumba3></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Rhumba3 </H2>
|
||||
|
@ -315,7 +302,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Rhumba3Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Rhumba3Sus </H2>
|
||||
|
@ -339,7 +325,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=RhumbaIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> RhumbaIntro </H2>
|
||||
|
@ -360,7 +345,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=RhumbaEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> RhumbaEnd </H2>
|
||||
|
@ -383,7 +367,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=RhumbaEnd1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> RhumbaEnd1 </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:37 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:12 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Rock-128</H1>
|
||||
|
@ -10,7 +10,6 @@
|
|||
<LI><A Href=#Rock128End>Rock128End</a>
|
||||
</ul>
|
||||
<A Name=Rock128></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Rock128 </H2>
|
||||
|
@ -27,7 +26,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Rock128Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Rock128Sus </H2>
|
||||
|
@ -46,7 +44,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Rock128Intro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Rock128Intro </H2>
|
||||
|
@ -63,7 +60,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Rock128End></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Rock128End </H2>
|
||||
|
|
|
@ -1,17 +1,37 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:34 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:12 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Rockballad</H1>
|
||||
<P>Written for slowish/doo-wop things like "You Belong To Me".
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Variables </H2>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="100%">
|
||||
<TR>
|
||||
<TD Valign=Top> <B> SusVoice </B> </TD>
|
||||
<TD Valign=Top> Voice used for sustained voicing in RockBalladVoice (default=ChoirAahs). </TD>
|
||||
</TR>
|
||||
<TR>
|
||||
<TD Valign=Top> <B> SusVoiceOctave </B> </TD>
|
||||
<TD Valign=Top> Octave for sustained voices (default=4). </TD>
|
||||
</TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<ul>
|
||||
<LI><A Href=#RockBallad>RockBallad</a>
|
||||
<LI><A Href=#RockBallad1>RockBallad1</a>
|
||||
<LI><A Href=#RockBalladFill>RockBalladFill</a>
|
||||
<LI><A Href=#RockBallad1Fill>RockBallad1Fill</a>
|
||||
<LI><A Href=#RockBalladVoice>RockBalladVoice</a>
|
||||
<LI><A Href=#RockBalladIntro>RockBalladIntro</a>
|
||||
<LI><A Href=#RockBalladEnd>RockBalladEnd</a>
|
||||
<LI><A Href=#RockBalladEnd1>RockBalladEnd1</a>
|
||||
</ul>
|
||||
<A Name=RockBallad></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> RockBallad </H2>
|
||||
|
@ -28,8 +48,24 @@
|
|||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=RockBallad1></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> RockBallad1 </H2>
|
||||
Same as the basic pattern, but skips the chord triplet on bar 4. <B>(4)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Bass </TD> <TD> FretlessBass </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Drum </TD> <TD> ClosedHiHat </TD></TR>
|
||||
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||
<TR><TD> Drum-Snare </TD> <TD> SnareDrum1 </TD></TR>
|
||||
<TR><TD> Walk </TD> <TD> FretlessBass </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=RockBalladFill></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> RockBalladFill </H2>
|
||||
|
@ -47,8 +83,25 @@
|
|||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=RockBallad1Fill></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> RockBallad1Fill </H2>
|
||||
Guitar apreggio fills without 4th bar triplets. <B>(4)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Arpeggio </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Bass </TD> <TD> FretlessBass </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Drum </TD> <TD> ClosedHiHat </TD></TR>
|
||||
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||
<TR><TD> Drum-Snare </TD> <TD> SnareDrum1 </TD></TR>
|
||||
<TR><TD> Walk </TD> <TD> FretlessBass </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=RockBalladVoice></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> RockBalladVoice </H2>
|
||||
|
@ -67,7 +120,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=RockBalladIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> RockBalladIntro </H2>
|
||||
|
@ -85,7 +137,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=RockBalladEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> RockBalladEnd </H2>
|
||||
|
@ -102,5 +153,21 @@
|
|||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=RockBalladEnd1></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> RockBalladEnd1 </H2>
|
||||
Simple 2 bar ending. <B>(2)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Bass </TD> <TD> FretlessBass </TD></TR>
|
||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||
<TR><TD> Drum </TD> <TD> ClosedHiHat </TD></TR>
|
||||
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||
<TR><TD> Drum-Snare </TD> <TD> SnareDrum1 </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
|
||||
</Body></HTML>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:42 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:12 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Samba</H1>
|
||||
|
@ -14,7 +14,6 @@
|
|||
<LI><A Href=#SambaEnd>SambaEnd</a>
|
||||
</ul>
|
||||
<A Name=Samba></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Samba </H2>
|
||||
|
@ -35,7 +34,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SambaFill></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SambaFill </H2>
|
||||
|
@ -57,7 +55,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SambaPlus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SambaPlus </H2>
|
||||
|
@ -78,7 +75,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SambaSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SambaSus </H2>
|
||||
|
@ -100,7 +96,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SambaSusFill></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SambaSusFill </H2>
|
||||
|
@ -123,7 +118,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SambaSusPlus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SambaSusPlus </H2>
|
||||
|
@ -145,7 +139,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SambaIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SambaIntro </H2>
|
||||
|
@ -166,7 +159,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SambaEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SambaEnd </H2>
|
||||
|
|
137
mma/docs/html/lib/stdlib/shuffleboggie.html
Normal file
137
mma/docs/html/lib/stdlib/shuffleboggie.html
Normal file
|
@ -0,0 +1,137 @@
|
|||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:13 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Shuffleboggie</H1>
|
||||
<P>A blues-like shuffle beat. Written for Kansas City.
|
||||
<ul>
|
||||
<LI><A Href=#ShuffleBoggie>ShuffleBoggie</a>
|
||||
<LI><A Href=#ShuffleBoggie1>ShuffleBoggie1</a>
|
||||
<LI><A Href=#ShuffleBoggieSus>ShuffleBoggieSus</a>
|
||||
<LI><A Href=#ShuffleBoggieIntro>ShuffleBoggieIntro</a>
|
||||
<LI><A Href=#ShuffleBoggieIntro4>ShuffleBoggieIntro4</a>
|
||||
<LI><A Href=#ShuffleBoggieEnd>ShuffleBoggieEnd</a>
|
||||
</ul>
|
||||
<A Name=ShuffleBoggie></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> ShuffleBoggie </H2>
|
||||
Blues with a shuffle style. <B>(2)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Bass </TD> <TD> SlapBass1 </TD></TR>
|
||||
<TR><TD> Bass-Piano </TD> <TD> Piano2 </TD></TR>
|
||||
<TR><TD> Chord-Guitar </TD> <TD> MutedGuitar </TD></TR>
|
||||
<TR><TD> Chord-Piano </TD> <TD> Piano2 </TD></TR>
|
||||
<TR><TD> Chord-Sax </TD> <TD> TenorSax </TD></TR>
|
||||
<TR><TD> Drum-Chh </TD> <TD> ClosedHiHat </TD></TR>
|
||||
<TR><TD> Drum-Clap </TD> <TD> HandClap </TD></TR>
|
||||
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||
<TR><TD> Drum-Ohh </TD> <TD> OpenHiHat </TD></TR>
|
||||
<TR><TD> Drum-Snare </TD> <TD> SnareDrum2 </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=ShuffleBoggie1></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> ShuffleBoggie1 </H2>
|
||||
Adds an articulated guitar riff to the basic beat. <B>(2)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Arpeggio </TD> <TD> CleanGuitar </TD></TR>
|
||||
<TR><TD> Bass </TD> <TD> SlapBass1 </TD></TR>
|
||||
<TR><TD> Bass-Piano </TD> <TD> Piano2 </TD></TR>
|
||||
<TR><TD> Chord-Guitar </TD> <TD> MutedGuitar </TD></TR>
|
||||
<TR><TD> Chord-Piano </TD> <TD> Piano2 </TD></TR>
|
||||
<TR><TD> Chord-Sax </TD> <TD> TenorSax </TD></TR>
|
||||
<TR><TD> Drum-Chh </TD> <TD> ClosedHiHat </TD></TR>
|
||||
<TR><TD> Drum-Clap </TD> <TD> HandClap </TD></TR>
|
||||
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||
<TR><TD> Drum-Ohh </TD> <TD> OpenHiHat </TD></TR>
|
||||
<TR><TD> Drum-Snare </TD> <TD> SnareDrum2 </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=ShuffleBoggieSus></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> ShuffleBoggieSus </H2>
|
||||
Blues with violins. Sort of odd, but we can call them fiddles! <B>(2)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Bass </TD> <TD> SlapBass1 </TD></TR>
|
||||
<TR><TD> Bass-Piano </TD> <TD> Piano2 </TD></TR>
|
||||
<TR><TD> Chord-Guitar </TD> <TD> MutedGuitar </TD></TR>
|
||||
<TR><TD> Chord-Piano </TD> <TD> Piano2 </TD></TR>
|
||||
<TR><TD> Chord-Sax </TD> <TD> TenorSax </TD></TR>
|
||||
<TR><TD> Chord-Sus </TD> <TD> Strings </TD></TR>
|
||||
<TR><TD> Drum-Chh </TD> <TD> ClosedHiHat </TD></TR>
|
||||
<TR><TD> Drum-Clap </TD> <TD> HandClap </TD></TR>
|
||||
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||
<TR><TD> Drum-Ohh </TD> <TD> OpenHiHat </TD></TR>
|
||||
<TR><TD> Drum-Snare </TD> <TD> SnareDrum2 </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=ShuffleBoggieIntro></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> ShuffleBoggieIntro </H2>
|
||||
A two bar intro. Short, loud and sweet. <B>(2)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Bass </TD> <TD> SlapBass1 </TD></TR>
|
||||
<TR><TD> Chord-Guitar </TD> <TD> MutedGuitar </TD></TR>
|
||||
<TR><TD> Chord-Piano </TD> <TD> Piano2 </TD></TR>
|
||||
<TR><TD> Chord-Sax </TD> <TD> TenorSax </TD></TR>
|
||||
<TR><TD> Drum-Chh </TD> <TD> ClosedHiHat </TD></TR>
|
||||
<TR><TD> Drum-Clap </TD> <TD> HandClap </TD></TR>
|
||||
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||
<TR><TD> Drum-Snare </TD> <TD> SnareDrum2 </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=ShuffleBoggieIntro4></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> ShuffleBoggieIntro4 </H2>
|
||||
A four bar intro. <B>(4)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Bass </TD> <TD> SlapBass1 </TD></TR>
|
||||
<TR><TD> Chord-Guitar </TD> <TD> MutedGuitar </TD></TR>
|
||||
<TR><TD> Chord-Piano </TD> <TD> Piano2 </TD></TR>
|
||||
<TR><TD> Chord-Sax </TD> <TD> TenorSax </TD></TR>
|
||||
<TR><TD> Drum-Chh </TD> <TD> ClosedHiHat </TD></TR>
|
||||
<TR><TD> Drum-Clap </TD> <TD> HandClap </TD></TR>
|
||||
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||
<TR><TD> Drum-Snare </TD> <TD> SnareDrum2 </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=ShuffleBoggieEnd></a>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> ShuffleBoggieEnd </H2>
|
||||
Very simple ending, hits on 1, 2 and 3 of last bar. <B>(2)</B>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||
<TR><TD> Bass </TD> <TD> SlapBass1 </TD></TR>
|
||||
<TR><TD> Chord-Guitar </TD> <TD> MutedGuitar </TD></TR>
|
||||
<TR><TD> Chord-Piano </TD> <TD> Piano2 </TD></TR>
|
||||
<TR><TD> Chord-Sax </TD> <TD> TenorSax </TD></TR>
|
||||
<TR><TD> Drum-Chh </TD> <TD> ClosedHiHat </TD></TR>
|
||||
<TR><TD> Drum-Clap </TD> <TD> HandClap </TD></TR>
|
||||
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||
<TR><TD> Drum-Snare </TD> <TD> SnareDrum2 </TD></TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
|
||||
</Body></HTML>
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:35 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:13 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Ska</H1>
|
||||
|
@ -12,7 +12,6 @@
|
|||
<LI><A Href=#SkaEnd>SkaEnd</a>
|
||||
</ul>
|
||||
<A Name=Ska></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Ska </H2>
|
||||
|
@ -34,7 +33,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Ska1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Ska1 </H2>
|
||||
|
@ -57,7 +55,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SkaSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SkaSus </H2>
|
||||
|
@ -80,7 +77,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Ska1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Ska1Sus </H2>
|
||||
|
@ -104,7 +100,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SkaClap></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SkaClap </H2>
|
||||
|
@ -127,7 +122,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SkaEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SkaEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:36 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:13 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Slowblues</H1>
|
||||
|
@ -18,7 +18,6 @@
|
|||
<LI><A Href=#SlowBluesEnd>SlowBluesEnd</a>
|
||||
</ul>
|
||||
<A Name=SlowBlues></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowBlues </H2>
|
||||
|
@ -36,7 +35,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowBluesFill></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowBluesFill </H2>
|
||||
|
@ -54,7 +52,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowBluesFill1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowBluesFill1 </H2>
|
||||
|
@ -72,7 +69,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowBluesFill2></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowBluesFill2 </H2>
|
||||
|
@ -90,7 +86,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowBluesFill3></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowBluesFill3 </H2>
|
||||
|
@ -108,7 +103,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowBluesSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowBluesSus </H2>
|
||||
|
@ -127,7 +121,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowBluesWalk4></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowBluesWalk4 </H2>
|
||||
|
@ -144,7 +137,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowBluesWalk4Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowBluesWalk4Sus </H2>
|
||||
|
@ -162,7 +154,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowBluesWalk8></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowBluesWalk8 </H2>
|
||||
|
@ -180,7 +171,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowBluesWalk8Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowBluesWalk8Sus </H2>
|
||||
|
@ -199,7 +189,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowBluesIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowBluesIntro </H2>
|
||||
|
@ -216,7 +205,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowBluesEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowBluesEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:44 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:13 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Slowbolero</H1>
|
||||
|
@ -10,7 +10,6 @@
|
|||
<LI><A Href=#SlowBoleroEnd>SlowBoleroEnd</a>
|
||||
</ul>
|
||||
<A Name=SlowBolero></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowBolero </H2>
|
||||
|
@ -32,7 +31,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowBoleroSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowBoleroSus </H2>
|
||||
|
@ -55,7 +53,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowBoleroIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowBoleroIntro </H2>
|
||||
|
@ -77,7 +74,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowBoleroEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowBoleroEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:41 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:13 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Slowcountry</H1>
|
||||
|
@ -14,7 +14,6 @@
|
|||
<LI><A Href=#SlowCountryEnd>SlowCountryEnd</a>
|
||||
</ul>
|
||||
<A Name=SlowCountry></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowCountry </H2>
|
||||
|
@ -32,7 +31,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowCountrySus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowCountrySus </H2>
|
||||
|
@ -51,7 +49,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowCountryFill></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowCountryFill </H2>
|
||||
|
@ -70,7 +67,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowCountryWalk></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowCountryWalk </H2>
|
||||
|
@ -86,7 +82,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowCountryWalkSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowCountryWalkSus </H2>
|
||||
|
@ -103,7 +98,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowCountryWalkFill></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowCountryWalkFill </H2>
|
||||
|
@ -122,7 +116,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowCountryIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowCountryIntro </H2>
|
||||
|
@ -139,7 +132,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowCountryEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowCountryEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:37 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:13 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Slowjazz</H1>
|
||||
|
@ -21,7 +21,6 @@
|
|||
<LI><A Href=#SlowJazz2End>SlowJazz2End</a>
|
||||
</ul>
|
||||
<A Name=SlowJazz></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowJazz </H2>
|
||||
|
@ -39,7 +38,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowJazzSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowJazzSus </H2>
|
||||
|
@ -58,7 +56,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowJazzWalk></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowJazzWalk </H2>
|
||||
|
@ -75,7 +72,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowJazzWalkSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowJazzWalkSus </H2>
|
||||
|
@ -93,7 +89,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowJazz1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowJazz1 </H2>
|
||||
|
@ -111,7 +106,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowJazz1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowJazz1Sus </H2>
|
||||
|
@ -130,7 +124,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowJazz1Walk></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowJazz1Walk </H2>
|
||||
|
@ -147,7 +140,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowJazz1WalkSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowJazz1WalkSus </H2>
|
||||
|
@ -165,7 +157,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowJazz2></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowJazz2 </H2>
|
||||
|
@ -183,7 +174,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowJazz2Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowJazz2Sus </H2>
|
||||
|
@ -202,7 +192,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowJazzIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowJazzIntro </H2>
|
||||
|
@ -220,7 +209,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowJazz1Intro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowJazz1Intro </H2>
|
||||
|
@ -238,7 +226,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowJazz2Intro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowJazz2Intro </H2>
|
||||
|
@ -255,7 +242,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowJazzEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowJazzEnd </H2>
|
||||
|
@ -272,7 +258,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SlowJazz2End></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SlowJazz2End </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:32 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:14 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Softrock</H1>
|
||||
|
@ -13,7 +13,6 @@
|
|||
<LI><A Href=#SoftRockEnd>SoftRockEnd</a>
|
||||
</ul>
|
||||
<A Name=SoftRock></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SoftRock </H2>
|
||||
|
@ -31,7 +30,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SoftRockSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SoftRockSus </H2>
|
||||
|
@ -50,7 +48,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SoftRock1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SoftRock1 </H2>
|
||||
|
@ -69,7 +66,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SoftRock1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SoftRock1Sus </H2>
|
||||
|
@ -89,7 +85,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SoftRockIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SoftRockIntro </H2>
|
||||
|
@ -106,7 +101,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SoftRockSusIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SoftRockSusIntro </H2>
|
||||
|
@ -124,7 +118,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SoftRockEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SoftRockEnd </H2>
|
||||
|
|
|
@ -1,8 +1,22 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:42 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:14 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Softshoe</H1>
|
||||
<P>Syncopated ditty for the old dancers. Written for "Me and My Shadow".
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Variables </H2>
|
||||
</TD></TR>
|
||||
<TR><TD>
|
||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="100%">
|
||||
<TR>
|
||||
<TD Valign=Top> <B> ChordVoice </B> </TD>
|
||||
<TD Valign=Top> Voice used in Chord tracks (defaults to Piano2). </TD>
|
||||
</TR>
|
||||
</Table>
|
||||
</TD></TR>
|
||||
</Table>
|
||||
<ul>
|
||||
<LI><A Href=#Softshoe>Softshoe</a>
|
||||
<LI><A Href=#SoftShoePlus>SoftShoePlus</a>
|
||||
|
@ -12,7 +26,6 @@
|
|||
<LI><A Href=#SoftShoeEnd>SoftShoeEnd</a>
|
||||
</ul>
|
||||
<A Name=Softshoe></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Softshoe </H2>
|
||||
|
@ -30,7 +43,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SoftShoePlus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SoftShoePlus </H2>
|
||||
|
@ -49,7 +61,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SoftShoeSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SoftShoeSus </H2>
|
||||
|
@ -68,7 +79,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SoftShoeSusPlus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SoftShoeSusPlus </H2>
|
||||
|
@ -88,7 +98,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SoftShoeIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SoftShoeIntro </H2>
|
||||
|
@ -105,7 +114,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SoftShoeEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SoftShoeEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:43 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:14 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Son</H1>
|
||||
|
@ -10,7 +10,6 @@
|
|||
<LI><A Href=#SonEnd>SonEnd</a>
|
||||
</ul>
|
||||
<A Name=Son></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Son </H2>
|
||||
|
@ -33,7 +32,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SonSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SonSus </H2>
|
||||
|
@ -57,7 +55,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SonIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SonIntro </H2>
|
||||
|
@ -80,7 +77,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SonEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SonEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:30 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:14 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Swing</H1>
|
||||
|
@ -34,7 +34,6 @@
|
|||
<LI><A Href=#Swing2End>Swing2End</a>
|
||||
</ul>
|
||||
<A Name=Swing></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Swing </H2>
|
||||
|
@ -55,7 +54,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SwingWalk></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SwingWalk </H2>
|
||||
|
@ -76,7 +74,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SwingTriple></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SwingTriple </H2>
|
||||
|
@ -97,7 +94,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SwingPlus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SwingPlus </H2>
|
||||
|
@ -119,7 +115,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SwingWalkPlus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SwingWalkPlus </H2>
|
||||
|
@ -141,7 +136,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SwingSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SwingSus </H2>
|
||||
|
@ -163,7 +157,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SwingPlusSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SwingPlusSus </H2>
|
||||
|
@ -186,7 +179,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SwingWalkSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SwingWalkSus </H2>
|
||||
|
@ -208,7 +200,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SwingWalkPlusSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SwingWalkPlusSus </H2>
|
||||
|
@ -231,7 +222,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Swing1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Swing1 </H2>
|
||||
|
@ -252,7 +242,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Swing1Walk></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Swing1Walk </H2>
|
||||
|
@ -273,7 +262,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Swing1Triple></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Swing1Triple </H2>
|
||||
|
@ -293,7 +281,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Swing1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Swing1Sus </H2>
|
||||
|
@ -315,7 +302,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Swing1WalkSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Swing1WalkSus </H2>
|
||||
|
@ -337,7 +323,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Swing1Plus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Swing1Plus </H2>
|
||||
|
@ -359,7 +344,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Swing1PlusSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Swing1PlusSus </H2>
|
||||
|
@ -382,7 +366,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Swing1WalkPlus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Swing1WalkPlus </H2>
|
||||
|
@ -404,7 +387,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Swing1WalkPlusSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Swing1WalkPlusSus </H2>
|
||||
|
@ -427,7 +409,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Swing2></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Swing2 </H2>
|
||||
|
@ -449,7 +430,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Swing2Triple></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Swing2Triple </H2>
|
||||
|
@ -469,7 +449,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Swing2Plus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Swing2Plus </H2>
|
||||
|
@ -492,7 +471,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Swing2Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Swing2Sus </H2>
|
||||
|
@ -515,7 +493,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Swing2PlusSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Swing2PlusSus </H2>
|
||||
|
@ -539,7 +516,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SwingIntro></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SwingIntro </H2>
|
||||
|
@ -560,7 +536,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SwingIntro2></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SwingIntro2 </H2>
|
||||
|
@ -581,7 +556,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=SwingEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> SwingEnd </H2>
|
||||
|
@ -600,7 +574,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Swing1End></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Swing1End </H2>
|
||||
|
@ -621,7 +594,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Swing2End></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Swing2End </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:29 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:15 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Tango</H1>
|
||||
|
@ -9,7 +9,6 @@
|
|||
<LI><A Href=#TangoEnd>TangoEnd</a>
|
||||
</ul>
|
||||
<A Name=Tango></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Tango </H2>
|
||||
|
@ -30,7 +29,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=Tango1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> Tango1 </H2>
|
||||
|
@ -51,7 +49,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=TangoEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> TangoEnd </H2>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<!-- Auto-Generated by MMA on: Sun Oct 15 11:20:36 2006 -->
|
||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:15 2007 -->
|
||||
<HTML>
|
||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||
<H1>Vienesewaltz</H1>
|
||||
|
@ -11,7 +11,6 @@
|
|||
<LI><A Href=#VieneseWaltzEnd>VieneseWaltzEnd</a>
|
||||
</ul>
|
||||
<A Name=VieneseWaltz></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> VieneseWaltz </H2>
|
||||
|
@ -28,7 +27,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=VieneseWaltzSus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> VieneseWaltzSus </H2>
|
||||
|
@ -46,7 +44,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=VieneseWaltz1></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> VieneseWaltz1 </H2>
|
||||
|
@ -64,7 +61,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=VieneseWaltz1Sus></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> VieneseWaltz1Sus </H2>
|
||||
|
@ -83,7 +79,6 @@
|
|||
</TD></TR>
|
||||
</Table>
|
||||
<A Name=VieneseWaltzEnd></a>
|
||||
<P>
|
||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||
<TR><TD>
|
||||
<H2> VieneseWaltzEnd </H2>
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user