Updated to MMA 1.4

This commit is contained in:
Matthias Neeracher 2009-05-17 22:34:44 +00:00
parent 5b55f5f1cd
commit fb48baaf09
299 changed files with 27510 additions and 16024 deletions

View File

@ -31,10 +31,11 @@ import MMA.patScale
import MMA.patArpeggio import MMA.patArpeggio
import MMA.patSolo import MMA.patSolo
import MMA.patAria import MMA.patAria
import MMA.grooves
import gbl import gbl
from MMA.common import * from MMA.common import *
trkClasses = { trkClasses = {
'BASS' : MMA.patBass.Bass, 'BASS' : MMA.patBass.Bass,
'CHORD' : MMA.patChord.Chord, 'CHORD' : MMA.patChord.Chord,
@ -75,9 +76,9 @@ def trackAlloc(name, err):
If not, we either error (err==1) or return (err==0). If not, we either error (err==1) or return (err==0).
""" """
if trkClasses.has_key(base): try:
f = trkClasses[base] f = trkClasses[base]
else: except:
if err: if err:
error("There is no track class '%s' for trackname '%s'" % (base, name) ) error("There is no track class '%s' for trackname '%s'" % (base, name) )
else: else:
@ -93,7 +94,7 @@ def trackAlloc(name, err):
# Update current grooves to reflect new track. # Update current grooves to reflect new track.
for slot in gbl.settingsGroove.keys(): for slot in MMA.grooves.glist.keys():
newtk.saveGroove(slot) newtk.saveGroove(slot)

View File

@ -29,10 +29,12 @@ import sys
import pickle import pickle
import MMA.midi import MMA.midi
import gbl
import MMA.parse import MMA.parse
import gbl
from MMA.common import * from MMA.common import *
grooveDir = {} grooveDir = {}
mmadir = ".mmaDB" # constant, name of the lib database file mmadir = ".mmaDB" # constant, name of the lib database file
fileCount = 0 fileCount = 0
@ -52,8 +54,8 @@ def updateGrooveList(n):
def libUpdate(): 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 This is called from the main program after the initialization
and other option parsing. No RETURN. and other option parsing. No RETURN.
""" """
global fileCount, gdDate, grooveDir, processedfiles global fileCount, gdDate, grooveDir, processedfiles
@ -137,9 +139,9 @@ def dolibupdate(root, subdir):
""" Get a list of the files in this directory. If the list """ Get a list of the files in this directory. If the list
includes a file called 'MMAIGNORE' the entire directory includes a file called 'MMAIGNORE' the entire directory
(and subdirs) is ignored. Otherwise, each file in the (and subdirs) is ignored. Otherwise, each file in the
directory ending in 'mma' is parsed for groove defs. directory ending in 'mma' is parsed for groove defs.
""" """
p = os.path.join(root,subdir) p = os.path.join(root,subdir)
@ -156,9 +158,7 @@ def dolibupdate(root, subdir):
if fn.startswith('.') or fn.startswith('#'): if fn.startswith('.') or fn.startswith('#'):
continue continue
# Create full path name f=os.path.join(root, subdir, fn) # Create full path name
f=os.path.join(root, subdir, fn)
if os.path.isdir(f): if os.path.isdir(f):
dolibupdate(root, os.path.join(subdir,fn)) # recursive! dolibupdate(root, os.path.join(subdir,fn)) # recursive!
@ -168,18 +168,18 @@ def dolibupdate(root, subdir):
processedFiles.append(ename) processedFiles.append(ename)
if gdDate and grooveDir.has_key(ename) and \ if gdDate and ename in grooveDir and os.path.getmtime(f) < gdDate:
os.path.getmtime(f) < gdDate:
print " Existing: %s" % f print " Existing: %s" % f
grooveCount += len(grooveDir[ename]) grooveCount += len(grooveDir[ename])
continue continue
if grooveDir.has_key(ename): if ename in grooveDir:
print " Updating: %s" % f print " Updating: %s" % f
else: else:
print " Creating: %s" % f print " Creating: %s" % f
mkGrooveList = [] mkGrooveList = []
gbl.mtrks = {} gbl.mtrks = {}
MMA.grooves.aliaslist = {}
for c in gbl.midiAssigns.keys(): for c in gbl.midiAssigns.keys():
gbl.midiAssigns[c]=[] gbl.midiAssigns[c]=[]
for a,v in enumerate(gbl.midiAvail): for a,v in enumerate(gbl.midiAvail):

View File

@ -27,7 +27,7 @@ import copy
from MMA.common import * from MMA.common import *
from MMA.chordtable import chords from MMA.chordtable import chordlist
@ -42,7 +42,7 @@ def defChord(ln):
if not len(ln): if not len(ln):
error(emsg) error(emsg)
name = ln.pop(0) name = ln.pop(0)
if name in chords.keys(): if name in chordlist.keys():
warning("Redefining chordtype '%s'" % name) warning("Redefining chordtype '%s'" % name)
if '/' in name: if '/' in name:
@ -77,27 +77,28 @@ def defChord(ln):
scale[i]=v scale[i]=v
chords[name] = ( notes, scale, "User Defined") chordlist[name] = ( notes, scale, "User Defined")
if gbl.debug: if gbl.debug:
print "ChordType '%s', %s" % (name, chords[name]) print "ChordType '%s', %s" % (name, chordlist[name])
def printChord(ln): def printChord(ln):
""" Display the note/scale/def for chord(s). """ """ Display the note/scale/def for chord(s). """
for c in ln: for c in ln:
if not chords.has_key(c): try:
print c, ':', chordlist[c][0], chordlist[c][1], chordlist[c][2]
except:
error("Chord '%s' is unknown" % c) error("Chord '%s' is unknown" % c)
print c, ':', chords[c][0], chords[c][1], chords[c][2]
"""
Table of chord adjustment factors. Since the initial chord is based
on a C scale, we need to shift the chord for different degrees. Note,
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? """ Table of chord adjustment factors. Since the initial chord is based
on a C scale, we need to shift the chord for different degrees. Note,
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?
""" """
cdAdjust = { cdAdjust = {
@ -288,14 +289,14 @@ class ChordNotes:
ctype='M' ctype='M'
try: try:
notes = chords[ctype][0] notes = chordlist[ctype][0]
adj = cdAdjust[tonic] + octave adj = cdAdjust[tonic] + octave
except: except:
error( "Illegal/Unknown chord name: '%s'" % name ) error( "Illegal/Unknown chord name: '%s'" % name )
self.noteList = [ x + adj for x in notes ] self.noteList = [ x + adj for x in notes ]
self.bnoteList = tuple(self.noteList) self.bnoteList = tuple(self.noteList)
self.scaleList = tuple([ x + adj for x in chords[ctype][1] ]) self.scaleList = tuple([ x + adj for x in chordlist[ctype][1] ])
self.chordType = ctype self.chordType = ctype
self.tonic = tonic self.tonic = tonic
self.rootNote = self.noteList[0] self.rootNote = self.noteList[0]
@ -311,11 +312,11 @@ class ChordNotes:
# Do inversions if there is a valid slash notation. # Do inversions if there is a valid slash notation.
if slash: if slash:
if not cdAdjust.has_key(slash): try:
r=cdAdjust[slash] # r = -6 to 6
except KeyError:
error("The note '%s' in the slash chord is unknown" % slash) error("The note '%s' in the slash chord is unknown" % slash)
r=cdAdjust[slash] # r = -6 to 6
# If the slash note is in the chord we invert # If the slash note is in the chord we invert
# the chord so the slash note is in root position. # the chord so the slash note is in root position.

View File

@ -53,7 +53,7 @@ A = Bbb= 9
As = Bb = 10 As = Bb = 10
B = Cb = 11 B = Cb = 11
chords = { chordlist = {
'M': ((C, E, G ), 'M': ((C, E, G ),
(C, D, E, F, G, A, B), (C, D, E, F, G, A, B),
"Major triad. This is the default and is used in " "Major triad. This is the default and is used in "
@ -399,8 +399,8 @@ chords = {
""" Extend our table with common synomyns. These are real copies, """ Extend our table with common synomyns. These are real copies,
not pointers. This is done so that a user redefine only affects not pointers. This is done so that a user redefine only affects
the original. the original.
""" """
aliases = ( aliases = (
@ -448,14 +448,15 @@ aliases = (
('9sus', 'sus9', ''), ('9sus', 'sus9', ''),
('9-5', '9b5', ''), ('9-5', '9b5', ''),
('dim3', 'mb5', 'Diminished triad (non-standard notation).'), ('dim3', 'mb5', 'Diminished triad (non-standard notation).'),
('omit3(add9)','omit3add9', '') ('omit3(add9)','omit3add9', ''),
('9sus4', 'sus9', '')
) )
for a,b,d in aliases: for a,b,d in aliases:
n=chords[b][0] n=chordlist[b][0]
s=chords[b][1] s=chordlist[b][1]
if not d: if not d:
d=chords[b][2] d=chordlist[b][2]
chords[a] = (n, s, d) chordlist[a] = (n, s, d)

View File

@ -59,26 +59,31 @@ def error(msg):
print "ERROR:%s %s" % (ln, msg) print "ERROR:%s %s" % (ln, msg)
# Parse though the error message and check for illegal characters.
# Report (first only) if any found.
for a in msg:
a=ord(a)
if a<0x20 or a >=0x80:
print "Corrupt input file? Illegal character 0x%2x found." % a
break
sys.exit(1) sys.exit(1)
def warning(msg): def warning(msg):
""" Print warning message and return. """ """ Print warning message and return. """
if not gbl.noWarn:
ln = ""
if gbl.noWarn: if gbl.lineno >= 0:
return ln = "<Line %d>" % gbl.lineno
ln = "" if gbl.inpath:
ln += "<File:%s>" % gbl.inpath.fname
if gbl.lineno >= 0:
ln = "<Line %d>" % gbl.lineno
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): def getOffset(ticks, ran=None):
@ -124,10 +129,13 @@ def stof(s, errmsg=None):
try: try:
return float(s) return float(s)
except: except:
if errmsg: try:
error(errmsg) return int(s,0)
else: except:
error("Expecting a value, not %s" % s) if errmsg:
error(errmsg)
else:
error("Expecting a value, not %s" % s)
@ -144,15 +152,15 @@ def printList(l):
def pextract(s, open, close, onlyone=None): def pextract(s, open, close, onlyone=None):
""" Extract a parenthesized set of substrings. """ Extract a parenthesized set of substrings.
s - original string s - original string
open - substring start tag \ can be multiple character open - substring start tag \ can be multiple character
close - substring end tag / strings (ie. "<<" or "-->") close - substring end tag / strings (ie. "<<" or "-->")
onlyone - optional, if set only the first set is extracted 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", '{', '}' ) eg: pextract( "x{123}{666}y", '{', '}' )
Returns: ( 'xy', [ '123', '666' ] ) Returns: ( 'xy', [ '123', '666' ] )
""" """
@ -171,3 +179,34 @@ def pextract(s, open, close, onlyone=None):
return s.strip(), subs return s.strip(), subs
def seqBump(l):
""" Expand/contract an existing sequence list to the current seqSize."""
while len(l) < gbl.seqSize:
l += l
return l[:gbl.seqSize]
def lnExpand(ln, msg):
""" Validate and expand a list passed to a set command. """
if len(ln) > gbl.seqSize:
warning("%s list truncated to %s patterns" % (msg, gbl.seqSize) )
ln = ln[:gbl.seqSize]
last = None
for i,n in enumerate(ln):
if n == '/':
if not last:
error ("%s cannot use a '/' as the first item in list." % cmd)
else:
ln[i] = last
else:
last = n
return ln

View File

@ -26,9 +26,13 @@ Bob van der Poel <bob@mellowood.ca>
import os import os
import time import time
import MMA.midiC
import MMA.grooves
import gbl import gbl
from MMA.common import * from MMA.common import *
import MMA.midiC
def docDrumNames(order): def docDrumNames(order):
@ -76,22 +80,22 @@ def docInstNames(order):
""" Whenever MMA encounters a DOC command, or if it defines """ Whenever MMA encounters a DOC command, or if it defines
a groove with DEFGROOVE it calls the docAdd() function. a groove with DEFGROOVE it calls the docAdd() function.
The saved docs are printed to stdout with the docDump() command. The saved docs are printed to stdout with the docDump() command.
This is called whenever parse() encounters an EOF. This is called whenever parse() encounters an EOF.
Both routines are ignored if the -Dx command line option has Both routines are ignored if the -Dx command line option has
not been set. not been set.
Storage is done is in the following arrays. Storage is done is in the following arrays.
""" """
fname = '' fname = ''
author="" author = ""
notes="" notes = ""
defs=[] defs = []
variables=[] variables = []
def docAuthor(ln): def docAuthor(ln):
global author global author
@ -104,7 +108,7 @@ def docNote(ln):
global fname, notes global fname, notes
if not gbl.docs or not ln: if not gbl.createDocs or not ln:
return return
# Grab the arg and data, save it # Grab the arg and data, save it
@ -119,7 +123,7 @@ def docVars(ln):
global fname, variables global fname, variables
if not gbl.docs or not ln: if not gbl.createDocs or not ln:
return return
fname = os.path.basename(gbl.inpath.fname) fname = os.path.basename(gbl.inpath.fname)
@ -129,9 +133,9 @@ def docVars(ln):
def docDefine(ln): 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 Entries are stored as a list. Each item in the list is
complete groove def looking like: complete groove def looking like:
defs[ [ Name, Seqsize, Description, [ [TRACK,INST]...]] ...] defs[ [ Name, Seqsize, Description, [ [TRACK,INST]...]] ...]
""" """
@ -149,12 +153,13 @@ def docDefine(ln):
defs.append(l) defs.append(l)
def docDump(): def docDump():
""" Print the LaTex docs. """ """ Print the LaTex docs. """
global fname, author, notes, defs, variables global fname, author, notes, defs, variables
if gbl.docs == 1: # latex docs if gbl.createDocs == 1: # latex docs
if notes: if notes:
if fname.endswith(gbl.ext): if fname.endswith(gbl.ext):
fname='.'.join(fname.split('.')[:-1]) fname='.'.join(fname.split('.')[:-1])
@ -170,13 +175,21 @@ def docDump():
if defs: if defs:
for l in defs: for l in defs:
print " \\instable{%s}{%s}{%s}{" % \ alias = MMA.grooves.getAlias(l[0])
(totex(l[0]), totex(l[2]), l[1] ) if alias:
if len(alias)>1:
alias="Aliases: %s" % alias
else:
alias="Alias: %s" % alias
else:
alias=''
print " \\instable{%s}{%s}{%s}{%s}{" % \
(totex(l[0]), totex(l[2]), l[1], alias)
for c,v in l[3:]: for c,v in l[3:]:
print " \\insline{%s}{%s}" % (c.title(), totex(v)) print " \\insline{%s}{%s}" % (c.title(), totex(v))
print " }" print " }"
if gbl.docs == 2: # html docs if gbl.createDocs == 2: # html docs
if notes: if notes:
print '<!-- Auto-Generated by MMA on: %s -->' % time.ctime() print '<!-- Auto-Generated by MMA on: %s -->' % time.ctime()
print '<HTML>' print '<HTML>'
@ -213,6 +226,13 @@ def docDump():
print '<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">' print '<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">'
print ' <TR><TD>' print ' <TR><TD>'
print ' <H2> %s </H2> ' % l[0] print ' <H2> %s </H2> ' % l[0]
alias=MMA.grooves.getAlias(l[0])
if alias:
if len(alias)>1:
ll="Aliases"
else:
ll="Alias"
print ' <H4> %s: %s </H4>' % (ll, alias)
print ' %s <B>(%s)</B> ' % ( l[2], l[1] ) print ' %s <B>(%s)</B> ' % ( l[2], l[1] )
print ' </TD></TR>' print ' </TD></TR>'
print ' <TR><TD>' print ' <TR><TD>'
@ -224,17 +244,54 @@ def docDump():
print '</Table>' print '</Table>'
print print
print '</Body></HTML>' print '</Body></HTML>'
if gbl.createDocs == 3:
if notes:
if fname.endswith(gbl.ext):
fname='.'.join(fname.split('.')[:-1])
print "%s.mma %s" % (fname, notes)
print
if variables:
print " Variables:"
for l in variables:
print " %s %s" % ( l[0], l[1] )
print
if defs:
for l in defs:
print "Groove %s" % l[0].title()
MMA.grooves.grooveDo(l[0].upper())
for t in sorted(gbl.tnames):
tr = gbl.tnames[t]
sq = tr.sequence
if sq[0]:
rt = []
for a in range(gbl.seqSize):
s=sq[a]
x = '{' + tr.formatPattern(sq[a]) + '}'
rt.append(x)
print " %s Sequence %s" % (tr.name, ' '.join(rt))
if tr.vtype == 'DRUM':
print " %s Tone %s" % (tr.name,
' '.join([MMA.midiC.valueToDrum(a) for a in tr.toneList]))
else:
print " %s Voice %s" % (tr.name,
' '.join([MMA.midiC.voiceNames[a] for a in tr.voice]))
print
defs = [] defs = []
variables=[] variables=[]
notes = "" notes = ""
author = "" author = ""
def totex(s): 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("$", "\$")
@ -254,3 +311,17 @@ def totex(s):
return s return s
def docVerbose():
""" Print verbose pattern/sequence info: -Dp command line. """
global fname, author, notes, defs, variables
defs = []
variables=[]
notes = ""
author = ""

View File

@ -32,11 +32,11 @@ from MMA.common import *
def locFile(name, lib): def locFile(name, lib):
""" Locate a filename. """ Locate a filename.
This checks, in order: This checks, in order:
lib/name + .mma lib/name + .mma
lib/name lib/name
name + .mma name + .mma
name name
""" """
ext=gbl.ext ext=gbl.ext
@ -73,7 +73,7 @@ class ReadFile:
class FileData: class FileData:
""" After reading the file in bulk it is parsed and stored in this """ After reading the file in bulk it is parsed and stored in this
data structure. Blanks lines and comments are removed. data structure. Blanks lines and comments are removed.
""" """
def __init__(self, lnum, data, label): def __init__(self, lnum, data, label):
@ -97,7 +97,6 @@ class ReadFile:
try: try:
inpath = file(fname, 'r') inpath = file(fname, 'r')
except: except:
error("Unable to open '%s' for input" % fname) error("Unable to open '%s' for input" % fname)
@ -107,7 +106,6 @@ class ReadFile:
self.fname = fname self.fname = fname
""" Read entire file, line by line: """ Read entire file, line by line:
- strip off blanks, comments - strip off blanks, comments
- join continuation lines - join continuation lines
- parse out LABELS - parse out LABELS
@ -131,10 +129,17 @@ class ReadFile:
if not l: if not l:
continue continue
# join lines ending in '\' (the strip() makes this the last char
while l[-1] == '\\': while l[-1] == '\\':
l = l[0:-1] + ' ' + inpath.readline().strip() l = l[0:-1] + ' ' + inpath.readline().strip()
lcount +=1 lcount +=1
""" input cleanup ... for now the only cleanup is to convert
0xa0 (non-breakable space) to 0x20 (regular space).
"""
l=l.replace('\xa0', '\x20')
""" This next line splits the line at the first found """ This next line splits the line at the first found
comment '//', drops the comment, and splits the comment '//', drops the comment, and splits the
@ -200,6 +205,7 @@ class ReadFile:
else: else:
label = None 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))
@ -222,15 +228,15 @@ class ReadFile:
def goto(self, l): def goto(self, l):
""" Do a goto jump. """ Do a goto jump.
This isn't perfect, but is probably the way most GOTOs work. If 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 inside a repeat/if then nothing more is processed. The jump is
immediate. Of course, you'll run into problems with missing immediate. Of course, you'll run into problems with missing
repeat/repeatend if you try it. Since all repeats are stacked 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 back into the que, we just delete the que. Then we look for a
matching label in the file line array. matching label in the file line array.
Label search is linear. Not too efficient, but the lists Label search is linear. Not too efficient, but the lists
will probably never be that long either. will probably never be that long either.
""" """
@ -251,13 +257,13 @@ class ReadFile:
def push(self, q, nums): def push(self, q, nums):
""" Push a list of lines back into the input stream. """ 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. 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 Note: we reverse the original, extend() then reverse again, just
in case the caller cares. 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: if not self.que:
@ -276,8 +282,8 @@ class ReadFile:
def read(self): def read(self):
""" Return a line. """ Return a line.
This will return either a queued line or a line from the This will return either a queued line or a line from the
file (which was stored/processed earlier). file (which was stored/processed earlier).
""" """
while 1: while 1:

View File

@ -24,7 +24,7 @@ Bob van der Poel <bob@mellowood.ca>
import os import os
version = "1.1" # Version -- March 7/2007 version = "1.4" # Version -- Sept/2008
""" mtrks is storage for the MIDI data as it is created. """ mtrks is storage for the MIDI data as it is created.
It is a dict of class Mtrk() instances. Keys are the It is a dict of class Mtrk() instances. Keys are the
@ -56,7 +56,7 @@ for c in range(0,17):
is inc/decremented. is inc/decremented.
""" """
midiAvail=[ 0 ] * 17 # slots 0..16, slot 0 is not used. 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
@ -64,28 +64,14 @@ deletedTracks = [] # list of deleted tracks for -c report
are names, data is a channel. Eg. midiChPrefs['BASS-SUS']==9 are names, data is a channel. Eg. midiChPrefs['BASS-SUS']==9
""" """
midiChPrefs={} midiChPrefs = {}
""" Is the -T option is used only the tracks in this list
""" Groove storage. Each entry in settingsGroove{} has a keyname are generated. All other tracks are muted (OFF)
of a saved groove.
lastGroove and currentGroove are used by macros
""" """
settingsGroove = {} muteTracks = []
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]
"""
seqRnd = [0] # set if SEQRND has been set
############# String constants #################### ############# String constants ####################
@ -98,28 +84,31 @@ ext = ".mma" # extension for song/lib files.
BperQ = 192 # midi ticks per quarter note BperQ = 192 # midi ticks per quarter note
QperBar = 4 # Beats/bar, set with TIME QperBar = 4 # Beats/bar, set with TIME
tickOffset = 0 # offset of current bar in ticks tickOffset = 0 # offset of current bar in ticks
tempo = 120 # current tempo tempo = 120 # current tempo
seqSize = 1 # variation sequence table size seqSize = 1 # variation sequence table size
seqCount = 0 # running count of variation seqCount = 0 # running count of variation
transpose = 0 # Transpose is global (ignored by drum tracks) totTime = 0.0 # running duration count in seconds
lineno = -1 # used for error reporting transpose = 0 # Transpose is global (ignored by drum tracks)
swingMode = 0 # defaults to 0, set to 1 for swing mode lineno = -1 # used for error reporting
swingSkew = None # this is just for $_SwingMode macro
barNum = 0 # Current line number 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
endsync = 0 # flag, set if we want a eof sync
synctick = 0 # flag, set if we want a tick on all tracks at offset 0
############# Path and search variables. ############# ############# Path and search variables. #############
libPath = '' libPath = ''
for p in ( "c:\\mma\\lib", "/usr/local/share/mma/lib", "/usr/share/mma/lib", "./lib"): for p in ( "c:\\mma\\lib", "/usr/local/share/mma/lib", "/usr/share/mma/lib", "./lib"):
if os.path.isdir(p): if os.path.isdir(p):
libPath=p libPath=p
break break
@ -139,8 +128,8 @@ mmaEnd = [] # list of END files
mmaRC = None # user specified RC file, overrides defaults mmaRC = None # user specified RC file, overrides defaults
inpath = None # input file inpath = None # input file
midiFileType = 1 # type 1 file, SMF command can change to 0 midiFileType = 1 # type 1 file, SMF command can change to 0
runningStatus = 1 # running status enabled runningStatus = 1 # running status enabled
############# Options. ############# ############# Options. #############
@ -163,9 +152,11 @@ chshow = Lchshow = 0
outfile = None outfile = None
infile = None infile = None
docs = 0 createDocs = 0
maxBars = 500 maxBars = 500
makeGrvDefs = 0 makeGrvDefs = 0
cmdSMF = None cmdSMF = None
playFile = 0 # set if we want to call a player
midiPlayer = "aplaymidi"

448
mma/MMA/grooves.py Normal file
View File

@ -0,0 +1,448 @@
# grooves.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>
"""
""" Groove storage. Each entry in glist{} has a keyname
of a saved groove.
lastGroove and currentGroove are used by macros
"""
import os
import MMA.midi
import MMA.notelen
import MMA.auto
import MMA.volume
import MMA.parse
import MMA.seqrnd
import MMA.docs
import gbl
from MMA.common import *
glist = {}
aliaslist = {}
lastGroove = '' # name of the last groove (used by macros)
currentGroove = '' # name of current groove (used by macros)
""" groovesList[] holds a list of grooves to use when the
groove command is used with several args. ie, when
we use either:
Groove 2 groove1 groove2 groove3
or
Groove groove1 groove2 groove3
in both cases, the names of the grooves are stored in groovesList[]
"""
groovesList = None
groovesCount = 0
def grooveDefine(ln):
""" Define a groove.
Current settings are assigned to a groove name.
"""
if not len(ln):
error("Use: DefGroove Name")
slot=ln[0].upper()
# Slot names can't contain a '/' (reserved) or be an integer (used in groove select).
if '/' in slot:
error("The '/' is not permitted in a groove name")
if slot.isdigit():
error("Invalid slot name '%s'. Cannot be only digits" % slot)
if slot in aliaslist:
error("Can't define groove name %s, already defined as an alias for %s." \
% (slot, aliaslist[slot]))
grooveDefineDo(slot)
if gbl.debug:
print "Groove settings saved to '%s'." % slot
if gbl.makeGrvDefs:
MMA.auto.updateGrooveList(slot)
if len(ln) > 1:
MMA.docs.docDefine(ln)
def grooveDefineDo(slot):
for n in gbl.tnames.values():
n.saveGroove(slot)
glist[slot] = {
'SEQSIZE': gbl.seqSize,
'SEQRNDWT': MMA.seqrnd.seqRndWeight[:],
'QPERBAR': gbl.QperBar,
'SEQRND': MMA.seqrnd.seqRnd[:],
'TIMESIG': MMA.midi.timeSig.get(),
'81': MMA.notelen.noteLenTable['81'],
'82': MMA.notelen.noteLenTable['82'],
'SWINGMODE': gbl.swingMode ,
'SWINGSKEW': gbl.swingSkew,
'VRATIO': (MMA.volume.vTRatio, MMA.volume.vMRatio)}
def grooveAlias(ln):
""" Create an alias name for an existing groove. """
global aliaslist
if len(ln) != 2:
error("GrooveAlias needs exactly 2 args: GrooveName AliasName.")
a = ln[0].upper()
g = ln[1].upper()
if not g in glist:
error("GrooveAlias: Groove %s has not been defined." % ln[0])
aliaslist[a]=g
def groove(ln):
""" Select a previously defined groove. """
global groovesList, groovesCount, lastGroove, currentGroove
if not ln:
error("Groove: needs agrument(s)")
tmpList =[]
if ln[0].isdigit():
wh=stoi(ln[0])
if wh<1:
error("Groove selection must be > 0, not '%s'" % wh)
ln=ln[1:]
else:
wh = None
for slot in ln:
slot = slot.upper()
if slot == "/":
if len(tmpList):
slot=tmpList[-1]
else:
error("A previous groove name is needed before a '/'")
if not slot in glist: # convert alias to real groove name
for a,r in aliaslist.iteritems():
if slot == a:
slot = r
break
if not slot in glist:
if gbl.debug:
print "Groove '%s' not defined. Trying auto-load from libraries" \
% slot
l=MMA.auto.loadGrooveDir(slot) # name of the lib file with groove
if l:
if gbl.debug:
print "Attempting to load groove '%s' from '%s'." % (slot, l)
reportFutureVols()
MMA.parse.usefile([os.path.join(gbl.autoLib, l)])
if not slot in glist:
error("Groove '%s' not found. Have libraries changed "
"since last 'mma -g' run?" % slot)
else:
error("Groove '%s' could not be found in memory or library files" % slot )
tmpList.append(slot)
if not len(tmpList):
error("Use: Groove [selection] Name [...]")
""" If the first arg to list was an int() (ie: 3 groove1 groove2 grooveFoo)
we select from the list. After the selection, we reset the list to be
just the selected entry. This was, if there are multiple groove names without
a leading int() we process the list as groove list changing with each bar.
"""
if wh:
wh = (wh-1) % len(tmpList)
tmpList=tmpList[wh:wh+1]
slot=tmpList[0]
grooveDo(slot)
groovesCount = 0
if len(tmpList)==1:
groovesList=None
else:
groovesList=tmpList
lastGroove = currentGroove
currentGroove = slot
if lastGroove == '':
lastGroove = slot
if gbl.debug:
print "Groove settings restored from '%s'." % slot
def grooveDo(slot):
""" This is separate from groove() so we can call it from
usefile() with a qualified name. """
reportFutureVols()
oldSeqSize = gbl.seqSize
g=glist[slot]
gbl.seqSize = g['SEQSIZE']
MMA.seqrnd.seqRndWeight = g['SEQRNDWT']
gbl.QperBar = g['QPERBAR']
MMA.seqrnd.seqRnd = g['SEQRND']
MMA.midi.timeSig.set( *g['TIMESIG']) # passing tuple as 2 args.
MMA.notelen.noteLenTable['81'] = g['81']
MMA.notelen.noteLenTable['82'] = g['82']
gbl.swingMode = g['SWINGMODE']
gbl.swingSkew = g['SWINGSKEW']
MMA.volume.vTRatio, MMA.volume.vMRatio = g['VRATIO']
for n in gbl.tnames.values():
n.restoreGroove(slot)
""" This is important! Tracks NOT overwritten by saved grooves way
have the wrong sequence length. I don't see any easy way to hit
just the unchanged/unrestored tracks so we do them all.
Only done if a change in seqsize ... doesn't take long to be safe.
"""
if oldSeqSize != gbl.seqSize:
for a in gbl.tnames.values():
a.setSeqSize()
MMA.seqrnd.seqRndWeight = seqBump(MMA.seqrnd.seqRndWeight)
gbl.seqCount = 0
def reportFutureVols():
""" Print warning for pending track cresendos.
We need a seperate func here since the groove() may
parse a new file, which will clear out data before
getting to grooveDo().
Note that the test is for more that one trailing future volume.
This is deliberate ... a construct like:
Chord Cresc ff 1
..somechord
Groove NEW
will leave a future volume on the stack.
"""
volerrs=[]
for n in gbl.tnames.values():
if len(n.futureVols)>1:
volerrs.append(n.name)
n.futureVols = [] # don't want leftover future vols a track level!
if volerrs:
volerrs.sort()
warning("Pending (de)Cresc in %s." % ', '.join(volerrs))
def grooveClear(ln):
""" Delete all previously loaded grooves from memory."""
global groovesList, groovesCount, glist, lastGroove, currentGroove, aliaslist
if ln:
error("GrooveClear does not have any arguments.")
groovesList = {}
aliaslist = {}
groovesCount = 0
try:
a= glist[gmagic]
except:
a=None
glist={}
if a:
glist[gmagic]=a
lastGroove = ''
currentGroove = ''
if gbl.debug:
print "All grooves deleted."
def nextGroove():
""" Handle groove lists. Called from parse().
If there is more than 1 entry in the groove list,
advance (circle). We don't have to qualify grooves
since they were verified when this list was created.
groovesList==None if there is only one groove (or none).
"""
global lastGroove, currentGroove, groovesCount
if groovesList:
groovesCount += 1
if groovesCount > len(groovesList)-1:
groovesCount = 0
slot = groovesList[groovesCount]
if slot != currentGroove:
grooveDo(slot)
lastGroove = currentGroove
currentGroove = slot
if gbl.debug:
print "Groove (list) setting restored from '%s'." % slot
def trackGroove(name, ln):
""" Select a previously defined groove for a single track. """
if len(ln) != 1:
error("Use: %s Groove Name" % name)
slot = ln[0].upper()
if not slot in glist: # convert alias to real groove name
for a,r in aliaslist.iteritems():
if slot == a:
slot = r
break
if not slot in glist:
error("Groove '%s' not defined" % slot)
g=gbl.tnames[name]
g.restoreGroove(slot)
if g.sequence == [None] * len(g.sequence):
warning("'%s' Track Groove has no sequence. Track name error?" % name)
g.setSeqSize()
if gbl.debug:
print "%s Groove settings restored from '%s'." % (name, slot)
def getAlias(al):
""" This is used by the library doc printer to get a list aliases. """
al=al.upper()
l=[]
for a,r in aliaslist.iteritems():
if al == r:
l.append(a.title())
return ', '.join(l)
def allgrooves(ln):
""" Apply a command to all currently defined grooves. """
if not ln:
error("OverRide: requires a directive.")
origSlot = MMA.parse.gmagic # save the current groove
grooveDefineDo(origSlot)
action = ln[0].upper()
if len(ln)>1:
trAction = ln[1].upper()
else:
trAction = ''
sfuncs = MMA.parse.simpleFuncs
tfuncs = MMA.parse.trackFuncs
counter = 0
for g in glist:
grooveDo(g)
if action in sfuncs:
sfuncs[action](ln[1:])
counter += 1
continue
if len(ln) < 2:
error("AllGrooves: No command for assumed trackname %s." % action)
name=action
if not name in gbl.tnames:
continue
if trAction in tfuncs:
tfuncs[trAction](name, ln[2:])
counter += 1
else:
error ("AllGrooves: Not a command: '%s'" % ' '.join(ln))
grooveDefineDo(g) # store the change!!!
grooveDo(origSlot) # restore groove
if not counter:
warning("No tracks affected with '%s'" % ' '.join(ln))
else:
if gbl.debug:
print "AllGrooves: %s tracks modified." % counter

View File

@ -90,16 +90,16 @@ def harmonize(hmode, note, chord):
def gethnote(note, chord): 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 This routine works by creating a chord list with all
its notes having a value less than the note (remember, this its notes having a value less than the note (remember, this
is all MIDI values). We then grab notes from the end of is all MIDI values). We then grab notes from the end of
the chord until one is found which is less than the original the chord until one is found which is less than the original
note. note.
""" """
wm="No harmony note found since no chord, using note " + \ wm="No harmony note found since no chord, using note " + \

View File

@ -252,35 +252,37 @@ class Lyric:
if self.dupchords: if self.dupchords:
ly = [] ly = []
for v in ln.split(): # do each chord symbol or '/' mark
for v in ln.split(): if v != '/':
v = v.replace('&', 'b') v = v.replace('&', 'b') # remember, "&" is optional
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: if v == 'z' or v == 'z!': # convert plain z to "NC"
tr=0 # Needed in case line is invalid! v = 'N.C.'
cn=v[0:2]
if self.chordnames.has_key(cn):
tr=self.chordnames[cn] + self.transpose
else: if 'z' in v: # strip out the 'zCDA..' after the chord
cn=v[0:1] v = v.split('z')[0]
if self.chordnames.has_key(cn):
tr=self.chordnames[cn] + self.transpose
while tr>=12: tr-=12 v = v.lstrip("+-") # strip off leading "+" and "-"
while tr<=-12: tr+=12
if tr: if self.transpose: # transpose will be set to 0, 1, -1, etc.
v = self.transNames[self.transKey][tr] + v[len(cn):] t=None # Needed in case line is not a chord ('/', "NC")!
try: # try for 2 char chord name (F#, Gb, etc)
cn=v[0:2]
t=self.chordnames[cn] + self.transpose
except:
try: # try 1 char chord name (C, D, etc)
cn=v[0:1]
t=self.chordnames[cn] + self.transpose
except:
pass # not a chord pitch
if t != None: # use None, 0 is okay
while t>=12: t-=12
while t<=-12: t+=12
v = self.transNames[self.transKey][t] + v[len(cn):]
ly.append(v) ly.append(v)

View File

@ -26,18 +26,21 @@ class. At the top of MMAparse an instance in created with
something like: macros=MMMmacros.Macros(). something like: macros=MMMmacros.Macros().
""" """
import gbl import random
from MMA.common import *
from MMA.notelen import getNoteLen
import MMA.midiC import MMA.midiC
import MMA.lyric
import MMA.translate import MMA.translate
import MMA.patSolo import MMA.patSolo
import MMA.patAria import MMA.patAria
import MMA.volume import MMA.volume
import MMA.notelen import MMA.grooves
import MMA.parse
import MMA.seqrnd
import random import gbl
from MMA.lyric import lyric
from MMA.common import *
from MMA.safe_eval import safe_eval
class Macros: class Macros:
@ -90,15 +93,15 @@ class Macros:
return str(int(MMA.volume.lastVolume * 100)) return str(int(MMA.volume.lastVolume * 100))
elif s == 'GROOVE': elif s == 'GROOVE':
return gbl.currentGroove return MMA.grooves.currentGroove
elif s == 'LASTGROOVE': elif s == 'LASTGROOVE':
return gbl.lastGroove return MMA.grooves.lastGroove
elif s == 'SEQRND': elif s == 'SEQRND':
if gbl.seqRnd[0] == 0: return "Off" if MMA.seqrnd.seqRnd[0] == 0: return "Off"
if gbl.seqRnd[0] == 1: return "On" if MMA.seqrnd.seqRnd[0] == 1: return "On"
return ' '.join(gbl.seqRnd[1:]) return ' '.join(MMA.seqrnd.seqRnd[1:])
elif s == 'SEQSIZE': elif s == 'SEQSIZE':
return str(gbl.seqSize) return str(gbl.seqSize)
@ -141,7 +144,7 @@ class Macros:
return ' '.join([str(x) for x in MMA.midi.splitChannels]) return ' '.join([str(x) for x in MMA.midi.splitChannels])
elif s == 'SEQRNDWEIGHT': elif s == 'SEQRNDWEIGHT':
return ' '.join([str(x) for x in MMA.parse.seqRndWeight]) return ' '.join([str(x) for x in MMA.seqrnd.seqRndWeight])
elif s == 'AUTOLIBPATH': elif s == 'AUTOLIBPATH':
return gbl.autoLib return gbl.autoLib
@ -168,7 +171,7 @@ class Macros:
return str(gbl.lineno) return str(gbl.lineno)
elif s == 'LYRIC': elif s == 'LYRIC':
return MMA.lyric.lyric.setting() return lyric.setting()
# Track vars ... these are in format TRACKNAME_VAR # Track vars ... these are in format TRACKNAME_VAR
@ -179,10 +182,10 @@ class Macros:
tname = s[:a] tname = s[:a]
func = s[a+1:] func = s[a+1:]
if gbl.tnames.has_key(tname): try:
t=gbl.tnames[tname] t=gbl.tnames[tname]
else: except:
error("System variable $_%s refers to nonexistent track" % s) error("System variable $_%s refers to nonexistent track." % s )
if func == 'ACCENT': if func == 'ACCENT':
@ -247,6 +250,12 @@ class Macros:
elif func == 'RVOLUME': elif func == 'RVOLUME':
return ' '.join([str(int(a * 100)) for a in t.rVolume]) return ' '.join([str(int(a * 100)) for a in t.rVolume])
elif func == 'SEQUENCE':
tmp = []
for a in range(gbl.seqSize):
tmp.append('{' + t.formatPattern(t.sequence[a]) + '}')
return ' '.join(tmp)
elif func == 'SEQRND': elif func == 'SEQRND':
if t.seqRnd: return 'On' if t.seqRnd: return 'On'
else: return 'Off' else: return 'Off'
@ -271,7 +280,8 @@ class Macros:
return ' '.join([str(x) for x in t.unify]) return ' '.join([str(x) for x in t.unify])
elif func == 'VOICE': elif func == 'VOICE':
return ' '.join([MMA.midiC.voiceNames[a] for a in t.voice]) return ' '.join([MMA.midiC.valueToInst(a) for a in t.voice])
elif func == 'VOICING': elif func == 'VOICING':
if t.vtype != 'CHORD': if t.vtype != 'CHORD':
@ -287,7 +297,6 @@ class Macros:
error("Unknown system track variable %s" % s) error("Unknown system track variable %s" % s)
def expand(self, l): def expand(self, l):
""" Loop though input line and make variable subsitutions. """ Loop though input line and make variable subsitutions.
MMA variables are pretty simple ... any word starting MMA variables are pretty simple ... any word starting
@ -301,23 +310,36 @@ class Macros:
if not self.expandMode: if not self.expandMode:
return l return l
gotmath=0
while 1: # Loop until no more subsitutions have been done while 1: # Loop until no more subsitutions have been done
sub=0 sub=0
for i,s in enumerate(l): for i,s in enumerate(l):
if s[:2] == '$$':
continue
if s[0]=='$': if s[0]=='$':
s=s[1:].upper()
if s.startswith('_'): s = s[1:].upper()
frst = s[0]
if frst == '$': # $$ - don't expand (done in IF clause)
continue
elif frst == '(': # flag math macro
gotmath = 1
continue
# we have a var, see if system or user. Set 'ex'
elif frst == '_': # system var
ex=self.sysvar(s[1:]) ex=self.sysvar(s[1:])
elif not s in self.vars:
elif s in self.vars: # user var?
ex = self.vars[s]
else: # unknown var...error
error("User variable '%s' has not been defined" % s ) error("User variable '%s' has not been defined" % s )
else:
ex=self.vars[s]
if type(ex) == type([]): # MSET variable if type(ex) == type([]): # MSET variable
if len(ex): if len(ex):
@ -336,6 +358,35 @@ class Macros:
if not sub: if not sub:
break break
# all the mma internal and system macros are expanded. Now check for math.
if gotmath:
l = ' '.join(l) # join back into one line
while 1:
try:
s1 = l.index('$(') # any '$(' left?
except:
break # nope, done
# find trailing )
nest=0
s2 = s1+2
max = len(l)
while 1:
if l[s2] == '(': nest+=1
if l[s2] == ')':
if not nest:
break
else:
nest-=1
s2 += 1
if s2 >= max:
error("Unmatched delimiter in '%s'." % l)
l = l[:s1] + str(safe_eval( l[s1+2:s2].strip())) + l[s2+1:]
l=l.split()
return l return l
@ -567,6 +618,7 @@ class Macros:
l=l.upper() l=l.upper()
if l[:2] == '$$': if l[:2] == '$$':
l=l.upper()
l=l[2:] l=l[2:]
if not l in self.vars: if not l in self.vars:
error("String Variable '%s' does not exist" % l) error("String Variable '%s' does not exist" % l)
@ -575,9 +627,12 @@ class Macros:
try: try:
v=float(l) v=float(l)
except: except:
v=None try:
v=int(l,0) # this lets us convert HEX/OCTAL
except:
v=None
return ( l, v ) return ( l.upper(), v )
def readblk(): def readblk():
@ -626,9 +681,9 @@ class Macros:
retpoint = 2 retpoint = 2
if action == 'DEF': if action == 'DEF':
compare = self.vars.has_key(v) compare = v in self.vars
elif action == 'NDEF': elif action == 'NDEF':
compare = ( not self.vars.has_key(v)) compare = ( v not in self.vars )
else: else:
error("Unreachable unary conditional") error("Unreachable unary conditional")
@ -693,4 +748,19 @@ class Macros:
gbl.inpath.push( q, qnum ) gbl.inpath.push( q, qnum )
def domath(s):
""" A simple math factoring func. Just does add, sub, mult, divide. """
print '>>>',s
s = ' '.join(s)
try:
s = eval(s)
except:
error("Error in '%s' expression." % s)
print s
return str(s)
macros = Macros() macros = Macros()

View File

@ -24,14 +24,19 @@ Bob van der Poel <bob@mellowood.ca>
""" """
import os import os
import time
import MMA.midi
import MMA.parse
import MMA.file
import MMA.options
import MMA.auto
import MMA.docs
import gbl import gbl
from MMA.common import * from MMA.common import *
import MMA.midi
import MMA.docs
import MMA.parse
from MMA.file import locFile
from MMA.lyric import lyric from MMA.lyric import lyric
import MMA.options
######################################## ########################################
######################################## ########################################
@ -66,37 +71,36 @@ m.addTrkName(0, 'MetaTrack')
m.addTempo(0, gbl.tempo) m.addTempo(0, gbl.tempo)
MMA.parse.setTimeSig(['4','4']) # most stdlib files will override this MMA.parse.setTimeSig(['4','4']) # most stdlib files will override this
##################################### #####################################
# Read an RC file. All found files are processed. # Read an RC file. All found files are processed.
docOption = gbl.docs # Disable doc printing for RC file docOption = gbl.createDocs # Disable doc printing for RC file
gbl.docs = 0 gbl.createDocs = 0
rcread=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: if gbl.mmaRC:
rcfiles = [ gbl.mmaRC ] rcfiles = [ gbl.mmaRC ]
for i in rcfiles: for i in rcfiles:
f = locFile(i, None) f = MMA.file.locFile(i, None)
if f: if f:
if gbl.showrun: if gbl.showrun:
print "Reading RC file '%s'" % f print "Reading RC file '%s'" % f
MMA.parse.parseFile(f) MMA.parse.parseFile(f)
rcread+=1 #rcread+=1
break break
else: else:
if gbl.mmaRC: if gbl.mmaRC:
error("Specified init file '%s' not found" % gbl.mmaRC) error("Specified init file '%s' not found" % gbl.mmaRC)
if not rcread: else: #if not rcread:
gbl.lineno = -1 gbl.lineno = -1
warning("No RC file was found or processed") warning("No RC file was found or processed")
gbl.docs = docOption # Restore doc options gbl.createDocs = docOption # Restore doc options
################################################ ################################################
@ -106,8 +110,7 @@ gbl.docs = docOption # Restore doc options
if gbl.makeGrvDefs: if gbl.makeGrvDefs:
if gbl.infile: if gbl.infile:
error("No filename is permitted with the -g option") error("No filename is permitted with the -g option")
from MMA.auto import libUpdate MMA.auto.libUpdate() # update and EXIT
libUpdate() # update and EXIT
################################ ################################
@ -124,7 +127,7 @@ gbl.mtrks[0].addText(0, "Input filename: %s" % gbl.infile)
# Just extract docs (-Dx) to stdout. # Just extract docs (-Dx) to stdout.
if docOption: if docOption:
f=locFile(gbl.infile, None) f=MMA.file.locFile(gbl.infile, None)
if not f: if not f:
error("File '%s' not found" % gbl.infile) error("File '%s' not found" % gbl.infile)
MMA.parse.parseFile(f) MMA.parse.parseFile(f)
@ -146,15 +149,19 @@ if gbl.cmdSMF:
# 1. strip off the extension if it is .mma, # 1. strip off the extension if it is .mma,
# 2. append .mid # 2. append .mid
if gbl.playFile and gbl.outfile:
error("You cannot use the -f option with -P")
if gbl.outfile: if gbl.outfile:
outfile = gbl.outfile outfile = gbl.outfile
elif gbl.playFile:
outfile = "MMAtmp%s.mid" % os.getpid()
else: else:
outfile, ext = os.path.splitext(gbl.infile) outfile, ext = os.path.splitext(gbl.infile)
if ext != gbl.ext: if ext != gbl.ext:
outfile=gbl.infile outfile=gbl.infile
outfile += '.mid' outfile += '.mid'
outfile=os.path.expanduser(outfile) outfile=os.path.expanduser(outfile)
@ -164,7 +171,7 @@ outfile=os.path.expanduser(outfile)
# First the mmastart files # First the mmastart files
for f in gbl.mmaStart: for f in gbl.mmaStart:
fn = locFile(f, gbl.incPath) fn = MMA.file.locFile(f, gbl.incPath)
if not fn: if not fn:
warning("MmaStart file '%s' not found/processed" % fn) warning("MmaStart file '%s' not found/processed" % fn)
MMA.parse.parseFile(fn) MMA.parse.parseFile(fn)
@ -172,7 +179,8 @@ for f in gbl.mmaStart:
# The song file specified on the command line # The song file specified on the command line
f = locFile(gbl.infile, None)
f = MMA.file.locFile(gbl.infile, None)
if not f: if not f:
gbl.lineno = -1 gbl.lineno = -1
@ -183,12 +191,11 @@ MMA.parse.parseFile(f)
# Finally, the mmaend files # Finally, the mmaend files
for f in gbl.mmaEnd: for f in gbl.mmaEnd:
fn = locFile(f, None) fn = MMA.file.locFile(f, None)
if not fn: if not fn:
warning("MmaEnd file '%s' not found/processed" % f) warning("MmaEnd file '%s' not found/processed" % f)
MMA.parse.parseFile(fn) MMA.parse.parseFile(fn)
################################################# #################################################
# Just display the channel assignments (-c) and exit... # Just display the channel assignments (-c) and exit...
@ -253,6 +260,7 @@ if gbl.noOutput:
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. """ We fix the outPath now. This lets you set outpath in the song file.
The filename "outfile" was created above. It is either the input filename The filename "outfile" was created above. It is either the input filename
@ -270,7 +278,7 @@ gbl.lineno=-1 # disable line nums for error/warning
otherwise it is inserted before the filename portion. otherwise it is inserted before the filename portion.
""" """
if (not outfile.startswith('/')) and gbl.outPath and (not gbl.outfile): if (not outfile.startswith('/')) and gbl.outPath and not gbl.outfile and not gbl.playFile:
if gbl.outPath[0] in '.\\/': if gbl.outPath[0] in '.\\/':
outfile = "%s/%s" % (gbl.outPath, outfile) outfile = "%s/%s" % (gbl.outPath, outfile)
else: else:
@ -288,6 +296,7 @@ for n in gbl.tnames.values():
if n.channel: if n.channel:
n.doMidiClear() n.doMidiClear()
n.clearPending() n.clearPending()
n.doChannelReset()
if n.riff: if n.riff:
warning("%s has pending Riff(s)" % n.name) warning("%s has pending Riff(s)" % n.name)
@ -317,7 +326,7 @@ if fileExist:
print "Overwriting existing", print "Overwriting existing",
else: else:
print "Creating new", print "Creating new",
print "midi file (%s bars): '%s'" % (gbl.barNum, outfile) print "midi file (%s bars, %.2f min): '%s'" % (gbl.barNum, gbl.totTime, outfile)
try: try:
out = file(outfile, 'wb') out = file(outfile, 'wb')
@ -327,6 +336,15 @@ except:
MMA.midi.writeTracks(out) MMA.midi.writeTracks(out)
out.close() out.close()
if gbl.playFile:
print "Playing %s with %s" % (outfile, gbl.midiPlayer)
t=time.time()
os.system("%s %s" % (gbl.midiPlayer, outfile))
os.remove(outfile)
print "Play complete (%.2f min), file has been deleted." % ((time.time()-t)/60)
if gbl.debug: if gbl.debug:
print "Completed processing file '%s'." % outfile print "Completed processing file '%s'." % outfile

View File

@ -26,9 +26,12 @@ the sequences for later recall.
""" """
import MMA.midiC
import gbl import gbl
from MMA.common import * from MMA.common import *
import MMA.midiC
class Mdefine: class Mdefine:
def __init__(self): def __init__(self):

View File

@ -22,15 +22,15 @@ Bob van der Poel <bob@mellowood.ca>
""" """
import gbl
from MMA.common import *
from MMA.midiM import intToWord, intTo3Byte, intToLong, intToVarNumber from MMA.midiM import intToWord, intTo3Byte, intToLong, intToVarNumber
import MMA.midiC import MMA.midiC
import gbl
from MMA.common import *
splitChannels = [] splitChannels = []
def setSplitChannels(ln): 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. """
@ -39,10 +39,10 @@ def setSplitChannels(ln):
splitChannels = [] splitChannels = []
for a in ln: for a in ln:
c = stoi(a) a = stoi(a)
if c < 1 or c >16: if a < 1 or a >16:
error("SplitChannels: Expecting value 1 to 16, not %s" % c) error("SplitChannels: Expecting value 1 to 16, not %s" % a)
splitChannels.append(c) splitChannels.append(a)
if gbl.debug: if gbl.debug:
print "SplitChannels: ", print "SplitChannels: ",
@ -106,15 +106,16 @@ def writeTracks(out):
def writeSplitTrack(channel, out): def writeSplitTrack(channel, out):
""" Split a drum track into a separate track for the non-note """ Split a track. In drum tracks this puts different instruments
stuff and then a track for each note. into individual tracks (useful!); for instrument tracks it puts
each pitch into a track (probably not useful).
""" """
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 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 for each pitch which appears in the track and
a track (labeled -1) to store every other than note on data. a track (labeled -1) to store every other-than-note-on data.
""" """
notes={} notes={}
@ -130,7 +131,7 @@ def writeSplitTrack(channel, out):
else: else:
n = -1 # special value for non-note on events n = -1 # special value for non-note on events
if not notes.has_key(n): # create a new mtrk if needed if not n in notes: # create a new mtrk if needed
notes[n]=Mtrk(10) notes[n]=Mtrk(10)
if offset in notes[n].miditrk: # copy event to new track if offset in notes[n].miditrk: # copy event to new track
@ -149,7 +150,7 @@ def writeSplitTrack(channel, out):
if channel == 10: if channel == 10:
m = "%s" % MMA.midiC.valueToDrum(a) m = "%s" % MMA.midiC.valueToDrum(a)
else: else:
m= "%s-%s" % (gbl.mtrks[channel].trackname, a) m = "%s-%s" % (gbl.mtrks[channel].trackname, a)
notes[a].addTrkName(0, m) notes[a].addTrkName(0, m)
@ -166,8 +167,7 @@ def writeSplitTrack(channel, out):
def mkHeader(count, tempo, Mtype): def mkHeader(count, tempo, Mtype):
return "MThd" + intToLong(6) + intToWord(Mtype) + \ return "MThd" + intToLong(6) + intToWord(Mtype) + intToWord(count) + intToWord(tempo)
intToWord(count) + intToWord(tempo)
""" Midi track class. All the midi creation is done here. """ Midi track class. All the midi creation is done here.
@ -188,7 +188,7 @@ class Mtrk:
tr=self.miditrk tr=self.miditrk
lg=len(cmd) lg=len(cmd)
if tr.has_key(offset): if offset in tr:
for i,a in enumerate(tr[offset]): for i,a in enumerate(tr[offset]):
if a[0:lg] == cmd: if a[0:lg] == cmd:
del tr[offset][i] del tr[offset][i]
@ -221,11 +221,13 @@ class Mtrk:
self.delDup(offset, cmd) self.delDup(offset, cmd)
self.addToTrack(offset, cmd + chr(0x02) + chr(n) + chr(mi) ) self.addToTrack(offset, cmd + chr(0x02) + chr(n) + chr(mi) )
def addMarker(self, offset, msg): def addMarker(self, offset, msg):
""" Create a midi MARKER event.""" """ 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): def addText(self, offset, msg):
""" Create a midi TextEvent.""" """ Create a midi TextEvent."""
@ -251,16 +253,25 @@ class Mtrk:
self.addToTrack(offset, cmd + intToVarNumber(len(msg)) + msg ) self.addToTrack(offset, cmd + intToVarNumber(len(msg)) + msg )
def addProgChange( self, offset, program): def addProgChange( self, offset, program, oldprg):
""" Create a midi program change. """ Create a midi program change (handles extended voicing).
program - midi program program - The MIDI program (voice) value
oldprg - existing MIDI program
Returns - packed string
""" """
self.addToTrack(offset, v1, lsb1, msb1 = MMA.midiC.voice2tup(oldprg)
chr(0xc0 | self.channel) + chr(program) ) v2, lsb2, msb2 = MMA.midiC.voice2tup(program)
if msb1 != msb2: # only if CTRL32 has changed
self.addToTrack(offset, chr(0xb0 | self.channel) + chr(0x20) + chr(msb2) )
if lsb1 != lsb2: # only if CTRL0 has changed
self.addToTrack(offset, chr(0xb0 | self.channel) + chr(0x00) + chr(lsb2) )
# Always do voice change. Maybe not necessary, but let's be safe.
self.addToTrack(offset, chr(0xc0 | self.channel) + chr(v2) )
def addGlis(self, offset, v): def addGlis(self, offset, v):
@ -272,22 +283,17 @@ class Mtrk:
""" """
if v == 0: if v == 0:
self.addToTrack(offset, self.addToTrack(offset, chr(0xb0 | self.channel) + chr(0x41) + chr(0x00) )
chr(0xb0 | self.channel) + chr(0x41) + chr(0x00) )
else: else:
self.addToTrack(offset, self.addToTrack(offset, chr(0xb0 | self.channel) + chr(0x41) + chr(0x7f) )
chr(0xb0 | self.channel) + chr(0x41) + chr(0x7f) ) self.addToTrack(offset, chr(0xb0 | self.channel) + chr(0x05) + chr(v) )
self.addToTrack(offset,
chr(0xb0 | self.channel) + chr(0x05) + chr(v) )
def addPan(self, offset, v): def addPan(self, offset, v):
""" Set the lsb of the pan setting.""" """ Set the lsb of the pan setting."""
self.addToTrack(offset, self.addToTrack(offset, chr(0xb0 | self.channel) + chr(0x0a) + chr(v) )
chr(0xb0 | self.channel) + chr(0x0a) + chr(v) )
def addCtl(self, offset, l): def addCtl(self, offset, l):
@ -316,9 +322,9 @@ class Mtrk:
def addTempo(self, offset, beats): def addTempo(self, offset, beats):
""" Create a midi tempo meta event. """ 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) cmd = chr(0xff) + chr(0x51)
@ -329,11 +335,26 @@ class Mtrk:
def writeMidiTrack(self, out): def writeMidiTrack(self, out):
""" Create/write the MIDI track. """ 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 the -1 flag is set we need to add a terminate
to the end of each track. This is done to make looping
software like seq24 happy. We do this by truncating all
data in the file past the current tick pointer and inserting
an all-notes-off at that position.
"""
if gbl.endsync and self.channel>=0:
eof = gbl.tickOffset
for offset in tr.keys():
if offset > eof:
del tr[offset]
self.addToTrack(eof, chr(0xb0 | self.channel) + chr(0x7b) + chr(0))
""" To every MIDI track we generate we add (if the -0 flag """ To every MIDI track we generate we add (if the -0 flag
was set) an on/off beep at offset 0. This makes for was set) an on/off beep at offset 0. This makes for
easier sync in multi-tracks. easier sync in multi-tracks.
@ -360,19 +381,19 @@ class Mtrk:
# Convert all events to MIDI deltas and store in # Convert all events to MIDI deltas and store in
# the track array/list # the track array/list
tdata=[] # empty track container tdata = [] # empty track container
lastSts=None # Running status tracker lastSts = None # Running status tracker
for a in sorted(tr.keys()): for a in sorted(tr.keys()):
delta = a-last delta = a-last
for d in tr[a]: for d in tr[a]:
""" Running status check. For each packet compare """ Running status check. For each packet compare
the first byte with the first byte of the previous the first byte with the first byte of the previous
packet. If it is can be converted to running status packet. If it is can be converted to running status
we strip out byte 0. Note that valid running status we strip out byte 0. Note that valid running status
byte are 0x80..0xef. 0xfx are system messages byte are 0x80..0xef. 0xfx are system messages
and are note suitable for running status. and are note suitable for running status.
""" """
if len(d) > 1: if len(d) > 1:
@ -404,35 +425,34 @@ class Mtrk:
def addPairToTrack(self, boffset, startRnd, duration, note, v, unify): def addPairToTrack(self, boffset, startRnd, duration, note, v, unify):
""" Add a note on/off pair to a track. """ Add a note on/off pair to a track.
boffset - offset into current bar boffset - offset into current bar
startRnd - rand val start adjustment startRnd - rand val start adjustment
duration - note len duration - note len
note - midi value of note note - midi value of note
v - midi velocity v - midi velocity
unify - if set attempt to unify/compress on/offs unify - if set attempt to unify/compress on/offs
This function tries its best to handle overlapping events. This function tries its best to handle overlapping events.
Easy to show effect with a table of note ON/OFF pairs. Both Easy to show effect with a table of note ON/OFF pairs. Both
events are for the same note pitch. events are for the same note pitch.
Offsets | 200 | 300 | 320 | 420 Offsets | 200 | 300 | 320 | 420
---------|--------|--------|-------|-------- ---------|--------|--------|-------|--------
Pair1 | on | | off | Pair1 | on | | off |
Pair2 | | on | | off Pair2 | | on | | off
The logic here will delete the OFF event at 320 and The logic here will delete the OFF event at 320 and
insert a new OFF at 300. Result is that when playing insert a new OFF at 300. Result is that when playing
Pair1 will turn off at 300 followed by the same note Pair1 will turn off at 300 followed by the same note
in Pair2 beginning sounded right after. Why the on/off? in Pair2 beginning sounded right after. Why the on/off?
Remember: Velocities may be different! Remember: Velocities may be different!
However, if the unify flag is set we should end up with: However, if the unify flag is set we should end up with:
Offsets | 200 | 300 | 320 | 420
---------|--------|--------|-------|--------
Pair1 | on | | |
Pair2 | | | | off
Offsets | 200 | 300 | 320 | 420
---------|--------|--------|-------|--------
Pair1 | on | | |
Pair2 | | | | off
""" """
@ -443,30 +463,30 @@ class Mtrk:
# ON/OFF events # ON/OFF events
onEvent = chr(0x90 | self.channel) + chr(note) + chr(v) onEvent = chr(0x90 | self.channel) + chr(note) + chr(v)
offEvent = onEvent[:-1] + chr(0) offEvent = onEvent[:-1] + chr(0)
""" Check for overlap on last event set for this track and """ Check for overlap on last event set for this track and
do some ugly trickry. do some ugly trickry.
- The noOnFlag is set if we don't want to have the main - 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 routine add in the ON event. This is set when UNIFY is
set and we have an overlap. set and we have an overlap.
- We set F to the stored event time for this note and, - We set F to the stored event time for this note and,
if it's in the same event range as the current event if it's in the same event range as the current event
we loop though the saved events for this track. We are we loop though the saved events for this track. We are
looking for a NOTE OFF event. looking for a NOTE OFF event.
- If we get a matching event we then delete it from the - If we get a matching event we then delete it from the
track. This requires 2 statements: one for an event track. This requires 2 statements: one for an event
list with only 1 event, a 2nd for multiple events. list with only 1 event, a 2nd for multiple events.
- If UNIFY is NOT set we insert a NOTE OFF at the current - If UNIFY is NOT set we insert a NOTE OFF at the current
on time. This replaces the OFF we just deleted. on time. This replaces the OFF we just deleted.
- If UNIFY is SET we skip the above step, and we set the - If UNIFY is SET we skip the above step, and we set the
noOnFlag so that the ON event isn't set. noOnFlag so that the ON event isn't set.
""" """
@ -499,10 +519,10 @@ class Mtrk:
def zapRangeTrack(self, start, end): def zapRangeTrack(self, start, end):
""" Clear NoteOn events from track in range: start ... end. """ Clear NoteOn events from track in range: start ... end.
This is called from the fermata function. This is called from the fermata function.
We delete the entire event list (3 bytes) from the buffer. This We delete the entire event list (3 bytes) from the buffer. This
can result in empty directory enteries, but that isn't a problem. can result in empty directory enteries, but that isn't a problem.
""" """
trk=self.miditrk trk=self.miditrk
@ -517,14 +537,14 @@ class Mtrk:
def addToTrack(self, offset, event): def addToTrack(self, offset, event):
""" Add an event to a track. """ Add an event to a track.
MIDI data is saved as created in track structures. MIDI data is saved as created in track structures.
Each track has a miditrk dictionary entry which used Each track has a miditrk dictionary entry which used
the time offsets and keys and has the various events the time offsets and keys and has the various events
as data. Each event is packed string of bytes and as data. Each event is a packed string of bytes and
the events are stored as a list in the order they are the events are stored as a list in the order they are
created. Our storage looks like: created. Our storage looks like:
miditrk[123] = [event1, event2, ...] miditrk[OFFSET_VALUE] = [event1, event2, ...]
""" """
if offset<0: if offset<0:
@ -538,8 +558,6 @@ class Mtrk:
tr[offset]=[event] tr[offset]=[event]
class TimeSig: class TimeSig:
""" Track and set the current time signature. """ Track and set the current time signature.

View File

@ -26,64 +26,101 @@ This module contains interface for MIDI constants and conversion routines.
from MMA.common import * from MMA.common import *
from MMA.miditables import * from MMA.miditables import *
def drumToValue(name):
""" Get the value of the drum tone (-1==error). """
try: def voice2tup(x):
v=int(name, 0) """ Convert integer into 3 byte tuple: Voice, LSB, MSB. """
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: if x>0xffff:
error("Note in Drum Tone list must be 0..127, not %s" % v) msb = x >> 16
x &= 0xffff
else:
msb = 0
if x>0xff:
lsb = x >> 8
x &= 0xff
else:
lsb = 0
return (x, lsb, msb)
def extVocStr(v):
v = "%s.%s.%s" % voice2tup(v)
if v[-2:] == '.0':
v=v[:-2]
if v[-2:] == '.0':
v=v[:-2]
return v return v
###############################
def drumToValue(name):
""" Get the value of the drum tone (-1==error).
Note that this is quite different from instToValue() ... in that
case the caller does a bunch of validation stuff for controllers, etc.
"""
try: # assuming that 'name' is an integer
i = int(name, 0)
if i>=0 and i<=127:
return int(name)
else:
return -1
except:
try:
return drumInx[ name.upper() ]
except KeyError:
return -1
def valueToDrum(val):
""" Get the name of the drum tone. """
try:
return drumNames[val]
except KeyError:
return str(val)
def instToValue(name): def instToValue(name):
""" Get the value of the instrument name (-1==error). """ """ Get the value of the instrument name (-1==error). """
try: try:
return upperVoiceNames.index(name.upper()) return voiceInx[name.upper()]
except ValueError: except KeyError:
return -1 return -1
def ctrlToValue(name):
""" Get the value of the controler name (-1==error). """
try:
return upperCtrlNames.index(name.upper())
except ValueError:
return -1
def valueToInst(val): def valueToInst(val):
""" Get the name of the inst. (or 'ERR'). """ """ Get the name of the inst. (or 'ERR'). """
try: try:
return voiceNames[val] return voiceNames[val]
except IndexError: except KeyError:
return "ERROR" try:
int(val)
except:
return "ERROR"
return extVocStr(val)
def valueToDrum(val):
""" 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).
"""
if val<27 or val>86: def ctrlToValue(name):
return str(val) """ Get the value of the controler name (-1==error). """
else:
return drumNames[val-27] try:
return ctrlInx[name.upper()]
except keyError:
return -1
def valueToCtrl(val): def valueToCtrl(val):
""" Get the name of the controller (or 'ERR'). """ """ Get the name of the controller (or 'ERR'). """
try: try:
return ctrlNames[val] return ctrlNames[val]
except IndexError: except KeyError:
return "ERROR" return "ERROR"

View File

@ -23,11 +23,15 @@ Bob van der Poel <bob@mellowood.ca>
""" """
import os
import MMA.midiM import MMA.midiM
from MMA.alloc import trackAlloc
import gbl import gbl
from MMA.common import * from MMA.common import *
import os from MMA.alloc import trackAlloc
# The following 2 variables are global. A bit ugly :) # The following 2 variables are global. A bit ugly :)
@ -149,7 +153,10 @@ def midiinc(ln):
iend = 0xffffff iend = 0xffffff
for a in ln: for a in ln:
cmd, opt = a.split('=') try:
cmd, opt = a.split('=')
except:
error("MidiInc expecting cmd=opt pairs, not '%s'." % a)
cmd=cmd.upper() cmd=cmd.upper()
@ -497,7 +504,7 @@ def midiinc(ln):
t.clearPending() t.clearPending()
if t.voice[0] != t.ssvoice: if t.voice[0] != t.ssvoice:
gbl.mtrks[t.channel].addProgChange( gbl.tickOffset, t.voice[0]) gbl.mtrks[t.channel].addProgChange( gbl.tickOffset, t.voice[0], t.ssvoice)
channel = t.channel channel = t.channel
track = gbl.mtrks[channel] track = gbl.mtrks[channel]

View File

@ -27,140 +27,252 @@ MIDI controllers.
Having only the constants in this separate file permits to Having only the constants in this separate file permits to
call this from other programs, mainly the mma doc creators. call this from other programs, mainly the mma doc creators.
**** IMPORTANT *** IMPORTANT
The tables *Names/*Inx MUST have matching keys/values.
The KEYS in the *Inx tables are the values from the
*Name tables in UPPERCASE. Be very careful making changes!!!!!
""" """
# Standard GM drum tone names.
drumNames={
27:'HighQ', 28:'Slap', 29:'ScratchPush',
30:'ScratchPull', 31:'Sticks', 32:'SquareClick',
33:'MetronomeClick', 34:'MetronomeBell', 35:'KickDrum2',
36:'KickDrum1', 37:'SideKick', 38:'SnareDrum1',
39:'HandClap', 40:'SnareDrum2', 41:'LowTom2',
42:'ClosedHiHat', 43:'LowTom1', 44:'PedalHiHat',
45:'MidTom2', 46:'OpenHiHat', 47:'MidTom1',
48:'HighTom2', 49:'CrashCymbal1', 50:'HighTom1',
51:'RideCymbal1', 52:'ChineseCymbal', 53:'RideBell',
54:'Tambourine', 55:'SplashCymbal', 56:'CowBell',
57:'CrashCymbal2', 58:'VibraSlap', 59:'RideCymbal2',
60:'HighBongo', 61:'LowBongo', 62:'MuteHighConga',
63:'OpenHighConga', 64:'LowConga', 65:'HighTimbale',
66:'LowTimbale', 67:'HighAgogo', 68:'LowAgogo',
69:'Cabasa', 70:'Maracas', 71:'ShortHiWhistle',
72:'LongLowWhistle', 73:'ShortGuiro', 74:'LongGuiro',
75:'Claves', 76:'HighWoodBlock', 77:'LowWoodBlock',
78:'MuteCuica', 79:'OpenCuica', 80:'MuteTriangle',
81:'OpenTriangle', 82:'Shaker', 83:'JingleBell',
84:'Castanets', 85:'MuteSudro', 86:'OpenSudro'}
drumInx={
'HIGHQ':27, 'SLAP':28, 'SCRATCHPUSH':29,
'SCRATCHPULL':30, 'STICKS':31, 'SQUARECLICK':32,
'METRONOMECLICK':33, 'METRONOMEBELL':34, 'KICKDRUM2':35,
'KICKDRUM1':36, 'SIDEKICK':37, 'SNAREDRUM1':38,
'HANDCLAP':39, 'SNAREDRUM2':40, 'LOWTOM2':41,
'CLOSEDHIHAT':42, 'LOWTOM1':43, 'PEDALHIHAT':44,
'MIDTOM2':45, 'OPENHIHAT':46, 'MIDTOM1':47,
'HIGHTOM2':48, 'CRASHCYMBAL1':49, 'HIGHTOM1':50,
'RIDECYMBAL1':51, 'CHINESECYMBAL':52, 'RIDEBELL':53,
'TAMBOURINE':54, 'SPLASHCYMBAL':55, 'COWBELL':56,
'CRASHCYMBAL2':57, 'VIBRASLAP':58, 'RIDECYMBAL2':59,
'HIGHBONGO':60, 'LOWBONGO':61, 'MUTEHIGHCONGA':62,
'OPENHIGHCONGA':63, 'LOWCONGA':64, 'HIGHTIMBALE':65,
'LOWTIMBALE':66, 'HIGHAGOGO':67, 'LOWAGOGO':68,
'CABASA':69, 'MARACAS':70, 'SHORTHIWHISTLE':71,
'LONGLOWWHISTLE':72, 'SHORTGUIRO':73, 'LONGGUIRO':74,
'CLAVES':75, 'HIGHWOODBLOCK':76, 'LOWWOODBLOCK':77,
'MUTECUICA':78, 'OPENCUICA':79, 'MUTETRIANGLE':80,
'OPENTRIANGLE':81, 'SHAKER':82, 'JINGLEBELL':83,
'CASTANETS':84, 'MUTESUDRO':85, 'OPENSUDRO':86}
""" English names for midi instruments and drums.
These tables are used by the pattern classes to # Standard GM voice names.
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=[ voiceNames={
'Piano1', 'Piano2','Piano3', 0:'Piano1', 1:'Piano2', 2:'Piano3',
'Honky-TonkPiano', 'RhodesPiano', 'EPiano', 3:'Honky-TonkPiano', 4:'RhodesPiano', 5:'EPiano',
'HarpsiChord', 'Clavinet', 'Celesta', 6:'HarpsiChord', 7:'Clavinet', 8:'Celesta',
'Glockenspiel', 'MusicBox', 'Vibraphone', 9:'Glockenspiel', 10:'MusicBox', 11:'Vibraphone',
'Marimba', 'Xylophone', 'TubularBells', 'Santur', 12:'Marimba', 13:'Xylophone', 14:'TubularBells',
'Organ1', 'Organ2', 'Organ3', 'ChurchOrgan', 15:'Santur', 16:'Organ1', 17:'Organ2',
'ReedOrgan', 'Accordion', 'Harmonica', 18:'Organ3', 19:'ChurchOrgan', 20:'ReedOrgan',
'Bandoneon', 'NylonGuitar', 'SteelGuitar', 21:'Accordion', 22:'Harmonica', 23:'Bandoneon',
'JazzGuitar', 'CleanGuitar', 'MutedGuitar', 24:'NylonGuitar', 25:'SteelGuitar', 26:'JazzGuitar',
'OverDriveGuitar', 'DistortonGuitar', 27:'CleanGuitar', 28:'MutedGuitar', 29:'OverDriveGuitar',
'GuitarHarmonics', 'AcousticBass', 30:'DistortonGuitar', 31:'GuitarHarmonics', 32:'AcousticBass',
'FingeredBass', 'PickedBass', 'FretlessBass', 33:'FingeredBass', 34:'PickedBass', 35:'FretlessBass',
'SlapBass1', 'SlapBass2', 'SynthBass1', 36:'SlapBass1', 37:'SlapBass2', 38:'SynthBass1',
'SynthBass2', 'Violin', 'Viola', 'Cello', 39:'SynthBass2', 40:'Violin', 41:'Viola',
'ContraBass', 'TremoloStrings', 42:'Cello', 43:'ContraBass', 44:'TremoloStrings',
'PizzicatoString', 'OrchestralHarp', 'Timpani', 45:'PizzicatoString', 46:'OrchestralHarp', 47:'Timpani',
'Strings', 'SlowStrings', 'SynthStrings1', 48:'Strings', 49:'SlowStrings', 50:'SynthStrings1',
'SynthStrings2', 'ChoirAahs', 'VoiceOohs', 51:'SynthStrings2', 52:'ChoirAahs', 53:'VoiceOohs',
'SynthVox', 'OrchestraHit', 'Trumpet', 54:'SynthVox', 55:'OrchestraHit', 56:'Trumpet',
'Trombone', 'Tuba', 'MutedTrumpet', 'FrenchHorn', 57:'Trombone', 58:'Tuba', 59:'MutedTrumpet',
'BrassSection', 'SynthBrass1', 'SynthBrass2', 60:'FrenchHorn', 61:'BrassSection', 62:'SynthBrass1',
'SopranoSax', 'AltoSax', 'TenorSax', 63:'SynthBrass2', 64:'SopranoSax', 65:'AltoSax',
'BaritoneSax', 'Oboe', 'EnglishHorn', 'Bassoon', 66:'TenorSax', 67:'BaritoneSax', 68:'Oboe',
'Clarinet', 'Piccolo', 'Flute', 'Recorder', 69:'EnglishHorn', 70:'Bassoon', 71:'Clarinet',
'PanFlute', 'BottleBlow', 'Shakuhachi', 72:'Piccolo', 73:'Flute', 74:'Recorder',
'Whistle', 'Ocarina', 'SquareWave', 'SawWave', 75:'PanFlute', 76:'BottleBlow', 77:'Shakuhachi',
'SynCalliope', 'ChifferLead', 'Charang', 78:'Whistle', 79:'Ocarina', 80:'SquareWave',
'SoloVoice', '5thSawWave', 'Bass&Lead', 81:'SawWave', 82:'SynCalliope', 83:'ChifferLead',
'Fantasia', 'WarmPad', 'PolySynth', 'SpaceVoice', 84:'Charang', 85:'SoloVoice', 86:'5thSawWave',
'BowedGlass', 'MetalPad', 'HaloPad', 'SweepPad', 87:'Bass&Lead', 88:'Fantasia', 89:'WarmPad',
'IceRain', 'SoundTrack', 'Crystal', 'Atmosphere', 90:'PolySynth', 91:'SpaceVoice', 92:'BowedGlass',
'Brightness', 'Goblins', 'EchoDrops', 93:'MetalPad', 94:'HaloPad', 95:'SweepPad',
'StarTheme', 'Sitar', 'Banjo', 'Shamisen', 96:'IceRain', 97:'SoundTrack', 98:'Crystal',
'Koto', 'Kalimba', 'BagPipe', 'Fiddle', 'Shanai', 99:'Atmosphere', 100:'Brightness', 101:'Goblins',
'TinkleBell', 'AgogoBells', 'SteelDrums', 102:'EchoDrops', 103:'StarTheme', 104:'Sitar',
'WoodBlock', 'TaikoDrum', 'MelodicTom1', 105:'Banjo', 106:'Shamisen', 107:'Koto',
'SynthDrum', 'ReverseCymbal', 'GuitarFretNoise', 108:'Kalimba', 109:'BagPipe', 110:'Fiddle',
'BreathNoise', 'SeaShore', 'BirdTweet', 111:'Shanai', 112:'TinkleBell', 113:'AgogoBells',
'TelephoneRing', 'HelicopterBlade', 114:'SteelDrums', 115:'WoodBlock', 116:'TaikoDrum',
'Applause/Noise', 'GunShot' ] 117:'MelodicTom1', 118:'SynthDrum', 119:'ReverseCymbal',
120:'GuitarFretNoise', 121:'BreathNoise', 122:'SeaShore',
123:'BirdTweet', 124:'TelephoneRing', 125:'HelicopterBlade',
126:'Applause/Noise', 127:'GunShot' }
voiceInx={
'PIANO1':0, 'PIANO2':1, 'PIANO3':2,
'HONKY-TONKPIANO':3, 'RHODESPIANO':4, 'EPIANO':5,
'HARPSICHORD':6, 'CLAVINET':7, 'CELESTA':8,
'GLOCKENSPIEL':9, 'MUSICBOX':10, 'VIBRAPHONE':11,
'MARIMBA':12, 'XYLOPHONE':13, 'TUBULARBELLS':14,
'SANTUR':15, 'ORGAN1':16, 'ORGAN2':17,
'ORGAN3':18, 'CHURCHORGAN':19, 'REEDORGAN':20,
'ACCORDION':21, 'HARMONICA':22, 'BANDONEON':23,
'NYLONGUITAR':24, 'STEELGUITAR':25, 'JAZZGUITAR':26,
'CLEANGUITAR':27, 'MUTEDGUITAR':28, 'OVERDRIVEGUITAR':29,
'DISTORTONGUITAR':30, 'GUITARHARMONICS':31, 'ACOUSTICBASS':32,
'FINGEREDBASS':33, 'PICKEDBASS':34, 'FRETLESSBASS':35,
'SLAPBASS1':36, 'SLAPBASS2':37, 'SYNTHBASS1':38,
'SYNTHBASS2':39, 'VIOLIN':40, 'VIOLA':41,
'CELLO':42, 'CONTRABASS':43, 'TREMOLOSTRINGS':44,
'PIZZICATOSTRING':45, 'ORCHESTRALHARP':46, 'TIMPANI':47,
'STRINGS':48, 'SLOWSTRINGS':49, 'SYNTHSTRINGS1':50,
'SYNTHSTRINGS2':51, 'CHOIRAAHS':52, 'VOICEOOHS':53,
'SYNTHVOX':54, 'ORCHESTRAHIT':55, 'TRUMPET':56,
'TROMBONE':57, 'TUBA':58, 'MUTEDTRUMPET':59,
'FRENCHHORN':60, 'BRASSSECTION':61, 'SYNTHBRASS1':62,
'SYNTHBRASS2':63, 'SOPRANOSAX':64, 'ALTOSAX':65,
'TENORSAX':66, 'BARITONESAX':67, 'OBOE':68,
'ENGLISHHORN':69, 'BASSOON':70, 'CLARINET':71,
'PICCOLO':72, 'FLUTE':73, 'RECORDER':74,
'PANFLUTE':75, 'BOTTLEBLOW':76, 'SHAKUHACHI':77,
'WHISTLE':78, 'OCARINA':79, 'SQUAREWAVE':80,
'SAWWAVE':81, 'SYNCALLIOPE':82, 'CHIFFERLEAD':83,
'CHARANG':84, 'SOLOVOICE':85, '5THSAWWAVE':86,
'BASS&LEAD':87, 'FANTASIA':88, 'WARMPAD':89,
'POLYSYNTH':90, 'SPACEVOICE':91, 'BOWEDGLASS':92,
'METALPAD':93, 'HALOPAD':94, 'SWEEPPAD':95,
'ICERAIN':96, 'SOUNDTRACK':97, 'CRYSTAL':98,
'ATMOSPHERE':99, 'BRIGHTNESS':100, 'GOBLINS':101,
'ECHODROPS':102, 'STARTHEME':103, 'SITAR':104,
'BANJO':105, 'SHAMISEN':106, 'KOTO':107,
'KALIMBA':108, 'BAGPIPE':109, 'FIDDLE':110,
'SHANAI':111, 'TINKLEBELL':112, 'AGOGOBELLS':113,
'STEELDRUMS':114, 'WOODBLOCK':115, 'TAIKODRUM':116,
'MELODICTOM1':117, 'SYNTHDRUM':118, 'REVERSECYMBAL':119,
'GUITARFRETNOISE':120, 'BREATHNOISE':121, 'SEASHORE':122,
'BIRDTWEET':123, 'TELEPHONERING':124, 'HELICOPTERBLADE':125,
'APPLAUSE/NOISE':126, 'GUNSHOT':127 }
upperVoiceNames = [name.upper() for name in voiceNames] # Controller names. Tables are borrowed from:
# http://www.midi.org/about-midi/table3.shtml
ctrlNames = [ # 0-31 Double Precise Controllers MSB (14-bits, 16,384 values)
### also see: http://www.midi.org/about-midi/table3.shtml # 32-63 Double Precise Controllers LSB (14-bits, 16,384 values)
# 64-119 Single Precise Controllers (7-bits, 128 values)
# 120-127 Channel Mode Messages
### 0-31 Double Precise Controllers ctrlNames = {
### MSB (14-bits, 16,384 values) 0:'Bank', 1:'Modulation', 2:'Breath',
3:'Ctrl3', 4:'Foot', 5:'Portamento',
6:'Data', 7:'Volume', 8:'Balance',
9:'Ctrl9', 10:'Pan', 11:'Expression',
12:'Effect1', 13:'Effect2', 14:'Ctrl14',
15:'Ctrl15', 16:'General1', 17:'General2',
18:'General3', 19:'General4', 20:'Ctrl20',
21:'Ctrl21', 22:'Ctrl22', 23:'Ctrl23',
24:'Ctrl24', 25:'Ctrl25', 26:'Ctrl26',
27:'Ctrl27', 28:'Ctrl28', 29:'Ctrl29',
30:'Ctrl30', 31:'Ctrl31', 32:'BankLSB',
33:'ModulationLSB', 34:'BreathLSB', 35:'Ctrl35',
36:'FootLSB', 37:'PortamentoLSB', 38:'DataLSB',
39:'VolumeLSB', 40:'BalanceLSB', 41:'Ctrl41',
42:'PanLSB', 43:'ExpressionLSB', 44:'Effect1LSB',
45:'Effect2LSB', 46:'Ctrl46', 47:'Ctrl47',
48:'General1LSB', 49:'General2LSB', 50:'General3LSB',
51:'General4LSB', 52:'Ctrl52', 53:'Ctrl53',
54:'Ctrl54', 55:'Ctrl55', 56:'Ctrl56',
57:'Ctrl57', 58:'Ctrl58', 59:'Ctrl59',
60:'Ctrl60', 61:'Ctrl61', 62:'Ctrl62',
63:'Ctrl63', 64:'Sustain', 65:'Portamento',
66:'Sostenuto', 67:'SoftPedal', 68:'Legato',
69:'Hold2', 70:'Variation', 71:'Resonance',
72:'ReleaseTime', 73:'AttackTime', 74:'Brightness',
75:'DecayTime', 76:'VibratoRate', 77:'VibratoDepth',
78:'VibratoDelay', 79:'Ctrl79', 80:'General5',
81:'General6', 82:'General7', 83:'General8',
84:'PortamentoCtrl', 85:'Ctrl85', 86:'Ctrl86',
87:'Ctrl87', 88:'Ctrl88', 89:'Ctrl89',
90:'Ctrl90', 91:'Reverb', 92:'Tremolo',
93:'Chorus', 94:'Detune', 95:'Phaser',
96:'DataInc', 97:'DataDec', 98:'NonRegLSB',
99:'NonRegMSB', 100:'RegParLSB', 101:'RegParMSB',
102:'Ctrl102', 103:'Ctrl103', 104:'Ctrl104',
105:'Ctrl105', 106:'Ctrl106', 107:'Ctrl107',
108:'Ctrl108', 109:'Ctrl109', 110:'Ctrl110',
111:'Ctrl111', 112:'Ctrl112', 113:'Ctrl113',
114:'Ctrl114', 115:'Ctrl115', 116:'Ctrl116',
117:'Ctrl117', 118:'Ctrl118', 119:'Ctrl119',
120:'AllSoundsOff', 121:'ResetAll', 122:'LocalCtrl',
123:'AllNotesOff', 124:'OmniOff', 125:'OmniOn',
126:'PolyOff', 127:'PolyOn' }
'Bank', 'Modulation', 'Breath', 'Ctrl3', ctrlInx = {
'Foot', 'Portamento', 'Data', 'Volume', 'BANK':0, 'MODULATION':1, 'BREATH':2,
'Balance', 'Ctrl9', 'Pan', 'Expression', 'CTRL3':3, 'FOOT':4, 'PORTAMENTO':5,
'Effect1', 'Effect2', 'Ctrl14', 'Ctrl15', 'DATA':6, 'VOLUME':7, 'BALANCE':8,
'General1','General2','General3','General4', 'CTRL9':9, 'PAN':10, 'EXPRESSION':11,
'Ctrl20', 'Ctrl21', 'Ctrl22', 'Ctrl23', 'EFFECT1':12, 'EFFECT2':13, 'CTRL14':14,
'Ctrl24', 'Ctrl25', 'Ctrl26', 'Ctrl27', 'CTRL15':15, 'GENERAL1':16, 'GENERAL2':17,
'Ctrl28', 'Ctrl29', 'Ctrl30', 'Ctrl31', 'GENERAL3':18, 'GENERAL4':19, 'CTRL20':20,
### 32-63 Double Precise Controllers 'CTRL21':21, 'CTRL22':22, 'CTRL23':23,
### LSB (14-bits, 16,384 values) 'CTRL24':24, 'CTRL25':25, 'CTRL26':26,
'BankLSB', 'ModulationLSB', 'BreathLSB', 'CTRL27':27, 'CTRL28':28, 'CTRL29':29,
'Ctrl35', 'FootLSB', 'PortamentoLSB', 'CTRL30':30, 'CTRL31':31, 'BANKLSB':32,
'DataLSB','VolumeLSB','BalanceLSB', 'MODULATIONLSB':33, 'BREATHLSB':34, 'CTRL35':35,
'Ctrl41','PanLSB','ExpressionLSB', 'FOOTLSB':36, 'PORTAMENTOLSB':37, 'DATALSB':38,
'Effect1LSB', 'Effect2LSB','Ctrl46', 'Ctrl47', 'VOLUMELSB':39, 'BALANCELSB':40, 'CTRL41':41,
'General1LSB','General2LSB', 'General3LSB', 'PANLSB':42, 'EXPRESSIONLSB':43, 'EFFECT1LSB':44,
'General4LSB', 'Ctrl52','Ctrl53', 'Ctrl54', 'EFFECT2LSB':45, 'CTRL46':46, 'CTRL47':47,
'Ctrl55', 'Ctrl56', 'Ctrl57', 'Ctrl58', 'GENERAL1LSB':48, 'GENERAL2LSB':49, 'GENERAL3LSB':50,
'Ctrl59', 'Ctrl60', 'Ctrl61', 'Ctrl62', 'GENERAL4LSB':51, 'CTRL52':52, 'CTRL53':53,
'Ctrl63', 'CTRL54':54, 'CTRL55':55, 'CTRL56':56,
'CTRL57':57, 'CTRL58':58, 'CTRL59':59,
'CTRL60':60, 'CTRL61':61, 'CTRL62':62,
'CTRL63':63, 'SUSTAIN':64, 'PORTAMENTO':65,
'SOSTENUTO':66, 'SOFTPEDAL':67, 'LEGATO':68,
'HOLD2':69, 'VARIATION':70, 'RESONANCE':71,
'RELEASETIME':72, 'ATTACKTIME':73, 'BRIGHTNESS':74,
'DECAYTIME':75, 'VIBRATORATE':76, 'VIBRATODEPTH':77,
'VIBRATODELAY':78, 'CTRL79':79, 'GENERAL5':80,
'GENERAL6':81, 'GENERAL7':82, 'GENERAL8':83,
'PORTAMENTOCTRL':84, 'CTRL85':85, 'CTRL86':86,
'CTRL87':87, 'CTRL88':88, 'CTRL89':89,
'CTRL90':90, 'REVERB':91, 'TREMOLO':92,
'CHORUS':93, 'DETUNE':94, 'PHASER':95,
'DATAINC':96, 'DATADEC':97, 'NONREGLSB':98,
'NONREGMSB':99, 'REGPARLSB':100, 'REGPARMSB':101,
'CTRL102':102, 'CTRL103':103, 'CTRL104':104,
'CTRL105':105, 'CTRL106':106, 'CTRL107':107,
'CTRL108':108, 'CTRL109':109, 'CTRL110':110,
'CTRL111':111, 'CTRL112':112, 'CTRL113':113,
'CTRL114':114, 'CTRL115':115, 'CTRL116':116,
'CTRL117':117, 'CTRL118':118, 'CTRL119':119,
'ALLSOUNDSOFF':120, 'RESETALL':121, 'LOCALCTRL':122,
'ALLNOTESOFF':123, 'OMNIOFF':124, 'OMNION':125,
'POLYOFF':126, 'POLYON':127 }
### 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

@ -23,6 +23,7 @@ Bob van der Poel <bob@mellowood.ca>
""" """
import gbl import gbl
from MMA.common import * from MMA.common import *

View File

@ -28,23 +28,22 @@ Bob van der Poel <bob@mellowood.ca>
import getopt import getopt
import sys import sys
import gbl
from MMA.common import *
import MMA.docs import MMA.docs
import MMA.parse import MMA.parse
import MMA.alloc
import MMA.chords import MMA.chords
from MMA.macro import macros import MMA.alloc
import MMA.volume
import gbl
from MMA.common import *
from MMA.macro import macros
def opts(): def opts():
""" Option parser. """ """ Option parser. """
try: try:
opts, args = getopt.gnu_getopt(sys.argv[1:], opts, args = getopt.gnu_getopt(sys.argv[1:],
"dpsS:ri:wneom:f:M:cgGvD:0", [] ) "dpsS:ri:wneom:f:M:cgGvD:01PT:", [] )
except getopt.GetoptError: except getopt.GetoptError:
usage() usage()
@ -110,24 +109,32 @@ def opts():
else: else:
error("Only a '0' or '1' is permitted for the -M arg") error("Only a '0' or '1' is permitted for the -M arg")
elif o == '-T': # set tracks to generate, mute all others
gbl.muteTracks = a.upper().split(',')
elif o == '-D': elif o == '-D':
if a == 'xl': if a == 'xl':
gbl.docs = 1 gbl.createDocs = 1
elif a == 'xh': elif a == 'xh':
gbl.docs = 2 gbl.createDocs = 2
elif a == 'v':
gbl.createDocs = 3
elif a == 'k': elif a == 'k':
def pl(msg, lst): def pl(msg, lst, adds):
print msg, print msg,
for i in sorted(lst.keys()): for i in sorted(lst.keys() + adds):
print i, print i,
print "\n" print "\n"
pl("Base track names:", MMA.alloc.trkClasses ) pl("Base track names:", MMA.alloc.trkClasses, [])
pl("Commands:", MMA.parse.simpleFuncs) pl("Commands:", MMA.parse.simpleFuncs,
pl("TrackCommands:", MMA.parse.trackFuncs) ["BEGIN", "END",] )
pl("TrackCommands:", MMA.parse.trackFuncs, [])
print "Not complete ... subcommands, comments, chords..." print "Not complete ... subcommands, comments, chords..."
sys.exit(0) sys.exit(0)
@ -138,14 +145,25 @@ def opts():
elif o == '-0': elif o == '-0':
gbl.synctick = 1 gbl.synctick = 1
elif o == '-1':
gbl.endsync = 1
elif o == '-P':
gbl.playFile = 1
else: else:
usage() # unreachable?? usage() # unreachable??
if args: # we have processed all the args. Should just have a filename left
if gbl.infile:
usage("Only one input filename is permitted.")
gbl.infile = args.pop(0)
if len(args)>1:
usage("Only one input filename is permitted, %s given on command line." % len(args) )
if gbl.infile:
usage("Input filename already assigned ... should not happen.")
if args:
gbl.infile = args[0]
def usage(msg=''): def usage(msg=''):
""" Usage message. """ """ Usage message. """
@ -162,6 +180,7 @@ def usage(msg=''):
" -Dk print list of MMA keywords", " -Dk print list of MMA keywords",
" -Dxl eXtract Latex doc blocks from file", " -Dxl eXtract Latex doc blocks from file",
" -Dxh eXtract HTML doc blocks from file", " -Dxh eXtract HTML doc blocks from file",
" -Dv extract lots of info about the grooves/seqs in file",
" -e show parsed/Expanded lines", " -e show parsed/Expanded lines",
" -f <file> set output Filename", " -f <file> set output Filename",
" -g update Groove dependency database", " -g update Groove dependency database",
@ -175,9 +194,11 @@ def usage(msg=''):
" -r display Running progress", " -r display Running progress",
" -s display Sequence info during run", " -s display Sequence info during run",
" -S <var[=data]> Set macro 'var' to 'data'", " -S <var[=data]> Set macro 'var' to 'data'",
" -T <tracks> Limit generation to specified tracks",
" -v display Version number", " -v display Version number",
" -w disable Warning messages", " -w disable Warning messages",
" -0 create sync at start of all channel tracks" ] " -0 create sync at start of all channel tracks",
" -1 create sync at end of all channel tracks" ]
for a in txt: for a in txt:

View File

@ -34,35 +34,39 @@ import random
import copy import copy
import gbl import gbl
from MMA.common import *
import MMA.notelen import MMA.notelen
import MMA.chords import MMA.chords
import MMA.file import MMA.file
import MMA.docs
import MMA.midi import MMA.midi
import MMA.midiIn import MMA.midiIn
import MMA.grooves
import MMA.docs
import MMA.auto import MMA.auto
from MMA.alloc import trackAlloc
from MMA.common import *
import MMA.translate import MMA.translate
from MMA.lyric import lyric
import MMA.patSolo import MMA.patSolo
from MMA.macro import macros
import MMA.mdefine import MMA.mdefine
import MMA.volume import MMA.volume
from MMA.pat import seqBump import MMA.seqrnd
import MMA.patch
import gbl
from MMA.common import *
from MMA.lyric import lyric
from MMA.macro import macros
from MMA.alloc import trackAlloc
lastChord = None # tracks last chord for "/ /" data lines. lastChord = None # tracks last chord for "/ /" data lines.
beginData = [] # Current data set by a BEGIN statement beginData = [] # Current data set by a BEGIN statement
beginPoints = [] # since BEGINs can be nested, we need ptrs for backing out of BEGINs beginPoints = [] # since BEGINs can be nested, we need ptrs for backing out of BEGINs
seqRndWeight = [1]
groovesList = None
groovesCount = 0
gmagic = 9988 # magic name for groove saved with USE gmagic = 9988 # magic name for groove saved with USE
""" This table is passed to the track classes. It has """ This table is passed to the track classes. It has
an instance for each chord in the current bar. an instance for each chord in the current bar.
""" """
@ -105,7 +109,6 @@ def parse(inpath):
""" Process a mma input file. """ """ Process a mma input file. """
global beginData, lastChord global beginData, lastChord
global groovesList, groovesCount
gbl.inpath = inpath gbl.inpath = inpath
@ -130,18 +133,22 @@ def parse(inpath):
encountered. encountered.
The placement here is pretty deliberate. Variable expand comes The placement here is pretty deliberate. Variable expand comes
later so you can't macorize BEGIN ... I think this makes sense. later so you can't macroize BEGIN ... I think this makes sense.
The tests for 'begin', 'end' and the appending of the current
begin[] stuff have to be here, in this order.
""" """
key=l[0].upper() action=l[0].upper() # 1st arg in line
if key == 'BEGIN':
if action == 'BEGIN':
if not l: if not l:
error("Use: Begin STUFF") error("Use: Begin STUFF")
beginPoints.append(len(beginData)) beginPoints.append(len(beginData))
beginData.extend(l[1:]) beginData.extend(l[1:])
continue continue
if key == 'END': if action == 'END':
if len(l) > 1: if len(l) > 1:
error("No arguments permitted for END") error("No arguments permitted for END")
if not beginData: if not beginData:
@ -151,8 +158,8 @@ def parse(inpath):
if beginData: if beginData:
l = beginData + l l = beginData + l
action = l[0].upper()
action = l[0].upper()
if gbl.showExpand and action !='REPEAT': if gbl.showExpand and action !='REPEAT':
print l print l
@ -197,7 +204,7 @@ def parse(inpath):
a line number on a line by itself it okay. a line number on a line by itself it okay.
""" """
if l[0].isdigit(): if action.isdigit(): # isdigit() matches '1', '1234' but not '1a'!
l = l[1:] l = l[1:]
if not l: # ignore empty lines if not l: # ignore empty lines
continue continue
@ -221,26 +228,28 @@ def parse(inpath):
l = ' '.join(l) l = ' '.join(l)
l = MMA.patSolo.extractSolo(l, rptcount) l = MMA.patSolo.extractSolo(l, rptcount)
""" Set lyrics from [stuff] in the current line or """ Set lyrics from [stuff] in the current line.
stuff previously stored with LYRICS SET. NOTE: lyric.extract() inserts previously created
data from LYRICS SET and inserts the chord names
if that flag is active.
""" """
l, lyrics = lyric.extract(l, rptcount) l, lyrics = lyric.extract(l, rptcount)
l = l.split()
""" At this point we have only chord info. A number """ At this point we have only chord info. A number
of sanity checks are made: of sanity checks are made:
1. Make sure there is some chord data, 1. Make sure there is some chord data,
2. Ensure the correct number of chords. 2. Ensure the correct number of chords.
""" """
l = l.split()
if not l: if not l:
error("Expecting music (chord) data. Even lines with\n" error("Expecting music (chord) data. Even lines with\n"
" lyrics or solos still need a chord") " lyrics or solos still need a chord")
i = gbl.QperBar - len(l) i = gbl.QperBar - len(l)
if i<0: if i < 0:
error("Too many chords in line. Max is %s, not %s" % error("Too many chords in line. Max is %s, not %s" %
(gbl.QperBar, len(l) ) ) (gbl.QperBar, len(l) ) )
if i: if i:
@ -249,7 +258,7 @@ def parse(inpath):
""" We now have a valid line. It'll look something like: """ We now have a valid line. It'll look something like:
['Cm', '/', 'z', 'F#'] ['Cm', '/', 'z', 'F#'] or ['C', '/', '/', '/' ]
For each bar we create a ctable structure. This is just For each bar we create a ctable structure. This is just
a list of CTables, one for each beat division. a list of CTables, one for each beat division.
@ -275,19 +284,24 @@ def parse(inpath):
# Create MIDI data for the bar # Create MIDI data for the bar
for rpt in range(rptcount): for rpt in range(rptcount): # for each bar in the repeat count ( Cm * 3)
""" Handle global (de)cresc by popping a new volume off stack. """
if MMA.volume.futureVol: if MMA.volume.futureVol:
MMA.volume.volume = MMA.volume.futureVol.pop(0) MMA.volume.volume = MMA.volume.futureVol.pop(0)
if MMA.volume.futureVol:
MMA.volume.nextVolume = MMA.volume.futureVol[0]
else:
MMA.volume.nextVolume = None
tmp = []
for x, i in enumerate(seqRndWeight):
tmp.extend([x] * i)
if not len(tmp):
error("SeqRndWeight has generated an empty list")
randomSeq = random.choice(tmp)
if gbl.seqRnd[0] == 1: """ Set up for rnd seq. This may set the current seq point. If return
gbl.seqCount = randomSeq is >=0 then we're doing track rnd.
"""
rsq, seqlist = MMA.seqrnd.setseq()
""" Process each track. It is important that the track classes """ Process each track. It is important that the track classes
are written so that the ctable passed to them IS NOT MODIFIED. are written so that the ctable passed to them IS NOT MODIFIED.
@ -296,16 +310,20 @@ def parse(inpath):
""" """
for a in gbl.tnames.values(): for a in gbl.tnames.values():
seqSave = gbl.seqCount if rsq >= 0:
if a.name in gbl.seqRnd: seqSave = gbl.seqCount
gbl.seqCount = randomSeq if a.name in seqlist: # for seqrnd with tracklist
gbl.seqCount = rsq
a.bar(ctable) ## process entire bar! a.bar(ctable) ## process entire bar!
gbl.seqCount = seqSave if rsq >= 0:
gbl.seqCount = seqSave
# Adjust counters # Adjust counters
gbl.totTime += float(gbl.QperBar) / gbl.tempo
gbl.barNum += 1 gbl.barNum += 1
if gbl.barNum > gbl.maxBars: if gbl.barNum > gbl.maxBars:
@ -316,27 +334,7 @@ def parse(inpath):
gbl.seqCount = (gbl.seqCount+1) % gbl.seqSize gbl.seqCount = (gbl.seqCount+1) % gbl.seqSize
""" Handle groove lists. If there is more than 1 entry MMA.grooves.nextGroove() # using groove list? Advance.
in the groove list, advance (circle). We don't have
to qualify grooves since they were verified when
this list was created. groovesList==None if there
is only one groove (or none).
"""
if groovesList:
groovesCount += 1
if groovesCount > len(groovesList)-1:
groovesCount = 0
slot = groovesList[groovesCount]
if slot != gbl.currentGroove:
grooveDo(slot)
gbl.lastGroove = gbl.currentGroove
gbl.currentGroove = slot
if gbl.debug:
print "Groove (list) setting restored from '%s'." % slot
# Enabled with the -r command line option # Enabled with the -r command line option
@ -519,7 +517,7 @@ def repeat(ln):
while 1: while 1:
if act in ('REPEATEND', 'ENDREPEAT'): if act in ('REPEATEND', 'ENDREPEAT'):
if l: if l:
l=macros.expand(l) l = macros.expand(l)
if len(l) == 2 and l[0].upper() == 'NOWARN': if len(l) == 2 and l[0].upper() == 'NOWARN':
l=l[1:] l=l[1:]
warn=0 warn=0
@ -561,7 +559,7 @@ def repeat(ln):
ending = 1 ending = 1
if l: if l:
l=macros.expand(l) l = macros.expand(l)
if len(l) == 2 and l[0].upper() == 'NOWARN': if len(l) == 2 and l[0].upper() == 'NOWARN':
warn=0 warn=0
l=l[1:] l=l[1:]
@ -701,6 +699,9 @@ def tempo(ln):
print "Set future Tempo to %s over %s beats" % \ print "Set future Tempo to %s over %s beats" % \
( int(tempo), numbeats) ( int(tempo), numbeats)
if gbl.tempo <=0:
error("Tempo setting must be greater than 0.")
def beatAdjust(ln): def beatAdjust(ln):
""" Delete or insert some beats into the sequence. """ Delete or insert some beats into the sequence.
@ -717,6 +718,8 @@ def beatAdjust(ln):
gbl.tickOffset += int(adj * gbl.BperQ) gbl.tickOffset += int(adj * gbl.BperQ)
gbl.totTime += adj / gbl.tempo # adjust total time
if gbl.debug: if gbl.debug:
print "BeatAdjust: inserted %s at bar %s." % (adj, gbl.barNum + 1) print "BeatAdjust: inserted %s at bar %s." % (adj, gbl.barNum + 1)
@ -803,204 +806,6 @@ def fermata(ln):
% (start, end) % (start, end)
#######################################
# Groove stuff
def grooveDefine(ln):
""" Define a groove.
Current settings are assigned to a groove name.
"""
if not len(ln):
error("Use: DefGroove Name")
slot=ln[0].upper()
# Slot names can't contain a '/' (reserved) or be an integer (used in groove select).
if '/' in slot:
error("The '/' is not permitted in a groove name")
if slot.isdigit():
error("Invalid slot name '%s'. Cannot be only digits" % slot)
grooveDefineDo(slot)
if gbl.debug:
print "Groove settings saved to '%s'." % slot
if gbl.makeGrvDefs:
MMA.auto.updateGrooveList(slot)
if len(ln) > 1:
MMA.docs.docDefine(ln)
def grooveDefineDo(slot):
for n in gbl.tnames.values():
n.saveGroove(slot)
gbl.settingsGroove[slot] = {
'SEQSIZE': gbl.seqSize,
'SEQRNDWT': seqRndWeight[:],
'QPERBAR': gbl.QperBar,
'SEQRND': gbl.seqRnd[:],
'TIMESIG': MMA.midi.timeSig.get(),
'81': MMA.notelen.noteLenTable['81'],
'82': MMA.notelen.noteLenTable['82'],
'SWINGMODE': gbl.swingMode ,
'SWINGSKEW': gbl.swingSkew,
'VRATIO': (MMA.volume.vTRatio, MMA.volume.vMRatio)}
def groove(ln):
""" Select a previously defined groove. """
global groovesList, groovesCount
if not ln:
error("Groove: needs agrument(s)")
tmpList =[]
if ln[0].isdigit():
wh=stoi(ln[0])
if wh<1:
error("Groove selection must be > 0, not '%s'" % wh)
ln=ln[1:]
else:
wh = None
for slot in ln:
slot = slot.upper()
if slot == "/":
if len(tmpList):
slot=tmpList[-1]
else:
error("A previous groove name is needed before a '/'")
if not slot in gbl.settingsGroove:
if gbl.debug:
print "Groove '%s' not defined. Trying auto-load from libraries" \
% slot
l=MMA.auto.loadGrooveDir(slot) # name of the lib file with groove
if l:
if gbl.debug:
print "Attempting to load groove '%s' from '%s'." \
% (slot, l)
usefile([os.path.join(gbl.autoLib, l)])
if not slot in gbl.settingsGroove:
error("Groove '%s' not found. Have libraries changed "
"since last 'mma -g' run?" % slot)
else:
error("Groove '%s' could not be found in memory or library files" % slot )
tmpList.append(slot)
if not len(tmpList):
error("Use: Groove [selection] Name [...]")
""" If the first arg to list was an int() (ie: 3 groove1 groove2 grooveFoo)
we select from the list. After the selection, we reset the list to be
just the selected entry. This was, if there are multiple groove names without
a leading int() we process the list as groove list changing with each bar.
"""
if wh:
wh = (wh-1) % len(tmpList)
tmpList=tmpList[wh:wh+1]
slot=tmpList[0]
grooveDo(slot)
groovesCount = 0
if len(tmpList)==1:
groovesList=None
else:
groovesList=tmpList
gbl.lastGroove = gbl.currentGroove
gbl.currentGroove = slot
if gbl.lastGroove == '':
gbl.lastGroove = slot
if gbl.debug:
print "Groove settings restored from '%s'." % slot
def grooveDo(slot):
""" This is separate from groove() so we can call it from
usefile() with a qualified name. """
global seqRndWeight
oldSeqSize = gbl.seqSize
g=gbl.settingsGroove[slot]
gbl.seqSize = g['SEQSIZE']
seqRndWeight = g['SEQRNDWT']
gbl.QperBar = g['QPERBAR']
gbl.seqRnd = g['SEQRND']
MMA.midi.timeSig.set( *g['TIMESIG']) # passing tuple as 2 args.
MMA.notelen.noteLenTable['81'] = g['81']
MMA.notelen.noteLenTable['82'] = g['82']
gbl.swingMode = g['SWINGMODE']
gbl.swingSkew = g['SWINGSKEW']
MMA.volume.vTRatio, MMA.volume.vMRatio = g['VRATIO']
for n in gbl.tnames.values():
n.restoreGroove(slot)
""" This is important! Tracks NOT overwritten by saved grooves way
have the wrong sequence length. I don't see any easy way to hit
just the unchanged/unrestored tracks so we do them all.
Only done if a change in seqsize ... doesn't take long to be safe.
"""
if oldSeqSize != gbl.seqSize:
for a in gbl.tnames.values():
a.setSeqSize()
seqRndWeight = MMA.pat.seqBump(seqRndWeight)
gbl.seqCount = 0
def grooveClear(ln):
""" Delete all previously loaded grooves from memory."""
global groovesList, groovesCount
if ln:
error("GrooveClear does not have any arguments.")
groovesList = {}
groovesCount = 0
try:
a= gbl.settingsGroove[gmagic]
except:
a=None
gbl.settingsGroove={}
if a:
gbl.settingsGroove[gmagic]=a
gbl.lastGroove = ''
gbl.currentGroove = ''
if gbl.debug:
print "All grooves deleted."
####################################### #######################################
# File and I/O # File and I/O
@ -1047,10 +852,9 @@ def usefile(ln):
""" """
slot = gmagic slot = gmagic
grooveDefineDo(slot) MMA.grooves.grooveDefineDo(slot)
parseFile(fn) parseFile(fn)
grooveDo(slot) MMA.grooves.grooveDo(slot)
def mmastart(ln): def mmastart(ln):
if not ln: if not ln:
@ -1099,9 +903,9 @@ def setAutoPath(ln):
# To avoid conflicts, delete all existing grooves (current seq not effected) # To avoid conflicts, delete all existing grooves (current seq not effected)
gbl.settingsGroove = {} MMA.grooves.glist = {}
gbl.lastGroove = '' MMA.grooves.lastGroove = ''
gbl.currentGroove = '' MMA.grooves.currentGroove = ''
if gbl.debug: if gbl.debug:
print "AutoLibPath set to", f print "AutoLibPath set to", f
@ -1135,6 +939,20 @@ def setOutPath(ln):
else: else:
gbl.outPath = os.path.expanduser(ln[0]) gbl.outPath = os.path.expanduser(ln[0])
if gbl.debug:
print "OutPath set to", gbl.outPath
def setMidiPlayer(ln):
""" Set the MIDI file player (used with -P). """
if len(ln) != 1:
error("Use: MidiPlayer <program name>")
gbl.midiPlayer = ln[0]
if gbl.debug:
print "MidiPlayer set to", gbl.MidiPlayer
####################################### #######################################
@ -1143,13 +961,14 @@ def setOutPath(ln):
def seqsize(ln): def seqsize(ln):
""" Set the length of sequences. """ """ Set the length of sequences. """
global seqRndWeight
if len(ln) !=1: if len(ln) !=1:
error("Usage 'SeqSize N'") error("Usage 'SeqSize N'")
n = stoi(ln[0], "Argument for SeqSize must be integer") n = stoi(ln[0], "Argument for SeqSize must be integer")
if n < 1:
error("SeqSize: sequence size must be 1 or greater, not '%s'." % n)
# Setting the sequence size always resets the seq point # Setting the sequence size always resets the seq point
gbl.seqCount = 0 gbl.seqCount = 0
@ -1164,7 +983,7 @@ def seqsize(ln):
for a in gbl.tnames.values(): for a in gbl.tnames.values():
a.setSeqSize() a.setSeqSize()
seqRndWeight = seqBump(seqRndWeight) MMA.seqrnd.seqRndWeight = seqBump(MMA.seqrnd.seqRndWeight)
if gbl.debug: if gbl.debug:
print "Set SeqSize to ", n print "Set SeqSize to ", n
@ -1193,9 +1012,9 @@ def seq(ln):
gbl.seqCount = s-1 gbl.seqCount = s-1
if gbl.seqRnd[0] == 1: if MMA.seqrnd.seqRnd[0] == 1:
warning("SeqRnd has been disabled by a Seq command") warning("SeqRnd has been disabled by a Seq command")
seqRnd = [0] MMA.seqrnd.seqRnd = [0]
def seqClear(ln): def seqClear(ln):
@ -1209,67 +1028,9 @@ def seqClear(ln):
n.clearSequence() n.clearSequence()
MMA.volume.futureVol = [] MMA.volume.futureVol = []
setSeqRndWeight(['1']) MMA.seqrnd.setSeqRndWeight(['1'])
def setSeqRnd(ln):
""" Set random order for all tracks. """
emsg = "use [ON, OFF | TrackList ]"
if not ln:
error("SeqRnd:" + emsg)
a=ln[0].upper()
if a in ("ON", "1") and len(ln) == 1:
gbl.seqRnd = [1]
elif a in ("OFF", "0") and len(ln) == 1:
gbl.seqRnd = [0]
else:
gbl.seqRnd=[2]
for a in ln:
a = a.upper()
if not a in gbl.tnames:
error("SeqRnd: Track '%s' does not exist, %s" % (a, emsg))
if a in gbl.seqRnd:
error("SeqRnd: Duplicate track '%s' specified, %s" % (a, emsg))
gbl.seqRnd.append(a)
if gbl.debug:
print "SeqRnd:",
if gbl.seqRnd[0] == 2:
for a in gbl.seqRnd[1:]:
print a,
print
else:
if gbl.seqRnd[0] == 1:
print "On"
else:
print "Off"
def setSeqRndWeight(ln):
""" Set global rnd weight. """
global seqRndWeight
if not ln:
error("Use: RndWeight <weight factors>")
tmp = []
for n in ln:
n = stoi(n)
if n < 0: error("RndWeight: Values must be 0 or greater")
tmp.append(n)
seqRndWeight = seqBump(tmp)
if gbl.debug:
print "RndWeight: ",
printList(seqRndWeight)
def restart(ln): def restart(ln):
""" Restart all tracks to almost-default condidions. """ """ Restart all tracks to almost-default condidions. """
@ -1448,6 +1209,20 @@ def setTimeSig(ln):
####################################### #######################################
# Misc # Misc
def synchronize(ln):
""" Set synchronization in the MIDI. A file mode for -0 and -1. """
if not ln:
error("SYNCHRONIZE: requires args END and/or START.")
for a in ln:
if a.upper() == 'END':
gbl.endsync = 1
elif a.upper() == 'START':
gbl.synctick = 1
else:
error("SYNCHRONIZE: expecting END or START")
def rndseed(ln): def rndseed(ln):
""" Reseed the random number generator. """ """ Reseed the random number generator. """
@ -1486,7 +1261,7 @@ def lnPrint(ln):
def printActive(ln): def printActive(ln):
""" Print a list of the active tracks. """ """ Print a list of the active tracks. """
print "Active tracks, groove:", gbl.currentGroove, ' '.join(ln) print "Active tracks, groove:", MMA.grooves.currentGroove, ' '.join(ln)
for a in sorted(gbl.tnames.keys()): for a in sorted(gbl.tnames.keys()):
f=gbl.tnames[a] f=gbl.tnames[a]
@ -1700,31 +1475,6 @@ def trackRestart(name, ln):
gbl.tnames[name].restart() gbl.tnames[name].restart()
def trackGroove(name, ln):
""" Select a previously defined groove for a single track. """
if len(ln) != 1:
error("Use: %s Groove Name" % name)
slot = ln[0].upper()
if not slot in gbl.settingsGroove:
error("Groove '%s' not defined" % slot)
g=gbl.tnames[name]
g.restoreGroove(slot)
if g.sequence == [None] * len(g.sequence):
warning("'%s' Track Groove has no sequence. Track name error?" % name)
g.setSeqSize()
if gbl.debug:
print "%s Groove settings restored from '%s'." % (name, slot)
def trackRiff(name, ln): def trackRiff(name, ln):
""" Set a riff for a track. """ """ Set a riff for a track. """
@ -1776,6 +1526,8 @@ def trackRvolume(name, ln):
gbl.tnames[name].setRVolume(ln) gbl.tnames[name].setRVolume(ln)
def trackSwell(name, ln):
gbl.tnames[name].setSwell(ln)
def trackCresc(name, ln): def trackCresc(name, ln):
gbl.tnames[name].setCresc(1, ln) gbl.tnames[name].setCresc(1, ln)
@ -2125,11 +1877,10 @@ def trackVoice(name, ln):
def trackPan(name, ln): def trackPan(name, ln):
""" Set the Midi Pan value for a track.""" """ Set the Midi Pan value for a track."""
if len(ln) != 1: if len(ln)==1 or len(ln)==3:
error("Use: %s PAN NN" % name) gbl.tnames[name].setPan(ln)
else:
gbl.tnames[name].setPan(ln[0]) error("Use %s MidiPAN [Value] OR [Initvalue DestValue Beats]." % name)
def trackOff(name, ln): def trackOff(name, ln):
""" Turn a track off """ """ Turn a track off """
@ -2253,19 +2004,22 @@ def trackUnify(name, ln):
simpleFuncs={ simpleFuncs={
'ADJUSTVOLUME': MMA.volume.adjvolume, 'ADJUSTVOLUME': MMA.volume.adjvolume,
'ALLGROOVES': MMA.grooves.allgrooves,
'ALLTRACKS': allTracks, 'ALLTRACKS': allTracks,
'AUTHOR': MMA.docs.docAuthor, 'AUTHOR': MMA.docs.docAuthor,
'AUTOSOLOTRACKS': MMA.patSolo.setAutoSolo, 'AUTOSOLOTRACKS': MMA.patSolo.setAutoSolo,
'BEATADJUST': beatAdjust, 'BEATADJUST': beatAdjust,
'CHANNELPREF': setChPref, 'CHANNELPREF': setChPref,
'CHORDADJUST': MMA.chords.chordAdjust,
'COMMENT': comment, 'COMMENT': comment,
'CRESC': MMA.volume.setCresc, 'CRESC': MMA.volume.setCresc,
'CUT': cut, 'CUT': cut,
'DEBUG': setDebug, 'DEBUG': setDebug,
'DEC': macros.vardec, 'DEC': macros.vardec,
'DECRESC': MMA.volume.setDecresc, 'DECRESC': MMA.volume.setDecresc,
'DEFALIAS': MMA.grooves.grooveAlias,
'DEFCHORD': MMA.chords.defChord, 'DEFCHORD': MMA.chords.defChord,
'DEFGROOVE': grooveDefine, 'DEFGROOVE': MMA.grooves.grooveDefine,
'DELETE': deleteTrks, 'DELETE': deleteTrks,
'DOC': MMA.docs.docNote, 'DOC': MMA.docs.docNote,
'DOCVAR': MMA.docs.docVars, 'DOCVAR': MMA.docs.docVars,
@ -2277,8 +2031,8 @@ simpleFuncs={
'EOF': eof, 'EOF': eof,
'FERMATA': fermata, 'FERMATA': fermata,
'GOTO': goto, 'GOTO': goto,
'GROOVE': groove, 'GROOVE': MMA.grooves.groove,
'GROOVECLEAR': grooveClear, 'GROOVECLEAR': MMA.grooves.grooveClear,
'IF': macros.varIF, 'IF': macros.varIF,
'IFEND': ifend, 'IFEND': ifend,
'INC': macros.varinc, 'INC': macros.varinc,
@ -2297,7 +2051,7 @@ simpleFuncs={
'MSET': macros.msetvar, 'MSET': macros.msetvar,
'MSETEND': endmset, 'MSETEND': endmset,
'NEWSET': macros.newsetvar, 'NEWSET': macros.newsetvar,
'CHORDADJUST': MMA.chords.chordAdjust, 'PATCH': MMA.patch.patch,
'PRINT': lnPrint, 'PRINT': lnPrint,
'PRINTACTIVE': printActive, 'PRINTACTIVE': printActive,
'PRINTCHORD': MMA.chords.printChord, 'PRINTCHORD': MMA.chords.printChord,
@ -2309,17 +2063,20 @@ simpleFuncs={
'RNDSET': macros.rndvar, 'RNDSET': macros.rndvar,
'SEQ': seq, 'SEQ': seq,
'SEQCLEAR': seqClear, 'SEQCLEAR': seqClear,
'SEQRND': setSeqRnd, 'SEQRND': MMA.seqrnd.setSeqRnd,
'SEQRNDWEIGHT': setSeqRndWeight, 'SEQRNDWEIGHT': MMA.seqrnd.setSeqRndWeight,
'SEQSIZE': seqsize, 'SEQSIZE': seqsize,
'SET': macros.setvar, 'SET': macros.setvar,
'SETAUTOLIBPATH': setAutoPath, 'SETAUTOLIBPATH': setAutoPath,
'SETINCPATH': setIncPath, 'SETINCPATH': setIncPath,
'SETLIBPATH': setLibPath, 'SETLIBPATH': setLibPath,
'SETMIDIPLAYER': setMidiPlayer,
'SETOUTPATH': setOutPath, 'SETOUTPATH': setOutPath,
'SHOWVARS': macros.showvars, 'SHOWVARS': macros.showvars,
'STACKVALUE': macros.stackValue, 'STACKVALUE': macros.stackValue,
'SWELL': MMA.volume.setSwell,
'SWINGMODE': MMA.notelen.swingMode, 'SWINGMODE': MMA.notelen.swingMode,
'SYNCHRONIZE': synchronize,
'TEMPO': tempo, 'TEMPO': tempo,
'TIME': setTime, 'TIME': setTime,
'TIMESIG': setTimeSig, 'TIMESIG': setTimeSig,
@ -2350,7 +2107,7 @@ trackFuncs={
'DRUMTYPE': trackDrumType, 'DRUMTYPE': trackDrumType,
'DUPROOT': trackDupRoot, 'DUPROOT': trackDupRoot,
'FORCEOUT': trackForceOut, 'FORCEOUT': trackForceOut,
'GROOVE': trackGroove, 'GROOVE': MMA.grooves.trackGroove,
'HARMONY': trackHarmony, 'HARMONY': trackHarmony,
'HARMONYONLY': trackHarmonyOnly, 'HARMONYONLY': trackHarmonyOnly,
'HARMONYVOLUME': trackHarmonyVolume, 'HARMONYVOLUME': trackHarmonyVolume,
@ -2379,6 +2136,7 @@ trackFuncs={
'SEQRND': trackSeqRnd, 'SEQRND': trackSeqRnd,
'SEQUENCE': trackSequence, 'SEQUENCE': trackSequence,
'SEQRNDWEIGHT': trackSeqRndWeight, 'SEQRNDWEIGHT': trackSeqRndWeight,
'SWELL': trackSwell,
'NOTESPAN': trackSpan, 'NOTESPAN': trackSpan,
'STRUM': trackStrum, 'STRUM': trackStrum,
'TONE': trackTone, 'TONE': trackTone,

View File

@ -28,34 +28,30 @@ import copy
import random import random
import math import math
import gbl import MMA.notelen
from MMA.common import *
from MMA.notelen import getNoteLen
import MMA.translate import MMA.translate
import MMA.midi import MMA.midi
import MMA.midiC import MMA.midiC
import MMA.alloc
import MMA.mdefine import MMA.mdefine
import MMA.volume import MMA.volume
import MMA.alloc
import MMA.seqrnd
import gbl
from MMA.common import *
class Voicing: class Voicing:
def __init__(self): def __init__(self):
self.mode = None self.mode = None
self.range = 12 self.range = 12
self.center = 4 self.center = 4
self.random = 0 self.random = 0
self.percent = 0 self.percent = 0
self.bcount = 0 self.bcount = 0
self.dir = 0 self.dir = 0
def seqBump(l):
""" Expand/contract an existing sequence list to the current seqSize."""
while len(l) < gbl.seqSize:
l += l
return l[:gbl.seqSize]
pats = {} # Storage for all pattern defines pats = {} # Storage for all pattern defines
@ -77,14 +73,14 @@ class PC:
def __init__(self, nm): def __init__(self, nm):
self.inited = 0 self.inited = 0
self.name = nm self.name = nm
self.channel = 0 self.channel = 0
self.grooves = {} self.grooves = {}
self.saveVols = {} self.saveVols = {}
self.ssvoice = -1 # Track the voice set for the track self.ssvoice = -1 # Track the voice set for the track
self.smidiVoice = () # Track MIDIVoice cmds to avoid dups self.smidiVoice = () # Track MIDIVoice cmds to avoid dups
self.midiSent = 0 # if set, MIDICLEAR invoked. self.midiSent = 0 # if set, MIDICLEAR invoked.
""" Midi commands like Pan, Glis, etc. are stacked until musical """ Midi commands like Pan, Glis, etc. are stacked until musical
@ -100,9 +96,13 @@ class PC:
self.clearSequence() self.clearSequence()
self.nextVolume = None
self.inited = 1 self.inited = 1
if gbl.muteTracks and nm not in gbl.muteTracks:
self.disable = 1
########################################## ##########################################
## These are called from process() to set options ## These are called from process() to set options
@ -110,7 +110,7 @@ class PC:
def setCompress(self, ln): def setCompress(self, ln):
""" set/unset the compress flag. """ """ set/unset the compress flag. """
ln=self.lnExpand(ln, 'Compress') ln = lnExpand(ln, '%s Compress' % self.name)
tmp = [] tmp = []
@ -140,7 +140,7 @@ class PC:
def setRange(self, ln): def setRange(self, ln):
""" set range. """ """ set range. """
ln=self.lnExpand(ln, 'Range') ln = lnExpand(ln, '%s Range' % self.name)
tmp = [] tmp = []
@ -322,9 +322,9 @@ class PC:
return return
""" Get name of track to share with and make sure it exists. """ Get name of track to share with and make sure it exists.
If not, trackAlloc() will create the track. Do some If not, trackAlloc() will create the track. Do some
sanity checks and ensure that the shared track has sanity checks and ensure that the shared track has
a channel assigned. a channel assigned.
""" """
sc = ln.upper() sc = ln.upper()
@ -357,7 +357,6 @@ class PC:
self.voice = gbl.tnames[sc].voice[:] self.voice = gbl.tnames[sc].voice[:]
self.octave = gbl.tnames[sc].octave[:] self.octave = gbl.tnames[sc].octave[:]
# Update the avail. lists # Update the avail. lists
gbl.midiAssigns[self.channel].append(self.name) gbl.midiAssigns[self.channel].append(self.name)
@ -384,17 +383,56 @@ class PC:
print "Set %s track name for MIDI to %s" % (self.name, n) print "Set %s track name for MIDI to %s" % (self.name, n)
def setPan(self, ln): def setPan(self, ln):
""" Set MIDI Pan for this track. """ """ Set MIDI Pan for this track. Parse sends 1 or 3 args. """
v = stoi(ln[0], "Expecting integer value 0..127") if len(ln)==3:
beats = stof(ln[2])
if beats < 1:
error("Beat value must be positive count, not '%s'." % beats)
initPan = stoi(ln[0], "Expecting integer value 0..127")
newPan = stoi(ln[1], "Expecting integer value 0..127")
else:
beats = 0
initPan = 0
newPan = stoi(ln[0], "Expecting integer value 0..127")
if v<0 or v>127: ticks = beats * gbl.BperQ # convert beats to midi ticks
error("PAN value must be 0..127")
self.midiPending.append( ("PAN", gbl.tickOffset, v)) if initPan<0 or initPan>127:
error("Initial MidiPAN value must be 0..127")
if newPan<0 or newPan>127:
error("Final MidiPAN value must be 0..127")
if newPan<initPan:
span = initPan-newPan
changer=-1
else:
span = newPan-initPan
changer=1
if span>0:
step = ticks/span
else:
beats=0
if beats:
v=initPan
off=gbl.tickOffset
for a in range(span+1):
self.midiPending.append( ("PAN", int(off), v))
off+=step
v+=changer
else:
self.midiPending.append( ("PAN", gbl.tickOffset, newPan))
if gbl.debug: if gbl.debug:
print "Set %s MIDIPan to %s" % (self.name, v) if beats:
print "Set %s MIDIPan from %s to %s over %s beats." % \
(self.name, initPan, newPan, beats)
else:
print "Set %s MIDIPan to %s" % (self.name, newPan)
@ -428,8 +466,12 @@ class PC:
def setOn(self): def setOn(self):
""" Turn ON track. """ """ Turn ON track. """
self.disable = 0 if gbl.muteTracks and self.name not in gbl.muteTracks:
self.ssvoice = -1 warning("Attempt to enable muted track %s ignored." % self.name)
else:
self.disable = 0
self.ssvoice = -1
if gbl.debug: if gbl.debug:
print "%s Enabled" % self.name print "%s Enabled" % self.name
@ -448,7 +490,7 @@ class PC:
def setRVolume(self, ln): def setRVolume(self, ln):
""" Set the volume randomizer for a track. """ """ Set the volume randomizer for a track. """
ln = self.lnExpand(ln, 'RVolume') ln = lnExpand(ln, '%s RVolume' % self.name)
tmp = [] tmp = []
for n in ln: for n in ln:
@ -475,7 +517,7 @@ class PC:
def setRSkip(self, ln): def setRSkip(self, ln):
""" Set the note random skip factor for a track. """ """ Set the note random skip factor for a track. """
ln = self.lnExpand(ln, 'RSkip') ln = lnExpand(ln, '%s RSkip' % self.name)
tmp = [] tmp = []
for n in ln: for n in ln:
@ -498,7 +540,7 @@ class PC:
def setRTime(self, ln): def setRTime(self, ln):
""" Set the timing randomizer for a track. """ """ Set the timing randomizer for a track. """
ln=self.lnExpand(ln, 'RTime') ln = lnExpand(ln, '%s RTime' % self.name)
tmp = [] tmp = []
for n in ln: for n in ln:
@ -538,7 +580,7 @@ class PC:
def setRndWeight(self, ln): def setRndWeight(self, ln):
""" Set weighting factors for seqrnd. """ """ Set weighting factors for seqrnd. """
ln = self.lnExpand(ln, "SeqRndWeight") ln = lnExpand(ln, "%s SeqRndWeight" % self.name)
tmp = [] tmp = []
for n in ln: for n in ln:
@ -556,7 +598,7 @@ class PC:
def setDirection(self, ln): def setDirection(self, ln):
""" Set scale direction. """ """ Set scale direction. """
ln = self.lnExpand(ln, "Direction") ln = lnExpand(ln, "%s Direction" % self.name)
tmp = [] tmp = []
for n in ln: for n in ln:
@ -594,7 +636,7 @@ class PC:
by one rotation for each value. by one rotation for each value.
""" """
ln=self.lnExpand(ln, "Invert") ln = lnExpand(ln, "%s Invert" % self.name)
vwarn = 0 vwarn = 0
tmp = [] tmp = []
@ -623,7 +665,7 @@ class PC:
def setOctave(self, ln): def setOctave(self, ln):
""" Set the octave for a track. """ """ Set the octave for a track. """
ln=self.lnExpand(ln, 'Octave') ln = lnExpand(ln, '%s Octave' % self.name)
tmp = [] tmp = []
for n in ln: for n in ln:
@ -662,7 +704,7 @@ class PC:
def setHarmony(self, ln): def setHarmony(self, ln):
""" Set the harmony. """ """ Set the harmony. """
ln=self.lnExpand(ln, 'Harmony') ln = lnExpand(ln, '%s Harmony' % self.name)
tmp = [] tmp = []
for n in ln: for n in ln:
@ -686,7 +728,7 @@ class PC:
""" Set the harmony only. """ """ Set the harmony only. """
ln=self.lnExpand(ln, 'HarmonyOnly') ln = lnExpand(ln, '%s HarmonyOnly' % self.name)
tmp = [] tmp = []
for n in ln: for n in ln:
@ -710,7 +752,7 @@ class PC:
def setHarmonyVolume(self, ln): def setHarmonyVolume(self, ln):
""" Set harmony volume adjustment. """ """ Set harmony volume adjustment. """
ln=self.lnExpand(ln, 'HarmonyOnly') ln = lnExpand(ln, '%s HarmonyOnly' % self.name)
tmp = [] tmp = []
for n in ln: for n in ln:
@ -766,23 +808,45 @@ class PC:
def setVoice(self, ln): def setVoice(self, ln):
""" Set the voice for a track. """ Set the voice for a track.
Note, this just sets flags, the voice is set in bar(). Note, this just sets flags, the voice is set in bar().
ln[] is not nesc. set to the correct length. ln[] is not nesc. set to the correct length.
the voice can be gm-string, user-def-string, or value.
A value can be xx.yy.vv, yy.vv or vv
""" """
ln=self.lnExpand(ln, 'Voice') ln = lnExpand(ln, '%s Voice' % self.name)
tmp = [] tmp = []
for n in ln: for n in ln:
n = MMA.translate.vtable.get(n) n = MMA.translate.vtable.get(n)
a=MMA.midiC.instToValue(n) voc=MMA.midiC.instToValue(n)
if a < 0: if voc < 0 and n[0].isalpha():
a=stoi(n, "Expecting a valid voice name or value, " error("Voice '%s' is not defined." % n)
"not '%s'" % n) if voc < 0: # not a valid name, assume vv.msb(ctrl0).lsb(ctrl32) value
if a <0 or a > 127: nn = n.split('.')
error("Voice must be 0..127") if len(nn) > 3 or len(nn) < 1:
tmp.append( a ) error("Expecting a voice value Prog.MSB.LSB, not '%s'" % n)
voc = 0
if len(nn) > 2:
i = stoi(nn[2])
if i<0 or i>127:
error("LSB must be 0..127, not '%s'" % i)
voc = i << 16
if len(nn) > 1:
i = stoi(nn[1])
if i<0 or i>127:
error("MSB must be 0..127, not '%s'" % i)
voc += i << 8
i = stoi(nn[0])
if i<0 or i>127:
error("Program must be 0..127, not '%s'" % i)
voc += i
tmp.append( voc )
self.voice = seqBump(tmp) self.voice = seqBump(tmp)
@ -794,11 +858,10 @@ class PC:
warning("Track %s is shared with %s,\n" warning("Track %s is shared with %s,\n"
" changing voice may create conflict" % (a,self.name)) " changing voice may create conflict" % (a,self.name))
if gbl.debug: if gbl.debug:
print "Set %s Voice to:" % self.name, print "Set %s Voice to:" % self.name,
for a in self.voice: for i in self.voice:
print MMA.midiC.valueToInst(a), print MMA.midiC.valueToInst(i),
print print
@ -829,6 +892,11 @@ class PC:
self.midiSent = 0 self.midiSent = 0
def doChannelReset(self):
""" Reset the midi voicing to 'sane'. Called when track ended. """
if self.ssvoice > 127:
gbl.mtrks[self.channel].addProgChange( gbl.tickOffset, 0, self.ssvoice)
def setMidiSeq(self, ln): def setMidiSeq(self, ln):
""" Set a midi sequence for a track. """ Set a midi sequence for a track.
@ -842,7 +910,7 @@ class PC:
""" lnExpand() works here! The midi data has been converted to """ lnExpand() works here! The midi data has been converted to
pseudo-macros already in the parser. """ pseudo-macros already in the parser. """
ln=self.lnExpand(ln, "MidiSeq") ln = lnExpand(ln, "%s MidiSeq" % self.name)
seq = [] seq = []
for a in ln: for a in ln:
@ -875,7 +943,7 @@ class PC:
""" lnExpand() works here! The midi data has been converted to """ lnExpand() works here! The midi data has been converted to
pseudo-macros already in the parser. """ pseudo-macros already in the parser. """
ln = self.lnExpand(ln, 'MIDIVoice') ln = lnExpand(ln, '%s MIDIVoice' % self.name)
seq = [] seq = []
for a in ln: for a in ln:
@ -916,7 +984,7 @@ class PC:
ln[] not nesc. correct length ln[] not nesc. correct length
""" """
ln=self.lnExpand(ln, 'Volume') ln = lnExpand(ln, '%s Volume' % self.name)
tmp = [None] * len(ln) tmp = [None] * len(ln)
for i,n in enumerate(ln): for i,n in enumerate(ln):
@ -944,6 +1012,9 @@ class PC:
self.setVolume([ln[0]]) self.setVolume([ln[0]])
ln=ln[1:] ln=ln[1:]
if len(ln) != 2:
error("Cresc expecting 2 or 3 args.")
vol = self.volume[0] vol = self.volume[0]
if self.volume.count(vol) != len(self.volume): if self.volume.count(vol) != len(self.volume):
@ -951,6 +1022,52 @@ class PC:
self.futureVols = MMA.volume.fvolume(dir, vol, ln) self.futureVols = MMA.volume.fvolume(dir, vol, ln)
if gbl.debug:
print "Set %s Cresc to:" % self.name,
for a in self.futureVols:
print int(a*100),
print
def setSwell(self, ln):
""" Set a swell (cresc<>decresc) for track. """
if len(ln) == 3: # 3 args, 1st is intial setting
self.setVolume([ln[0]])
ln=ln[1:]
if len(ln) != 2:
error("%s Swell expecting 2 or 3 args." % self.name)
if self.volume.count(self.volume[0]) != len(self.volume):
warning("%s Swell being used with track with variable sequence volumes." \
% self.name)
count = stoi(ln[1])
if count < 2:
error("%s Swell bar count must be 2 or greater." % self.name)
count += 1
c = int(count/2)
if count % 2: # even number of bars (we bumped count)
offset = 1
c+=1
else: # odd number
offset = 0
c=str(c)
self.futureVols = MMA.volume.fvolume(0 ,self.volume[0],
[ ln[0], c ] )
self.futureVols.extend(MMA.volume.fvolume(0, self.futureVols[-1],
[str(int(self.volume[0]*100)), c ] )[offset:] )
if gbl.debug:
print "Set %s Swell to:" % self.name,
for a in self.futureVols:
print int(a*100),
print
def setMallet(self, ln): def setMallet(self, ln):
""" Mallet (repeat) settngs. """ """ Mallet (repeat) settngs. """
@ -962,7 +1079,7 @@ class PC:
error("Each Mallet option must contain a '=', not '%s'" % l) error("Each Mallet option must contain a '=', not '%s'" % l)
if mode == 'RATE': if mode == 'RATE':
self.mallet = getNoteLen(val) self.mallet = MMA.notelen.getNoteLen(val)
elif mode == 'DECAY': elif mode == 'DECAY':
val = stof(val, "Mallet Decay must be a value, not '%s'" % val) val = stof(val, "Mallet Decay must be a value, not '%s'" % val)
@ -983,45 +1100,44 @@ class PC:
tmp = [] tmp = []
""" We can do "Track Accent 1 20 3 -10" or "Track Accent {1 20 3 -10}" """ 2 ways to call this:
or even something like "Track Accent {1 20} / {/} {3 20}"
Note that the "/" can or not have {}s. Track Accent 1 20 3 -10 -- fix up by adding {} around entire option list,
Track Accent {1 20 3 -10} -- okay
Track Accent {1 20} / {/} {3 20} -- okay.
At this point ln is a string. We extract each set of {}s and build a
new ln[].
Note that the "/" can or not have {}s.
""" """
ln = ' '.join(ln) ln = ' '.join(ln)
if not ln.startswith('{'): if not ln.startswith('{'):
ln='{' + ln +"}" ln='{' + ln +"}"
# Convert string to list. One entry per seq.
l=[] l=[]
while ln: while ln:
if not ln.startswith("{"): if ln[0] == "/": # / not delimited with {}
if ln[0]=='/': ln = "{/}" + ln[1:]
l.append('/')
ln=ln[1:].strip() a,b = pextract(ln, "{", "}", 1)
else: ln=a.strip()
error("Unknown value in %s Accent: %s" % (self.name, ln[0])) if len(b)==1 and b[0]=='/': # convert ['/'] to '/' for lnExpand()
l.append('/')
else: else:
a,b = pextract(ln, "{", "}", 1) l.append(b[0].split())
ln=a.strip()
if len(b)==1 and b[0]=='/':
l.append('/')
else:
l.append(b[0].split())
ln=self.lnExpand(l, 'Accent')
ln = lnExpand(l, '%s Accent' % self.name)
for l in ln: for l in ln:
tt=[] tt=[]
if len(l)/2*2 != len(l): if len(l)/2*2 != len(l):
error("Use: %s Accent Beat Percentage [...]" % self.name) error("Use: %s Accent Beat Percentage [...]" % self.name)
for b, v in zip(l[::2], l[1::2]): for b, v in zip(l[::2], l[1::2]):
b=self.setBarOffset( b ) b=self.setBarOffset( b )
v=stoi(v, "Bbeat offset must be a value, not '%s'" % v) v=stoi(v, "Beat offset must be a value, not '%s'" % v)
if v < -100 or v > 100: if v < -100 or v > 100:
error("Velocity adjustment (as percentage) must " error("Velocity adjustment (as percentage) must "
"be -100..100, not '%s'" % v) "be -100..100, not '%s'" % v)
@ -1044,7 +1160,7 @@ class PC:
def setArtic(self, ln): def setArtic(self, ln):
""" Set the note articuation value. """ """ Set the note articuation value. """
ln=self.lnExpand(ln, 'Articulate') ln = lnExpand(ln, '%s Articulate' % self.name)
tmp = [] tmp = []
for n in ln: for n in ln:
@ -1067,7 +1183,7 @@ class PC:
def setUnify(self, ln): def setUnify(self, ln):
""" Set unify. """ """ Set unify. """
ln = self.lnExpand(ln, "Unify") ln = lnExpand(ln, "%s Unify" % self.name)
tmp = [] tmp = []
for n in ln: for n in ln:
@ -1086,29 +1202,6 @@ class PC:
printList(self.unify) printList(self.unify)
def lnExpand(self, ln, cmd):
""" Validate and expand a list passed to a set command. """
if len(ln) > gbl.seqSize:
warning("%s list truncated to %s patterns" % (self.name, gbl.seqSize) )
ln = ln[:gbl.seqSize]
last = None
for i,n in enumerate(ln):
if n == '/':
if not last:
error ("You cannot use a '/' as the first item "
"in a %s list" % cmd)
else:
ln[i] = last
else:
last = n
return ln
def copySettings(self, cp): def copySettings(self, cp):
""" Copy the voicing from a 2nd voice to the current one. """ """ Copy the voicing from a 2nd voice to the current one. """
@ -1174,25 +1267,25 @@ class PC:
'HARMONYO': self.harmonyOnly[:], 'HARMONYO': self.harmonyOnly[:],
'HARMONYV': self.harmonyVolume[:], 'HARMONYV': self.harmonyVolume[:],
'INVERT': self.invert[:], 'INVERT': self.invert[:],
'LIMIT': self.chordLimit, 'LIMIT': self.chordLimit,
'RANGE': self.chordRange[:], 'RANGE': self.chordRange[:],
'OCTAVE': self.octave[:], 'OCTAVE': self.octave[:],
'RSKIP': self.rSkip[:], 'RSKIP': self.rSkip[:],
'RTIME': self.rTime[:], 'RTIME': self.rTime[:],
'RVOLUME': self.rVolume[:], 'RVOLUME': self.rVolume[:],
'SCALE': self.scaleType[:], 'SCALE': self.scaleType[:],
'SEQ': self.sequence[:], 'SEQ': self.sequence[:],
'SEQRND': self.seqRnd, 'SEQRND': self.seqRnd,
'SEQRNDWT': self.seqRndWeight[:], 'SEQRNDWT': self.seqRndWeight[:],
'STRUM': self.strum[:], 'STRUM': self.strum[:],
'VOICE': self.voice[:], 'VOICE': self.voice[:],
'VOLUME': self.volume[:], 'VOLUME': self.volume[:],
'UNIFY': self.unify[:], 'UNIFY': self.unify[:],
'MIDISEQ': self.midiSeq[:], 'MIDISEQ': self.midiSeq[:],
'MIDIVOICE':self.midiVoice[:], 'MIDIVOICE': self.midiVoice[:],
'MIDICLEAR':self.midiClear[:], 'MIDICLEAR': self.midiClear[:],
'SPAN': (self.spanStart, self.spanEnd), 'SPAN': (self.spanStart, self.spanEnd),
'MALLET': (self.mallet, self.malletDecay), 'MALLET': (self.mallet, self.malletDecay),
} }
@ -1291,7 +1384,7 @@ class PC:
""" """
ln=self.lnExpand(ln, 'Sequence') ln = lnExpand(ln, '%s Sequence' % self.name)
tmp = [None] * len(ln) tmp = [None] * len(ln)
for i, n in enumerate(ln): for i, n in enumerate(ln):
@ -1555,9 +1648,9 @@ class PC:
plist.sort(patsort) plist.sort(patsort)
if gbl.swingMode: if gbl.swingMode:
len8 = getNoteLen('8') len8 = MMA.notelen.getNoteLen('8')
len81 = getNoteLen('81') len81 = MMA.notelen.getNoteLen('81')
len82 = getNoteLen('82') len82 = MMA.notelen.getNoteLen('82')
onBeats = [ x * gbl.BperQ for x in range(gbl.QperBar)] onBeats = [ x * gbl.BperQ for x in range(gbl.QperBar)]
offBeats = [ (x * gbl.BperQ + len8) for x in range(gbl.QperBar)] offBeats = [ (x * gbl.BperQ + len8) for x in range(gbl.QperBar)]
@ -1579,14 +1672,21 @@ class PC:
def printPattern(self, pat): def printPattern(self, pat):
""" Print a pattern. Used by debugging code.""" """ Print a pattern. Used by debugging code."""
s=[] print self.formatPattern(pat)
def formatPattern(self, pat):
pp=[]
if not pat:
return ' z '
for p in pat: for p in pat:
s.append(" %2.2f %2.0f" % (1+(p.offset/float(gbl.BperQ)), s=[]
s.append("%.2f %.0f" % (1+(p.offset/float(gbl.BperQ)),
p.duration)) p.duration))
if self.vtype == 'CHORD': if self.vtype == 'CHORD':
for a in p.vol: for a in p.vol:
s.append( " %2.0f" % a) s.append( "%.0f" % a)
elif self.vtype == 'BASS': elif self.vtype == 'BASS':
f=str(p.noteoffset+1) f=str(p.noteoffset+1)
@ -1601,21 +1701,20 @@ class PC:
elif p.addoctave < 0: elif p.addoctave < 0:
f+="-" * (p.addoctave/-12) f+="-" * (p.addoctave/-12)
s.append( " %s %2.0f" % (f, p.vol ) ) s.append( "%s %.0f" % (f, p.vol ) )
elif self.vtype == 'ARPEGGIO': elif self.vtype == 'ARPEGGIO':
s.append( " %2.0f " % p.vol ) s.append( "%.0f " % p.vol )
elif self.vtype == 'DRUM': elif self.vtype == 'DRUM':
s.append(" %2.0f" % p.vol) s.append("%.0f" % p.vol)
elif self.vtype == 'WALK': elif self.vtype == 'WALK':
s.append(" %2.0f" % p.vol ) s.append("%.0f" % p.vol )
s.append(' ;') pp.append(' '.join(s))
s.append('\n')
s[-2]=' ' return "; ".join(pp)
print "".join(s)
def insertVoice(self): def insertVoice(self):
@ -1624,13 +1723,13 @@ class PC:
sc = gbl.seqCount sc = gbl.seqCount
""" 1st pass for MIDIVOICE. There's a separate slot for """ 1st pass for MIDIVOICE. There's a separate slot for
each bar in the sequence, plus the data can be sent each bar in the sequence, plus the data can be sent
before or after 'voice' commands. This first loop before or after 'voice' commands. This first loop
sends MIDIVOICE data with an offset of 0. Note, we sends MIDIVOICE data with an offset of 0. Note, we
don't set the value for 'self.smidiVoice' until we don't set the value for 'self.smidiVoice' until we
do this again, later. All this is needed since some do this again, later. All this is needed since some
MIDIVOICE commands NEED to be sent BEFORE voice selection, MIDIVOICE commands NEED to be sent BEFORE voice selection,
and others AFTER. and others AFTER.
""" """
if self.midiVoice: if self.midiVoice:
@ -1644,18 +1743,20 @@ class PC:
v=self.voice[sc] v=self.voice[sc]
if v != self.ssvoice: if v != self.ssvoice:
gbl.mtrks[self.channel].addProgChange( gbl.tickOffset, v)
gbl.mtrks[self.channel].addProgChange( gbl.tickOffset, v, self.ssvoice)
self.ssvoice = v self.ssvoice = v
# Mark ssvoice also in shared tracks # Mark ssvoice also in shared tracks
for a in gbl.midiAssigns[self.channel]: for a in gbl.midiAssigns[self.channel]:
if gbl.tnames.has_key(a): try:
gbl.tnames[a].ssvoice = v gbl.tnames[a].ssvoice = v
except KeyError:
pass
if gbl.debug: if gbl.debug:
print "Track %s Voice %s inserted" \ print "Track %s Voice %s inserted" % (self.name,MMA.midiC.valueToInst(v) )
% (self.name, MMA.midiC.valueToInst(v) )
""" Our 2nd stab at MIDIVOICE. This time any sequences """ Our 2nd stab at MIDIVOICE. This time any sequences
with offsets >0 are sent. AND the smidiVoice and midiSent with offsets >0 are sent. AND the smidiVoice and midiSent
@ -1685,6 +1786,10 @@ class PC:
if self.futureVols: if self.futureVols:
self.volume = seqBump([self.futureVols.pop(0)]) self.volume = seqBump([self.futureVols.pop(0)])
if self.futureVols:
self.nextVolume = self.futureVols[0]
else:
self.nextVolume = None
# If track is off don't do anything else. # If track is off don't do anything else.
@ -1702,12 +1807,7 @@ class PC:
""" """
if self.seqRnd: if self.seqRnd:
tmp = [] self.seq = MMA.seqrnd.getrndseq(self.seqRndWeight)
for x, i in enumerate(self.seqRndWeight):
tmp.extend([x] * i)
if not len(tmp):
error("SeqRndWeight has generated an empty list")
self.seq = random.choice(tmp)
else: else:
self.seq = gbl.seqCount self.seq = gbl.seqCount
@ -1717,7 +1817,6 @@ class PC:
if self.riff: if self.riff:
pattern = self.riff.pop(0) pattern = self.riff.pop(0)
else: else:
pattern = self.sequence[sc] pattern = self.sequence[sc]
@ -1816,11 +1915,25 @@ class PC:
a1 = self.volume[sc] a1 = self.volume[sc]
if not a1: if not a1:
return 0 return 0
if self.nextVolume: # inter-bar cresc adjust
bt=beat
if bt<1: # might have negative offsets, cres code ignores
bt=0
a1 += (self.nextVolume - a1) * bt / (gbl.BperQ * gbl.QperBar)
a1 *= MMA.volume.vTRatio a1 *= MMA.volume.vTRatio
a2 = MMA.volume.volume a2 = MMA.volume.volume
if not a2: if not a2:
return 0 return 0
if MMA.volume.nextVolume: # inter-bar cresc adjust
bt=beat
if bt<1: # might have negative offsets, cres code ignores
bt=0
a2 += (MMA.volume.nextVolume - a2) * bt / (gbl.BperQ * gbl.QperBar)
a2 *= MMA.volume.vMRatio a2 *= MMA.volume.vMRatio
v *= ( a1 + a2 ) v *= ( a1 + a2 )
@ -1895,12 +2008,11 @@ class PC:
else: else:
note = None note = None
v=stof(v, "Value for %s bar offset must be integer/float" % self.name) v=stof(v, "Value for %s bar offset must be integer/float" % self.name)
v = (v-1) * gbl.BperQ v = (v-1) * gbl.BperQ
if note: if note:
v += getNoteLen(note) * sign v += MMA.notelen.getNoteLen(note) * sign
if v < 0: if v < 0:
if v<-gbl.BperQ: if v<-gbl.BperQ:

View File

@ -23,15 +23,15 @@ Bob van der Poel <bob@mellowood.ca>
""" """
import random
import MMA.notelen
import MMA.harmony
import gbl import gbl
from MMA.notelen import getNoteLen
from MMA.common import * from MMA.common import *
from MMA.harmony import harmonize from MMA.pat import PC
from MMA.pat import PC, seqBump
import random
class Aria(PC): class Aria(PC):
""" Pattern class for an aria (auto-melody) track. """ """ Pattern class for an aria (auto-melody) track. """
@ -70,7 +70,7 @@ class Aria(PC):
a = struct() a = struct()
a.offset = self.setBarOffset(ev[0]) a.offset = self.setBarOffset(ev[0])
a.duration = getNoteLen( ev[1] ) a.duration = MMA.notelen.getNoteLen( ev[1] )
a.vol = stoi(ev[2], "Note volume in Aria definition not int") a.vol = stoi(ev[2], "Note volume in Aria definition not int")
return a return a
@ -79,7 +79,7 @@ class Aria(PC):
def setScaletype(self, ln): def setScaletype(self, ln):
""" Set scale type. """ """ Set scale type. """
ln = self.lnExpand(ln, "ScaleType") ln = lnExpand(ln, "%s ScaleType" % self.name)
tmp = [] tmp = []
for n in ln: for n in ln:
@ -213,7 +213,7 @@ class Aria(PC):
if self.harmony[sc]: if self.harmony[sc]:
h = harmonize(self.harmony[sc], note, ct.chord.noteList) h = MMA.harmony.harmonize(self.harmony[sc], note, ct.chord.noteList)
for n in h: for n in h:
self.sendNote( self.sendNote(
p.offset, p.offset,

View File

@ -25,14 +25,13 @@ Bob van der Poel <bob@mellowood.ca>
import random import random
import MMA.notelen
import MMA.harmony
import gbl import gbl
from MMA.notelen import getNoteLen
from MMA.common import * from MMA.common import *
from MMA.harmony import harmonize
from MMA.pat import PC from MMA.pat import PC
class Arpeggio(PC): class Arpeggio(PC):
""" Pattern class for an arpeggio track. """ """ Pattern class for an arpeggio track. """
@ -52,7 +51,7 @@ class Arpeggio(PC):
"for apreggio define, not '%s'" % ' '.join(ev) ) "for apreggio define, not '%s'" % ' '.join(ev) )
a.offset = self.setBarOffset(ev[0]) a.offset = self.setBarOffset(ev[0])
a.duration = getNoteLen(ev[1]) a.duration = MMA.notelen.getNoteLen(ev[1])
a.vol = stoi(ev[2], "Type error in Arpeggio definition") a.vol = stoi(ev[2], "Type error in Arpeggio definition")
return a return a
@ -147,7 +146,7 @@ class Arpeggio(PC):
if self.harmony[sc]: if self.harmony[sc]:
h = harmonize(self.harmony[sc], note, ourChord) h = MMA.harmony.harmonize(self.harmony[sc], note, ourChord)
for n in h: for n in h:
self.sendNote( self.sendNote(
p.offset, p.offset,

View File

@ -24,11 +24,11 @@ Bob van der Poel <bob@mellowood.ca>
""" """
import MMA.notelen
import MMA.harmony
import gbl import gbl
from MMA.notelen import getNoteLen
from MMA.common import * from MMA.common import *
from MMA.harmony import harmonize
from MMA.pat import PC from MMA.pat import PC
@ -51,7 +51,7 @@ class Bass(PC):
a = struct() a = struct()
a.offset = self.setBarOffset(ev[0]) a.offset = self.setBarOffset(ev[0])
a.duration = getNoteLen( ev[1] ) a.duration = MMA.notelen.getNoteLen( ev[1] )
offset = ev[2] offset = ev[2]
n=offset[0] n=offset[0]
@ -119,7 +119,7 @@ class Bass(PC):
if self.harmony[sc]: if self.harmony[sc]:
h = harmonize(self.harmony[sc], note, ct.chord.noteList) h = MMA.harmony.harmonize(self.harmony[sc], note, ct.chord.noteList)
for n in h: for n in h:
self.sendNote( self.sendNote(
p.offset, p.offset,

View File

@ -26,10 +26,12 @@ Bob van der Poel <bob@mellowood.ca>
import random import random
import MMA.notelen
import gbl import gbl
from MMA.notelen import getNoteLen
from MMA.common import * from MMA.common import *
from MMA.pat import PC, seqBump from MMA.pat import PC
@ -136,7 +138,7 @@ class Chord(PC):
""" set/unset root duplication. Only for CHORDs """ """ set/unset root duplication. Only for CHORDs """
ln=self.lnExpand(ln, 'DupRoot') ln = lnExpand(ln, '%s DupRoot' % self.name)
tmp = [] tmp = []
for n in ln: for n in ln:
@ -157,7 +159,7 @@ class Chord(PC):
def setStrum(self, ln): def setStrum(self, ln):
""" Set Strum time. """ """ Set Strum time. """
ln=self.lnExpand(ln, 'Strum') ln = lnExpand(ln, '%s Strum' % self.name)
tmp = [] tmp = []
for n in ln: for n in ln:
@ -187,7 +189,7 @@ class Chord(PC):
a = struct() a = struct()
a.offset = self.setBarOffset(ev[0]) a.offset = self.setBarOffset(ev[0])
a.duration = getNoteLen(ev[1]) a.duration = MMA.notelen.getNoteLen(ev[1])
vv = ev[2:] vv = ev[2:]
if len(vv)>8: if len(vv)>8:
@ -401,4 +403,3 @@ class Chord(PC):
self.voicing.bcount -= 1 self.voicing.bcount -= 1

View File

@ -23,12 +23,12 @@ Bob van der Poel <bob@mellowood.ca>
""" """
import MMA.notelen
import MMA.translate
import gbl import gbl
from MMA.common import * from MMA.common import *
from MMA.notelen import getNoteLen from MMA.pat import PC
import MMA.translate
from MMA.pat import PC, seqBump
class Drum(PC): class Drum(PC):
""" Pattern class for a drum track. """ """ Pattern class for a drum track. """
@ -51,7 +51,7 @@ class Drum(PC):
ln[] is not nesc. the right length. ln[] is not nesc. the right length.
""" """
ln=self.lnExpand(ln, 'Tone') ln = lnExpand(ln, '%s Tone' % self.name)
tmp = [] tmp = []
for n in ln: for n in ln:
@ -77,7 +77,7 @@ class Drum(PC):
a = struct() a = struct()
a.offset = self.setBarOffset(ev[0]) a.offset = self.setBarOffset(ev[0])
a.duration = getNoteLen(ev[1]) a.duration = MMA.notelen.getNoteLen(ev[1])
a.vol = stoi(ev[2], "Type error in Drum volume") a.vol = stoi(ev[2], "Type error in Drum volume")
return a return a

View File

@ -25,12 +25,12 @@ Bob van der Poel <bob@mellowood.ca>
import random import random
from MMA.harmony import harmonize import MMA.harmony
from MMA.notelen import getNoteLen import MMA.notelen
from MMA.pat import PC
import gbl import gbl
from MMA.common import * from MMA.common import *
from MMA.pat import PC, seqBump
class Scale(PC): class Scale(PC):
""" Pattern class for a Scale track. """ """ Pattern class for a Scale track. """
@ -60,7 +60,7 @@ class Scale(PC):
a = struct() a = struct()
a.offset = self.setBarOffset(ev[0]) a.offset = self.setBarOffset(ev[0])
a.duration = getNoteLen(ev[1]) a.duration = MMA.notelen.getNoteLen(ev[1])
a.vol = stoi(ev[2], "Type error in Scale definition") a.vol = stoi(ev[2], "Type error in Scale definition")
@ -69,7 +69,7 @@ class Scale(PC):
def setScaletype(self, ln): def setScaletype(self, ln):
""" Set scale type. """ """ Set scale type. """
ln = self.lnExpand(ln, "ScaleType") ln = lnExpand(ln, "%s ScaleType" % self.name)
tmp = [] tmp = []
for n in ln: for n in ln:
@ -220,7 +220,7 @@ class Scale(PC):
if self.harmony[sc]: if self.harmony[sc]:
ch = self.getChordInPos(p.offset, ctable).chord.noteList ch = self.getChordInPos(p.offset, ctable).chord.noteList
h = harmonize(self.harmony[sc], note, ch) h = MMA.harmony.harmonize(self.harmony[sc], note, ch)
for n in h: for n in h:
self.sendNote( self.sendNote(
p.offset, p.offset,

View File

@ -23,14 +23,16 @@ Bob van der Poel <bob@mellowood.ca>
""" """
import MMA.notelen
import MMA.translate
import MMA.harmony
import MMA.volume
import MMA.alloc
import gbl import gbl
from MMA.common import * from MMA.common import *
from MMA.notelen import getNoteLen
import MMA.translate
from MMA.harmony import harmonize
from MMA.pat import PC from MMA.pat import PC
import MMA.alloc
import MMA.volume
class NoteList: class NoteList:
@ -80,6 +82,7 @@ class Melody(PC):
if len(ln) > 1: if len(ln) > 1:
error("Only 1 value permitted for Drum Tone in Solo tracks") 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])
@ -128,14 +131,14 @@ class Melody(PC):
""" """
if gbl.swingMode: if gbl.swingMode:
len8 = getNoteLen('8') len8 = MMA.notelen.getNoteLen('8')
len81 = getNoteLen('81') len81 = MMA.notelen.getNoteLen('81')
len82 = getNoteLen('82') len82 = MMA.notelen.getNoteLen('82')
onBeats = [ x * gbl.BperQ for x in range(gbl.QperBar)] onBeats = [ x * gbl.BperQ for x in range(gbl.QperBar)]
offBeats = [ (x * gbl.BperQ + len8) for x in range(gbl.QperBar)] offBeats = [ (x * gbl.BperQ + len8) for x in range(gbl.QperBar)]
length = getNoteLen('4') # default note length length = MMA.notelen.getNoteLen('4') # default note length
lastc = '' # last parsed note lastc = '' # last parsed note
velocity = 90 # intial/default velocity for solo notes velocity = 90 # intial/default velocity for solo notes
@ -206,7 +209,7 @@ class Melody(PC):
i+=1 i+=1
if i: if i:
l=getNoteLen(a[0:i]) l=MMA.notelen.getNoteLen(a[0:i])
c=a[i:] c=a[i:]
else: else:
l=length l=length
@ -220,7 +223,6 @@ class Melody(PC):
length = l # set defaults for next loop length = l # set defaults for next loop
lastc = c lastc = c
""" Convert the note part into a series of midi values """ Convert the note part into a series of midi values
Notes can be a single note, or a series of notes. And 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 each note can be a letter a-g (or r), a '#,&,n' plus
@ -286,7 +288,7 @@ class Melody(PC):
elif name == '*': elif name == '*':
v = self.drumTone v = self.drumTone
else: else:
v = MMA.translate.dtable.get(name) v = int(MMA.translate.dtable.get(name))
""" Swingmode -- This tests for successive 8ths on/off beat """ Swingmode -- This tests for successive 8ths on/off beat
@ -352,7 +354,7 @@ class Melody(PC):
if tb.chordZ: if tb.chordZ:
continue continue
h = harmonize(harmony, nn.nl[0], tb.chord.bnoteList) h = MMA.harmony.harmonize(harmony, nn.nl[0], tb.chord.bnoteList)
""" If harmonyonly set then drop note, substitute harmony, """ If harmonyonly set then drop note, substitute harmony,
else append harmony notes to chord. else append harmony notes to chord.
@ -622,7 +624,7 @@ def extractSolo(ln, rptcount):
""" """
for t in autoSoloTracks[1:]: for t in autoSoloTracks[1:]:
if gbl.tnames.has_key(t) and gbl.tnames[t].riff == [] \ if t in gbl.tnames and gbl.tnames[t].riff == [] \
and max(gbl.tnames[t].harmonyOnly): and max(gbl.tnames[t].harmonyOnly):
gbl.tnames[t].setRiff( firstSolo[:] ) gbl.tnames[t].setRiff( firstSolo[:] )

View File

@ -26,13 +26,14 @@ Bob van der Poel <bob@mellowood.ca>
import random import random
from MMA.harmony import harmonize
from MMA.notelen import getNoteLen import MMA.harmony
import MMA.notelen
import gbl import gbl
from MMA.common import * from MMA.common import *
from MMA.pat import PC from MMA.pat import PC
class Walk(PC): class Walk(PC):
""" Pattern class for a walking bass track. """ """ Pattern class for a walking bass track. """
@ -52,7 +53,7 @@ class Walk(PC):
a = struct() a = struct()
a.offset = self.setBarOffset(ev[0]) a.offset = self.setBarOffset(ev[0])
a.duration = getNoteLen(ev[1]) a.duration = MMA.notelen.getNoteLen(ev[1])
a.vol = stoi(ev[2], "Type error in Walking Bass definition") a.vol = stoi(ev[2], "Type error in Walking Bass definition")
return a return a
@ -152,7 +153,7 @@ class Walk(PC):
if self.harmony[sc]: if self.harmony[sc]:
ch = self.getChordInPos(p.offset, ctable).chord.noteList ch = self.getChordInPos(p.offset, ctable).chord.noteList
h = harmonize(self.harmony[sc], note, ch) h = MMA.harmony.harmonize(self.harmony[sc], note, ch)
for n in h: for n in h:
self.sendNote( self.sendNote(
p.offset, p.offset,

148
mma/MMA/patch.py Normal file
View File

@ -0,0 +1,148 @@
# patch.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 various patch manger routines.
"""
from MMA.common import *
from MMA.miditables import *
import MMA.file
import MMA.midiC
def patch(ln):
""" Main routine to manage midi patch names. """
for i,a in enumerate(ln):
if a.count('=') == 1:
a,b = a.split('=')
else:
b=''
a=a.upper()
if a == "LIST":
b=b.upper()
if b == "ALL":
plistall()
elif b == "EXT":
plistext()
elif b == "GM":
plistgm()
else:
error("Expecting All, EXT or GM argument for List")
if a == "RENAME":
prename(ln[i+1:])
break
if a == 'SET':
patchset(ln[i+1:])
break
error("Unknown option for Patch: %s" % a)
# Set a patch value=name
def patchset(ln):
if not ln:
error("Patch Set expecting list of value pairs.")
for a in ln:
try:
v,n = a.split('=', 1)
except:
error("Patch Set expecting value=name pair, not: %s" % a)
v=v.split('.')
if len(v) > 3 or len(v) < 1:
error("Patch Set: Expecting a voice value Prog.MSB.LSB." )
voc = 0
if len(v) > 2: # ctrl32
i = stoi(v[2], "Patch Set LSB expecting integer.")
if i<0 or i>127:
error("LSB must be 0..127, not '%s'." % i)
voc = i << 16
if len(v) > 1: # ctrl0
i = stoi(v[1], "Patch Set MSB expecting integer.")
if i<0 or i>127:
error("MSB must be 0..127, not '%s'." % i)
voc += i << 8
i = stoi(v[0], "Patch Set Voice expecting integer.")
if i<0 or i>127:
error("Program must be 0..127, not '%s'." % i)
voc += i
if voc in voiceNames:
warning("Patch Set duplicating voice name %s with %s=%s" % \
(voiceNames[voc], n, MMA.midiC.extVocStr(voc) ))
if n.upper() in voiceInx:
warning("Patch Set duplicating voice value %s with %s=%s" % \
(MMA.midiC.extVocStr(voiceInx[n.upper()]),
MMA.midiC.extVocStr(voc), n) )
voiceNames[voc]=n
voiceInx[n.upper()]=voc
# Rename
def prename(ln):
if not ln:
error("Patch Rename expecting list of value pairs.")
for a in ln:
if not a.count("=") == 1:
error("Patch Rename expecting oldname=newname pair")
a,b = a.split("=")
if not a.upper() in voiceInx:
error("Patch %s doen't exist, can't be renamed." % a)
if b.upper() in voiceInx:
error("Patch name %s already exists" % b)
v = voiceInx[a.upper()]
voiceNames[v]=b
del voiceInx[a.upper()]
voiceInx[b.upper()]=v
# list funcs
def plistgm():
for v in sorted(voiceNames.keys()):
if v <= 127:
print "%s=%s" % (MMA.midiC.extVocStr(v), voiceNames[v] )
def plistall():
plistgm()
plistext()
def plistext():
for v in sorted(voiceNames.keys()):
if v>127:
print "%s=%s" % (MMA.midiC.extVocStr(v), voiceNames[v])

48
mma/MMA/safe_eval.py Normal file
View File

@ -0,0 +1,48 @@
# safe_eval.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 re
from math import *
from common import error
safeCmds = [ 'ceil', 'fabs', 'floor', 'exp', 'log', 'log10', 'pow',
'sqrt', 'acos', 'asin', 'atan', 'atan2', 'cos', 'hypot',
'sin', 'tan', 'degrees', 'radians', 'cosh', 'sinh',
'int', 'in', '.join', 'str', '.split', 'for' ]
def safe_eval( expr ):
toks = re.split( r'([a-zA-Z_\.]+|.)', expr )
for t in toks:
if len(t)>1 and t not in safeCmds:
error("Illegal/Unknown operator '%s' in $()." % t)
try:
return eval(expr)
except:
error("Illegal operation in '%s'." % expr)

155
mma/MMA/seqrnd.py Normal file
View File

@ -0,0 +1,155 @@
# seqrnd.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 random
from MMA.common import *
""" 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]
"""
seqRnd = [0] # set if SEQRND has been set
seqRndWeight = [1]
def setseq():
""" Set up the seqrnd values, called from parse loop.
returns:
0... a random sequence number,
-1 signals that rndseq is not enabled.
There are three methods of rndseq. They depend on the first value
in the list seqRnd[]:
[0] not enabled.
[1] random selection, keeps all tracks in sync.
[2] randomize selected tracks.
The list seqRndWeight has at least the same number of entries in it
as there are in the sequence size. By default each will have
the same value of 1. A list of the valid sequence points is
generated (ie, if seqsize==4 tmp will be [0,1,2,3]). In addition
the weights of each entry in tmp[] is adjusted by the weights in
the seqrndweight[] list.
"""
if seqRnd[0]:
r = getrndseq(seqRndWeight)
if seqRnd[0] == 1:
gbl.seqCount = r
r = -1
else:
r = -1
return ( r, seqRnd[1:] )
def getrndseq(v):
tmp = []
for x, i in enumerate(v):
tmp.extend([x] * i)
tmp=tmp[:gbl.seqSize]
if not len(tmp):
error("SeqRndWeight has generated an empty list")
return random.choice(tmp)
## Main parser routines
def setSeqRnd(ln):
""" Set random order for all tracks. """
global seqRnd
emsg = "use [ON, OFF or TrackList ]"
if not ln:
error("SeqRnd:" + emsg)
a=ln[0].upper()
if a in ("ON", "1") and len(ln) == 1:
seqRnd = [1]
elif a in ("OFF", "0") and len(ln) == 1:
seqRnd = [0]
else:
seqRnd=[2]
for a in ln:
a = a.upper()
if not a in gbl.tnames:
error("SeqRnd: Track '%s' does not exist, %s" % (a, emsg))
if a in seqRnd:
error("SeqRnd: Duplicate track '%s' specified, %s" % (a, emsg))
seqRnd.append(a)
if gbl.debug:
print "SeqRnd:",
if seqRnd[0] == 2:
for a in seqRnd[1:]:
print a,
print
elif seqRnd[0] == 1:
print "On"
else:
print "Off"
def getweights(ln, msg):
ln = lnExpand(ln, msg)
if not ln:
error("Use: %s <weight factors>" % msg)
tmp = []
for n in ln:
n = stoi(n)
if n < 0: error("%s: Values must be 0 or greater" % msg)
tmp.append(n)
tmp = seqBump(tmp)
if gbl.debug:
print "%s: " % msg,
printList(tmp)
return tmp
def setSeqRndWeight(ln):
""" Set global rnd weight. """
global seqRndWeight
seqRndWeight = getweights(ln, "SeqRndWeight")

View File

@ -26,11 +26,13 @@ This module handles voice name translations.
""" """
import gbl
import MMA.midiC import MMA.midiC
import gbl
from MMA.common import * from MMA.common import *
""" Translation table for VOICE. This is ONLY used when a voice is set """ Translation table for VOICE. This is ONLY used when a voice is set
from the VOICE command. If a translation exists the translation is from the VOICE command. If a translation exists the translation is
substituted. substituted.
@ -78,10 +80,9 @@ class Vtable:
""" Return a translation or original. """ """ Return a translation or original. """
name=name.upper() name=name.upper()
if self.table.has_key(name): try:
return self.table[name] return self.table[name]
except KeyError:
else:
return name return name
vtable=Vtable() # Create single class instance. vtable=Vtable() # Create single class instance.
@ -123,24 +124,32 @@ class Dtable:
error("Each translation pair must be in the format Voice=Alias") error("Each translation pair must be in the format Voice=Alias")
v,a = l.split('=') v,a = l.split('=')
v=MMA.midiC.drumToValue(v) v1=MMA.midiC.drumToValue(v)
a=MMA.midiC.drumToValue(a) if v1<0:
error("Drum Tone '%s' not defined." % v)
a1=MMA.midiC.drumToValue(a)
if a1<0:
error("Drum Tone '%s' not defined." % a)
self.table[v] = a self.table[v1] = a1
if gbl.debug: if gbl.debug:
print "DrumTone Translation: %s=%s" % \ print "DrumTone Translation: %s=%s" % \
(MMA.midiC.valueToDrum(v), MMA.midiC.valueToDrum(a)) (MMA.midiC.valueToDrum(v), MMA.midiC.valueToDrum(a))
def get(self, name): def get(self, name):
""" Return a translation or original. """ """ Return a translation or original. Note that this also does
validation of 'name'. It is called from patDrum and patSolo.
"""
v=MMA.midiC.drumToValue(name) v=MMA.midiC.drumToValue(name)
if self.table.has_key(v): if v<0:
return self.table[v] error("Drum Tone '%s' not defined." % name)
else: try:
return self.table[v]
except KeyError:
return v return v
@ -195,10 +204,10 @@ class VoiceVolTable:
def get(self, v, vol): def get(self, v, vol):
""" Return an adjusted value or original. """ """ Return an adjusted value or original. """
if self.table.has_key(v): try:
vol = int(vol * self.table[v]) vol = int(vol * self.table[v])
except KeyError:
return vol return vol
voiceVolTable=VoiceVolTable() voiceVolTable=VoiceVolTable()
@ -245,10 +254,10 @@ class DrumVolTable:
def get(self, v, vol): def get(self, v, vol):
""" Return an adjusted value or original. """ """ Return an adjusted value or original. """
if self.table.has_key(v): try:
vol = int(vol * self.table[v]) vol = int(vol * self.table[v])
except KeyError:
return vol return vol
drumVolTable=DrumVolTable() drumVolTable=DrumVolTable()

View File

@ -42,6 +42,9 @@ vols={ 'OFF': 0.00, 'PPPP': 0.05, 'PPP': 0.10,
'FF': 1.60, 'FFF': 1.80, 'FFFF': 2.00 } 'FF': 1.60, 'FFF': 1.80, 'FFFF': 2.00 }
volume = vols['M'] # default global volume volume = vols['M'] # default global volume
nextVolume = None # main parser sets this to the next volume
# when future volumes are stacked. It's used
# by the volume adjust to smooth out (de)crescendos.
lastVolume = volume lastVolume = volume
futureVol = [] futureVol = []
vTRatio = .6 vTRatio = .6
@ -141,14 +144,56 @@ def setVolume(ln):
print "Volume: %s%%" % volume print "Volume: %s%%" % volume
# The next 2 are called from the parser. # The next 3 are called from the parser.
def setCresc(ln): def setCresc(ln):
""" Master Crescendo. """
setCrescendo(1, ln) setCrescendo(1, ln)
def setDecresc(ln): def setDecresc(ln):
""" Master Decrescendo (Diminuendo). """
setCrescendo(-1, ln) setCrescendo(-1, ln)
def setSwell(ln):
""" Set a swell (cresc<>decresc). """
global futureVol, volume, lastVolume
lastVolume = volume
if len(ln) == 3: # 3 args, 1st is intial setting
setVolume([ln[0]])
ln=ln[1:]
if len(ln) != 2:
error("Swell expecting 2 or 3 args.")
count = stoi(ln[1])
if count < 2:
error("Swell bar count must be 2 or greater.")
if count % 2:
c=(count+1)/2
offset=1
else:
c=count/2
offset=0
c=str(c)
futureVol = fvolume(0, volume, [ ln[0], c ] )
futureVol.extend(fvolume(0, futureVol[-1],
[str(int(volume*100)), c ])[offset:])
if gbl.debug:
print "Set Swell to:",
for a in futureVol:
print int(a*100),
print
def setCrescendo(dir, ln): def setCrescendo(dir, ln):
""" Combined (de)cresc() """ """ Combined (de)cresc() """
@ -166,6 +211,13 @@ def setCrescendo(dir, ln):
futureVol = fvolume(dir, volume, ln) futureVol = fvolume(dir, volume, ln)
if gbl.debug:
print "Set (De)Cresc to:",
for a in futureVol:
print int(a*100),
print
# Used by both the 2 funcs above and from TRACK.setCresc() # Used by both the 2 funcs above and from TRACK.setCresc()
@ -181,6 +233,9 @@ def fvolume(dir, startvol, ln):
if bcount <= 0: if bcount <= 0:
error("Bar count for (De)Cresc must be postive") error("Bar count for (De)Cresc must be postive")
# Test to see if (de)cresc is contrary to current settings.
# Using 'dir' of 0 will bypass this (used by SWELL).
if dir > 0 and destvol < startvol: if dir > 0 and destvol < startvol:
warning("Cresc volume less than current setting" ) warning("Cresc volume less than current setting" )
@ -190,9 +245,9 @@ def fvolume(dir, startvol, ln):
elif destvol == startvol: elif destvol == startvol:
warning("(De)Cresc volume equal to current setting" ) warning("(De)Cresc volume equal to current setting" )
bcount -= 1 if bcount> 1:
bcount -= 1
step = ( destvol-startvol ) / bcount step = ( destvol-startvol ) / bcount
volList=[startvol] volList=[startvol]
for a in range(bcount-1): for a in range(bcount-1):

View File

@ -136,6 +136,9 @@ os.system("%s -G" % bin)
print "Setting permissions on MMADIR database file for user update." print "Setting permissions on MMADIR database file for user update."
os.system("chmod a+w " + dest+"/lib/stdlib/.mmaDB") os.system("chmod a+w " + dest+"/lib/stdlib/.mmaDB")
## man pages
print "There are some man pages in %s/docs/man that you may wish to install." % dest
print "Install complete. Have fun!"

View File

@ -84,6 +84,7 @@ information from the each library file:
<li> <A Href = stdlib/8beat.html> stdlib/8beat.mma </a> </li> <li> <A Href = stdlib/8beat.html> stdlib/8beat.mma </a> </li>
<li> <A Href = stdlib/ballad.html> stdlib/ballad.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/ballad128.html> stdlib/ballad128.mma </a> </li>
<li> <A Href = stdlib/ballad68.html> stdlib/ballad68.mma </a> </li>
<li> <A Href = stdlib/basicrock.html> stdlib/basicrock.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/beguine.html> stdlib/beguine.mma </a> </li>
<li> <A Href = stdlib/bigband.html> stdlib/bigband.mma </a> </li> <li> <A Href = stdlib/bigband.html> stdlib/bigband.mma </a> </li>
@ -125,15 +126,20 @@ information from the each library file:
<li> <A Href = stdlib/polka.html> stdlib/polka.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/popballad.html> stdlib/popballad.mma </a> </li>
<li> <A Href = stdlib/quickstep.html> stdlib/quickstep.mma </a> </li> <li> <A Href = stdlib/quickstep.html> stdlib/quickstep.mma </a> </li>
<li> <A Href = stdlib/rb-ballad.html> stdlib/rb-ballad.mma </a> </li>
<li> <A Href = stdlib/rb.html> stdlib/rb.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/rhumba.html> stdlib/rhumba.mma </a> </li>
<li> <A Href = stdlib/rock-128.html> stdlib/rock-128.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/rockballad.html> stdlib/rockballad.mma </a> </li>
<li> <A Href = stdlib/rockwaltz.html> stdlib/rockwaltz.mma </a> </li>
<li> <A Href = stdlib/salsa.html> stdlib/salsa.mma </a> </li>
<li> <A Href = stdlib/samba.html> stdlib/samba.mma </a> </li> <li> <A Href = stdlib/samba.html> stdlib/samba.mma </a> </li>
<li> <A Href = stdlib/showtune.html> stdlib/showtune.mma </a> </li>
<li> <A Href = stdlib/shuffleboggie.html> stdlib/shuffleboggie.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/ska.html> stdlib/ska.mma </a> </li>
<li> <A Href = stdlib/slowblues.html> stdlib/slowblues.mma </a> </li> <li> <A Href = stdlib/slowblues.html> stdlib/slowblues.mma </a> </li>
<li> <A Href = stdlib/slowbolero.html> stdlib/slowbolero.mma </a> </li> <li> <A Href = stdlib/slowbolero.html> stdlib/slowbolero.mma </a> </li>
<li> <A Href = stdlib/slowbroadway.html> stdlib/slowbroadway.mma </a> </li>
<li> <A Href = stdlib/slowcountry.html> stdlib/slowcountry.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/slowjazz.html> stdlib/slowjazz.mma </a> </li>
<li> <A Href = stdlib/softrock.html> stdlib/softrock.mma </a> </li> <li> <A Href = stdlib/softrock.html> stdlib/softrock.mma </a> </li>
@ -141,6 +147,7 @@ information from the each library file:
<li> <A Href = stdlib/son.html> stdlib/son.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/swing.html> stdlib/swing.mma </a> </li>
<li> <A Href = stdlib/tango.html> stdlib/tango.mma </a> </li> <li> <A Href = stdlib/tango.html> stdlib/tango.mma </a> </li>
<li> <A Href = stdlib/trance.html> stdlib/trance.mma </a> </li>
<li> <A Href = stdlib/vienesewaltz.html> stdlib/vienesewaltz.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/waltz.html> stdlib/waltz.mma </a> </li>
<li> <A Href = stdlib/zydeco.html> stdlib/zydeco.mma </a> </li> <li> <A Href = stdlib/zydeco.html> stdlib/zydeco.mma </a> </li>
@ -158,6 +165,8 @@ information from the each library file:
<ul> <ul>
<li> <A Href = yamaha/mambo.html> yamaha/mambo.mma </a> </li> <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/quando-g.s280.html> yamaha/quando-g.s280.mma </a> </li>
<li> <A Href = yamaha/salsa1.html> yamaha/salsa1.mma </a> </li>
<li> <A Href = yamaha/salsa2.html> yamaha/salsa2.mma </a> </li>
<li> <A Href = yamaha/w-rock.html> yamaha/w-rock.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> <li> <A Href = yamaha/western.html> yamaha/western.mma </a> </li>
</ul> </ul>
@ -168,4 +177,4 @@ information from the each library file:
<P>It is a part of the MMA distribution <P>It is a part of the MMA distribution
and is protected by the same copyrights as MMA (the GNU General Public License). and is protected by the same copyrights as MMA (the GNU General Public License).
<P> Created: Wed Mar 7 11:50:18 2007<HTML> <P> Created: Sun Sep 28 11:30:06 2008<HTML>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:15 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:30:04 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>K50S_Rock</H1> <H1>K50S_Rock</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:16 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:30:05 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Kfunk1</H1> <H1>Kfunk1</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:16 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:30:05 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Twi</H1> <H1>Twi</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:03 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:29:57 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>50Srock</H1> <H1>50Srock</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:03 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:29:57 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>60Srock</H1> <H1>60Srock</H1>
@ -8,6 +8,7 @@
<LI><A Href=#60sRock1>60sRock1</a> <LI><A Href=#60sRock1>60sRock1</a>
<LI><A Href=#60sRockSus>60sRockSus</a> <LI><A Href=#60sRockSus>60sRockSus</a>
<LI><A Href=#60sRock1Sus>60sRock1Sus</a> <LI><A Href=#60sRock1Sus>60sRock1Sus</a>
<LI><A Href=#60sRockIntro>60sRockIntro</a>
<LI><A Href=#60sRockEnd>60sRockEnd</a> <LI><A Href=#60sRockEnd>60sRockEnd</a>
</ul> </ul>
<A Name=60sRock></a> <A Name=60sRock></a>
@ -82,6 +83,23 @@
</Table> </Table>
</TD></TR> </TD></TR>
</Table> </Table>
<A Name=60sRockIntro></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> 60sRockIntro </H2>
4 bar intro. <B>(4)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Chord </TD> <TD> CleanGuitar </TD></TR>
<TR><TD> Chord-Straight </TD> <TD> CleanGuitar </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>
<TR><TD> Walk </TD> <TD> FretlessBass </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=60sRockEnd></a> <A Name=60sRockEnd></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%"> <Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD> <TR><TD>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:03 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:29:57 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>8Beat</H1> <H1>8Beat</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:04 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:29:57 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Ballad</H1> <H1>Ballad</H1>
@ -8,6 +8,7 @@
<LI><A Href=#BalladSus>BalladSus</a> <LI><A Href=#BalladSus>BalladSus</a>
<LI><A Href=#Ballad1>Ballad1</a> <LI><A Href=#Ballad1>Ballad1</a>
<LI><A Href=#Ballad1Sus>Ballad1Sus</a> <LI><A Href=#Ballad1Sus>Ballad1Sus</a>
<LI><A Href=#BalladFill>BalladFill</a>
<LI><A Href=#BalladIntro>BalladIntro</a> <LI><A Href=#BalladIntro>BalladIntro</a>
<LI><A Href=#BalladIntro1>BalladIntro1</a> <LI><A Href=#BalladIntro1>BalladIntro1</a>
<LI><A Href=#BalladIntro2>BalladIntro2</a> <LI><A Href=#BalladIntro2>BalladIntro2</a>
@ -116,6 +117,30 @@
</Table> </Table>
</TD></TR> </TD></TR>
</Table> </Table>
<A Name=BalladFill></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> BalladFill </H2>
1 bar fill, good for endings. <B>(1)</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> 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>
<A Name=BalladIntro></a> <A Name=BalladIntro></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%"> <Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD> <TR><TD>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:04 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:29:57 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Ballad128</H1> <H1>Ballad128</H1>
@ -31,7 +31,7 @@
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%"> <Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD> <TR><TD>
<H2> Ballad128Plus </H2> <H2> Ballad128Plus </H2>
Adds arpeggiated . <B>(4)</B> Adds arpeggiated piano. <B>(4)</B>
</TD></TR> </TD></TR>
<TR><TD> <TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%"> <Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">

View File

@ -0,0 +1,125 @@
<!-- Auto-Generated by MMA on: Sun Sep 28 11:29:57 2008 -->
<HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Ballad68</H1>
<P>A 6/8 Ballad. Written for "Dedicated To The One I Love". This is written with 4 beats to the bar, so you'll probably need to multiply the "real" tempo by 2. Largely based on ballad128, so they should be somewhat compatible.
<ul>
<LI><A Href=#Ballad68>Ballad68</a>
<LI><A Href=#Ballad68Plus>Ballad68Plus</a>
<LI><A Href=#Ballad68Sus>Ballad68Sus</a>
<LI><A Href=#Ballad68SusPlus>Ballad68SusPlus</a>
<LI><A Href=#Ballad68-44>Ballad68-44</a>
<LI><A Href=#Ballad68Intro>Ballad68Intro</a>
<LI><A Href=#Ballad68End>Ballad68End</a>
</ul>
<A Name=Ballad68></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> Ballad68 </H2>
A rock ballad beat in 6/8. <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>
</Table>
</TD></TR>
</Table>
<A Name=Ballad68Plus></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> Ballad68Plus </H2>
Adds arpeggiated 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> Drum-Kick </TD> <TD> SideKick </TD></TR>
<TR><TD> Drum-Snare </TD> <TD> SnareDrum2 </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=Ballad68Sus></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> Ballad68Sus </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>
</Table>
</TD></TR>
</Table>
<A Name=Ballad68SusPlus></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> Ballad68SusPlus </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>
</Table>
</TD></TR>
</Table>
<A Name=Ballad68-44></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> Ballad68-44 </H2>
A 4/4 fill bar. <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> 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>
<A Name=Ballad68Intro></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> Ballad68Intro </H2>
This 4 bar intro with 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> AcousticBass </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> SideKick </TD></TR>
<TR><TD> Drum-Snare </TD> <TD> SnareDrum2 </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=Ballad68End></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> Ballad68End </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> 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: Wed Mar 7 11:50:04 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:29:57 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Basicrock</H1> <H1>Basicrock</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:04 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:29:57 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Beguine</H1> <H1>Beguine</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:04 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:29:57 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Bigband</H1> <H1>Bigband</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:05 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:29:58 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Bluegrass</H1> <H1>Bluegrass</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:05 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:29:58 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Blues</H1> <H1>Blues</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:05 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:29:58 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Boggiewoggie</H1> <H1>Boggiewoggie</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:05 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:29:58 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Bolero</H1> <H1>Bolero</H1>
@ -8,6 +8,10 @@
<LI><A Href=#BoleroFill>BoleroFill</a> <LI><A Href=#BoleroFill>BoleroFill</a>
<LI><A Href=#BoleroSus>BoleroSus</a> <LI><A Href=#BoleroSus>BoleroSus</a>
<LI><A Href=#BoleroSusFill>BoleroSusFill</a> <LI><A Href=#BoleroSusFill>BoleroSusFill</a>
<LI><A Href=#BoleroAlt>BoleroAlt</a>
<LI><A Href=#BoleroAltSus>BoleroAltSus</a>
<LI><A Href=#BoleroAltFill>BoleroAltFill</a>
<LI><A Href=#BoleroAltSusFill>BoleroAltSusFill</a>
<LI><A Href=#BoleroIntro>BoleroIntro</a> <LI><A Href=#BoleroIntro>BoleroIntro</a>
<LI><A Href=#BoleroEnd>BoleroEnd</a> <LI><A Href=#BoleroEnd>BoleroEnd</a>
<LI><A Href=#Bolero1>Bolero1</a> <LI><A Href=#Bolero1>Bolero1</a>
@ -97,6 +101,90 @@
</Table> </Table>
</TD></TR> </TD></TR>
</Table> </Table>
<A Name=BoleroAlt></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> BoleroAlt </H2>
Arpeggiated guitars. <B>(4)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Arpeggio-Guitar </TD> <TD> NylonGuitar </TD></TR>
<TR><TD> Bass </TD> <TD> FingeredBass </TD></TR>
<TR><TD> Bass-Guitar </TD> <TD> NylonGuitar </TD></TR>
<TR><TD> Chord </TD> <TD> SteelGuitar </TD></TR>
<TR><TD> Drum-Claves </TD> <TD> Claves </TD></TR>
<TR><TD> Drum-Hbongo </TD> <TD> HighBongo </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Lbongo </TD> <TD> LowBongo </TD></TR>
<TR><TD> Drum-Maraca </TD> <TD> Maracas </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=BoleroAltSus></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> BoleroAltSus </H2>
Sustain with Arpeggiated guitars. <B>(4)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Arpeggio-Guitar </TD> <TD> NylonGuitar </TD></TR>
<TR><TD> Bass </TD> <TD> FingeredBass </TD></TR>
<TR><TD> Bass-Guitar </TD> <TD> NylonGuitar </TD></TR>
<TR><TD> Chord </TD> <TD> SteelGuitar </TD></TR>
<TR><TD> Chord-Sus </TD> <TD> Strings </TD></TR>
<TR><TD> Drum-Claves </TD> <TD> Claves </TD></TR>
<TR><TD> Drum-Hbongo </TD> <TD> HighBongo </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Lbongo </TD> <TD> LowBongo </TD></TR>
<TR><TD> Drum-Maraca </TD> <TD> Maracas </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=BoleroAltFill></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> BoleroAltFill </H2>
Arpeggiated flutes and guitars. <B>(4)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Arpeggio </TD> <TD> Flute </TD></TR>
<TR><TD> Arpeggio-Guitar </TD> <TD> NylonGuitar </TD></TR>
<TR><TD> Bass </TD> <TD> FingeredBass </TD></TR>
<TR><TD> Bass-Guitar </TD> <TD> NylonGuitar </TD></TR>
<TR><TD> Chord </TD> <TD> SteelGuitar </TD></TR>
<TR><TD> Drum-Claves </TD> <TD> Claves </TD></TR>
<TR><TD> Drum-Hbongo </TD> <TD> HighBongo </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Lbongo </TD> <TD> LowBongo </TD></TR>
<TR><TD> Drum-Maraca </TD> <TD> Maracas </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=BoleroAltSusFill></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> BoleroAltSusFill </H2>
Sustain with arpeggiated flutes and guitars. <B>(4)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Arpeggio </TD> <TD> Flute </TD></TR>
<TR><TD> Arpeggio-Guitar </TD> <TD> NylonGuitar </TD></TR>
<TR><TD> Bass </TD> <TD> FingeredBass </TD></TR>
<TR><TD> Bass-Guitar </TD> <TD> NylonGuitar </TD></TR>
<TR><TD> Chord </TD> <TD> SteelGuitar </TD></TR>
<TR><TD> Chord-Sus </TD> <TD> Strings </TD></TR>
<TR><TD> Drum-Claves </TD> <TD> Claves </TD></TR>
<TR><TD> Drum-Hbongo </TD> <TD> HighBongo </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Lbongo </TD> <TD> LowBongo </TD></TR>
<TR><TD> Drum-Maraca </TD> <TD> Maracas </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=BoleroIntro></a> <A Name=BoleroIntro></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%"> <Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD> <TR><TD>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:05 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:29:58 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Bossanova</H1> <H1>Bossanova</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:06 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:29:58 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Broadway</H1> <H1>Broadway</H1>
@ -9,7 +9,7 @@
<LI><A Href=#BroadwaySus>BroadwaySus</a> <LI><A Href=#BroadwaySus>BroadwaySus</a>
<LI><A Href=#Broadway1Sus>Broadway1Sus</a> <LI><A Href=#Broadway1Sus>Broadway1Sus</a>
<LI><A Href=#BroadwayIntro>BroadwayIntro</a> <LI><A Href=#BroadwayIntro>BroadwayIntro</a>
<LI><A Href=#BroadWayEnd>BroadWayEnd</a> <LI><A Href=#BroadwayEnd>BroadwayEnd</a>
</ul> </ul>
<A Name=Broadway></a> <A Name=Broadway></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%"> <Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
@ -110,10 +110,10 @@
</Table> </Table>
</TD></TR> </TD></TR>
</Table> </Table>
<A Name=BroadWayEnd></a> <A Name=BroadwayEnd></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%"> <Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD> <TR><TD>
<H2> BroadWayEnd </H2> <H2> BroadwayEnd </H2>
A 2 bar ending reminiscent of a cha-cha. <B>(2)</B> A 2 bar ending reminiscent of a cha-cha. <B>(2)</B>
</TD></TR> </TD></TR>
<TR><TD> <TR><TD>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:06 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:29:58 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Calypso</H1> <H1>Calypso</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:06 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:29:58 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Chacha</H1> <H1>Chacha</H1>
@ -33,6 +33,7 @@
<LI><A Href=#ChaChaFill>ChaChaFill</a> <LI><A Href=#ChaChaFill>ChaChaFill</a>
<LI><A Href=#ChaCha1Fill>ChaCha1Fill</a> <LI><A Href=#ChaCha1Fill>ChaCha1Fill</a>
<LI><A Href=#ChaChaIntro>ChaChaIntro</a> <LI><A Href=#ChaChaIntro>ChaChaIntro</a>
<LI><A Href=#ChaChaIntro8>ChaChaIntro8</a>
<LI><A Href=#ChaChaEnd>ChaChaEnd</a> <LI><A Href=#ChaChaEnd>ChaChaEnd</a>
</ul> </ul>
<A Name=ChaCha></a> <A Name=ChaCha></a>
@ -194,6 +195,28 @@
</Table> </Table>
</TD></TR> </TD></TR>
</Table> </Table>
<A Name=ChaChaIntro8></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> ChaChaIntro8 </H2>
Same intro expanded to 8 bars. <B>(8)</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=ChaChaEnd></a> <A Name=ChaChaEnd></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%"> <Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD> <TR><TD>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:06 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:29:58 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Countryblues</H1> <H1>Countryblues</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:06 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:29:59 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Countryswing</H1> <H1>Countryswing</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:07 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:29:59 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Countrywaltz</H1> <H1>Countrywaltz</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:07 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:29:59 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Desert</H1> <H1>Desert</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:07 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:29:59 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Dixie</H1> <H1>Dixie</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:07 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:29:59 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Dixiemarch</H1> <H1>Dixiemarch</H1>

View File

@ -1,8 +1,8 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:07 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:29:59 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Easyswing</H1> <H1>Easyswing</H1>
<P>Soft guitar strumming. Great of tunes like "Beyond The Sea" and "Summertime". <P>Soft guitar strumming. Great for tunes like "Beyond The Sea" and "Summertime".
<ul> <ul>
<LI><A Href=#EasySwing>EasySwing</a> <LI><A Href=#EasySwing>EasySwing</a>
<LI><A Href=#EasySwingSus>EasySwingSus</a> <LI><A Href=#EasySwingSus>EasySwingSus</a>
@ -39,6 +39,7 @@
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR> <TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR> <TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR> <TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR> <TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR> <TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
</Table> </Table>
@ -56,6 +57,7 @@
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR> <TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR> <TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR> <TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR> <TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR> <TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
</Table> </Table>
@ -73,6 +75,7 @@
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR> <TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR> <TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR> <TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR> <TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR> <TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
</Table> </Table>
@ -88,6 +91,7 @@
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%"> <Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR> <TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR> <TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR> <TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR> <TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
</Table> </Table>
@ -104,6 +108,7 @@
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR> <TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR> <TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR> <TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR> <TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR> <TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
</Table> </Table>
@ -121,6 +126,7 @@
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR> <TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR> <TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR> <TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR> <TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR> <TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
</Table> </Table>
@ -137,6 +143,7 @@
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR> <TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR> <TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR> <TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR> <TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR> <TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
</Table> </Table>
@ -154,6 +161,7 @@
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR> <TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR> <TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR> <TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR> <TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR> <TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
</Table> </Table>
@ -171,6 +179,7 @@
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR> <TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR> <TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR> <TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR> <TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR> <TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
</Table> </Table>
@ -187,6 +196,7 @@
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR> <TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR> <TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR> <TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR> <TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR> <TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
</Table> </Table>
@ -204,6 +214,7 @@
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR> <TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR> <TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR> <TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR> <TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR> <TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
</Table> </Table>
@ -221,6 +232,7 @@
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR> <TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR> <TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR> <TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR> <TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR> <TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
</Table> </Table>
@ -237,6 +249,7 @@
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR> <TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR> <TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR> <TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR> <TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR> <TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
</Table> </Table>
@ -254,6 +267,7 @@
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR> <TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR> <TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR> <TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR> <TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR> <TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
</Table> </Table>
@ -271,6 +285,7 @@
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR> <TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR> <TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR> <TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR> <TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR> <TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
</Table> </Table>
@ -286,6 +301,7 @@
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%"> <Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR> <TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR> <TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR> <TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR> <TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
</Table> </Table>
@ -302,6 +318,7 @@
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR> <TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR> <TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR> <TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR> <TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR> <TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
</Table> </Table>
@ -318,6 +335,7 @@
<TR><TD> Arpeggio </TD> <TD> JazzGuitar </TD></TR> <TR><TD> Arpeggio </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR> <TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR> <TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR> <TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR> <TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
</Table> </Table>
@ -334,6 +352,7 @@
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR> <TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR> <TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR> <TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR> <TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
</Table> </Table>
</TD></TR> </TD></TR>
@ -349,6 +368,7 @@
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR> <TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR> <TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR> <TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR> <TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
</Table> </Table>
</TD></TR> </TD></TR>
@ -364,6 +384,7 @@
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR> <TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR> <TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Drum-Hh </TD> <TD> RideCymbal1 </TD></TR> <TR><TD> Drum-Hh </TD> <TD> RideCymbal1 </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR> <TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
</Table> </Table>
</TD></TR> </TD></TR>
@ -380,6 +401,7 @@
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR> <TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR> <TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR> <TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR> <TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
</Table> </Table>
</TD></TR> </TD></TR>
@ -395,6 +417,7 @@
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR> <TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR> <TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR> <TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR> <TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR> <TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
</Table> </Table>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:07 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:29:59 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Fastblues</H1> <H1>Fastblues</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:08 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:29:59 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Folk</H1> <H1>Folk</H1>
@ -7,6 +7,8 @@
<LI><A Href=#Folk>Folk</a> <LI><A Href=#Folk>Folk</a>
<LI><A Href=#FolkWalk>FolkWalk</a> <LI><A Href=#FolkWalk>FolkWalk</a>
<LI><A Href=#FolkArticulated>FolkArticulated</a> <LI><A Href=#FolkArticulated>FolkArticulated</a>
<LI><A Href=#FolkSus>FolkSus</a>
<LI><A Href=#FolkArticulatedSus>FolkArticulatedSus</a>
<LI><A Href=#FolkIntro>FolkIntro</a> <LI><A Href=#FolkIntro>FolkIntro</a>
<LI><A Href=#FolkEnd>FolkEnd</a> <LI><A Href=#FolkEnd>FolkEnd</a>
</ul> </ul>
@ -54,6 +56,38 @@
</Table> </Table>
</TD></TR> </TD></TR>
</Table> </Table>
<A Name=FolkSus></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> FolkSus </H2>
Some nice harmonica chords with the guitar. <B>(8)</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> NylonGuitar </TD></TR>
<TR><TD> Chord-Sus </TD> <TD> Harmonica </TD></TR>
<TR><TD> Drum-Tamb </TD> <TD> Tambourine </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=FolkArticulatedSus></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> FolkArticulatedSus </H2>
Articulated version with harmonica. <B>(8)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Arpeggio </TD> <TD> NylonGuitar </TD></TR>
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> NylonGuitar </TD></TR>
<TR><TD> Chord-Sus </TD> <TD> Harmonica </TD></TR>
<TR><TD> Drum-Tamb </TD> <TD> Tambourine </TD></TR>
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=FolkIntro></a> <A Name=FolkIntro></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%"> <Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD> <TR><TD>

View File

@ -1,8 +1,22 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:08 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:29:59 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Foxtrot</H1> <H1>Foxtrot</H1>
<P>Just about any old-fashioned dance piece can be set to a foxtrot. <P>Just about any old-fashioned dance piece can be set to a foxtrot.
<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> ArpeggioVoice </B> </TD>
<TD Valign=Top> Voice for the alternating apreggios in the Plus versions (Default=Piano1). Also used in Introduction and Ending. </TD>
</TR>
</Table>
</TD></TR>
</Table>
<ul> <ul>
<LI><A Href=#Foxtrot>Foxtrot</a> <LI><A Href=#Foxtrot>Foxtrot</a>
<LI><A Href=#FoxtrotSus>FoxtrotSus</a> <LI><A Href=#FoxtrotSus>FoxtrotSus</a>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:08 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:29:59 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Frenchwaltz</H1> <H1>Frenchwaltz</H1>
@ -38,7 +38,7 @@
<LI><A Href=#FrenchWaltz2FillSus>FrenchWaltz2FillSus</a> <LI><A Href=#FrenchWaltz2FillSus>FrenchWaltz2FillSus</a>
<LI><A Href=#FrenchWaltz3>FrenchWaltz3</a> <LI><A Href=#FrenchWaltz3>FrenchWaltz3</a>
<LI><A Href=#FrenchWaltz3Fill>FrenchWaltz3Fill</a> <LI><A Href=#FrenchWaltz3Fill>FrenchWaltz3Fill</a>
<LI><A Href=#FrenchWaltz2Sus>FrenchWaltz2Sus</a> <LI><A Href=#FrenchWaltz3Sus>FrenchWaltz3Sus</a>
<LI><A Href=#FrenchWaltz3FillSus>FrenchWaltz3FillSus</a> <LI><A Href=#FrenchWaltz3FillSus>FrenchWaltz3FillSus</a>
<LI><A Href=#FrenchWaltzIntro>FrenchWaltzIntro</a> <LI><A Href=#FrenchWaltzIntro>FrenchWaltzIntro</a>
<LI><A Href=#FrenchWaltzEnd>FrenchWaltzEnd</a> <LI><A Href=#FrenchWaltzEnd>FrenchWaltzEnd</a>
@ -284,10 +284,10 @@
</Table> </Table>
</TD></TR> </TD></TR>
</Table> </Table>
<A Name=FrenchWaltz2Sus></a> <A Name=FrenchWaltz3Sus></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%"> <Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD> <TR><TD>
<H2> FrenchWaltz2Sus </H2> <H2> FrenchWaltz3Sus </H2>
Viola counter melody and sustained strings. <B>(8)</B> Viola counter melody and sustained strings. <B>(8)</B>
</TD></TR> </TD></TR>
<TR><TD> <TR><TD>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:08 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:30:00 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Guitarballad</H1> <H1>Guitarballad</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:08 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:30:00 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Hillcountry</H1> <H1>Hillcountry</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:09 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:30:00 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Jazz-54</H1> <H1>Jazz-54</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:09 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:30:00 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Jazzguitar</H1> <H1>Jazzguitar</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:09 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:30:00 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Jazzwaltz</H1> <H1>Jazzwaltz</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:09 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:30:00 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Jive</H1> <H1>Jive</H1>
@ -17,6 +17,7 @@
<LI><A Href=#Jive1Plus>Jive1Plus</a> <LI><A Href=#Jive1Plus>Jive1Plus</a>
<LI><A Href=#Jive1SusPlus>Jive1SusPlus</a> <LI><A Href=#Jive1SusPlus>Jive1SusPlus</a>
<LI><A Href=#JiveIntro>JiveIntro</a> <LI><A Href=#JiveIntro>JiveIntro</a>
<LI><A Href=#JiveIntro8>JiveIntro8</a>
<LI><A Href=#JiveEnd>JiveEnd</a> <LI><A Href=#JiveEnd>JiveEnd</a>
</ul> </ul>
<A Name=Jive></a> <A Name=Jive></a>
@ -95,7 +96,7 @@
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%"> <Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD> <TR><TD>
<H2> JivePlus </H2> <H2> JivePlus </H2>
Add some additional apreggios. <B>(4)</B> Add some additional arpeggios. <B>(4)</B>
</TD></TR> </TD></TR>
<TR><TD> <TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%"> <Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
@ -113,7 +114,7 @@
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%"> <Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD> <TR><TD>
<H2> JiveSusPlus </H2> <H2> JiveSusPlus </H2>
Apreggios plus strings. <B>(4)</B> Arpeggios plus strings. <B>(4)</B>
</TD></TR> </TD></TR>
<TR><TD> <TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%"> <Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
@ -255,6 +256,24 @@
</Table> </Table>
</TD></TR> </TD></TR>
</Table> </Table>
<A Name=JiveIntro8></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> JiveIntro8 </H2>
8 bar intro. <B>(8)</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-Sax </TD> <TD> AltoSax </TD></TR>
<TR><TD> Chord </TD> <TD> Piano2 </TD></TR>
<TR><TD> Drum-Clap </TD> <TD> SnareDrum1 </TD></TR>
<TR><TD> Drum-Hh </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>
<A Name=JiveEnd></a> <A Name=JiveEnd></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%"> <Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD> <TR><TD>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:09 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:30:00 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Lfusion</H1> <H1>Lfusion</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:09 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:30:00 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Lighttango</H1> <H1>Lighttango</H1>
@ -10,7 +10,9 @@
<LI><A Href=#LightTango1Sus>LightTango1Sus</a> <LI><A Href=#LightTango1Sus>LightTango1Sus</a>
<LI><A Href=#LightTangoFill>LightTangoFill</a> <LI><A Href=#LightTangoFill>LightTangoFill</a>
<LI><A Href=#LightTangoIntro>LightTangoIntro</a> <LI><A Href=#LightTangoIntro>LightTangoIntro</a>
<LI><A Href=#LightTangoIntro1>LightTangoIntro1</a>
<LI><A Href=#LightTangoEnd>LightTangoEnd</a> <LI><A Href=#LightTangoEnd>LightTangoEnd</a>
<LI><A Href=#LightTango4End>LightTango4End</a>
</ul> </ul>
<A Name=LightTango></a> <A Name=LightTango></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%"> <Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
@ -133,6 +135,25 @@
</Table> </Table>
</TD></TR> </TD></TR>
</Table> </Table>
<A Name=LightTangoIntro1></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> LightTangoIntro1 </H2>
Smoother version of basic introduction. <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-Guitar </TD> <TD> NylonGuitar </TD></TR>
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </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>
<TR><TD> Drum-Tam </TD> <TD> Tambourine </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=LightTangoEnd></a> <A Name=LightTangoEnd></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%"> <Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD> <TR><TD>
@ -150,5 +171,25 @@
</Table> </Table>
</TD></TR> </TD></TR>
</Table> </Table>
<A Name=LightTango4End></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> LightTango4End </H2>
Smoother 4 bar ending. <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-Accordion </TD> <TD> Accordion </TD></TR>
<TR><TD> Chord-Guitar </TD> <TD> NylonGuitar </TD></TR>
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </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>
<TR><TD> Drum-Tam </TD> <TD> Tambourine </TD></TR>
</Table>
</TD></TR>
</Table>
</Body></HTML> </Body></HTML>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:10 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:30:00 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Lullaby</H1> <H1>Lullaby</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:10 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:30:01 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Mambo</H1> <H1>Mambo</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:10 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:30:01 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>March</H1> <H1>March</H1>

View File

@ -1,8 +1,22 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:10 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:30:01 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Merengue</H1> <H1>Merengue</H1>
<P>This is a very fast dance rhythm native to the Dominican Republic. The demo song for this ``Compadre Pedro Juan''. Note that you'll have to double up on the tempo for this to sound right. Patterns are from ``Latin Rhythms: Mystery Unraveled'' by Victor Lopez. <P>This is a very fast dance rhythm native to the Dominican Republic. The demo song for this ``Compadre Pedro Juan''. Note that you'll have to double up on the tempo for this to sound right. Patterns are from ``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> BandoneonOctave </B> </TD>
<TD Valign=Top> The Octave setting for the bandoneon (default=6) </TD>
</TR>
</Table>
</TD></TR>
</Table>
<ul> <ul>
<LI><A Href=#Merengue>Merengue</a> <LI><A Href=#Merengue>Merengue</a>
<LI><A Href=#Merengue1>Merengue1</a> <LI><A Href=#Merengue1>Merengue1</a>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:10 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:30:01 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Metronome</H1> <H1>Metronome</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:11 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:30:01 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Metronome3</H1> <H1>Metronome3</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:11 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:30:01 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Modernjazz</H1> <H1>Modernjazz</H1>
@ -11,8 +11,12 @@
<TR><TD> <TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="100%"> <Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="100%">
<TR> <TR>
<TD Valign=Top> <B> ApreggioVoice </B> </TD> <TD Valign=Top> <B> ArpeggioVoice </B> </TD>
<TD Valign=Top> Voice for the alternating apreggios in ModernJazz1 (Default=MutedTrumpet). Also used in Introduction and Ending. </TD> <TD Valign=Top> Voice for the alternating arpeggios in ModernJazz1 and ModernJazz2 (plus the SUS versions of 1 and 2). </TD>
</TR>
<TR>
<TD Valign=Top> <B> (Default=MutedTrumpet). </B> </TD>
<TD Valign=Top> Also used in Introduction and Ending. </TD>
</TR> </TR>
</Table> </Table>
</TD></TR> </TD></TR>
@ -22,6 +26,8 @@
<LI><A Href=#ModernJazz1>ModernJazz1</a> <LI><A Href=#ModernJazz1>ModernJazz1</a>
<LI><A Href=#ModernJazzSus>ModernJazzSus</a> <LI><A Href=#ModernJazzSus>ModernJazzSus</a>
<LI><A Href=#ModernJazz1Sus>ModernJazz1Sus</a> <LI><A Href=#ModernJazz1Sus>ModernJazz1Sus</a>
<LI><A Href=#ModernJazz2>ModernJazz2</a>
<LI><A Href=#ModernJazz2Sus>ModernJazz2Sus</a>
<LI><A Href=#ModernJazzIntro>ModernJazzIntro</a> <LI><A Href=#ModernJazzIntro>ModernJazzIntro</a>
<LI><A Href=#ModernJazzEnd>ModernJazzEnd</a> <LI><A Href=#ModernJazzEnd>ModernJazzEnd</a>
</ul> </ul>
@ -107,6 +113,49 @@
</Table> </Table>
</TD></TR> </TD></TR>
</Table> </Table>
<A Name=ModernJazz2></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> ModernJazz2 </H2>
A slower version of alternate-bar trumpet for faster tempos. <B>(4)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Arpeggio </TD> <TD> MutedTrumpet </TD></TR>
<TR><TD> Bass-Trp </TD> <TD> MutedTrumpet </TD></TR>
<TR><TD> Chord-Guitar </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Chord-Piano </TD> <TD> Piano2 </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Ohh </TD> <TD> OpenHiHat </TD></TR>
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
<TR><TD> Drum-Ride </TD> <TD> RideCymbal1 </TD></TR>
<TR><TD> Drum-Side </TD> <TD> SnareDrum1 </TD></TR>
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=ModernJazz2Sus></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> ModernJazz2Sus </H2>
Slower alternate-bar trumpets with violins for faster tempos. <B>(4)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Arpeggio </TD> <TD> MutedTrumpet </TD></TR>
<TR><TD> Bass-Trp </TD> <TD> MutedTrumpet </TD></TR>
<TR><TD> Chord-Guitar </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Chord-Piano </TD> <TD> Piano2 </TD></TR>
<TR><TD> Chord-Sus </TD> <TD> VoiceOohs </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Ohh </TD> <TD> OpenHiHat </TD></TR>
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
<TR><TD> Drum-Ride </TD> <TD> RideCymbal1 </TD></TR>
<TR><TD> Drum-Side </TD> <TD> SnareDrum1 </TD></TR>
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=ModernJazzIntro></a> <A Name=ModernJazzIntro></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%"> <Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD> <TR><TD>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:11 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:30:01 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Pianoballad</H1> <H1>Pianoballad</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:11 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:30:01 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Polka</H1> <H1>Polka</H1>
@ -13,6 +13,7 @@
<LI><A Href=#Polka1Arp>Polka1Arp</a> <LI><A Href=#Polka1Arp>Polka1Arp</a>
<LI><A Href=#Polka1SusArp>Polka1SusArp</a> <LI><A Href=#Polka1SusArp>Polka1SusArp</a>
<LI><A Href=#PolkaIntro>PolkaIntro</a> <LI><A Href=#PolkaIntro>PolkaIntro</a>
<LI><A Href=#PolkaIntro8>PolkaIntro8</a>
<LI><A Href=#PolkaEnd>PolkaEnd</a> <LI><A Href=#PolkaEnd>PolkaEnd</a>
</ul> </ul>
<A Name=Polka></a> <A Name=Polka></a>
@ -193,6 +194,24 @@
</Table> </Table>
</TD></TR> </TD></TR>
</Table> </Table>
<A Name=PolkaIntro8></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> PolkaIntro8 </H2>
Expanded version of PolkaIntro for 8 bars. <B>(8)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Bass </TD> <TD> Tuba </TD></TR>
<TR><TD> Chord </TD> <TD> Accordion </TD></TR>
<TR><TD> Chord-Guitar </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Drum </TD> <TD> Slap </TD></TR>
<TR><TD> Drum-Cym </TD> <TD> CrashCymbal1 </TD></TR>
<TR><TD> Drum-Hh </TD> <TD> ClosedHiHat </TD></TR>
<TR><TD> Drum-Snare </TD> <TD> SnareDrum1 </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=PolkaEnd></a> <A Name=PolkaEnd></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%"> <Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD> <TR><TD>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:11 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:30:01 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Popballad</H1> <H1>Popballad</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:11 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:30:01 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Quickstep</H1> <H1>Quickstep</H1>
@ -11,6 +11,7 @@
<LI><A Href=#QuickStepDuh>QuickStepDuh</a> <LI><A Href=#QuickStepDuh>QuickStepDuh</a>
<LI><A Href=#QuickStepDuhSus>QuickStepDuhSus</a> <LI><A Href=#QuickStepDuhSus>QuickStepDuhSus</a>
<LI><A Href=#QuickStepIntro>QuickStepIntro</a> <LI><A Href=#QuickStepIntro>QuickStepIntro</a>
<LI><A Href=#QuickStepIntro8>QuickStepIntro8</a>
<LI><A Href=#QuickStepEnd>QuickStepEnd</a> <LI><A Href=#QuickStepEnd>QuickStepEnd</a>
</ul> </ul>
<A Name=QuickStep></a> <A Name=QuickStep></a>
@ -139,6 +140,23 @@
</Table> </Table>
</TD></TR> </TD></TR>
</Table> </Table>
<A Name=QuickStepIntro8></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> QuickStepIntro8 </H2>
The 4 bar intro stretched to 8. <B>(8)</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-Guitar </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Chord-Piano </TD> <TD> Piano2 </TD></TR>
<TR><TD> Drum-Closedhh </TD> <TD> ClosedHiHat </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Openhh </TD> <TD> OpenHiHat </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=QuickStepEnd></a> <A Name=QuickStepEnd></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%"> <Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD> <TR><TD>

View File

@ -0,0 +1,91 @@
<!-- Auto-Generated by MMA on: Sun Sep 28 11:30:02 2008 -->
<HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Rb-Ballad</H1>
<P>Rythmn and Blues ballad. Based on the R&B style, just made softer and prettier. Done for "Mercy, Mercy, Mercy".
<ul>
<LI><A Href=#R&B-Ballad>R&B-Ballad</a>
<LI><A Href=#R&B-BalladSus>R&B-BalladSus</a>
<LI><A Href=#R&B-BalladIntro>R&B-BalladIntro</a>
<LI><A Href=#R&B-BalladEnd>R&B-BalladEnd</a>
</ul>
<A Name=R&B-Ballad></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> R&B-Ballad </H2>
Basic R&B Ballad. <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> Piano2 </TD></TR>
<TR><TD> Chord-Organ </TD> <TD> Organ1 </TD></TR>
<TR><TD> Drum-Clap </TD> <TD> HandClap </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> SnareDrum2 </TD></TR>
<TR><TD> Drum-Tam </TD> <TD> Tambourine </TD></TR>
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=R&B-BalladSus></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> R&B-BalladSus </H2>
Change rhythmic organ to sustained chords. <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> Piano2 </TD></TR>
<TR><TD> Chord-Organ </TD> <TD> Organ1 </TD></TR>
<TR><TD> Drum-Clap </TD> <TD> HandClap </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> SnareDrum2 </TD></TR>
<TR><TD> Drum-Tam </TD> <TD> Tambourine </TD></TR>
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=R&B-BalladIntro></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> R&B-BalladIntro </H2>
A bit laid-back, 4 bar intro. <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> Piano2 </TD></TR>
<TR><TD> Chord-Organ </TD> <TD> Organ1 </TD></TR>
<TR><TD> Drum-Clap </TD> <TD> HandClap </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> SnareDrum2 </TD></TR>
<TR><TD> Drum-Tam </TD> <TD> Tambourine </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=R&B-BalladEnd></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> R&B-BalladEnd </H2>
Two 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> Piano2 </TD></TR>
<TR><TD> Chord-Organ </TD> <TD> Organ1 </TD></TR>
<TR><TD> Drum-Clap </TD> <TD> HandClap </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> SnareDrum2 </TD></TR>
<TR><TD> Drum-Tam </TD> <TD> Tambourine </TD></TR>
</Table>
</TD></TR>
</Table>
</Body></HTML>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:12 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:30:02 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Rb</H1> <H1>Rb</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:12 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:30:02 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Rhumba</H1> <H1>Rhumba</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:12 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:30:02 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Rock-128</H1> <H1>Rock-128</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:12 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:30:02 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Rockballad</H1> <H1>Rockballad</H1>
@ -27,7 +27,9 @@
<LI><A Href=#RockBalladFill>RockBalladFill</a> <LI><A Href=#RockBalladFill>RockBalladFill</a>
<LI><A Href=#RockBallad1Fill>RockBallad1Fill</a> <LI><A Href=#RockBallad1Fill>RockBallad1Fill</a>
<LI><A Href=#RockBalladVoice>RockBalladVoice</a> <LI><A Href=#RockBalladVoice>RockBalladVoice</a>
<LI><A Href=#RockBallad1Voice>RockBallad1Voice</a>
<LI><A Href=#RockBalladIntro>RockBalladIntro</a> <LI><A Href=#RockBalladIntro>RockBalladIntro</a>
<LI><A Href=#RockBalladSusIntro>RockBalladSusIntro</a>
<LI><A Href=#RockBalladEnd>RockBalladEnd</a> <LI><A Href=#RockBalladEnd>RockBalladEnd</a>
<LI><A Href=#RockBalladEnd1>RockBalladEnd1</a> <LI><A Href=#RockBalladEnd1>RockBalladEnd1</a>
</ul> </ul>
@ -119,6 +121,24 @@
</Table> </Table>
</TD></TR> </TD></TR>
</Table> </Table>
<A Name=RockBallad1Voice></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> RockBallad1Voice </H2>
Cheese without 4th bar triplets. <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> Chord-Sus </TD> <TD> ChoirAahs </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=RockBalladIntro></a> <A Name=RockBalladIntro></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%"> <Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD> <TR><TD>
@ -132,7 +152,23 @@
<TR><TD> Drum </TD> <TD> ClosedHiHat </TD></TR> <TR><TD> Drum </TD> <TD> ClosedHiHat </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR> <TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Snare </TD> <TD> SnareDrum1 </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=RockBalladSusIntro></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> RockBalladSusIntro </H2>
4 bar intro with mostly strings. <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> Chord-Sus </TD> <TD> ChoirAahs </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> </Table>
</TD></TR> </TD></TR>
</Table> </Table>

View File

@ -0,0 +1,263 @@
<!-- Auto-Generated by MMA on: Sun Sep 28 11:30:02 2008 -->
<HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Rockwaltz</H1>
<P>This is our basic 3/4 waltz with added guitars and a bit of raunch.
<ul>
<LI><A Href=#RockWaltz>RockWaltz</a>
<LI><A Href=#RockWaltzSus>RockWaltzSus</a>
<LI><A Href=#RockWaltz1>RockWaltz1</a>
<LI><A Href=#RockWaltz1Sus>RockWaltz1Sus</a>
<LI><A Href=#RockWaltzWalk>RockWaltzWalk</a>
<LI><A Href=#RockWaltzWalkSus>RockWaltzWalkSus</a>
<LI><A Href=#RockWaltz1Walk>RockWaltz1Walk</a>
<LI><A Href=#RockWaltz1WalkSus>RockWaltz1WalkSus</a>
<LI><A Href=#RockWaltzIntro>RockWaltzIntro</a>
<LI><A Href=#RockWaltz1Intro>RockWaltz1Intro</a>
<LI><A Href=#RockWaltzIntro8>RockWaltzIntro8</a>
<LI><A Href=#RockWaltz1intro8>RockWaltz1intro8</a>
<LI><A Href=#RockWaltzEnd>RockWaltzEnd</a>
</ul>
<A Name=RockWaltz></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> RockWaltz </H2>
Hold tight for this dance. <B>(4)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Bass </TD> <TD> PickedBass </TD></TR>
<TR><TD> Chord </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-Snare </TD> <TD> SnareDrum1 </TD></TR>
<TR><TD> Drum-Tri </TD> <TD> OpenTriangle </TD></TR>
<TR><TD> Walk </TD> <TD> PickedBass </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=RockWaltzSus></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> RockWaltzSus </H2>
Add strings to RockWaltz. <B>(4)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Bass </TD> <TD> PickedBass </TD></TR>
<TR><TD> Chord </TD> <TD> CleanGuitar </TD></TR>
<TR><TD> Chord-Sus </TD> <TD> Strings </TD></TR>
<TR><TD> Drum-Chh </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> Drum-Tri </TD> <TD> OpenTriangle </TD></TR>
<TR><TD> Walk </TD> <TD> PickedBass </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=RockWaltz1></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> RockWaltz1 </H2>
Add piano apreggios to the RockWaltz. <B>(4)</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> PickedBass </TD></TR>
<TR><TD> Chord </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-Snare </TD> <TD> SnareDrum1 </TD></TR>
<TR><TD> Drum-Tri </TD> <TD> OpenTriangle </TD></TR>
<TR><TD> Scale </TD> <TD> CleanGuitar </TD></TR>
<TR><TD> Walk </TD> <TD> PickedBass </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=RockWaltz1Sus></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> RockWaltz1Sus </H2>
RockWaltz with arpeggios and sustained strings. <B>(4)</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> PickedBass </TD></TR>
<TR><TD> Chord </TD> <TD> CleanGuitar </TD></TR>
<TR><TD> Chord-Sus </TD> <TD> Strings </TD></TR>
<TR><TD> Drum-Chh </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> Drum-Tri </TD> <TD> OpenTriangle </TD></TR>
<TR><TD> Scale </TD> <TD> CleanGuitar </TD></TR>
<TR><TD> Walk </TD> <TD> PickedBass </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=RockWaltzWalk></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> RockWaltzWalk </H2>
Walking bass version of RockWaltz. <B>(4)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Chord </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-Snare </TD> <TD> SnareDrum1 </TD></TR>
<TR><TD> Drum-Tri </TD> <TD> OpenTriangle </TD></TR>
<TR><TD> Walk </TD> <TD> PickedBass </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=RockWaltzWalkSus></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> RockWaltzWalkSus </H2>
Walking bass and sustained strings. <B>(4)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Chord </TD> <TD> CleanGuitar </TD></TR>
<TR><TD> Chord-Sus </TD> <TD> Strings </TD></TR>
<TR><TD> Drum-Chh </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> Drum-Tri </TD> <TD> OpenTriangle </TD></TR>
<TR><TD> Walk </TD> <TD> PickedBass </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=RockWaltz1Walk></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> RockWaltz1Walk </H2>
Walking bass and arpeggios. <B>(4)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Arpeggio </TD> <TD> CleanGuitar </TD></TR>
<TR><TD> Chord </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-Snare </TD> <TD> SnareDrum1 </TD></TR>
<TR><TD> Drum-Tri </TD> <TD> OpenTriangle </TD></TR>
<TR><TD> Scale </TD> <TD> CleanGuitar </TD></TR>
<TR><TD> Walk </TD> <TD> PickedBass </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=RockWaltz1WalkSus></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> RockWaltz1WalkSus </H2>
Walking bass, arpeggios and sustained strings. <B>(4)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Arpeggio </TD> <TD> CleanGuitar </TD></TR>
<TR><TD> Chord </TD> <TD> CleanGuitar </TD></TR>
<TR><TD> Chord-Sus </TD> <TD> Strings </TD></TR>
<TR><TD> Drum-Chh </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> Drum-Tri </TD> <TD> OpenTriangle </TD></TR>
<TR><TD> Scale </TD> <TD> CleanGuitar </TD></TR>
<TR><TD> Walk </TD> <TD> PickedBass </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=RockWaltzIntro></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> RockWaltzIntro </H2>
RockWaltz intro with guitar chords. <B>(4)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Bass </TD> <TD> PickedBass </TD></TR>
<TR><TD> Chord </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-Snare </TD> <TD> SnareDrum1 </TD></TR>
<TR><TD> Drum-Tri </TD> <TD> OpenTriangle </TD></TR>
<TR><TD> Walk </TD> <TD> PickedBass </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=RockWaltz1Intro></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> RockWaltz1Intro </H2>
RockWaltz intro with arpeggios. <B>(4)</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> PickedBass </TD></TR>
<TR><TD> Drum-Chh </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> Drum-Tri </TD> <TD> OpenTriangle </TD></TR>
<TR><TD> Walk </TD> <TD> PickedBass </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=RockWaltzIntro8></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> RockWaltzIntro8 </H2>
8 bar RockWaltz intro with guitar chords. <B>(8)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Bass </TD> <TD> PickedBass </TD></TR>
<TR><TD> Chord </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-Snare </TD> <TD> SnareDrum1 </TD></TR>
<TR><TD> Drum-Tri </TD> <TD> OpenTriangle </TD></TR>
<TR><TD> Walk </TD> <TD> PickedBass </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=RockWaltz1intro8></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> RockWaltz1intro8 </H2>
8 bar RockWaltz intro with arpeggios. <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 </TD> <TD> PickedBass </TD></TR>
<TR><TD> Drum-Chh </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> Drum-Tri </TD> <TD> OpenTriangle </TD></TR>
<TR><TD> Walk </TD> <TD> PickedBass </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=RockWaltzEnd></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> RockWaltzEnd </H2>
Simple 4 bar ending. <B>(4)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Bass </TD> <TD> PickedBass </TD></TR>
<TR><TD> Chord </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-Snare </TD> <TD> SnareDrum1 </TD></TR>
<TR><TD> Drum-Tri </TD> <TD> OpenTriangle </TD></TR>
</Table>
</TD></TR>
</Table>
</Body></HTML>

View File

@ -0,0 +1,114 @@
<!-- Auto-Generated by MMA on: Sun Sep 28 11:30:02 2008 -->
<HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Salsa</H1>
<P>Salsa just means ``saucy'' or ``spicy'' and is based on son and rhumba patterns. This is created from scratch. I use it for a Peggy Lee styled version of the Cole Porter tune ``Always True To You In My Fashion.''
<ul>
<LI><A Href=#Salsa>Salsa</a>
<LI><A Href=#SalsaSus>SalsaSus</a>
<LI><A Href=#SalsaIntro>SalsaIntro</a>
<LI><A Href=#SalsaFill>SalsaFill</a>
<LI><A Href=#SalsaEnd>SalsaEnd</a>
</ul>
<A Name=Salsa></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> Salsa </H2>
Basic Salsa pattern. <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> Piano1 </TD></TR>
<TR><TD> Drum-Cabasa </TD> <TD> Cabasa </TD></TR>
<TR><TD> Drum-Claves </TD> <TD> Claves </TD></TR>
<TR><TD> Drum-Cowbell </TD> <TD> CowBell </TD></TR>
<TR><TD> Drum-Lbell </TD> <TD> LowAgogo </TD></TR>
<TR><TD> Drum-Lbongo </TD> <TD> LowBongo </TD></TR>
<TR><TD> Drum-Lguiro </TD> <TD> LongGuiro </TD></TR>
<TR><TD> Drum-Sguiro </TD> <TD> ShortGuiro </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=SalsaSus></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> SalsaSus </H2>
Basic pattern with added strings. <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> Piano1 </TD></TR>
<TR><TD> Chord-Sus </TD> <TD> SynthStrings1 </TD></TR>
<TR><TD> Drum-Cabasa </TD> <TD> Cabasa </TD></TR>
<TR><TD> Drum-Claves </TD> <TD> Claves </TD></TR>
<TR><TD> Drum-Cowbell </TD> <TD> CowBell </TD></TR>
<TR><TD> Drum-Lbell </TD> <TD> LowAgogo </TD></TR>
<TR><TD> Drum-Lbongo </TD> <TD> LowBongo </TD></TR>
<TR><TD> Drum-Lguiro </TD> <TD> LongGuiro </TD></TR>
<TR><TD> Drum-Sguiro </TD> <TD> ShortGuiro </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=SalsaIntro></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> SalsaIntro </H2>
A 4 bar introduction. <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> Piano1 </TD></TR>
<TR><TD> Drum-Cabasa </TD> <TD> Cabasa </TD></TR>
<TR><TD> Drum-Claves </TD> <TD> Claves </TD></TR>
<TR><TD> Drum-Cowbell </TD> <TD> CowBell </TD></TR>
<TR><TD> Drum-Lbell </TD> <TD> LowAgogo </TD></TR>
<TR><TD> Drum-Lbongo </TD> <TD> LowBongo </TD></TR>
<TR><TD> Drum-Lguiro </TD> <TD> LongGuiro </TD></TR>
<TR><TD> Drum-Sguiro </TD> <TD> ShortGuiro </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=SalsaFill></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> SalsaFill </H2>
Straight, 1 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-Cabasa </TD> <TD> Cabasa </TD></TR>
<TR><TD> Drum-Claves </TD> <TD> Claves </TD></TR>
<TR><TD> Drum-Cowbell </TD> <TD> CowBell </TD></TR>
<TR><TD> Drum-Lbell </TD> <TD> LowAgogo </TD></TR>
<TR><TD> Drum-Lbongo </TD> <TD> LowBongo </TD></TR>
<TR><TD> Drum-Sguiro </TD> <TD> ShortGuiro </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=SalsaEnd></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> SalsaEnd </H2>
Fast, 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> Piano1 </TD></TR>
<TR><TD> Drum-Cabasa </TD> <TD> Cabasa </TD></TR>
<TR><TD> Drum-Claves </TD> <TD> Claves </TD></TR>
<TR><TD> Drum-Cowbell </TD> <TD> CowBell </TD></TR>
<TR><TD> Drum-Lbell </TD> <TD> LowAgogo </TD></TR>
<TR><TD> Drum-Lbongo </TD> <TD> LowBongo </TD></TR>
<TR><TD> Drum-Lguiro </TD> <TD> LongGuiro </TD></TR>
<TR><TD> Drum-Sguiro </TD> <TD> ShortGuiro </TD></TR>
</Table>
</TD></TR>
</Table>
</Body></HTML>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:12 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:30:02 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Samba</H1> <H1>Samba</H1>
@ -37,7 +37,7 @@
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%"> <Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD> <TR><TD>
<H2> SambaFill </H2> <H2> SambaFill </H2>
Adds a whistle to the sandard beat. <B>(4)</B> Adds a whistle to the standard beat. <B>(4)</B>
</TD></TR> </TD></TR>
<TR><TD> <TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%"> <Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">

View File

@ -0,0 +1,168 @@
<!-- Auto-Generated by MMA on: Sun Sep 28 11:30:02 2008 -->
<HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Showtune</H1>
<P>An attempt for an orchestral backing for showtunes. I use this for ``I Loved You Once In Silence'' from ``Camelot''. Lots of strings and no drumkit.
<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> ExtraVoice </B> </TD>
<TD Valign=Top> Voice for the alternating arpeggios in ShowTune2 (Default=TubularBells). </TD>
</TR>
<TR>
<TD Valign=Top> <B> ExtraOctave </B> </TD>
<TD Valign=Top> Octave for ExtraVoice (Default=6). </TD>
</TR>
</Table>
</TD></TR>
</Table>
<ul>
<LI><A Href=#ShowTune>ShowTune</a>
<LI><A Href=#ShowTune1>ShowTune1</a>
<LI><A Href=#ShowTune2>ShowTune2</a>
<LI><A Href=#ShowTunePlus>ShowTunePlus</a>
<LI><A Href=#ShowTune1Plus>ShowTune1Plus</a>
<LI><A Href=#ShowTune2Plus>ShowTune2Plus</a>
<LI><A Href=#ShowTuneIntro>ShowTuneIntro</a>
<LI><A Href=#ShowTuneEnd>ShowTuneEnd</a>
</ul>
<A Name=ShowTune></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> ShowTune </H2>
Basic track with strings. <B>(4)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Bass-Guitar </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Bass-Timp </TD> <TD> Timpani </TD></TR>
<TR><TD> Chord-Flute </TD> <TD> Flute </TD></TR>
<TR><TD> Chord-String </TD> <TD> Strings </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=ShowTune1></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> ShowTune1 </H2>
Add in pizzicato strings. <B>(4)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Arpeggio-Piz </TD> <TD> PizzicatoString </TD></TR>
<TR><TD> Bass-Guitar </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Bass-Timp </TD> <TD> Timpani </TD></TR>
<TR><TD> Chord-Flute </TD> <TD> Flute </TD></TR>
<TR><TD> Chord-Piz </TD> <TD> PizzicatoString </TD></TR>
<TR><TD> Chord-String </TD> <TD> Strings </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=ShowTune2></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> ShowTune2 </H2>
Basic version with extra ''stuff''. Set voice with ``ExtraVoice''. <B>(4)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Arpeggio-Extra </TD> <TD> TubularBells </TD></TR>
<TR><TD> Bass-Guitar </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Bass-Timp </TD> <TD> Timpani </TD></TR>
<TR><TD> Chord-Flute </TD> <TD> Flute </TD></TR>
<TR><TD> Chord-String </TD> <TD> Strings </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=ShowTunePlus></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> ShowTunePlus </H2>
Add trumpet arpeggios. <B>(4)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Arpeggio-Horn </TD> <TD> FrenchHorn </TD></TR>
<TR><TD> Arpeggio-Trumpet </TD> <TD> Trumpet </TD></TR>
<TR><TD> Bass-Guitar </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Bass-Timp </TD> <TD> Timpani </TD></TR>
<TR><TD> Chord-Flute </TD> <TD> Flute </TD></TR>
<TR><TD> Chord-String </TD> <TD> Strings </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=ShowTune1Plus></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> ShowTune1Plus </H2>
Add trumpets and plucked strings. <B>(4)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Arpeggio-Horn </TD> <TD> FrenchHorn </TD></TR>
<TR><TD> Arpeggio-Piz </TD> <TD> PizzicatoString </TD></TR>
<TR><TD> Arpeggio-Trumpet </TD> <TD> Trumpet </TD></TR>
<TR><TD> Bass-Guitar </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Bass-Timp </TD> <TD> Timpani </TD></TR>
<TR><TD> Chord-Flute </TD> <TD> Flute </TD></TR>
<TR><TD> Chord-Piz </TD> <TD> PizzicatoString </TD></TR>
<TR><TD> Chord-String </TD> <TD> Strings </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=ShowTune2Plus></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> ShowTune2Plus </H2>
Add trumpets and ``extra''. <B>(4)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Arpeggio-Extra </TD> <TD> TubularBells </TD></TR>
<TR><TD> Arpeggio-Horn </TD> <TD> FrenchHorn </TD></TR>
<TR><TD> Arpeggio-Trumpet </TD> <TD> Trumpet </TD></TR>
<TR><TD> Bass-Guitar </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Bass-Timp </TD> <TD> Timpani </TD></TR>
<TR><TD> Chord-Flute </TD> <TD> Flute </TD></TR>
<TR><TD> Chord-String </TD> <TD> Strings </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=ShowTuneIntro></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> ShowTuneIntro </H2>
4 bar intro with plucked strings. <B>(4)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Arpeggio-Piz </TD> <TD> PizzicatoString </TD></TR>
<TR><TD> Bass-Guitar </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Bass-Timp </TD> <TD> Timpani </TD></TR>
<TR><TD> Chord-Flute </TD> <TD> Flute </TD></TR>
<TR><TD> Chord-Piz </TD> <TD> PizzicatoString </TD></TR>
<TR><TD> Chord-String </TD> <TD> Strings </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=ShowTuneEnd></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> ShowTuneEnd </H2>
A pretty dull ending. <B>(2)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Bass-Guitar </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord-Flute </TD> <TD> Flute </TD></TR>
<TR><TD> Chord-String </TD> <TD> Strings </TD></TR>
</Table>
</TD></TR>
</Table>
</Body></HTML>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:13 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:30:03 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Shuffleboggie</H1> <H1>Shuffleboggie</H1>
@ -10,6 +10,7 @@
<LI><A Href=#ShuffleBoggieIntro>ShuffleBoggieIntro</a> <LI><A Href=#ShuffleBoggieIntro>ShuffleBoggieIntro</a>
<LI><A Href=#ShuffleBoggieIntro4>ShuffleBoggieIntro4</a> <LI><A Href=#ShuffleBoggieIntro4>ShuffleBoggieIntro4</a>
<LI><A Href=#ShuffleBoggieEnd>ShuffleBoggieEnd</a> <LI><A Href=#ShuffleBoggieEnd>ShuffleBoggieEnd</a>
<LI><A Href=#ShuffleBoggieFill>ShuffleBoggieFill</a>
</ul> </ul>
<A Name=ShuffleBoggie></a> <A Name=ShuffleBoggie></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%"> <Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
@ -133,5 +134,24 @@
</Table> </Table>
</TD></TR> </TD></TR>
</Table> </Table>
<A Name=ShuffleBoggieFill></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> ShuffleBoggieFill </H2>
Single bar fill. <B>(1)</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-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>
</Body></HTML> </Body></HTML>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:13 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:30:03 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Ska</H1> <H1>Ska</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:13 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:30:03 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Slowblues</H1> <H1>Slowblues</H1>

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:13 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:30:03 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Slowbolero</H1> <H1>Slowbolero</H1>

Some files were not shown because too many files have changed in this diff Show More