merging mma-1.1

This commit is contained in:
Matthias Neeracher 2007-04-29 06:47:40 +00:00
parent 52f8c7da38
commit 35300f3344
266 changed files with 34821 additions and 23252 deletions

View File

@ -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>
"""
@ -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 the track already exists, just return
if name in gbl.tnames:
return
if name in gbl.tnames:
return
# Get the trackname. Can be just a type, or type-name.
# 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 '-' 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
# Now attempt to allocate the track
gbl.tnames[name] = newtk = f(name)
gbl.tnames[name] = newtk = f(name)
# Set the sequence size of new track
# Set the sequence size of new track
newtk.setSeqSize()
newtk.setSeqSize()
# Update current grooves to reflect new track.
# Update current grooves to reflect new track.
for slot in gbl.settingsGroove.keys():
newtk.saveGroove(slot)
for slot in gbl.settingsGroove.keys():
newtk.saveGroove(slot)
if gbl.debug:
print "Creating new track", name
if gbl.debug:
print "Creating new track", name
return
return

View File

@ -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

View File

@ -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])

View File

@ -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."),
'7b5': ((C, E, Gb, Bb ),
(C, D, E, F, Gb, A, Bb),
"7th, flat 5."),
'mM7(add9)': ((C, Eb, G, B, D+12),
(C, D, Eb, F, G, Ab, B),
"Minor Triad plus Major 7th and 9th."),
'dim7': ((C, Eb, Gb, Bbb ),
(C, D, Eb, F, Gb, Ab, Bbb ), # missing 8th note
"Diminished seventh."),
'm7b5': ((C, Eb, Gb, Bb ),
(C, D, Eb, F, Gb, Ab, Bb),
"Minor 7th, flat 5 (aka 1/2 diminished). "),
'aug': ((C, E, Gs ),
(C, D, E, F, Gs, A, B ),
"Augmented triad."),
'm7b9': ((C, Eb, G, Bb, Db+12 ),
(C, Db, Eb, F, G, Ab, Bb),
"Minor 7th with added flat 9th."),
'6': ((C, E, G, A ),
(C, D, E, F, G, A, B),
"Major tiad with added 6th."),
'm7#9': ((C, Eb, G, Bb, Ds+12 ),
(C, Ds, Eb, F, G, Ab, Bb),
"Minor 7th with added sharp 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''."),
'7': ((C, E, G, Bb ),
(C, D, E, F, G, A, Bb),
"7th."),
'M7': ((C, E, G, B),
(C, D, E, F, G, A, B),
"Major 7th."),
'7b5': ((C, E, Gb, Bb ),
(C, D, E, F, Gb, A, Bb),
"7th, flat 5."),
'M7#5': ((C, E, Gs, B),
(C, D, E, F, Gs, A, B),
"Major 7th with sharp 5th."),
'dim7': ((C, Eb, Gb, Bbb ),
(C, D, Eb, F, Gb, Ab, Bbb ), # missing 8th note
"Diminished seventh."),
'M7b5': ((C, E, Gb, B ),
(C, D, E, F, Gb, A, B ),
"Major 7th with a flat 5th."),
'dim7(addM7)': ((C, Eb, Gb, A, B),
(C, D, Eb, F, Gb, A, B),
"Diminished tirad with added Major 7th."),
'9': ((C, E, G, Bb, D+12 ),
(C, D, E, F, G, A, Bb),
"Dominant 7th plus 9th."),
'aug': ((C, E, Gs ),
(C, D, E, F, Gs, A, B ),
"Augmented triad."),
'sus9': ((C, E, G, D+12),
(C, D, E, F, G, A, D+12),
"Dominant 7th plus 9th, omit 7th."),
'6': ((C, E, G, A ),
(C, D, E, F, G, A, B),
"Major tiad with added 6th."),
'9b5': ((C, E, Gb, Bb, D+12 ),
(C, D, E, F, Gb, A, Bb),
"Dominant 7th plus 9th with flat 5th."),
'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''."),
'm9': ((C, Eb, G, Bb, D+12 ),
(C, D, Eb, F, G, Ab, Bb),
"Minor triad plus 7th and 9th."),
'M7': ((C, E, G, B),
(C, D, E, F, G, A, B),
"Major 7th."),
'm9b5': ((C, Eb, Gb, Bb, D+12 ),
(C, D, Eb, F, Gb, Ab, Bb),
"Minor triad, flat 5, plus 7th and 9th."),
'M7#5': ((C, E, Gs, B),
(C, D, E, F, Gs, A, B),
"Major 7th with sharp 5th."),
'm(sus9)':((C, Eb, G, D+12 ),
(C, D, Eb, F, G, Ab, D+12),
"Minor triad plus 9th (no 7th)."),
'M7b5': ((C, E, Gb, B ),
(C, D, E, F, Gb, A, B ),
"Major 7th with a flat 5th."),
'M9': ((C, E, G, B, D+12 ),
(C, D, E, F, G, A, B),
"Major 7th plus 9th."),
'7b9': ((C, E, G, Bb, Db+12 ),
(C, Db, E, F, G, A, Bb),
"Dominant 7th with flat 9th."),
'7#9': ((C, E, G, Bb, Ds+12 ),
(C, Ds, E, F, G, A, Bb),
"Dominant 7th with sharp 9th."),
'7b5b9':((C, E, Gb, Bb, Db+12 ),
(C, Db, E, F, Gb, A, Bb),
"Dominant 7th with flat 5th and flat 9th."),
'7b5#9':((C, E, Gb, Bb, Ds+12 ),
(C, Ds, E, F, Gb, A, Bb),
"Dominant 7th with flat 5th and sharp 9th."),
'7#5#9':((C, E, Gs, Bb, Ds+12 ),
(C, Ds, E, F, Gs, A, Bb),
"Dominant 7th with sharp 5th and sharp 9th."),
'7#5b9':((C, E, Gs, Bb, Db+12 ),
(C, Db, E, F, Gs, A, Bb),
"Dominant 7th with sharp 5th and flat 9th."),
'aug7': ((C, E, Gs, Bb ),
(C, D, E, F, Gs, A, Bb),
"An augmented chord (raised 5th) with a dominant 7th."),
'aug7b9':((C, E, Gs, Bb, Db+12 ),
(C, Db, E, F, Gs, A, Bb),
"Augmented 7th with flat 5th and sharp 9th."),
'11': ((C, E, G, Bb, D+12, F+12 ),
(C, D, E, F, G, A, Bb),
"9th chord plus 11th."),
'm11': ((C, Eb, G, Bb, D+12, F+12 ),
(C, D, Eb, F, G, Ab, Bb),
"9th with minor 3rd, plus 11th."),
'11b9': ((C, E, G, Bb, Db+12, F+12 ),
(C, Db, E, F, G, A, Bb),
"9th chord plus flat 11th."),
'9#5': ((C, E, Gs, Bb, D+12 ),
(C, D, E, F, Gs, A, Bb),
"Dominant 7th plus 9th with sharp 5th."),
'9#11': ((C, E, G, Bb, D+12, Fs+12 ),
(C, D, E, Fs, G, A, Bb),
"Dominant 7th plus 9th and sharp 11th."),
'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."),
'9': ((C, E, G, Bb, D+12 ),
(C, D, E, F, G, A, Bb),
"7th plus 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."),
# 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.
'9b5': ((C, E, Gb, Bb, D+12 ),
(C, D, E, F, Gb, A, Bb),
"7th plus 9th with flat 5th."),
'sus4': ((C, F, G ),
(C, D, F, F, G, A, B),
"Suspended 4th, major triad with 3rd raised half tone."),
'm9': ((C, Eb, G, Bb, D+12 ),
(C, D, Eb, F, G, Ab, Bb),
"Minor triad plus 7th and 9th."),
'7sus': ((C, F, G, Bb ),
(C, D, F, F, G, A, Bb),
"7th with suspended 4th, dominant 7th with 3rd "
"raised half tone."),
'm7b5b9': ((C, Eb, Gb, Bb, Db+12),
(C, Db, Eb, F, Gb, Ab, Bb),
"Minor 7th with flat 5th and flat 9th."),
'sus2': ((C, D, G ),
(C, D, D, F, G, A, B),
"Suspended 2nd, major triad with major 2nd above "
"root substituted for 3rd."),
'm9b5': ((C, Eb, Gb, Bb, D+12 ),
(C, D, Eb, F, Gb, Ab, Bb),
"Minor triad, flat 5, plus 7th and 9th."),
'7sus2':((C, D, G, Bb ),
(C, D, D, F, G, A, Bb),
"A sus2 with dominant 7th added."),
'm(sus9)':((C, Eb, G, D+12 ),
(C, D, Eb, F, G, Ab, D+12),
"Minor triad plus 9th (no 7th)."),
# 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': ((C, E, G, B, D+12 ),
(C, D, E, F, G, A, B),
"Major 7th plus 9th."),
'13': ((C, E, G, Bb, A+12),
(C, D, E, F, G, A, Bb),
"Dominant 7th (including 5th) plus 13th."),
'M9#11': ((C, E, G, B, D+12, Fs+12),
(C, D, E, Fs, G, A, B),
"Major 9th plus sharp 11th."),
'M13': ((C, E, G, B, A+12),
(C, D, E, F, G, A, B),
"Major 7th (including 5th) plus 13th."),
'7b9': ((C, E, G, Bb, Db+12 ),
(C, Db, E, F, G, A, Bb),
"7th with flat 9th."),
# 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.
'7#9': ((C, E, G, Bb, Ds+12 ),
(C, Ds, E, F, G, A, Bb),
"7th with sharp 9th."),
'5': ((C, C, G, G ),
(C, D, E, F, G, A, B),
"Altered Fifth or Power Chord; root and 5th only."),
'7#9b13': ((C, E, G, Bb, Ds+12, Ab+12 ),
(C, Ds, E, F, G, Ab, Bb),
"7th with sharp 9th and flat 13th."),
'7b5b9':((C, E, Gb, Bb, Db+12 ),
(C, Db, E, F, Gb, A, Bb),
"7th with flat 5th and flat 9th."),
'7b5#9':((C, E, Gb, Bb, Ds+12 ),
(C, Ds, E, F, Gb, A, Bb),
"7th with flat 5th and sharp 9th."),
'7#5#9':((C, E, Gs, Bb, Ds+12 ),
(C, Ds, E, F, Gs, A, Bb),
"7th with sharp 5th and sharp 9th."),
'aug7': ((C, E, Gs, Bb ),
(C, D, E, F, Gs, A, Bb),
"An augmented chord (raised 5th) with a dominant 7th."),
'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."),
'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."),
'+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."),
'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."),
'11': ((C, C, G, Bb, D+12, F+12 ),
(C, D, E, F, G, A, Bb),
"9th chord plus 11th (3rd not voiced)."),
'm11': ((C, Eb, G, Bb, D+12, F+12 ),
(C, D, Eb, F, G, Ab, Bb),
"9th with minor 3rd, plus 11th."),
'm7(add11)': ((C, Eb, G, Bb, F+12 ),
(C, D, Eb, F, G, Ab, Bb),
"Minor 7th plus 11th."),
'm9#11': ((C, Eb, G, Bb, D+12, Fs+12),
(C, D, Eb, Fs, G, A, Bb),
"Minor 7th plus 9th and sharp 11th."),
'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."),
'm7(add13)': ((C, Eb, G, Bb, A+12 ),
(C, D, Eb, F, G, A, Bb),
"Minor 7th plus 13th."),
'11b9': ((C, E, G, Bb, Db+12, F+12 ),
(C, Db, E, F, G, A, Bb),
"7th chord plus flat 9th and 11th."),
'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)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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,319 +29,319 @@ 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)
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 = []
pushedLyrics = []
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'))
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
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 }
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 }
def __init__(self):
pass
def __init__(self):
pass
def setting(self):
""" Called from macro. """
def setting(self):
""" Called from macro. """
a="Event="
a="Event="
if self.textev: a+="Text"
else: a+="Lyric"
if self.textev: a+="Text"
else: a+="Lyric"
a+=" Split="
if self.barsplit: a+="Bar"
else: a+="Normal"
a+=" Split="
if self.barsplit: a+="Bar"
else: a+="Normal"
a += " Verse=%s" % self.versenum
a += " Verse=%s" % self.versenum
a += " Chords="
if self.dupchords: a+="On"
else: a+="Off"
a += " Chords="
if self.dupchords: a+="On"
else: a+="Off"
a += " Transpose=%s" % self.transpose
a += " Transpose=%s" % self.transpose
a += " CNames="
if self.transKey: a+="Sharp"
else: a+="Flat"
a += " CNames="
if self.transKey: a+="Sharp"
else: a+="Flat"
return a
return a
def option(self, ln):
""" Set a lyric option. """
def option(self, ln):
""" Set a lyric option. """
for i, l in enumerate(ln):
l=l.upper()
for i, l in enumerate(ln):
l=l.upper()
# Single word options
# Single word options
if l.upper()=="SET":
if l.upper()=="SET":
if i>=len(ln):
s=''
else:
s=' '.join(ln[i+1:]).strip()
if i>=len(ln):
s=''
else:
s=' '.join(ln[i+1:]).strip()
if not s.startswith('['):
s = '[' + s + ']'
if not s.startswith('['):
s = '[' + s + ']'
self.pushedLyrics.append(s)
self.pushedLyrics.append(s)
break
break
# All the rest are OPT=VALUE pairs
# All the rest are OPT=VALUE pairs
try:
a,v = l.split('=')
except:
error("Lyric options must be in CMD=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.")
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."
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.")
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 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."
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.")
else:
error("Valid options for Lyric Split are BAR or NORMAL")
elif a == 'VERSE':
if v.isdigit():
self.versenum = int(v)
elif a == 'VERSE':
if v.isdigit():
self.versenum = int(v)
elif v == 'INC':
self.versenum += 1
elif v == 'INC':
self.versenum += 1
elif v == 'DEC':
self.versenum -= 1
elif v == 'DEC':
self.versenum -= 1
else:
error("Valid options of Lyric Verse are <nn> or INC or DEC.")
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 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
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 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."
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)
else:
error ("Expecting 'ON' or 'OFF' in Lyric directive, not 'CHORDS=%s'" % v)
elif a == 'TRANSPOSE':
elif a == 'TRANSPOSE':
v = stoi(v, "Lyric Tranpose expecting value, not %s" % v)
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)
if v < -12 or v > 12:
error("Lyric Tranpose %s out-of-range; must be -12..12" % v)
self.transpose = v
self.transpose = v
elif a == 'CNAMES':
elif a == 'CNAMES':
if v in ('#', 'SHARP'):
self.transKey = 1
elif v in ('B', '&', 'FLAT'):
self.transKey = 0
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("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 )
else:
error("Usage: Lyric expecting EVENT, SPLIT, VERSE, CHORDS, TRANSPOSE, CNAMES or SET, "
"not '%s'" % a )
def leftovers(self):
""" Just report leftovers on stack."""
def leftovers(self):
""" Just report leftovers on stack."""
if self.pushedLyrics:
warning("Lyrics remaining 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.
def extract(self, ln, rpt):
""" Extract lyric info from a chord line and place in META track.
Returns line and lyric as 2 strings.
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.
"""
The lyric is returned for debugging purposes, but it has been
processed and inserted into the MIDI track.
"""
a=ln.count('[')
b=ln.count(']')
a=ln.count('[')
b=ln.count(']')
if a != b:
error("Mismatched []s for lyrics found in chord line.")
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")
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
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.")
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, '[', ']')
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 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 = []
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 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
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
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
while tr>=12: tr-=12
while tr<=-12: tr+=12
if tr:
v = self.transNames[self.transKey][tr] + v[len(cn):]
if tr:
v = self.transNames[self.transKey][tr] + v[len(cn):]
ly.append(v)
ly.append(v)
i=gbl.QperBar - len(ly)
if i>0:
ly.extend( ['/'] * i )
lyrics.insert(0, ' '.join(ly) + '\\r')
i=gbl.QperBar - len(ly)
if i>0:
ly.extend( ['/'] * i )
lyrics.insert(0, ' '.join(ly) + '\\r')
v=self.versenum
v=self.versenum
if len(lyrics) == 1:
v=1
if len(lyrics) == 1:
v=1
if v > len(lyrics):
lyrics = ''
else:
lyrics=lyrics[v-1]
if v > len(lyrics):
lyrics = ''
else:
lyrics=lyrics[v-1]
if not len(lyrics):
return (ln, [])
if not len(lyrics):
return (ln, [])
lyrics=lyrics.replace('\\r', ' \\r ')
lyrics=lyrics.replace('\\n', ' \\n ')
lyrics=lyrics.replace(' ', ' ')
lyrics=lyrics.replace('\\r', ' \\r ')
lyrics=lyrics.replace('\\n', ' \\n ')
lyrics=lyrics.replace(' ', ' ')
if self.barsplit:
lyrics = [lyrics]
else:
lyrics = lyrics.split()
if self.barsplit:
lyrics = [lyrics]
else:
lyrics = lyrics.split()
beat = 0
bstep = gbl.QperBar / float(len(lyrics))
beat = 0
bstep = gbl.QperBar / float(len(lyrics))
for t, a in enumerate(lyrics):
a,b = pextract(a, '<', '>', 1)
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))
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')
a = a.replace('\\r', '\r')
a = a.replace('\\n', '\n')
if a and a != ' ':
if not a.endswith('-'):
a += ' '
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)
p=getOffset(beat * gbl.BperQ)
if self.textev:
gbl.mtrks[0].addText(p, a)
else:
gbl.mtrks[0].addLyric(p, a)
beat += bstep
beat += bstep
return (ln, lyrics)
return (ln, lyrics)
# Create a single instance of the Lyric Class.

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

@ -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()

View File

@ -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) )
# Convert all events to MIDI deltas and store in
# the track array/list
tdata=[] # empty track container
lastSts=None # Running status tracker
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) )
for a in sorted(tr.keys()):
delta = a-last
for d in tr[a]:
last = 0
""" 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.
"""
# Convert all events to MIDI deltas and store in
# the track array/list
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
tdata=[] # empty track container
lastSts=None # Running status tracker
tdata.extend( [ intToVarNumber(delta) , d ] )
delta = 0
last = a
for a in sorted(tr.keys()):
delta = a-last
for d in tr[a]:
# Add an EOF to the track (included in total track size)
""" 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.append( intToVarNumber(0))
tdata.append( chr(0xff) + chr(0x2f) + chr(0x00) )
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
tdata = ''.join(tdata)
totsize = len(tdata)
tdata.extend( [ intToVarNumber(delta) , d ] )
delta = 0
last = a
out.write("MTrk")
out.write(intToLong(totsize))
out.write( tdata )
# Add an EOF to the track (included in total track size)
tdata.append( intToVarNumber(0))
tdata.append( chr(0xff) + chr(0x2f) + chr(0x00) )
def addPairToTrack(self, boffset, startRnd, duration, note, v, unify):
""" Add a note on/off pair to a track.
tdata = ''.join(tdata)
totsize = len(tdata)
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
out.write("MTrk")
out.write(intToLong(totsize))
out.write( tdata )
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.
Offsets | 200 | 300 | 320 | 420
---------|--------|--------|-------|--------
Pair1 | on | | off |
Pair2 | | on | | off
def addPairToTrack(self, boffset, startRnd, duration, note, v, unify):
""" Add a note on/off pair to a track.
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!
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
However, if the unify flag is set we should end up with:
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.
Offsets | 200 | 300 | 320 | 420
---------|--------|--------|-------|--------
Pair1 | on | | |
Pair2 | | | | off
Offsets | 200 | 300 | 320 | 420
---------|--------|--------|-------|--------
Pair1 | on | | off |
Pair2 | | on | | off
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!
"""
However, if the unify flag is set we should end up with:
# Start/end offsets
Offsets | 200 | 300 | 320 | 420
---------|--------|--------|-------|--------
Pair1 | on | | |
Pair2 | | | | off
onOffset = getOffset( boffset, startRnd)
offOffset = onOffset + duration
# ON/OFF events
"""
onEvent = chr(0x90 | self.channel) + chr(note) + chr(v)
offEvent = onEvent[:-1] + chr(0)
# Start/end offsets
""" Check for overlap on last event set for this track and
do some ugly trickry.
onOffset = getOffset( boffset, startRnd)
offOffset = onOffset + duration
- 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.
# ON/OFF 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.
onEvent = chr(0x90 | self.channel) + chr(note) + chr(v)
offEvent = onEvent[:-1] + chr(0)
- 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.
""" Check for overlap on last event set for this track and
do some ugly trickry.
- If UNIFY is NOT set we insert a NOTE OFF at the current
on time. This replaces the OFF we just deleted.
- 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 UNIFY is SET we skip the above step, and we set the
noOnFlag so that the ON event isn't set.
- 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 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.
noOnFlag = None
- If UNIFY is NOT set we insert a NOTE OFF at the current
on time. This replaces the OFF we just deleted.
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
- If UNIFY is SET we skip the above step, and we set the
noOnFlag so that the ON event isn't set.
if not noOnFlag:
self.addToTrack(onOffset, onEvent )
self.addToTrack(offOffset, offEvent )
"""
# Save the NOTE OFF time for the next loop.
noOnFlag = None
self.lastEvent[note] = offOffset
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
if not noOnFlag:
self.addToTrack(onOffset, onEvent )
self.addToTrack(offOffset, offEvent )
def zapRangeTrack(self, start, end):
""" Clear NoteOn events from track in range: start ... end.
# Save the NOTE OFF time for the next loop.
This is called from the fermata function.
self.lastEvent[note] = offOffset
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 zapRangeTrack(self, start, end):
""" Clear NoteOn events from track in range: start ... end.
This is called from the fermata function.
def addToTrack(self, offset, event):
""" Add an event to a track.
We delete the entire event list (3 bytes) from the buffer. This
can result in empty directory enteries, but that isn't a problem.
"""
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:
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]
miditrk[123] = [event1, event2, ...]
"""
if offset<0:
offset=0
def addToTrack(self, offset, event):
""" Add an event to a track.
tr=self.miditrk
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 in tr:
tr[offset].append(event)
else:
tr[offset]=[event]
miditrk[123] = [event1, event2, ...]
"""
if offset<0:
offset=0
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()

View File

@ -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"

View File

@ -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)

View File

@ -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
View 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]

View File

@ -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>
"""
@ -28,60 +28,60 @@ 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 ]."
emsg = "Use: SwingMode [ On, Off, 0, 1 Skew=xx ]."
if not ln:
error(emsg)
if not ln:
error(emsg)
for v in ln:
for v in ln:
a = v.upper()
a = v.upper()
if a in ("ON", "1"):
gbl.swingMode = 1
continue
if a in ("ON", "1"):
gbl.swingMode = 1
continue
if a in ("OFF", "0"):
gbl.swingMode = 0
continue
if a in ("OFF", "0"):
gbl.swingMode = 0
continue
if a.find('=')>1:
a,b = a.split('=')
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
if a == 'SKEW':
gbl.swingSkew = b
v = int( stoi(b) * gbl.BperQ / 100)
noteLenTable['81'] = v
noteLenTable['82'] = gbl.BperQ - v
continue
error(emsg)
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.
@ -89,42 +89,42 @@ swingMode(['Skew=66']) # Set the default swingskew values.
def getNoteLen(n):
""" Convert a Note to a midi tick length.
""" 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
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
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 "+"
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
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]
try:
if a.startswith('-'):
i = noteLenTable[a[1:]] * -1
else:
i = noteLenTable[a]
except:
error("Unknown note duration %s" % n )
except:
error("Unknown note duration %s" % n )
if dot == 2:
i += i/2 + i/4
elif dot == 1:
i += i/2
length += i
if dot == 2:
i += i/2 + i/4
elif dot == 1:
i += i/2
length += i
return length
return length

View File

@ -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:
elif o == '-o':
gbl.showFilenames = gbl.LshowFilenames = 1
if o == '-d':
gbl.debug = gbl.Ldebug = 1
elif o == '-p':
gbl.pshow = gbl.Lpshow = 1
elif o == '-o':
gbl.showFilenames = gbl.LshowFilenames = 1
elif o == '-s':
gbl.seqshow = gbl.Lseqshow = 1
elif o == '-p':
gbl.pshow = gbl.Lpshow = 1
elif o == '-S':
ln = a.split('=', 1)
macros.setvar(ln)
elif o == '-s':
gbl.seqshow = gbl.Lseqshow = 1
elif o == '-r':
gbl.showrun = gbl.Lshowrun = 1
elif o == '-S':
ln = a.split('=', 1)
macros.setvar(ln)
elif o == '-w':
gbl.noWarn = gbl.LnoWarn = 1
elif o == '-r':
gbl.showrun = gbl.Lshowrun = 1
elif o == '-n':
gbl.noOutput = gbl.LnoOutput = 1
elif o == '-w':
gbl.noWarn = gbl.LnoWarn = 1
elif o == '-e':
gbl.showExpand = gbl.LshowExpand = 1
elif o == '-n':
gbl.noOutput = gbl.LnoOutput = 1
elif o == '-c':
gbl.chshow = gbl.Lchshow = 1
elif o == '-e':
gbl.showExpand = gbl.LshowExpand = 1
elif o == '-f':
gbl.outfile = a
elif o == '-c':
gbl.chshow = gbl.Lchshow = 1
elif o == '-i':
gbl.mmaRC = a
elif o == '-f':
gbl.outfile = a
elif o == '-g':
gbl.makeGrvDefs = 1
elif o == '-i':
gbl.mmaRC = a
elif o == '-G':
gbl.makeGrvDefs = 2
elif o == '-g':
gbl.makeGrvDefs = 1
elif o == '-m':
try:
a=int(a)
except:
error("Expecting -m arg to be a integer")
gbl.maxBars = a
elif o == '-G':
gbl.makeGrvDefs = 2
elif o == '-v':
print "%s" % gbl.version
sys.exit(0)
elif o == '-m':
try:
a=int(a)
except:
error("Expecting -m arg to be a integer")
gbl.maxBars = a
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 == '-v':
print "%s" % gbl.version
sys.exit(0)
elif o == '-D':
if a == 'xl':
gbl.docs = 1
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 a == 'xh':
gbl.docs = 2
elif o == '-D':
if a == 'xl':
gbl.docs = 1
elif a == 'k':
elif a == 'xh':
gbl.docs = 2
def pl(msg, lst):
print msg,
for i in sorted(lst.keys()):
print i,
print "\n"
elif a == 'k':
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)
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)
elif a == 'n':
MMA.chords.docs()
sys.exit(0)
else:
print "Unknown -D option."
usage()
elif a == 'da':
MMA.docs.docDrumNames("a")
sys.exit(0)
elif o == '-0':
gbl.synctick = 1
elif a == 'dm':
MMA.docs.docDrumNames("m")
sys.exit(0)
else:
usage() # unreachable??
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)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

228
mma/MMA/patAria.py Normal file
View 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))

View File

@ -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

View File

@ -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>
"""
@ -33,99 +33,99 @@ from MMA.pat import PC
class Bass(PC):
""" Pattern class for a bass track. """
""" Pattern class for a bass track. """
vtype = 'BASS'
vtype = 'BASS'
def getPgroup(self, ev):
""" Get group for bass pattern.
def getPgroup(self, ev):
""" Get group for bass pattern.
Fields - start, length, note, volume
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) )
if len(ev) != 4:
error("There must be n groups of 4 in a pattern definition, "
"not <%s>" % ' '.join(ev) )
a = struct()
a = struct()
a.offset = self.setBarOffset(ev[0])
a.duration = getNoteLen( ev[1] )
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 )
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
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
a.addoctave = 0
for n in ev[2][ptr:]:
if n == '+':
a.addoctave += 12
elif n == '-':
a.addoctave -= 12
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)
else:
error("Only '- + # b &' are permitted after a noteoffset, not '%s'" % n)
a.vol = stoi(ev[3], "Note volume in Bass definition not int.")
a.vol = stoi(ev[3], "Note volume in Bass definition not int")
return a
return a
def restart(self):
self.ssvoice = -1
def restart(self):
self.ssvoice = -1
def trackBar(self, pattern, ctable):
""" Do the bass bar.
def trackBar(self, pattern, ctable):
""" Do the bass bar.
Called from self.bar()
Called from self.bar()
"""
"""
sc = self.seq
unify = self.unify[sc]
sc = self.seq
unify = self.unify[sc]
for p in pattern:
ct = self.getChordInPos(p.offset, ctable)
for p in pattern:
ct = self.getChordInPos(p.offset, ctable)
if ct.bassZ:
continue
if ct.bassZ:
continue
note = ct.chord.scaleList[p.noteoffset] + p.addoctave + p.accidental
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 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))
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))

View File

@ -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

View File

@ -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>
"""
@ -31,68 +31,79 @@ 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.
"""
def __init__(self, ln):
""" init for drum track. """
ln=self.lnExpand(ln, 'Tone')
tmp = []
PC.__init__(self, ln)
for n in ln:
tmp.append(MMA.translate.dtable.get(n))
self.toneList = seqBump( tmp )
def restart(self):
self.ssvoice = -1
self.setChannel('10')
if not gbl.mtrks[self.channel].trackname:
gbl.mtrks[self.channel].addTrkName(0, 'Drum')
def getPgroup(self, ev):
""" Get group for a drum pattern.
def setTone(self, ln):
""" Set a tone list. Only valid for DRUMs.
ln[] is not nesc. the right length.
"""
Fields - start, length, volume
"""
ln=self.lnExpand(ln, 'Tone')
tmp = []
if len(ev) != 3:
error("There must be at exactly 3 items in each "
"group of a drum define, not <%s>." % ' '.join(ev) )
for n in ln:
tmp.append(MMA.translate.dtable.get(n))
a = struct()
self.toneList = seqBump( tmp )
a.offset = self.setBarOffset(ev[0])
a.duration = getNoteLen(ev[1])
a.vol = stoi(ev[2], "Type error in Drum volume.")
return a
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.
def trackBar(self, pattern, ctable):
""" Do a drum bar.
Called from self.bar()
Called from self.bar()
"""
"""
sc = self.seq
sc = self.seq
for p in pattern:
tb = self.getChordInPos(p.offset, ctable)
for p in pattern:
tb = self.getChordInPos(p.offset, ctable)
if tb.drumZ:
continue
if tb.drumZ:
continue
self.sendNote(
p.offset,
self.getDur(p.duration),
self.toneList[sc],
self.adjustVolume(p.vol, p.offset) )
self.sendNote(
p.offset,
self.getDur(p.duration),
self.toneList[sc],
self.adjustVolume(p.vol, p.offset) )

View File

@ -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)]
# only < start of list if DOWN or BOTH
else:
notelist = list(tb.chord.scaleList)
elif self.sOffset < 0:
if direct == 'BOTH':
self.dirfact = 1
self.sOffset = 1
else: ## DOWN
self.sOffset = len(self.notes)-1
""" 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.
"""
if direct == 'RANDOM':
note = random.choice(self.notes)
else:
note = self.notes[self.sOffset]
self.sOffset += self.dirfact
ln=self.chordRange[sc] # RANGE 1...x (def. == 1)
self.lastNote = note
o=0
self.notes = []
if not self.harmonyOnly[sc]:
self.sendNote(
p.offset,
self.getDur(p.duration),
self.adjustNote(note),
self.adjustVolume(p.vol, p.offset))
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 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) )

View File

@ -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.
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.
This is only called from trackbar(), but it's nicer
to isolate it here.
"""
sc = self.seq
barEnd = gbl.BperQ*gbl.QperBar
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:
acc=keySig.getAcc()
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)
# list of notename to midivalues
"""
midiNotes = {'c':0, 'd':2, 'e':4, 'f':5, 'g':7, 'a':9, 'b':11, 'r':None }
sc = self.seq
barEnd = gbl.BperQ*gbl.QperBar
""" 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 ";".
"""
acc=keySig.getAcc()
if not pat.endswith(';'):
error("All Solo strings must end with a ';'")
# list of notename to midivalues
""" Take our list of note/value pairs and decode into
a list of midi values. Quite ugly.
"""
midiNotes = {'c':0, 'd':2, 'e':4, 'f':5, 'g':7, 'a':9, 'b':11, 'r':None }
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)]
""" 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 not pat.endswith(';'):
error("All Solo strings must end with a ';'")
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]
""" Take our list of note/value pairs and decode into
a list of midi values. Quite ugly.
"""
notes={} # A dict of NoteList, keys == offset
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 self.drumType:
isdrum = 1
lastc = str(self.drumTone)
else:
isdrum = None
pat = pat.replace(' ', '').split(';')[:-1]
length = getNoteLen('4') # default note length
lastc = '' # last parsed note
velocity = 90 # intial/default velocity for solo notes
# set initial offset into bar
notes={} # A dict of NoteList, keys == offset
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
if self.drumType:
isdrum = 1
lastc = str(self.drumTone)
else:
isdrum = None
# Strip off trailing ~
pat = pat.replace(' ', '').split(';')[:-1]
if pat[-1].endswith("~"):
self.endTilde = [1, gbl.tickOffset + (gbl.BperQ * gbl.QperBar) ]
pat[-1]=pat[-1][:-1]
else:
self.endTilde = []
# set initial offset into bar
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
# Begin parse loop
# Strip off trailing ~
for a in pat:
if a == '<>':
continue
if pat[-1].endswith("~"):
self.endTilde = [1, gbl.tickOffset + (gbl.BperQ * gbl.QperBar) ]
pat[-1]=pat[-1][:-1]
else:
self.endTilde = []
if offset >= barEnd:
error("Attempt to start Solo note '%s' after end of bar." % a)
# strip out all '<volume>' setting and adjust velocity
# Begin parse loop
a, vls = pextract(a, "<", ">")
if vls:
if len(vls) > 1:
error("Only 1 volume string is permitted per note-set")
for a in pat:
if a == '<>':
continue
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]
if offset >= barEnd:
error("Attempt to start Solo note '%s' after end of bar" % a)
# strip out all '<volume>' setting and adjust velocity
""" Split the chord chunk into a note length and notes. Each
part of this is optional and defaults to the previously
parsed value.
"""
a, vls = pextract(a, "<", ">")
if vls:
if len(vls) > 1:
error("Only 1 volume string is permitted per note-set")
i = 0
while i < len(a):
if not a[i] in '1234568.+':
break
else:
i+=1
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]
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")
""" Split the chord chunk into a note length and notes. Each
part of this is optional and defaults to the previously
parsed value.
"""
length = l # set defaults for next loop
lastc = c
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
""" 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".
"""
if not c:
c=lastc
if not c:
error("You must specify the first note in a solo line")
if isdrum:
c=c.split(',')
else:
c=list(c)
length = l # set defaults for next loop
lastc = c
while c:
# Parse off note name or 'r' for a rest
""" 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".
"""
name = c.pop(0)
if isdrum:
c=c.split(',')
else:
c=list(c)
if name == 'r' and (offset in notes or c):
error("You cannot combine a rest with a note in "
"a chord for solos.")
while c:
# Parse off note name or 'r' for a rest
if not isdrum:
if not name in midiNotes:
error("%s encountered illegal note name '%s'."
% (self.name, name))
name = c.pop(0)
v = midiNotes[ name ]
if name == 'r' and (offset in notes or c):
error("You cannot combine a rest with a note in a chord for solos")
# Parse out a "#', '&' or 'n' accidental.
if c and c[0]=='#':
c.pop(0)
acc[name] = 1
if not isdrum:
if not name in midiNotes:
error("%s encountered illegal note name '%s'"
% (self.name, name))
elif c and c[0]=='&':
c.pop(0)
acc[name] = -1
v = midiNotes[ name ]
elif c and c[0]=='n':
c.pop(0)
acc[name] = 0
# Parse out a "#', '&' or 'n' accidental.
if v != None:
v += acc[name]
if c and c[0]=='#':
c.pop(0)
acc[name] = 1
# Parse out +/- (or series) for octave
elif c and c[0]=='&':
c.pop(0)
acc[name] = -1
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
elif c and c[0]=='n':
c.pop(0)
acc[name] = 0
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 v != None:
v += acc[name]
# Parse out +/- (or series) for octave
""" 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'.
"""
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 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
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)
# create a new note[] entry for this offset
""" 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'.
"""
if not offset in notes:
notes[offset] = NoteList(l)
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
# add note event to note[] array
notes[offset].nl.append(v)
notes[offset].velocity.append(self.adjustVolume(velocity, offset))
# create a new note[] entry for this offset
""" 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.
if not offset in notes:
notes[offset] = NoteList(l)
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).
"""
# add note event to note[] array
if harmony and offset in notes and not isdrum:
nn=notes[offset]
notes[offset].nl.append(v)
notes[offset].velocity.append(self.adjustVolume(velocity, offset))
if len(nn.nl) == 1 and nn.nl[0] != None:
tb = self.getChordInPos(offset, ctable)
notes[offset].defaultVel = velocity # needed for addHarmony()
if not tb.chordZ:
h = harmonize(harmony, nn.nl[0], tb.chord.bnoteList)
lastOffset = offset
offset += l
""" If harmonyonly set then drop note, substitute harmony,
else append harmony notes to chord.
"""
if offset <= barEnd:
if self.endTilde:
error("Tilde at end of bar has no effect")
for i in range(len(h)):
nn.velocity.append(self.adjustVolume(velocity *
self.harmonyVolume[sc], offset))
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)))
if harmOnly:
nn.nl = h
else:
nn.nl.extend(h)
return notes
lastOffset = offset
offset += l
def addHarmony(self, notes, ctable):
""" Add harmony to solo notes. """
if offset <= barEnd:
if self.endTilde:
error("Tilde at end of bar has no effect.")
sc=self.seq
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)))
harmony = self.harmony[sc]
harmOnly = self.harmonyOnly[sc]
return notes
for offset in notes:
nn = notes[offset]
def trackBar(self, pat, ctable):
""" Do the solo/melody line. Called from self.bar() """
if len(nn.nl) == 1 and nn.nl[0] != None:
tb = self.getChordInPos(offset, ctable)
notes = self.getLine(pat, ctable)
if tb.chordZ:
continue
""" 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:
h = harmonize(harmony, nn.nl[0], tb.chord.bnoteList)
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)
""" 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
sc=self.seq
unify = self.unify[sc]
# Create velocites for harmony note(s)
rptr = self.mallet
for i in range(off,len(nn.nl)):
nn.velocity.append(self.adjustVolume(nn.defaultVel *
self.harmonyVolume[sc], offset))
for offset in sorted(notes.keys()):
nn=notes[offset]
return notes
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)
def trackBar(self, pat, ctable):
""" Do the solo/melody line. Called from self.bar() """
notes = self.getLine(pat, ctable)
if self.harmony[self.seq] and not self.drumType:
self.addHarmony(notes, ctable)
sc=self.seq
unify = self.unify[sc]
rptr = self.mallet
for offset in sorted(notes.keys()):
nn=notes[offset]
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

View File

@ -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,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
vtype = 'WALK'
walkChoice = 0
def getPgroup(self, ev):
""" Get group for walking bass pattern.
def getPgroup(self, ev):
""" Get group for walking bass pattern.
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 Walking Bass definition, not <%s>." % ' '.join(ev))
if len(ev) != 3:
error("There must be at exactly 3 items in each group in "
"a Walking Bass 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 Walking Bass definition")
a.offset = self.setBarOffset(ev[0])
a.duration = getNoteLen(ev[1])
a.vol = stoi(ev[2], "Type error in Walking Bass definition")
return a
return a
def restart(self):
self.ssvoice = -1
self.walkChoice = 0
def restart(self):
self.ssvoice = -1
self.walkChoice = 0
def trackBar(self, pattern, ctable):
""" Do a waling bass bar.
def trackBar(self, pattern, ctable):
""" Do a waling bass bar.
Called from self.bar()
Called from self.bar()
"""
"""
sc=self.seq
dir = self.direction[sc]
unify = self.unify[sc]
sc=self.seq
dir = self.direction[sc]
unify = self.unify[sc]
for p in pattern:
for p in pattern:
tb = self.getChordInPos(p.offset, ctable)
tb = self.getChordInPos(p.offset, ctable)
if tb.walkZ:
continue
if tb.walkZ:
continue
root = tb.chord.rootNote # root note of chord
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).
""" 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.
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 UP or DOWN we don't append the 2nd half
of the scale.
If DIR is DOWN we reverse the order as well.
"""
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
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()
if dir == 'DOWN':
wNotes.reverse()
# Ensure that the offset is in range.
# Ensure that the offset is in range.
if self.walkChoice >= len(wNotes) or self.walkChoice < 0:
self.walkChoice = 0
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.
"""
""" 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
if p.offset == 0 and random.choice((0,1)):
self.walkChoice=0
note = wNotes[self.walkChoice]
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.
"""
""" 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 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 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) )
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) )

View File

@ -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()

View File

@ -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>
"""
@ -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,157 +49,159 @@ 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
global vols, vTRatio, vMRatio
if not ln:
error("Use: AdjustVolume DYN=RATIO [..].")
if not ln:
error("Use: AdjustVolume DYN=RATIO [..]")
for l in ln:
for l in ln:
try:
v,r = l.split('=')
except:
error("AdjustVolume expecting DYN=RATIO pair, not '%s'." % l)
try:
v,r = l.split('=')
except:
error("AdjustVolume expecting DYN=RATIO pair, not '%s'" % l)
v=v.upper()
v=v.upper()
if v == 'RATIO':
if v == 'RATIO':
r=stof(r)
r=stof(r)
if r<0 or r>100:
error("VolumeRatio must be value 0 to 100.")
if r<0 or r>100:
error("VolumeRatio must be value 0 to 100")
vTRatio = r/100
vMRatio = 1-vTRatio
vTRatio = r/100
vMRatio = 1-vTRatio
elif v in vols:
vols[v] = calcVolume(r, vols[v])
elif v in vols:
vols[v] = calcVolume(r, vols[v])
else:
error("Dynamic '%s' for AdjustVolume is unknown." % 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.
elif new[0] in "0123456789":
v = stoi(new, "Volume expecting value, not '%s'" % new) / 100.
else:
new = new.upper()
else:
new = new.upper()
adj = None
adj = None
if '+' in new:
new,adj = new.split('+')
elif '-' in new:
new,adj = new.split('-')
adj = '-' + adj
if '+' in new:
new,adj = new.split('+')
elif '-' in new:
new,adj = new.split('-')
adj = '-' + adj
if not new in vols:
error("Unknown volume '%s'." % new)
if not new in vols:
error("Unknown volume '%s'" % new)
v=vols[new]
v=vols[new]
if adj:
a = stoi(adj, "Volume expecting adjustment value, not %s." % adj)
v += (v * (a/100.))
if adj:
a = stoi(adj, "Volume expecting adjustment value, not %s" % adj)
v += (v * (a/100.))
return v
return v
def setVolume(ln):
""" Set master volume. """
""" Set master volume. """
global volume, lastVolume
global volume, lastVolume
lastVolume = volume
lastVolume = volume
if len(ln) != 1:
error ("Use: Volume DYNAMIC.")
if len(ln) != 1:
error ("Use: Volume DYNAMIC")
volume = calcVolume(ln[0], volume)
volume = calcVolume(ln[0], volume)
if gbl.debug:
print "Volume: %s%%" % 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() """
""" Combined (de)cresc() """
global futureVol, volume, lastVolume
global futureVol, volume, lastVolume
lastVolume = volume
lastVolume = volume
if len(ln) == 3:
setVolume([ln[0]])
ln=ln[1:]
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)
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
# Get destination volume
destvol = calcVolume(ln[0], startvol)
destvol = calcVolume(ln[0], startvol)
bcount = stoi(ln[1], "Type error in bar count for (De)Cresc, '%s'." % ln[1] )
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 bcount <= 0:
error("Bar count for (De)Cresc must be postive")
if dir > 0 and destvol < startvol:
warning("Cresc volume less than current setting. " )
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 dir < 0 and destvol > startvol:
warning("Decresc volume greater than current setting" )
elif destvol == startvol:
warning("(De)Cresc volume equal to current setting. " )
elif destvol == startvol:
warning("(De)Cresc volume equal to current setting" )
bcount -= 1
step = ( destvol-startvol ) / bcount
bcount -= 1
step = ( destvol-startvol ) / bcount
volList=[startvol]
volList=[startvol]
for a in range(bcount-1):
startvol += step
volList.append( startvol)
for a in range(bcount-1):
startvol += step
volList.append( startvol)
volList.append(destvol)
volList.append(destvol)
return volList
return volList

View File

@ -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

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View 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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View 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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View 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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View 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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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