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

View File

@ -29,10 +29,12 @@ import sys
import pickle
import MMA.midi
import gbl
import MMA.parse
import gbl
from MMA.common import *
grooveDir = {}
mmadir = ".mmaDB" # constant, name of the lib database file
fileCount = 0
@ -156,9 +158,7 @@ def dolibupdate(root, subdir):
if fn.startswith('.') or fn.startswith('#'):
continue
# Create full path name
f=os.path.join(root, subdir, fn)
f=os.path.join(root, subdir, fn) # Create full path name
if os.path.isdir(f):
dolibupdate(root, os.path.join(subdir,fn)) # recursive!
@ -168,18 +168,18 @@ def dolibupdate(root, subdir):
processedFiles.append(ename)
if gdDate and grooveDir.has_key(ename) and \
os.path.getmtime(f) < gdDate:
if gdDate and ename in grooveDir and os.path.getmtime(f) < gdDate:
print " Existing: %s" % f
grooveCount += len(grooveDir[ename])
continue
if grooveDir.has_key(ename):
if ename in grooveDir:
print " Updating: %s" % f
else:
print " Creating: %s" % f
mkGrooveList = []
gbl.mtrks = {}
MMA.grooves.aliaslist = {}
for c in gbl.midiAssigns.keys():
gbl.midiAssigns[c]=[]
for a,v in enumerate(gbl.midiAvail):

View File

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

View File

@ -53,7 +53,7 @@ A = Bbb= 9
As = Bb = 10
B = Cb = 11
chords = {
chordlist = {
'M': ((C, E, G ),
(C, D, E, F, G, A, B),
"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,
not pointers. This is done so that a user redefine only affects
the original.
not pointers. This is done so that a user redefine only affects
the original.
"""
aliases = (
@ -448,14 +448,15 @@ aliases = (
('9sus', 'sus9', ''),
('9-5', '9b5', ''),
('dim3', 'mb5', 'Diminished triad (non-standard notation).'),
('omit3(add9)','omit3add9', '')
('omit3(add9)','omit3add9', ''),
('9sus4', 'sus9', '')
)
for a,b,d in aliases:
n=chords[b][0]
s=chords[b][1]
n=chordlist[b][0]
s=chordlist[b][1]
if not d:
d=chords[b][2]
d=chordlist[b][2]
chords[a] = (n, s, d)
chordlist[a] = (n, s, d)

View File

@ -59,16 +59,22 @@ def error(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)
def warning(msg):
""" Print warning message and return. """
if gbl.noWarn:
return
if not gbl.noWarn:
ln = ""
if gbl.lineno >= 0:
@ -80,7 +86,6 @@ def warning(msg):
print "Warning:%s\n %s" % (ln, msg)
def getOffset(ticks, ran=None):
""" Calculate a midi offset into a song.
@ -123,6 +128,9 @@ def stof(s, errmsg=None):
try:
return float(s)
except:
try:
return int(s,0)
except:
if errmsg:
error(errmsg)
@ -171,3 +179,34 @@ def pextract(s, open, close, onlyone=None):
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 time
import MMA.midiC
import MMA.grooves
import gbl
from MMA.common import *
import MMA.midiC
def docDrumNames(order):
@ -76,22 +80,22 @@ def docInstNames(order):
""" 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.
This is called whenever parse() encounters an EOF.
The saved docs are printed to stdout with the docDump() command.
This is called whenever parse() encounters an EOF.
Both routines are ignored if the -Dx command line option has
not been set.
Both routines are ignored if the -Dx command line option has
not been set.
Storage is done is in the following arrays.
Storage is done is in the following arrays.
"""
fname = ''
author=""
notes=""
defs=[]
variables=[]
author = ""
notes = ""
defs = []
variables = []
def docAuthor(ln):
global author
@ -104,7 +108,7 @@ def docNote(ln):
global fname, notes
if not gbl.docs or not ln:
if not gbl.createDocs or not ln:
return
# Grab the arg and data, save it
@ -119,7 +123,7 @@ def docVars(ln):
global fname, variables
if not gbl.docs or not ln:
if not gbl.createDocs or not ln:
return
fname = os.path.basename(gbl.inpath.fname)
@ -149,12 +153,13 @@ def docDefine(ln):
defs.append(l)
def docDump():
""" Print the LaTex docs. """
global fname, author, notes, defs, variables
if gbl.docs == 1: # latex docs
if gbl.createDocs == 1: # latex docs
if notes:
if fname.endswith(gbl.ext):
fname='.'.join(fname.split('.')[:-1])
@ -170,13 +175,21 @@ def docDump():
if defs:
for l in defs:
print " \\instable{%s}{%s}{%s}{" % \
(totex(l[0]), totex(l[2]), l[1] )
alias = MMA.grooves.getAlias(l[0])
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:]:
print " \\insline{%s}{%s}" % (c.title(), totex(v))
print " }"
if gbl.docs == 2: # html docs
if gbl.createDocs == 2: # html docs
if notes:
print '<!-- Auto-Generated by MMA on: %s -->' % time.ctime()
print '<HTML>'
@ -213,6 +226,13 @@ def docDump():
print '<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">'
print ' <TR><TD>'
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 ' </TD></TR>'
print ' <TR><TD>'
@ -224,13 +244,50 @@ def docDump():
print '</Table>'
print
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 = []
variables=[]
notes = ""
author = ""
def totex(s):
""" Parse a string and quote tex stuff.
@ -254,3 +311,17 @@ def totex(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

@ -97,7 +97,6 @@ class ReadFile:
try:
inpath = file(fname, 'r')
except:
error("Unable to open '%s' for input" % fname)
@ -107,7 +106,6 @@ class ReadFile:
self.fname = fname
""" Read entire file, line by line:
- strip off blanks, comments
- join continuation lines
- parse out LABELS
@ -131,10 +129,17 @@ class ReadFile:
if not l:
continue
# join lines ending in '\' (the strip() makes this the last char
while l[-1] == '\\':
l = l[0:-1] + ' ' + inpath.readline().strip()
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
comment '//', drops the comment, and splits the
@ -200,6 +205,7 @@ class ReadFile:
else:
label = None
# Save the line, linenumber and (maybe) the label.
fdata.append( dataStore(lcount, l, label))

View File

@ -24,7 +24,7 @@ Bob van der Poel <bob@mellowood.ca>
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.
It is a dict of class Mtrk() instances. Keys are the
@ -56,7 +56,7 @@ for c in range(0,17):
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
@ -64,28 +64,14 @@ deletedTracks = [] # list of deleted tracks for -c report
are names, data is a channel. Eg. midiChPrefs['BASS-SUS']==9
"""
midiChPrefs={}
midiChPrefs = {}
""" Groove storage. Each entry in settingsGroove{} has a keyname
of a saved groove.
lastGroove and currentGroove are used by macros
""" Is the -T option is used only the tracks in this list
are generated. All other tracks are muted (OFF)
"""
settingsGroove = {}
lastGroove = ''
currentGroove = ''
""" SeqRnd variable is a list. The first entry is a flag:(0, 1 or x):
0 - not set
1 - set
2 - set for specific tracks, track list starts at position [1]
"""
seqRnd = [0] # set if SEQRND has been set
muteTracks = []
############# String constants ####################
@ -104,6 +90,8 @@ tempo = 120 # current tempo
seqSize = 1 # variation sequence table size
seqCount = 0 # running count of variation
totTime = 0.0 # running duration count in seconds
transpose = 0 # Transpose is global (ignored by drum tracks)
lineno = -1 # used for error reporting
@ -114,10 +102,11 @@ 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
############# Path and search variables. #############
libPath = ''
for p in ( "c:\\mma\\lib", "/usr/local/share/mma/lib", "/usr/share/mma/lib", "./lib"):
if os.path.isdir(p):
@ -163,9 +152,11 @@ chshow = Lchshow = 0
outfile = None
infile = None
docs = 0
createDocs = 0
maxBars = 500
makeGrvDefs = 0
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

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

View File

@ -26,18 +26,21 @@ class. At the top of MMAparse an instance in created with
something like: macros=MMMmacros.Macros().
"""
import gbl
from MMA.common import *
from MMA.notelen import getNoteLen
import random
import MMA.midiC
import MMA.lyric
import MMA.translate
import MMA.patSolo
import MMA.patAria
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:
@ -90,15 +93,15 @@ class Macros:
return str(int(MMA.volume.lastVolume * 100))
elif s == 'GROOVE':
return gbl.currentGroove
return MMA.grooves.currentGroove
elif s == 'LASTGROOVE':
return gbl.lastGroove
return MMA.grooves.lastGroove
elif s == 'SEQRND':
if gbl.seqRnd[0] == 0: return "Off"
if gbl.seqRnd[0] == 1: return "On"
return ' '.join(gbl.seqRnd[1:])
if MMA.seqrnd.seqRnd[0] == 0: return "Off"
if MMA.seqrnd.seqRnd[0] == 1: return "On"
return ' '.join(MMA.seqrnd.seqRnd[1:])
elif s == 'SEQSIZE':
return str(gbl.seqSize)
@ -141,7 +144,7 @@ class Macros:
return ' '.join([str(x) for x in MMA.midi.splitChannels])
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':
return gbl.autoLib
@ -168,7 +171,7 @@ class Macros:
return str(gbl.lineno)
elif s == 'LYRIC':
return MMA.lyric.lyric.setting()
return lyric.setting()
# Track vars ... these are in format TRACKNAME_VAR
@ -179,10 +182,10 @@ class Macros:
tname = s[:a]
func = s[a+1:]
if gbl.tnames.has_key(tname):
try:
t=gbl.tnames[tname]
else:
error("System variable $_%s refers to nonexistent track" % s)
except:
error("System variable $_%s refers to nonexistent track." % s )
if func == 'ACCENT':
@ -247,6 +250,12 @@ class Macros:
elif func == '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':
if t.seqRnd: return 'On'
else: return 'Off'
@ -271,7 +280,8 @@ class Macros:
return ' '.join([str(x) for x in t.unify])
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':
if t.vtype != 'CHORD':
@ -287,7 +297,6 @@ class Macros:
error("Unknown system track variable %s" % s)
def expand(self, l):
""" Loop though input line and make variable subsitutions.
MMA variables are pretty simple ... any word starting
@ -301,23 +310,36 @@ class Macros:
if not self.expandMode:
return l
gotmath=0
while 1: # Loop until no more subsitutions have been done
sub=0
for i,s in enumerate(l):
if s[:2] == '$$':
if s[0]=='$':
s = s[1:].upper()
frst = s[0]
if frst == '$': # $$ - don't expand (done in IF clause)
continue
if s[0]=='$':
s=s[1:].upper()
elif frst == '(': # flag math macro
gotmath = 1
continue
if s.startswith('_'):
# we have a var, see if system or user. Set 'ex'
elif frst == '_': # system var
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 )
else:
ex=self.vars[s]
if type(ex) == type([]): # MSET variable
if len(ex):
@ -336,6 +358,35 @@ class Macros:
if not sub:
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
@ -567,6 +618,7 @@ class Macros:
l=l.upper()
if l[:2] == '$$':
l=l.upper()
l=l[2:]
if not l in self.vars:
error("String Variable '%s' does not exist" % l)
@ -574,10 +626,13 @@ class Macros:
try:
v=float(l)
except:
try:
v=int(l,0) # this lets us convert HEX/OCTAL
except:
v=None
return ( l, v )
return ( l.upper(), v )
def readblk():
@ -626,9 +681,9 @@ class Macros:
retpoint = 2
if action == 'DEF':
compare = self.vars.has_key(v)
compare = v in self.vars
elif action == 'NDEF':
compare = ( not self.vars.has_key(v))
compare = ( v not in self.vars )
else:
error("Unreachable unary conditional")
@ -693,4 +748,19 @@ class Macros:
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()

View File

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

View File

@ -26,9 +26,12 @@ the sequences for later recall.
"""
import MMA.midiC
import gbl
from MMA.common import *
import MMA.midiC
class Mdefine:
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
import MMA.midiC
import gbl
from MMA.common import *
splitChannels = []
def setSplitChannels(ln):
""" Parser routine, sets up list of track to split. Overwrites existing. """
@ -39,10 +39,10 @@ def setSplitChannels(ln):
splitChannels = []
for a in ln:
c = stoi(a)
if c < 1 or c >16:
error("SplitChannels: Expecting value 1 to 16, not %s" % c)
splitChannels.append(c)
a = stoi(a)
if a < 1 or a >16:
error("SplitChannels: Expecting value 1 to 16, not %s" % a)
splitChannels.append(a)
if gbl.debug:
print "SplitChannels: ",
@ -106,15 +106,16 @@ def writeTracks(out):
def writeSplitTrack(channel, out):
""" Split a drum track into a separate track for the non-note
stuff and then a track for each note.
""" Split a track. In drum tracks this puts different instruments
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
""" A dict to store the split midi tracks. We'll end out with
a track for each pitch which appears in the track and
a track (labeled -1) to store every other than note on data.
a track (labeled -1) to store every other-than-note-on data.
"""
notes={}
@ -130,7 +131,7 @@ def writeSplitTrack(channel, out):
else:
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)
if offset in notes[n].miditrk: # copy event to new track
@ -149,7 +150,7 @@ def writeSplitTrack(channel, out):
if channel == 10:
m = "%s" % MMA.midiC.valueToDrum(a)
else:
m= "%s-%s" % (gbl.mtrks[channel].trackname, a)
m = "%s-%s" % (gbl.mtrks[channel].trackname, a)
notes[a].addTrkName(0, m)
@ -166,8 +167,7 @@ def writeSplitTrack(channel, out):
def mkHeader(count, tempo, Mtype):
return "MThd" + intToLong(6) + intToWord(Mtype) + \
intToWord(count) + intToWord(tempo)
return "MThd" + intToLong(6) + intToWord(Mtype) + intToWord(count) + intToWord(tempo)
""" Midi track class. All the midi creation is done here.
@ -188,7 +188,7 @@ class Mtrk:
tr=self.miditrk
lg=len(cmd)
if tr.has_key(offset):
if offset in tr:
for i,a in enumerate(tr[offset]):
if a[0:lg] == cmd:
del tr[offset][i]
@ -221,11 +221,13 @@ class Mtrk:
self.delDup(offset, cmd)
self.addToTrack(offset, cmd + chr(0x02) + chr(n) + chr(mi) )
def addMarker(self, offset, msg):
""" Create a midi MARKER event."""
self.addToTrack(offset, chr(0xff) + chr(0x06) + intToVarNumber(len(msg)) + msg )
def addText(self, offset, msg):
""" Create a midi TextEvent."""
@ -251,16 +253,25 @@ class Mtrk:
self.addToTrack(offset, cmd + intToVarNumber(len(msg)) + msg )
def addProgChange( self, offset, program):
""" Create a midi program change.
def addProgChange( self, offset, program, oldprg):
""" Create a midi program change (handles extended voicing).
program - midi program
Returns - packed string
program - The MIDI program (voice) value
oldprg - existing MIDI program
"""
self.addToTrack(offset,
chr(0xc0 | self.channel) + chr(program) )
v1, lsb1, msb1 = MMA.midiC.voice2tup(oldprg)
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):
@ -272,22 +283,17 @@ class Mtrk:
"""
if v == 0:
self.addToTrack(offset,
chr(0xb0 | self.channel) + chr(0x41) + chr(0x00) )
self.addToTrack(offset, chr(0xb0 | self.channel) + chr(0x41) + chr(0x00) )
else:
self.addToTrack(offset,
chr(0xb0 | self.channel) + chr(0x41) + chr(0x7f) )
self.addToTrack(offset,
chr(0xb0 | self.channel) + chr(0x05) + chr(v) )
self.addToTrack(offset, chr(0xb0 | self.channel) + chr(0x41) + chr(0x7f) )
self.addToTrack(offset, chr(0xb0 | self.channel) + chr(0x05) + chr(v) )
def addPan(self, offset, v):
""" Set the lsb of the pan setting."""
self.addToTrack(offset,
chr(0xb0 | self.channel) + chr(0x0a) + chr(v) )
self.addToTrack(offset, chr(0xb0 | self.channel) + chr(0x0a) + chr(v) )
def addCtl(self, offset, l):
@ -334,6 +340,21 @@ class Mtrk:
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
was set) an on/off beep at offset 0. This makes for
easier sync in multi-tracks.
@ -360,8 +381,8 @@ class Mtrk:
# Convert all events to MIDI deltas and store in
# the track array/list
tdata=[] # empty track container
lastSts=None # Running status tracker
tdata = [] # empty track container
lastSts = None # Running status tracker
for a in sorted(tr.keys()):
delta = a-last
@ -433,7 +454,6 @@ class Mtrk:
Pair1 | on | | |
Pair2 | | | | off
"""
# Start/end offsets
@ -520,11 +540,11 @@ class Mtrk:
MIDI data is saved as created in track structures.
Each track has a miditrk dictionary entry which used
the time offsets and keys and has the various events
as data. Each event is packed string of bytes and
as data. Each event is a packed string of bytes and
the events are stored as a list in the order they are
created. Our storage looks like:
miditrk[123] = [event1, event2, ...]
miditrk[OFFSET_VALUE] = [event1, event2, ...]
"""
if offset<0:
@ -538,8 +558,6 @@ class Mtrk:
tr[offset]=[event]
class TimeSig:
""" 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.miditables import *
def drumToValue(name):
""" Get the value of the drum tone (-1==error). """
try:
v=int(name, 0)
except:
try:
v = upperDrumNames.index(name.upper()) + 27
except ValueError:
error("Expecting a valid drum name or value for drum tone, not '%s'" % name)
def voice2tup(x):
""" Convert integer into 3 byte tuple: Voice, LSB, MSB. """
if v <0 or v > 127:
error("Note in Drum Tone list must be 0..127, not %s" % v)
if x>0xffff:
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
###############################
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):
""" Get the value of the instrument name (-1==error). """
try:
return upperVoiceNames.index(name.upper())
except ValueError:
return voiceInx[name.upper()]
except KeyError:
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):
""" Get the name of the inst. (or 'ERR'). """
try:
return voiceNames[val]
except IndexError:
except KeyError:
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:
return str(val)
else:
return drumNames[val-27]
def ctrlToValue(name):
""" Get the value of the controler name (-1==error). """
try:
return ctrlInx[name.upper()]
except keyError:
return -1
def valueToCtrl(val):
""" Get the name of the controller (or 'ERR'). """
try:
return ctrlNames[val]
except IndexError:
except KeyError:
return "ERROR"

View File

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

View File

@ -27,140 +27,252 @@ MIDI controllers.
Having only the constants in this separate file permits to
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
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]
# Standard GM voice names.
voiceNames=[
'Piano1', 'Piano2','Piano3',
'Honky-TonkPiano', 'RhodesPiano', 'EPiano',
'HarpsiChord', 'Clavinet', 'Celesta',
'Glockenspiel', 'MusicBox', 'Vibraphone',
'Marimba', 'Xylophone', 'TubularBells', 'Santur',
'Organ1', 'Organ2', 'Organ3', 'ChurchOrgan',
'ReedOrgan', 'Accordion', 'Harmonica',
'Bandoneon', 'NylonGuitar', 'SteelGuitar',
'JazzGuitar', 'CleanGuitar', 'MutedGuitar',
'OverDriveGuitar', 'DistortonGuitar',
'GuitarHarmonics', 'AcousticBass',
'FingeredBass', 'PickedBass', 'FretlessBass',
'SlapBass1', 'SlapBass2', 'SynthBass1',
'SynthBass2', 'Violin', 'Viola', 'Cello',
'ContraBass', 'TremoloStrings',
'PizzicatoString', 'OrchestralHarp', 'Timpani',
'Strings', 'SlowStrings', 'SynthStrings1',
'SynthStrings2', 'ChoirAahs', 'VoiceOohs',
'SynthVox', 'OrchestraHit', 'Trumpet',
'Trombone', 'Tuba', 'MutedTrumpet', 'FrenchHorn',
'BrassSection', 'SynthBrass1', 'SynthBrass2',
'SopranoSax', 'AltoSax', 'TenorSax',
'BaritoneSax', 'Oboe', 'EnglishHorn', 'Bassoon',
'Clarinet', 'Piccolo', 'Flute', 'Recorder',
'PanFlute', 'BottleBlow', 'Shakuhachi',
'Whistle', 'Ocarina', 'SquareWave', 'SawWave',
'SynCalliope', 'ChifferLead', 'Charang',
'SoloVoice', '5thSawWave', 'Bass&Lead',
'Fantasia', 'WarmPad', 'PolySynth', 'SpaceVoice',
'BowedGlass', 'MetalPad', 'HaloPad', 'SweepPad',
'IceRain', 'SoundTrack', 'Crystal', 'Atmosphere',
'Brightness', 'Goblins', 'EchoDrops',
'StarTheme', 'Sitar', 'Banjo', 'Shamisen',
'Koto', 'Kalimba', 'BagPipe', 'Fiddle', 'Shanai',
'TinkleBell', 'AgogoBells', 'SteelDrums',
'WoodBlock', 'TaikoDrum', 'MelodicTom1',
'SynthDrum', 'ReverseCymbal', 'GuitarFretNoise',
'BreathNoise', 'SeaShore', 'BirdTweet',
'TelephoneRing', 'HelicopterBlade',
'Applause/Noise', 'GunShot' ]
voiceNames={
0:'Piano1', 1:'Piano2', 2:'Piano3',
3:'Honky-TonkPiano', 4:'RhodesPiano', 5:'EPiano',
6:'HarpsiChord', 7:'Clavinet', 8:'Celesta',
9:'Glockenspiel', 10:'MusicBox', 11:'Vibraphone',
12:'Marimba', 13:'Xylophone', 14:'TubularBells',
15:'Santur', 16:'Organ1', 17:'Organ2',
18:'Organ3', 19:'ChurchOrgan', 20:'ReedOrgan',
21:'Accordion', 22:'Harmonica', 23:'Bandoneon',
24:'NylonGuitar', 25:'SteelGuitar', 26:'JazzGuitar',
27:'CleanGuitar', 28:'MutedGuitar', 29:'OverDriveGuitar',
30:'DistortonGuitar', 31:'GuitarHarmonics', 32:'AcousticBass',
33:'FingeredBass', 34:'PickedBass', 35:'FretlessBass',
36:'SlapBass1', 37:'SlapBass2', 38:'SynthBass1',
39:'SynthBass2', 40:'Violin', 41:'Viola',
42:'Cello', 43:'ContraBass', 44:'TremoloStrings',
45:'PizzicatoString', 46:'OrchestralHarp', 47:'Timpani',
48:'Strings', 49:'SlowStrings', 50:'SynthStrings1',
51:'SynthStrings2', 52:'ChoirAahs', 53:'VoiceOohs',
54:'SynthVox', 55:'OrchestraHit', 56:'Trumpet',
57:'Trombone', 58:'Tuba', 59:'MutedTrumpet',
60:'FrenchHorn', 61:'BrassSection', 62:'SynthBrass1',
63:'SynthBrass2', 64:'SopranoSax', 65:'AltoSax',
66:'TenorSax', 67:'BaritoneSax', 68:'Oboe',
69:'EnglishHorn', 70:'Bassoon', 71:'Clarinet',
72:'Piccolo', 73:'Flute', 74:'Recorder',
75:'PanFlute', 76:'BottleBlow', 77:'Shakuhachi',
78:'Whistle', 79:'Ocarina', 80:'SquareWave',
81:'SawWave', 82:'SynCalliope', 83:'ChifferLead',
84:'Charang', 85:'SoloVoice', 86:'5thSawWave',
87:'Bass&Lead', 88:'Fantasia', 89:'WarmPad',
90:'PolySynth', 91:'SpaceVoice', 92:'BowedGlass',
93:'MetalPad', 94:'HaloPad', 95:'SweepPad',
96:'IceRain', 97:'SoundTrack', 98:'Crystal',
99:'Atmosphere', 100:'Brightness', 101:'Goblins',
102:'EchoDrops', 103:'StarTheme', 104:'Sitar',
105:'Banjo', 106:'Shamisen', 107:'Koto',
108:'Kalimba', 109:'BagPipe', 110:'Fiddle',
111:'Shanai', 112:'TinkleBell', 113:'AgogoBells',
114:'SteelDrums', 115:'WoodBlock', 116:'TaikoDrum',
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 = [
### also see: http://www.midi.org/about-midi/table3.shtml
# 0-31 Double Precise Controllers MSB (14-bits, 16,384 values)
# 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
### MSB (14-bits, 16,384 values)
ctrlNames = {
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',
'Foot', 'Portamento', 'Data', 'Volume',
'Balance', 'Ctrl9', 'Pan', 'Expression',
'Effect1', 'Effect2', 'Ctrl14', 'Ctrl15',
'General1','General2','General3','General4',
'Ctrl20', 'Ctrl21', 'Ctrl22', 'Ctrl23',
'Ctrl24', 'Ctrl25', 'Ctrl26', 'Ctrl27',
'Ctrl28', 'Ctrl29', 'Ctrl30', 'Ctrl31',
### 32-63 Double Precise Controllers
### LSB (14-bits, 16,384 values)
'BankLSB', 'ModulationLSB', 'BreathLSB',
'Ctrl35', 'FootLSB', 'PortamentoLSB',
'DataLSB','VolumeLSB','BalanceLSB',
'Ctrl41','PanLSB','ExpressionLSB',
'Effect1LSB', 'Effect2LSB','Ctrl46', 'Ctrl47',
'General1LSB','General2LSB', 'General3LSB',
'General4LSB', 'Ctrl52','Ctrl53', 'Ctrl54',
'Ctrl55', 'Ctrl56', 'Ctrl57', 'Ctrl58',
'Ctrl59', 'Ctrl60', 'Ctrl61', 'Ctrl62',
'Ctrl63',
ctrlInx = {
'BANK':0, 'MODULATION':1, 'BREATH':2,
'CTRL3':3, 'FOOT':4, 'PORTAMENTO':5,
'DATA':6, 'VOLUME':7, 'BALANCE':8,
'CTRL9':9, 'PAN':10, 'EXPRESSION':11,
'EFFECT1':12, 'EFFECT2':13, 'CTRL14':14,
'CTRL15':15, 'GENERAL1':16, 'GENERAL2':17,
'GENERAL3':18, 'GENERAL4':19, 'CTRL20':20,
'CTRL21':21, 'CTRL22':22, 'CTRL23':23,
'CTRL24':24, 'CTRL25':25, 'CTRL26':26,
'CTRL27':27, 'CTRL28':28, 'CTRL29':29,
'CTRL30':30, 'CTRL31':31, 'BANKLSB':32,
'MODULATIONLSB':33, 'BREATHLSB':34, 'CTRL35':35,
'FOOTLSB':36, 'PORTAMENTOLSB':37, 'DATALSB':38,
'VOLUMELSB':39, 'BALANCELSB':40, 'CTRL41':41,
'PANLSB':42, 'EXPRESSIONLSB':43, 'EFFECT1LSB':44,
'EFFECT2LSB':45, 'CTRL46':46, 'CTRL47':47,
'GENERAL1LSB':48, 'GENERAL2LSB':49, 'GENERAL3LSB':50,
'GENERAL4LSB':51, 'CTRL52':52, 'CTRL53':53,
'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
from MMA.common import *

View File

@ -28,23 +28,22 @@ Bob van der Poel <bob@mellowood.ca>
import getopt
import sys
import gbl
from MMA.common import *
import MMA.docs
import MMA.parse
import MMA.alloc
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():
""" Option parser. """
try:
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:
usage()
@ -110,24 +109,32 @@ def opts():
else:
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':
if a == 'xl':
gbl.docs = 1
gbl.createDocs = 1
elif a == 'xh':
gbl.docs = 2
gbl.createDocs = 2
elif a == 'v':
gbl.createDocs = 3
elif a == 'k':
def pl(msg, lst):
def pl(msg, lst, adds):
print msg,
for i in sorted(lst.keys()):
for i in sorted(lst.keys() + adds):
print i,
print "\n"
pl("Base track names:", MMA.alloc.trkClasses )
pl("Commands:", MMA.parse.simpleFuncs)
pl("TrackCommands:", MMA.parse.trackFuncs)
pl("Base track names:", MMA.alloc.trkClasses, [])
pl("Commands:", MMA.parse.simpleFuncs,
["BEGIN", "END",] )
pl("TrackCommands:", MMA.parse.trackFuncs, [])
print "Not complete ... subcommands, comments, chords..."
sys.exit(0)
@ -138,14 +145,25 @@ def opts():
elif o == '-0':
gbl.synctick = 1
elif o == '-1':
gbl.endsync = 1
elif o == '-P':
gbl.playFile = 1
else:
usage() # unreachable??
if args:
if gbl.infile:
usage("Only one input filename is permitted.")
gbl.infile = args.pop(0)
# we have processed all the args. Should just have a filename left
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=''):
""" Usage message. """
@ -162,6 +180,7 @@ def usage(msg=''):
" -Dk print list of MMA keywords",
" -Dxl eXtract Latex 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",
" -f <file> set output Filename",
" -g update Groove dependency database",
@ -175,9 +194,11 @@ def usage(msg=''):
" -r display Running progress",
" -s display Sequence info during run",
" -S <var[=data]> Set macro 'var' to 'data'",
" -T <tracks> Limit generation to specified tracks",
" -v display Version number",
" -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:

View File

@ -34,35 +34,39 @@ import random
import copy
import gbl
from MMA.common import *
import MMA.notelen
import MMA.chords
import MMA.file
import MMA.docs
import MMA.midi
import MMA.midiIn
import MMA.grooves
import MMA.docs
import MMA.auto
from MMA.alloc import trackAlloc
from MMA.common import *
import MMA.translate
from MMA.lyric import lyric
import MMA.patSolo
from MMA.macro import macros
import MMA.mdefine
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.
beginData = [] # Current data set by a BEGIN statement
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
""" This table is passed to the track classes. It has
an instance for each chord in the current bar.
"""
@ -105,7 +109,6 @@ def parse(inpath):
""" Process a mma input file. """
global beginData, lastChord
global groovesList, groovesCount
gbl.inpath = inpath
@ -130,18 +133,22 @@ def parse(inpath):
encountered.
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()
if key == 'BEGIN':
action=l[0].upper() # 1st arg in line
if action == 'BEGIN':
if not l:
error("Use: Begin STUFF")
beginPoints.append(len(beginData))
beginData.extend(l[1:])
continue
if key == 'END':
if action == 'END':
if len(l) > 1:
error("No arguments permitted for END")
if not beginData:
@ -151,9 +158,9 @@ def parse(inpath):
if beginData:
l = beginData + l
action = l[0].upper()
if gbl.showExpand and action !='REPEAT':
print l
@ -197,7 +204,7 @@ def parse(inpath):
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:]
if not l: # ignore empty lines
continue
@ -221,26 +228,28 @@ def parse(inpath):
l = ' '.join(l)
l = MMA.patSolo.extractSolo(l, rptcount)
""" Set lyrics from [stuff] in the current line or
stuff previously stored with LYRICS SET.
""" Set lyrics from [stuff] in the current line.
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 = l.split()
""" At this point we have only chord info. A number
of sanity checks are made:
1. Make sure there is some chord data,
2. Ensure the correct number of chords.
"""
l = l.split()
if not l:
error("Expecting music (chord) data. Even lines with\n"
" lyrics or solos still need a chord")
i = gbl.QperBar - len(l)
if i<0:
if i < 0:
error("Too many chords in line. Max is %s, not %s" %
(gbl.QperBar, len(l) ) )
if i:
@ -249,7 +258,7 @@ def parse(inpath):
""" 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
a list of CTables, one for each beat division.
@ -275,19 +284,24 @@ def parse(inpath):
# 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:
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:
gbl.seqCount = randomSeq
""" Set up for rnd seq. This may set the current seq point. If return
is >=0 then we're doing track rnd.
"""
rsq, seqlist = MMA.seqrnd.setseq()
""" Process each track. It is important that the track classes
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():
if rsq >= 0:
seqSave = gbl.seqCount
if a.name in gbl.seqRnd:
gbl.seqCount = randomSeq
if a.name in seqlist: # for seqrnd with tracklist
gbl.seqCount = rsq
a.bar(ctable) ## process entire bar!
if rsq >= 0:
gbl.seqCount = seqSave
# Adjust counters
gbl.totTime += float(gbl.QperBar) / gbl.tempo
gbl.barNum += 1
if gbl.barNum > gbl.maxBars:
@ -316,27 +334,7 @@ def parse(inpath):
gbl.seqCount = (gbl.seqCount+1) % gbl.seqSize
""" Handle groove lists. 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).
"""
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
MMA.grooves.nextGroove() # using groove list? Advance.
# Enabled with the -r command line option
@ -519,7 +517,7 @@ def repeat(ln):
while 1:
if act in ('REPEATEND', 'ENDREPEAT'):
if l:
l=macros.expand(l)
l = macros.expand(l)
if len(l) == 2 and l[0].upper() == 'NOWARN':
l=l[1:]
warn=0
@ -561,7 +559,7 @@ def repeat(ln):
ending = 1
if l:
l=macros.expand(l)
l = macros.expand(l)
if len(l) == 2 and l[0].upper() == 'NOWARN':
warn=0
l=l[1:]
@ -701,6 +699,9 @@ def tempo(ln):
print "Set future Tempo to %s over %s beats" % \
( int(tempo), numbeats)
if gbl.tempo <=0:
error("Tempo setting must be greater than 0.")
def beatAdjust(ln):
""" Delete or insert some beats into the sequence.
@ -717,6 +718,8 @@ def beatAdjust(ln):
gbl.tickOffset += int(adj * gbl.BperQ)
gbl.totTime += adj / gbl.tempo # adjust total time
if gbl.debug:
print "BeatAdjust: inserted %s at bar %s." % (adj, gbl.barNum + 1)
@ -803,204 +806,6 @@ def fermata(ln):
% (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
@ -1047,10 +852,9 @@ def usefile(ln):
"""
slot = gmagic
grooveDefineDo(slot)
MMA.grooves.grooveDefineDo(slot)
parseFile(fn)
grooveDo(slot)
MMA.grooves.grooveDo(slot)
def mmastart(ln):
if not ln:
@ -1099,9 +903,9 @@ def setAutoPath(ln):
# To avoid conflicts, delete all existing grooves (current seq not effected)
gbl.settingsGroove = {}
gbl.lastGroove = ''
gbl.currentGroove = ''
MMA.grooves.glist = {}
MMA.grooves.lastGroove = ''
MMA.grooves.currentGroove = ''
if gbl.debug:
print "AutoLibPath set to", f
@ -1135,6 +939,20 @@ def setOutPath(ln):
else:
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):
""" Set the length of sequences. """
global seqRndWeight
if len(ln) !=1:
error("Usage 'SeqSize N'")
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
gbl.seqCount = 0
@ -1164,7 +983,7 @@ def seqsize(ln):
for a in gbl.tnames.values():
a.setSeqSize()
seqRndWeight = seqBump(seqRndWeight)
MMA.seqrnd.seqRndWeight = seqBump(MMA.seqrnd.seqRndWeight)
if gbl.debug:
print "Set SeqSize to ", n
@ -1193,9 +1012,9 @@ def seq(ln):
gbl.seqCount = s-1
if gbl.seqRnd[0] == 1:
if MMA.seqrnd.seqRnd[0] == 1:
warning("SeqRnd has been disabled by a Seq command")
seqRnd = [0]
MMA.seqrnd.seqRnd = [0]
def seqClear(ln):
@ -1209,67 +1028,9 @@ def seqClear(ln):
n.clearSequence()
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):
""" Restart all tracks to almost-default condidions. """
@ -1448,6 +1209,20 @@ def setTimeSig(ln):
#######################################
# 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):
""" Reseed the random number generator. """
@ -1486,7 +1261,7 @@ def lnPrint(ln):
def printActive(ln):
""" 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()):
f=gbl.tnames[a]
@ -1700,31 +1475,6 @@ def trackRestart(name, ln):
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):
""" Set a riff for a track. """
@ -1776,6 +1526,8 @@ def trackRvolume(name, ln):
gbl.tnames[name].setRVolume(ln)
def trackSwell(name, ln):
gbl.tnames[name].setSwell(ln)
def trackCresc(name, ln):
gbl.tnames[name].setCresc(1, ln)
@ -2125,11 +1877,10 @@ def trackVoice(name, ln):
def trackPan(name, ln):
""" Set the Midi Pan value for a track."""
if len(ln) != 1:
error("Use: %s PAN NN" % name)
gbl.tnames[name].setPan(ln[0])
if len(ln)==1 or len(ln)==3:
gbl.tnames[name].setPan(ln)
else:
error("Use %s MidiPAN [Value] OR [Initvalue DestValue Beats]." % name)
def trackOff(name, ln):
""" Turn a track off """
@ -2253,19 +2004,22 @@ def trackUnify(name, ln):
simpleFuncs={
'ADJUSTVOLUME': MMA.volume.adjvolume,
'ALLGROOVES': MMA.grooves.allgrooves,
'ALLTRACKS': allTracks,
'AUTHOR': MMA.docs.docAuthor,
'AUTOSOLOTRACKS': MMA.patSolo.setAutoSolo,
'BEATADJUST': beatAdjust,
'CHANNELPREF': setChPref,
'CHORDADJUST': MMA.chords.chordAdjust,
'COMMENT': comment,
'CRESC': MMA.volume.setCresc,
'CUT': cut,
'DEBUG': setDebug,
'DEC': macros.vardec,
'DECRESC': MMA.volume.setDecresc,
'DEFALIAS': MMA.grooves.grooveAlias,
'DEFCHORD': MMA.chords.defChord,
'DEFGROOVE': grooveDefine,
'DEFGROOVE': MMA.grooves.grooveDefine,
'DELETE': deleteTrks,
'DOC': MMA.docs.docNote,
'DOCVAR': MMA.docs.docVars,
@ -2277,8 +2031,8 @@ simpleFuncs={
'EOF': eof,
'FERMATA': fermata,
'GOTO': goto,
'GROOVE': groove,
'GROOVECLEAR': grooveClear,
'GROOVE': MMA.grooves.groove,
'GROOVECLEAR': MMA.grooves.grooveClear,
'IF': macros.varIF,
'IFEND': ifend,
'INC': macros.varinc,
@ -2297,7 +2051,7 @@ simpleFuncs={
'MSET': macros.msetvar,
'MSETEND': endmset,
'NEWSET': macros.newsetvar,
'CHORDADJUST': MMA.chords.chordAdjust,
'PATCH': MMA.patch.patch,
'PRINT': lnPrint,
'PRINTACTIVE': printActive,
'PRINTCHORD': MMA.chords.printChord,
@ -2309,17 +2063,20 @@ simpleFuncs={
'RNDSET': macros.rndvar,
'SEQ': seq,
'SEQCLEAR': seqClear,
'SEQRND': setSeqRnd,
'SEQRNDWEIGHT': setSeqRndWeight,
'SEQRND': MMA.seqrnd.setSeqRnd,
'SEQRNDWEIGHT': MMA.seqrnd.setSeqRndWeight,
'SEQSIZE': seqsize,
'SET': macros.setvar,
'SETAUTOLIBPATH': setAutoPath,
'SETINCPATH': setIncPath,
'SETLIBPATH': setLibPath,
'SETMIDIPLAYER': setMidiPlayer,
'SETOUTPATH': setOutPath,
'SHOWVARS': macros.showvars,
'STACKVALUE': macros.stackValue,
'SWELL': MMA.volume.setSwell,
'SWINGMODE': MMA.notelen.swingMode,
'SYNCHRONIZE': synchronize,
'TEMPO': tempo,
'TIME': setTime,
'TIMESIG': setTimeSig,
@ -2350,7 +2107,7 @@ trackFuncs={
'DRUMTYPE': trackDrumType,
'DUPROOT': trackDupRoot,
'FORCEOUT': trackForceOut,
'GROOVE': trackGroove,
'GROOVE': MMA.grooves.trackGroove,
'HARMONY': trackHarmony,
'HARMONYONLY': trackHarmonyOnly,
'HARMONYVOLUME': trackHarmonyVolume,
@ -2379,6 +2136,7 @@ trackFuncs={
'SEQRND': trackSeqRnd,
'SEQUENCE': trackSequence,
'SEQRNDWEIGHT': trackSeqRndWeight,
'SWELL': trackSwell,
'NOTESPAN': trackSpan,
'STRUM': trackStrum,
'TONE': trackTone,

View File

@ -28,15 +28,18 @@ import copy
import random
import math
import gbl
from MMA.common import *
from MMA.notelen import getNoteLen
import MMA.notelen
import MMA.translate
import MMA.midi
import MMA.midiC
import MMA.alloc
import MMA.mdefine
import MMA.volume
import MMA.alloc
import MMA.seqrnd
import gbl
from MMA.common import *
class Voicing:
def __init__(self):
@ -49,13 +52,6 @@ class Voicing:
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
@ -100,9 +96,13 @@ class PC:
self.clearSequence()
self.nextVolume = None
self.inited = 1
if gbl.muteTracks and nm not in gbl.muteTracks:
self.disable = 1
##########################################
## These are called from process() to set options
@ -110,7 +110,7 @@ class PC:
def setCompress(self, ln):
""" set/unset the compress flag. """
ln=self.lnExpand(ln, 'Compress')
ln = lnExpand(ln, '%s Compress' % self.name)
tmp = []
@ -140,7 +140,7 @@ class PC:
def setRange(self, ln):
""" set range. """
ln=self.lnExpand(ln, 'Range')
ln = lnExpand(ln, '%s Range' % self.name)
tmp = []
@ -357,7 +357,6 @@ class PC:
self.voice = gbl.tnames[sc].voice[:]
self.octave = gbl.tnames[sc].octave[:]
# Update the avail. lists
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)
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:
error("PAN value must be 0..127")
ticks = beats * gbl.BperQ # convert beats to midi ticks
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:
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,6 +466,10 @@ class PC:
def setOn(self):
""" Turn ON track. """
if gbl.muteTracks and self.name not in gbl.muteTracks:
warning("Attempt to enable muted track %s ignored." % self.name)
else:
self.disable = 0
self.ssvoice = -1
@ -448,7 +490,7 @@ class PC:
def setRVolume(self, ln):
""" Set the volume randomizer for a track. """
ln = self.lnExpand(ln, 'RVolume')
ln = lnExpand(ln, '%s RVolume' % self.name)
tmp = []
for n in ln:
@ -475,7 +517,7 @@ class PC:
def setRSkip(self, ln):
""" Set the note random skip factor for a track. """
ln = self.lnExpand(ln, 'RSkip')
ln = lnExpand(ln, '%s RSkip' % self.name)
tmp = []
for n in ln:
@ -498,7 +540,7 @@ class PC:
def setRTime(self, ln):
""" Set the timing randomizer for a track. """
ln=self.lnExpand(ln, 'RTime')
ln = lnExpand(ln, '%s RTime' % self.name)
tmp = []
for n in ln:
@ -538,7 +580,7 @@ class PC:
def setRndWeight(self, ln):
""" Set weighting factors for seqrnd. """
ln = self.lnExpand(ln, "SeqRndWeight")
ln = lnExpand(ln, "%s SeqRndWeight" % self.name)
tmp = []
for n in ln:
@ -556,7 +598,7 @@ class PC:
def setDirection(self, ln):
""" Set scale direction. """
ln = self.lnExpand(ln, "Direction")
ln = lnExpand(ln, "%s Direction" % self.name)
tmp = []
for n in ln:
@ -594,7 +636,7 @@ class PC:
by one rotation for each value.
"""
ln=self.lnExpand(ln, "Invert")
ln = lnExpand(ln, "%s Invert" % self.name)
vwarn = 0
tmp = []
@ -623,7 +665,7 @@ class PC:
def setOctave(self, ln):
""" Set the octave for a track. """
ln=self.lnExpand(ln, 'Octave')
ln = lnExpand(ln, '%s Octave' % self.name)
tmp = []
for n in ln:
@ -662,7 +704,7 @@ class PC:
def setHarmony(self, ln):
""" Set the harmony. """
ln=self.lnExpand(ln, 'Harmony')
ln = lnExpand(ln, '%s Harmony' % self.name)
tmp = []
for n in ln:
@ -686,7 +728,7 @@ class PC:
""" Set the harmony only. """
ln=self.lnExpand(ln, 'HarmonyOnly')
ln = lnExpand(ln, '%s HarmonyOnly' % self.name)
tmp = []
for n in ln:
@ -710,7 +752,7 @@ class PC:
def setHarmonyVolume(self, ln):
""" Set harmony volume adjustment. """
ln=self.lnExpand(ln, 'HarmonyOnly')
ln = lnExpand(ln, '%s HarmonyOnly' % self.name)
tmp = []
for n in ln:
@ -768,21 +810,43 @@ class PC:
Note, this just sets flags, the voice is set in bar().
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 = []
for n in ln:
n = MMA.translate.vtable.get(n)
a=MMA.midiC.instToValue(n)
voc=MMA.midiC.instToValue(n)
if a < 0:
a=stoi(n, "Expecting a valid voice name or value, "
"not '%s'" % n)
if a <0 or a > 127:
error("Voice must be 0..127")
tmp.append( a )
if voc < 0 and n[0].isalpha():
error("Voice '%s' is not defined." % n)
if voc < 0: # not a valid name, assume vv.msb(ctrl0).lsb(ctrl32) value
nn = n.split('.')
if len(nn) > 3 or len(nn) < 1:
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)
@ -794,11 +858,10 @@ class PC:
warning("Track %s is shared with %s,\n"
" changing voice may create conflict" % (a,self.name))
if gbl.debug:
print "Set %s Voice to:" % self.name,
for a in self.voice:
print MMA.midiC.valueToInst(a),
for i in self.voice:
print MMA.midiC.valueToInst(i),
print
@ -829,6 +892,11 @@ class PC:
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):
""" Set a midi sequence for a track.
@ -842,7 +910,7 @@ class PC:
""" lnExpand() works here! The midi data has been converted to
pseudo-macros already in the parser. """
ln=self.lnExpand(ln, "MidiSeq")
ln = lnExpand(ln, "%s MidiSeq" % self.name)
seq = []
for a in ln:
@ -875,7 +943,7 @@ class PC:
""" lnExpand() works here! The midi data has been converted to
pseudo-macros already in the parser. """
ln = self.lnExpand(ln, 'MIDIVoice')
ln = lnExpand(ln, '%s MIDIVoice' % self.name)
seq = []
for a in ln:
@ -916,7 +984,7 @@ class PC:
ln[] not nesc. correct length
"""
ln=self.lnExpand(ln, 'Volume')
ln = lnExpand(ln, '%s Volume' % self.name)
tmp = [None] * len(ln)
for i,n in enumerate(ln):
@ -944,6 +1012,9 @@ class PC:
self.setVolume([ln[0]])
ln=ln[1:]
if len(ln) != 2:
error("Cresc expecting 2 or 3 args.")
vol = self.volume[0]
if self.volume.count(vol) != len(self.volume):
@ -951,6 +1022,52 @@ class PC:
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):
""" Mallet (repeat) settngs. """
@ -962,7 +1079,7 @@ class PC:
error("Each Mallet option must contain a '=', not '%s'" % l)
if mode == 'RATE':
self.mallet = getNoteLen(val)
self.mallet = MMA.notelen.getNoteLen(val)
elif mode == 'DECAY':
val = stof(val, "Mallet Decay must be a value, not '%s'" % val)
@ -983,8 +1100,15 @@ class PC:
tmp = []
""" We can do "Track Accent 1 20 3 -10" or "Track Accent {1 20 3 -10}"
or even something like "Track Accent {1 20} / {/} {3 20}"
""" 2 ways to call this:
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.
"""
@ -992,27 +1116,19 @@ class PC:
if not ln.startswith('{'):
ln='{' + ln +"}"
# Convert string to list. One entry per seq.
l=[]
while ln:
if not ln.startswith("{"):
if ln[0]=='/':
l.append('/')
ln=ln[1:].strip()
else:
error("Unknown value in %s Accent: %s" % (self.name, ln[0]))
else:
if ln[0] == "/": # / not delimited with {}
ln = "{/}" + ln[1:]
a,b = pextract(ln, "{", "}", 1)
ln=a.strip()
if len(b)==1 and b[0]=='/':
if len(b)==1 and b[0]=='/': # convert ['/'] to '/' for lnExpand()
l.append('/')
else:
l.append(b[0].split())
ln=self.lnExpand(l, 'Accent')
ln = lnExpand(l, '%s Accent' % self.name)
for l in ln:
tt=[]
@ -1021,7 +1137,7 @@ class PC:
for b, v in zip(l[::2], l[1::2]):
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:
error("Velocity adjustment (as percentage) must "
"be -100..100, not '%s'" % v)
@ -1044,7 +1160,7 @@ class PC:
def setArtic(self, ln):
""" Set the note articuation value. """
ln=self.lnExpand(ln, 'Articulate')
ln = lnExpand(ln, '%s Articulate' % self.name)
tmp = []
for n in ln:
@ -1067,7 +1183,7 @@ class PC:
def setUnify(self, ln):
""" Set unify. """
ln = self.lnExpand(ln, "Unify")
ln = lnExpand(ln, "%s Unify" % self.name)
tmp = []
for n in ln:
@ -1086,29 +1202,6 @@ class PC:
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):
""" Copy the voicing from a 2nd voice to the current one. """
@ -1189,8 +1282,8 @@ class PC:
'VOLUME': self.volume[:],
'UNIFY': self.unify[:],
'MIDISEQ': self.midiSeq[:],
'MIDIVOICE':self.midiVoice[:],
'MIDICLEAR':self.midiClear[:],
'MIDIVOICE': self.midiVoice[:],
'MIDICLEAR': self.midiClear[:],
'SPAN': (self.spanStart, self.spanEnd),
'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)
for i, n in enumerate(ln):
@ -1555,9 +1648,9 @@ class PC:
plist.sort(patsort)
if gbl.swingMode:
len8 = getNoteLen('8')
len81 = getNoteLen('81')
len82 = getNoteLen('82')
len8 = MMA.notelen.getNoteLen('8')
len81 = MMA.notelen.getNoteLen('81')
len82 = MMA.notelen.getNoteLen('82')
onBeats = [ x * gbl.BperQ 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):
""" 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:
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))
if self.vtype == 'CHORD':
for a in p.vol:
s.append( " %2.0f" % a)
s.append( "%.0f" % a)
elif self.vtype == 'BASS':
f=str(p.noteoffset+1)
@ -1601,21 +1701,20 @@ class PC:
elif p.addoctave < 0:
f+="-" * (p.addoctave/-12)
s.append( " %s %2.0f" % (f, p.vol ) )
s.append( "%s %.0f" % (f, p.vol ) )
elif self.vtype == 'ARPEGGIO':
s.append( " %2.0f " % p.vol )
s.append( "%.0f " % p.vol )
elif self.vtype == 'DRUM':
s.append(" %2.0f" % p.vol)
s.append("%.0f" % p.vol)
elif self.vtype == 'WALK':
s.append(" %2.0f" % p.vol )
s.append("%.0f" % p.vol )
s.append(' ;')
s.append('\n')
s[-2]=' '
print "".join(s)
pp.append(' '.join(s))
return "; ".join(pp)
def insertVoice(self):
@ -1644,18 +1743,20 @@ class PC:
v=self.voice[sc]
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
# Mark ssvoice also in shared tracks
for a in gbl.midiAssigns[self.channel]:
if gbl.tnames.has_key(a):
try:
gbl.tnames[a].ssvoice = v
except KeyError:
pass
if gbl.debug:
print "Track %s Voice %s inserted" \
% (self.name, MMA.midiC.valueToInst(v) )
print "Track %s Voice %s inserted" % (self.name,MMA.midiC.valueToInst(v) )
""" Our 2nd stab at MIDIVOICE. This time any sequences
with offsets >0 are sent. AND the smidiVoice and midiSent
@ -1685,6 +1786,10 @@ class PC:
if self.futureVols:
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.
@ -1702,12 +1807,7 @@ class PC:
"""
if self.seqRnd:
tmp = []
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)
self.seq = MMA.seqrnd.getrndseq(self.seqRndWeight)
else:
self.seq = gbl.seqCount
@ -1717,7 +1817,6 @@ class PC:
if self.riff:
pattern = self.riff.pop(0)
else:
pattern = self.sequence[sc]
@ -1816,11 +1915,25 @@ class PC:
a1 = self.volume[sc]
if not a1:
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
a2 = MMA.volume.volume
if not a2:
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
v *= ( a1 + a2 )
@ -1895,12 +2008,11 @@ class PC:
else:
note = None
v=stof(v, "Value for %s bar offset must be integer/float" % self.name)
v = (v-1) * gbl.BperQ
if note:
v += getNoteLen(note) * sign
v += MMA.notelen.getNoteLen(note) * sign
if v < 0:
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
from MMA.notelen import getNoteLen
from MMA.common import *
from MMA.harmony import harmonize
from MMA.pat import PC, seqBump
from MMA.pat import PC
import random
class Aria(PC):
""" Pattern class for an aria (auto-melody) track. """
@ -70,7 +70,7 @@ class Aria(PC):
a = struct()
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")
return a
@ -79,7 +79,7 @@ class Aria(PC):
def setScaletype(self, ln):
""" Set scale type. """
ln = self.lnExpand(ln, "ScaleType")
ln = lnExpand(ln, "%s ScaleType" % self.name)
tmp = []
for n in ln:
@ -213,7 +213,7 @@ class Aria(PC):
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:
self.sendNote(
p.offset,

View File

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

View File

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

View File

@ -26,10 +26,12 @@ Bob van der Poel <bob@mellowood.ca>
import random
import MMA.notelen
import gbl
from MMA.notelen import getNoteLen
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 """
ln=self.lnExpand(ln, 'DupRoot')
ln = lnExpand(ln, '%s DupRoot' % self.name)
tmp = []
for n in ln:
@ -157,7 +159,7 @@ class Chord(PC):
def setStrum(self, ln):
""" Set Strum time. """
ln=self.lnExpand(ln, 'Strum')
ln = lnExpand(ln, '%s Strum' % self.name)
tmp = []
for n in ln:
@ -187,7 +189,7 @@ class Chord(PC):
a = struct()
a.offset = self.setBarOffset(ev[0])
a.duration = getNoteLen(ev[1])
a.duration = MMA.notelen.getNoteLen(ev[1])
vv = ev[2:]
if len(vv)>8:
@ -401,4 +403,3 @@ class Chord(PC):
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
from MMA.common import *
from MMA.notelen import getNoteLen
import MMA.translate
from MMA.pat import PC, seqBump
from MMA.pat import PC
class Drum(PC):
""" Pattern class for a drum track. """
@ -51,7 +51,7 @@ class Drum(PC):
ln[] is not nesc. the right length.
"""
ln=self.lnExpand(ln, 'Tone')
ln = lnExpand(ln, '%s Tone' % self.name)
tmp = []
for n in ln:
@ -77,7 +77,7 @@ class Drum(PC):
a = struct()
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")
return a

View File

@ -25,12 +25,12 @@ Bob van der Poel <bob@mellowood.ca>
import random
from MMA.harmony import harmonize
from MMA.notelen import getNoteLen
import MMA.harmony
import MMA.notelen
from MMA.pat import PC
import gbl
from MMA.common import *
from MMA.pat import PC, seqBump
class Scale(PC):
""" Pattern class for a Scale track. """
@ -60,7 +60,7 @@ class Scale(PC):
a = struct()
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")
@ -69,7 +69,7 @@ class Scale(PC):
def setScaletype(self, ln):
""" Set scale type. """
ln = self.lnExpand(ln, "ScaleType")
ln = lnExpand(ln, "%s ScaleType" % self.name)
tmp = []
for n in ln:
@ -220,7 +220,7 @@ class Scale(PC):
if self.harmony[sc]:
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:
self.sendNote(
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
from MMA.common import *
from MMA.notelen import getNoteLen
import MMA.translate
from MMA.harmony import harmonize
from MMA.pat import PC
import MMA.alloc
import MMA.volume
class NoteList:
@ -80,6 +82,7 @@ class Melody(PC):
if len(ln) > 1:
error("Only 1 value permitted for Drum Tone in Solo tracks")
self.drumTone = MMA.translate.dtable.get(ln[0])
@ -128,14 +131,14 @@ class Melody(PC):
"""
if gbl.swingMode:
len8 = getNoteLen('8')
len81 = getNoteLen('81')
len82 = getNoteLen('82')
len8 = MMA.notelen.getNoteLen('8')
len81 = MMA.notelen.getNoteLen('81')
len82 = MMA.notelen.getNoteLen('82')
onBeats = [ x * gbl.BperQ 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
velocity = 90 # intial/default velocity for solo notes
@ -206,7 +209,7 @@ class Melody(PC):
i+=1
if i:
l=getNoteLen(a[0:i])
l=MMA.notelen.getNoteLen(a[0:i])
c=a[i:]
else:
l=length
@ -220,7 +223,6 @@ class Melody(PC):
length = l # set defaults for next loop
lastc = c
""" Convert the note part into a series of midi values
Notes can be a single note, or a series of notes. And
each note can be a letter a-g (or r), a '#,&,n' plus
@ -286,7 +288,7 @@ class Melody(PC):
elif name == '*':
v = self.drumTone
else:
v = MMA.translate.dtable.get(name)
v = int(MMA.translate.dtable.get(name))
""" Swingmode -- This tests for successive 8ths on/off beat
@ -352,7 +354,7 @@ class Melody(PC):
if tb.chordZ:
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,
else append harmony notes to chord.
@ -622,7 +624,7 @@ def extractSolo(ln, rptcount):
"""
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):
gbl.tnames[t].setRiff( firstSolo[:] )

View File

@ -26,13 +26,14 @@ Bob van der Poel <bob@mellowood.ca>
import random
from MMA.harmony import harmonize
from MMA.notelen import getNoteLen
import MMA.harmony
import MMA.notelen
import gbl
from MMA.common import *
from MMA.pat import PC
class Walk(PC):
""" Pattern class for a walking bass track. """
@ -52,7 +53,7 @@ class Walk(PC):
a = struct()
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")
return a
@ -152,7 +153,7 @@ class Walk(PC):
if self.harmony[sc]:
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:
self.sendNote(
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 gbl
from MMA.common import *
""" Translation table for VOICE. This is ONLY used when a voice is set
from the VOICE command. If a translation exists the translation is
substituted.
@ -78,10 +80,9 @@ class Vtable:
""" Return a translation or original. """
name=name.upper()
if self.table.has_key(name):
try:
return self.table[name]
else:
except KeyError:
return name
vtable=Vtable() # Create single class instance.
@ -123,24 +124,32 @@ class Dtable:
error("Each translation pair must be in the format Voice=Alias")
v,a = l.split('=')
v=MMA.midiC.drumToValue(v)
a=MMA.midiC.drumToValue(a)
v1=MMA.midiC.drumToValue(v)
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:
print "DrumTone Translation: %s=%s" % \
(MMA.midiC.valueToDrum(v), MMA.midiC.valueToDrum(a))
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)
if self.table.has_key(v):
return self.table[v]
if v<0:
error("Drum Tone '%s' not defined." % name)
else:
try:
return self.table[v]
except KeyError:
return v
@ -195,9 +204,9 @@ class VoiceVolTable:
def get(self, v, vol):
""" Return an adjusted value or original. """
if self.table.has_key(v):
try:
vol = int(vol * self.table[v])
except KeyError:
return vol
@ -245,9 +254,9 @@ class DrumVolTable:
def get(self, v, vol):
""" Return an adjusted value or original. """
if self.table.has_key(v):
try:
vol = int(vol * self.table[v])
except KeyError:
return vol

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 }
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
futureVol = []
vTRatio = .6
@ -141,14 +144,56 @@ def setVolume(ln):
print "Volume: %s%%" % volume
# The next 2 are called from the parser.
# The next 3 are called from the parser.
def setCresc(ln):
""" Master Crescendo. """
setCrescendo(1, ln)
def setDecresc(ln):
""" Master Decrescendo (Diminuendo). """
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):
""" Combined (de)cresc() """
@ -166,6 +211,13 @@ def setCrescendo(dir, 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()
@ -181,6 +233,9 @@ def fvolume(dir, startvol, ln):
if bcount <= 0:
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:
warning("Cresc volume less than current setting" )
@ -190,9 +245,9 @@ def fvolume(dir, startvol, ln):
elif destvol == startvol:
warning("(De)Cresc volume equal to current setting" )
if bcount> 1:
bcount -= 1
step = ( destvol-startvol ) / bcount
volList=[startvol]
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."
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/ballad.html> stdlib/ballad.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/beguine.html> stdlib/beguine.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/popballad.html> stdlib/popballad.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/rhumba.html> stdlib/rhumba.mma </a> </li>
<li> <A Href = stdlib/rock-128.html> stdlib/rock-128.mma </a> </li>
<li> <A Href = stdlib/rockballad.html> stdlib/rockballad.mma </a> </li>
<li> <A Href = stdlib/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/showtune.html> stdlib/showtune.mma </a> </li>
<li> <A Href = stdlib/shuffleboggie.html> stdlib/shuffleboggie.mma </a> </li>
<li> <A Href = stdlib/ska.html> stdlib/ska.mma </a> </li>
<li> <A Href = stdlib/slowblues.html> stdlib/slowblues.mma </a> </li>
<li> <A Href = stdlib/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/slowjazz.html> stdlib/slowjazz.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/swing.html> stdlib/swing.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/waltz.html> stdlib/waltz.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>
<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/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/western.html> yamaha/western.mma </a> </li>
</ul>
@ -168,4 +177,4 @@ information from the each library file:
<P>It is a part of the MMA distribution
and is protected by the same copyrights as MMA (the GNU General Public License).
<P> Created: 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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>60Srock</H1>
@ -8,6 +8,7 @@
<LI><A Href=#60sRock1>60sRock1</a>
<LI><A Href=#60sRockSus>60sRockSus</a>
<LI><A Href=#60sRock1Sus>60sRock1Sus</a>
<LI><A Href=#60sRockIntro>60sRockIntro</a>
<LI><A Href=#60sRockEnd>60sRockEnd</a>
</ul>
<A Name=60sRock></a>
@ -82,6 +83,23 @@
</Table>
</TD></TR>
</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>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Ballad</H1>
@ -8,6 +8,7 @@
<LI><A Href=#BalladSus>BalladSus</a>
<LI><A Href=#Ballad1>Ballad1</a>
<LI><A Href=#Ballad1Sus>Ballad1Sus</a>
<LI><A Href=#BalladFill>BalladFill</a>
<LI><A Href=#BalladIntro>BalladIntro</a>
<LI><A Href=#BalladIntro1>BalladIntro1</a>
<LI><A Href=#BalladIntro2>BalladIntro2</a>
@ -116,6 +117,30 @@
</Table>
</TD></TR>
</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>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Ballad128</H1>
@ -31,7 +31,7 @@
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> Ballad128Plus </H2>
Adds arpeggiated . <B>(4)</B>
Adds arpeggiated piano. <B>(4)</B>
</TD></TR>
<TR><TD>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Bolero</H1>
@ -8,6 +8,10 @@
<LI><A Href=#BoleroFill>BoleroFill</a>
<LI><A Href=#BoleroSus>BoleroSus</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=#BoleroEnd>BoleroEnd</a>
<LI><A Href=#Bolero1>Bolero1</a>
@ -97,6 +101,90 @@
</Table>
</TD></TR>
</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>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Broadway</H1>
@ -9,7 +9,7 @@
<LI><A Href=#BroadwaySus>BroadwaySus</a>
<LI><A Href=#Broadway1Sus>Broadway1Sus</a>
<LI><A Href=#BroadwayIntro>BroadwayIntro</a>
<LI><A Href=#BroadWayEnd>BroadWayEnd</a>
<LI><A Href=#BroadwayEnd>BroadwayEnd</a>
</ul>
<A Name=Broadway></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
@ -110,10 +110,10 @@
</Table>
</TD></TR>
</Table>
<A Name=BroadWayEnd></a>
<A Name=BroadwayEnd></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> BroadWayEnd </H2>
<H2> BroadwayEnd </H2>
A 2 bar ending reminiscent of a cha-cha. <B>(2)</B>
</TD></TR>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Chacha</H1>
@ -33,6 +33,7 @@
<LI><A Href=#ChaChaFill>ChaChaFill</a>
<LI><A Href=#ChaCha1Fill>ChaCha1Fill</a>
<LI><A Href=#ChaChaIntro>ChaChaIntro</a>
<LI><A Href=#ChaChaIntro8>ChaChaIntro8</a>
<LI><A Href=#ChaChaEnd>ChaChaEnd</a>
</ul>
<A Name=ChaCha></a>
@ -194,6 +195,28 @@
</Table>
</TD></TR>
</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>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<LI><A Href=#EasySwing>EasySwing</a>
<LI><A Href=#EasySwingSus>EasySwingSus</a>
@ -39,6 +39,7 @@
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> JazzGuitar </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> Walk </TD> <TD> AcousticBass </TD></TR>
</Table>
@ -56,6 +57,7 @@
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </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> Walk </TD> <TD> AcousticBass </TD></TR>
</Table>
@ -73,6 +75,7 @@
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> JazzGuitar </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> Walk </TD> <TD> AcousticBass </TD></TR>
</Table>
@ -88,6 +91,7 @@
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Chord </TD> <TD> JazzGuitar </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> Walk </TD> <TD> AcousticBass </TD></TR>
</Table>
@ -104,6 +108,7 @@
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </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> Walk </TD> <TD> AcousticBass </TD></TR>
</Table>
@ -121,6 +126,7 @@
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> JazzGuitar </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> Walk </TD> <TD> AcousticBass </TD></TR>
</Table>
@ -137,6 +143,7 @@
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> JazzGuitar </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> Walk </TD> <TD> AcousticBass </TD></TR>
</Table>
@ -154,6 +161,7 @@
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </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> Walk </TD> <TD> AcousticBass </TD></TR>
</Table>
@ -171,6 +179,7 @@
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> JazzGuitar </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> Walk </TD> <TD> AcousticBass </TD></TR>
</Table>
@ -187,6 +196,7 @@
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> JazzGuitar </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> Walk </TD> <TD> AcousticBass </TD></TR>
</Table>
@ -204,6 +214,7 @@
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </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> Walk </TD> <TD> AcousticBass </TD></TR>
</Table>
@ -221,6 +232,7 @@
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> JazzGuitar </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> Walk </TD> <TD> AcousticBass </TD></TR>
</Table>
@ -237,6 +249,7 @@
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> JazzGuitar </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> Walk </TD> <TD> AcousticBass </TD></TR>
</Table>
@ -254,6 +267,7 @@
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </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> Walk </TD> <TD> AcousticBass </TD></TR>
</Table>
@ -271,6 +285,7 @@
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> JazzGuitar </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> Walk </TD> <TD> AcousticBass </TD></TR>
</Table>
@ -286,6 +301,7 @@
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Chord </TD> <TD> JazzGuitar </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> Walk </TD> <TD> AcousticBass </TD></TR>
</Table>
@ -302,6 +318,7 @@
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </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> Walk </TD> <TD> AcousticBass </TD></TR>
</Table>
@ -318,6 +335,7 @@
<TR><TD> Arpeggio </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-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
</Table>
@ -334,6 +352,7 @@
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> JazzGuitar </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>
</Table>
</TD></TR>
@ -349,6 +368,7 @@
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> JazzGuitar </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>
</Table>
</TD></TR>
@ -364,6 +384,7 @@
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> JazzGuitar </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>
</Table>
</TD></TR>
@ -380,6 +401,7 @@
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> JazzGuitar </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>
</Table>
</TD></TR>
@ -395,6 +417,7 @@
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> JazzGuitar </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> Walk </TD> <TD> AcousticBass </TD></TR>
</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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Folk</H1>
@ -7,6 +7,8 @@
<LI><A Href=#Folk>Folk</a>
<LI><A Href=#FolkWalk>FolkWalk</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=#FolkEnd>FolkEnd</a>
</ul>
@ -54,6 +56,38 @@
</Table>
</TD></TR>
</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>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Foxtrot</H1>
<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>
<LI><A Href=#Foxtrot>Foxtrot</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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Frenchwaltz</H1>
@ -38,7 +38,7 @@
<LI><A Href=#FrenchWaltz2FillSus>FrenchWaltz2FillSus</a>
<LI><A Href=#FrenchWaltz3>FrenchWaltz3</a>
<LI><A Href=#FrenchWaltz3Fill>FrenchWaltz3Fill</a>
<LI><A Href=#FrenchWaltz2Sus>FrenchWaltz2Sus</a>
<LI><A Href=#FrenchWaltz3Sus>FrenchWaltz3Sus</a>
<LI><A Href=#FrenchWaltz3FillSus>FrenchWaltz3FillSus</a>
<LI><A Href=#FrenchWaltzIntro>FrenchWaltzIntro</a>
<LI><A Href=#FrenchWaltzEnd>FrenchWaltzEnd</a>
@ -284,10 +284,10 @@
</Table>
</TD></TR>
</Table>
<A Name=FrenchWaltz2Sus></a>
<A Name=FrenchWaltz3Sus></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> FrenchWaltz2Sus </H2>
<H2> FrenchWaltz3Sus </H2>
Viola counter melody and sustained strings. <B>(8)</B>
</TD></TR>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Jive</H1>
@ -17,6 +17,7 @@
<LI><A Href=#Jive1Plus>Jive1Plus</a>
<LI><A Href=#Jive1SusPlus>Jive1SusPlus</a>
<LI><A Href=#JiveIntro>JiveIntro</a>
<LI><A Href=#JiveIntro8>JiveIntro8</a>
<LI><A Href=#JiveEnd>JiveEnd</a>
</ul>
<A Name=Jive></a>
@ -95,7 +96,7 @@
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> JivePlus </H2>
Add some additional apreggios. <B>(4)</B>
Add some additional arpeggios. <B>(4)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
@ -113,7 +114,7 @@
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> JiveSusPlus </H2>
Apreggios plus strings. <B>(4)</B>
Arpeggios plus strings. <B>(4)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
@ -255,6 +256,24 @@
</Table>
</TD></TR>
</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>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Lighttango</H1>
@ -10,7 +10,9 @@
<LI><A Href=#LightTango1Sus>LightTango1Sus</a>
<LI><A Href=#LightTangoFill>LightTangoFill</a>
<LI><A Href=#LightTangoIntro>LightTangoIntro</a>
<LI><A Href=#LightTangoIntro1>LightTangoIntro1</a>
<LI><A Href=#LightTangoEnd>LightTangoEnd</a>
<LI><A Href=#LightTango4End>LightTango4End</a>
</ul>
<A Name=LightTango></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
@ -133,6 +135,25 @@
</Table>
</TD></TR>
</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>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
@ -150,5 +171,25 @@
</Table>
</TD></TR>
</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>

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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<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>
<LI><A Href=#Merengue>Merengue</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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Modernjazz</H1>
@ -11,8 +11,12 @@
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="100%">
<TR>
<TD Valign=Top> <B> ApreggioVoice </B> </TD>
<TD Valign=Top> Voice for the alternating apreggios in ModernJazz1 (Default=MutedTrumpet). Also used in Introduction and Ending. </TD>
<TD Valign=Top> <B> ArpeggioVoice </B> </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>
</Table>
</TD></TR>
@ -22,6 +26,8 @@
<LI><A Href=#ModernJazz1>ModernJazz1</a>
<LI><A Href=#ModernJazzSus>ModernJazzSus</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=#ModernJazzEnd>ModernJazzEnd</a>
</ul>
@ -107,6 +113,49 @@
</Table>
</TD></TR>
</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>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Polka</H1>
@ -13,6 +13,7 @@
<LI><A Href=#Polka1Arp>Polka1Arp</a>
<LI><A Href=#Polka1SusArp>Polka1SusArp</a>
<LI><A Href=#PolkaIntro>PolkaIntro</a>
<LI><A Href=#PolkaIntro8>PolkaIntro8</a>
<LI><A Href=#PolkaEnd>PolkaEnd</a>
</ul>
<A Name=Polka></a>
@ -193,6 +194,24 @@
</Table>
</TD></TR>
</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>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Quickstep</H1>
@ -11,6 +11,7 @@
<LI><A Href=#QuickStepDuh>QuickStepDuh</a>
<LI><A Href=#QuickStepDuhSus>QuickStepDuhSus</a>
<LI><A Href=#QuickStepIntro>QuickStepIntro</a>
<LI><A Href=#QuickStepIntro8>QuickStepIntro8</a>
<LI><A Href=#QuickStepEnd>QuickStepEnd</a>
</ul>
<A Name=QuickStep></a>
@ -139,6 +140,23 @@
</Table>
</TD></TR>
</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>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Rockballad</H1>
@ -27,7 +27,9 @@
<LI><A Href=#RockBalladFill>RockBalladFill</a>
<LI><A Href=#RockBallad1Fill>RockBallad1Fill</a>
<LI><A Href=#RockBalladVoice>RockBalladVoice</a>
<LI><A Href=#RockBallad1Voice>RockBallad1Voice</a>
<LI><A Href=#RockBalladIntro>RockBalladIntro</a>
<LI><A Href=#RockBalladSusIntro>RockBalladSusIntro</a>
<LI><A Href=#RockBalladEnd>RockBalladEnd</a>
<LI><A Href=#RockBalladEnd1>RockBalladEnd1</a>
</ul>
@ -119,6 +121,24 @@
</Table>
</TD></TR>
</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>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
@ -132,7 +152,23 @@
<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=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>
</TD></TR>
</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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Samba</H1>
@ -37,7 +37,7 @@
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<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>
<TR><TD>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Shuffleboggie</H1>
@ -10,6 +10,7 @@
<LI><A Href=#ShuffleBoggieIntro>ShuffleBoggieIntro</a>
<LI><A Href=#ShuffleBoggieIntro4>ShuffleBoggieIntro4</a>
<LI><A Href=#ShuffleBoggieEnd>ShuffleBoggieEnd</a>
<LI><A Href=#ShuffleBoggieFill>ShuffleBoggieFill</a>
</ul>
<A Name=ShuffleBoggie></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
@ -133,5 +134,24 @@
</Table>
</TD></TR>
</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>

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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<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>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Slowbolero</H1>

View File

@ -0,0 +1,133 @@
<!-- Auto-Generated by MMA on: Sun Sep 28 11:30:03 2008 -->
<HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Slowbroadway</H1>
<P>This is slower version of the "broadway" rhythm. It works in 4/4 time and is voicing compatible. Written for an upbeat version of "Some Enchanted Evening".
<ul>
<LI><A Href=#SlowBroadway>SlowBroadway</a>
<LI><A Href=#SlowBroadway1>SlowBroadway1</a>
<LI><A Href=#SlowBroadwaySus>SlowBroadwaySus</a>
<LI><A Href=#SlowBroadway1Sus>SlowBroadway1Sus</a>
<LI><A Href=#SlowBroadwayIntro>SlowBroadwayIntro</a>
<LI><A Href=#SlowBroadwayEnd>SlowBroadwayEnd</a>
</ul>
<A Name=SlowBroadway></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> SlowBroadway </H2>
A corny Broadway tune rhythm. <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-Gloc </TD> <TD> Glockenspiel </TD></TR>
<TR><TD> Chord-Piz </TD> <TD> PizzicatoString </TD></TR>
<TR><TD> Drum-Hih1 </TD> <TD> ClosedHiHat </TD></TR>
<TR><TD> Drum-Hih2 </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>
<A Name=SlowBroadway1></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> SlowBroadway1 </H2>
Add in arpegiating flute. <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> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord-Gloc </TD> <TD> Glockenspiel </TD></TR>
<TR><TD> Chord-Piz </TD> <TD> PizzicatoString </TD></TR>
<TR><TD> Drum-Hih1 </TD> <TD> ClosedHiHat </TD></TR>
<TR><TD> Drum-Hih2 </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>
<A Name=SlowBroadwaySus></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> SlowBroadwaySus </H2>
Add sustained strings. <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-Gloc </TD> <TD> Glockenspiel </TD></TR>
<TR><TD> Chord-Piz </TD> <TD> PizzicatoString </TD></TR>
<TR><TD> Chord-Sus </TD> <TD> Strings </TD></TR>
<TR><TD> Drum-Hih1 </TD> <TD> ClosedHiHat </TD></TR>
<TR><TD> Drum-Hih2 </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>
<A Name=SlowBroadway1Sus></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> SlowBroadway1Sus </H2>
Sustained strings and apregiating flute. <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> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord-Gloc </TD> <TD> Glockenspiel </TD></TR>
<TR><TD> Chord-Piz </TD> <TD> PizzicatoString </TD></TR>
<TR><TD> Chord-Sus </TD> <TD> Strings </TD></TR>
<TR><TD> Drum-Hih1 </TD> <TD> ClosedHiHat </TD></TR>
<TR><TD> Drum-Hih2 </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>
<A Name=SlowBroadwayIntro></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> SlowBroadwayIntro </H2>
Simple 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-Gloc </TD> <TD> Glockenspiel </TD></TR>
<TR><TD> Chord-Piz </TD> <TD> PizzicatoString </TD></TR>
<TR><TD> Drum-Hih1 </TD> <TD> ClosedHiHat </TD></TR>
<TR><TD> Drum-Hih2 </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>
<A Name=SlowBroadwayEnd></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> SlowBroadwayEnd </H2>
A 2 bar ending. <B>(2)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord-Gloc </TD> <TD> Glockenspiel </TD></TR>
<TR><TD> Chord-Piz </TD> <TD> PizzicatoString </TD></TR>
<TR><TD> Drum-Hih1 </TD> <TD> ClosedHiHat </TD></TR>
<TR><TD> Drum-Hih2 </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>

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