Updated to MMA 1.4

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

View File

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

View File

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

View File

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

View File

@ -53,7 +53,7 @@ A = Bbb= 9
As = Bb = 10 As = Bb = 10
B = Cb = 11 B = Cb = 11
chords = { chordlist = {
'M': ((C, E, G ), 'M': ((C, E, G ),
(C, D, E, F, G, A, B), (C, D, E, F, G, A, B),
"Major triad. This is the default and is used in " "Major triad. This is the default and is used in "
@ -448,14 +448,15 @@ aliases = (
('9sus', 'sus9', ''), ('9sus', 'sus9', ''),
('9-5', '9b5', ''), ('9-5', '9b5', ''),
('dim3', 'mb5', 'Diminished triad (non-standard notation).'), ('dim3', 'mb5', 'Diminished triad (non-standard notation).'),
('omit3(add9)','omit3add9', '') ('omit3(add9)','omit3add9', ''),
('9sus4', 'sus9', '')
) )
for a,b,d in aliases: for a,b,d in aliases:
n=chords[b][0] n=chordlist[b][0]
s=chords[b][1] s=chordlist[b][1]
if not d: if not d:
d=chords[b][2] d=chordlist[b][2]
chords[a] = (n, s, d) chordlist[a] = (n, s, d)

View File

@ -59,16 +59,22 @@ def error(msg):
print "ERROR:%s %s" % (ln, msg) print "ERROR:%s %s" % (ln, msg)
# Parse though the error message and check for illegal characters.
# Report (first only) if any found.
for a in msg:
a=ord(a)
if a<0x20 or a >=0x80:
print "Corrupt input file? Illegal character 0x%2x found." % a
break
sys.exit(1) sys.exit(1)
def warning(msg): def warning(msg):
""" Print warning message and return. """ """ Print warning message and return. """
if not gbl.noWarn:
if gbl.noWarn:
return
ln = "" ln = ""
if gbl.lineno >= 0: if gbl.lineno >= 0:
@ -80,7 +86,6 @@ def warning(msg):
print "Warning:%s\n %s" % (ln, msg) print "Warning:%s\n %s" % (ln, msg)
def getOffset(ticks, ran=None): def getOffset(ticks, ran=None):
""" Calculate a midi offset into a song. """ Calculate a midi offset into a song.
@ -123,6 +128,9 @@ def stof(s, errmsg=None):
try: try:
return float(s) return float(s)
except:
try:
return int(s,0)
except: except:
if errmsg: if errmsg:
error(errmsg) error(errmsg)
@ -171,3 +179,34 @@ def pextract(s, open, close, onlyone=None):
return s.strip(), subs return s.strip(), subs
def seqBump(l):
""" Expand/contract an existing sequence list to the current seqSize."""
while len(l) < gbl.seqSize:
l += l
return l[:gbl.seqSize]
def lnExpand(ln, msg):
""" Validate and expand a list passed to a set command. """
if len(ln) > gbl.seqSize:
warning("%s list truncated to %s patterns" % (msg, gbl.seqSize) )
ln = ln[:gbl.seqSize]
last = None
for i,n in enumerate(ln):
if n == '/':
if not last:
error ("%s cannot use a '/' as the first item in list." % cmd)
else:
ln[i] = last
else:
last = n
return ln

View File

@ -26,9 +26,13 @@ Bob van der Poel <bob@mellowood.ca>
import os import os
import time import time
import MMA.midiC
import MMA.grooves
import gbl import gbl
from MMA.common import * from MMA.common import *
import MMA.midiC
def docDrumNames(order): def docDrumNames(order):
@ -104,7 +108,7 @@ def docNote(ln):
global fname, notes global fname, notes
if not gbl.docs or not ln: if not gbl.createDocs or not ln:
return return
# Grab the arg and data, save it # Grab the arg and data, save it
@ -119,7 +123,7 @@ def docVars(ln):
global fname, variables global fname, variables
if not gbl.docs or not ln: if not gbl.createDocs or not ln:
return return
fname = os.path.basename(gbl.inpath.fname) fname = os.path.basename(gbl.inpath.fname)
@ -149,12 +153,13 @@ def docDefine(ln):
defs.append(l) defs.append(l)
def docDump(): def docDump():
""" Print the LaTex docs. """ """ Print the LaTex docs. """
global fname, author, notes, defs, variables global fname, author, notes, defs, variables
if gbl.docs == 1: # latex docs if gbl.createDocs == 1: # latex docs
if notes: if notes:
if fname.endswith(gbl.ext): if fname.endswith(gbl.ext):
fname='.'.join(fname.split('.')[:-1]) fname='.'.join(fname.split('.')[:-1])
@ -170,13 +175,21 @@ def docDump():
if defs: if defs:
for l in defs: for l in defs:
print " \\instable{%s}{%s}{%s}{" % \ alias = MMA.grooves.getAlias(l[0])
(totex(l[0]), totex(l[2]), l[1] ) if alias:
if len(alias)>1:
alias="Aliases: %s" % alias
else:
alias="Alias: %s" % alias
else:
alias=''
print " \\instable{%s}{%s}{%s}{%s}{" % \
(totex(l[0]), totex(l[2]), l[1], alias)
for c,v in l[3:]: for c,v in l[3:]:
print " \\insline{%s}{%s}" % (c.title(), totex(v)) print " \\insline{%s}{%s}" % (c.title(), totex(v))
print " }" print " }"
if gbl.docs == 2: # html docs if gbl.createDocs == 2: # html docs
if notes: if notes:
print '<!-- Auto-Generated by MMA on: %s -->' % time.ctime() print '<!-- Auto-Generated by MMA on: %s -->' % time.ctime()
print '<HTML>' print '<HTML>'
@ -213,6 +226,13 @@ def docDump():
print '<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">' print '<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">'
print ' <TR><TD>' print ' <TR><TD>'
print ' <H2> %s </H2> ' % l[0] print ' <H2> %s </H2> ' % l[0]
alias=MMA.grooves.getAlias(l[0])
if alias:
if len(alias)>1:
ll="Aliases"
else:
ll="Alias"
print ' <H4> %s: %s </H4>' % (ll, alias)
print ' %s <B>(%s)</B> ' % ( l[2], l[1] ) print ' %s <B>(%s)</B> ' % ( l[2], l[1] )
print ' </TD></TR>' print ' </TD></TR>'
print ' <TR><TD>' print ' <TR><TD>'
@ -224,13 +244,50 @@ def docDump():
print '</Table>' print '</Table>'
print print
print '</Body></HTML>' print '</Body></HTML>'
if gbl.createDocs == 3:
if notes:
if fname.endswith(gbl.ext):
fname='.'.join(fname.split('.')[:-1])
print "%s.mma %s" % (fname, notes)
print
if variables:
print " Variables:"
for l in variables:
print " %s %s" % ( l[0], l[1] )
print
if defs:
for l in defs:
print "Groove %s" % l[0].title()
MMA.grooves.grooveDo(l[0].upper())
for t in sorted(gbl.tnames):
tr = gbl.tnames[t]
sq = tr.sequence
if sq[0]:
rt = []
for a in range(gbl.seqSize):
s=sq[a]
x = '{' + tr.formatPattern(sq[a]) + '}'
rt.append(x)
print " %s Sequence %s" % (tr.name, ' '.join(rt))
if tr.vtype == 'DRUM':
print " %s Tone %s" % (tr.name,
' '.join([MMA.midiC.valueToDrum(a) for a in tr.toneList]))
else:
print " %s Voice %s" % (tr.name,
' '.join([MMA.midiC.voiceNames[a] for a in tr.voice]))
print
defs = [] defs = []
variables=[] variables=[]
notes = "" notes = ""
author = "" author = ""
def totex(s): def totex(s):
""" Parse a string and quote tex stuff. """ Parse a string and quote tex stuff.
@ -254,3 +311,17 @@ def totex(s):
return s return s
def docVerbose():
""" Print verbose pattern/sequence info: -Dp command line. """
global fname, author, notes, defs, variables
defs = []
variables=[]
notes = ""
author = ""

View File

@ -97,7 +97,6 @@ class ReadFile:
try: try:
inpath = file(fname, 'r') inpath = file(fname, 'r')
except: except:
error("Unable to open '%s' for input" % fname) error("Unable to open '%s' for input" % fname)
@ -107,7 +106,6 @@ class ReadFile:
self.fname = fname self.fname = fname
""" Read entire file, line by line: """ Read entire file, line by line:
- strip off blanks, comments - strip off blanks, comments
- join continuation lines - join continuation lines
- parse out LABELS - parse out LABELS
@ -131,10 +129,17 @@ class ReadFile:
if not l: if not l:
continue continue
# join lines ending in '\' (the strip() makes this the last char
while l[-1] == '\\': while l[-1] == '\\':
l = l[0:-1] + ' ' + inpath.readline().strip() l = l[0:-1] + ' ' + inpath.readline().strip()
lcount +=1 lcount +=1
""" input cleanup ... for now the only cleanup is to convert
0xa0 (non-breakable space) to 0x20 (regular space).
"""
l=l.replace('\xa0', '\x20')
""" This next line splits the line at the first found """ This next line splits the line at the first found
comment '//', drops the comment, and splits the comment '//', drops the comment, and splits the
@ -200,6 +205,7 @@ class ReadFile:
else: else:
label = None label = None
# Save the line, linenumber and (maybe) the label. # Save the line, linenumber and (maybe) the label.
fdata.append( dataStore(lcount, l, label)) fdata.append( dataStore(lcount, l, label))

View File

@ -24,7 +24,7 @@ Bob van der Poel <bob@mellowood.ca>
import os import os
version = "1.1" # Version -- March 7/2007 version = "1.4" # Version -- Sept/2008
""" mtrks is storage for the MIDI data as it is created. """ mtrks is storage for the MIDI data as it is created.
It is a dict of class Mtrk() instances. Keys are the It is a dict of class Mtrk() instances. Keys are the
@ -67,25 +67,11 @@ deletedTracks = [] # list of deleted tracks for -c report
midiChPrefs = {} midiChPrefs = {}
""" Is the -T option is used only the tracks in this list
""" Groove storage. Each entry in settingsGroove{} has a keyname are generated. All other tracks are muted (OFF)
of a saved groove.
lastGroove and currentGroove are used by macros
""" """
settingsGroove = {} muteTracks = []
lastGroove = ''
currentGroove = ''
""" SeqRnd variable is a list. The first entry is a flag:(0, 1 or x):
0 - not set
1 - set
2 - set for specific tracks, track list starts at position [1]
"""
seqRnd = [0] # set if SEQRND has been set
############# String constants #################### ############# String constants ####################
@ -104,6 +90,8 @@ tempo = 120 # current tempo
seqSize = 1 # variation sequence table size seqSize = 1 # variation sequence table size
seqCount = 0 # running count of variation seqCount = 0 # running count of variation
totTime = 0.0 # running duration count in seconds
transpose = 0 # Transpose is global (ignored by drum tracks) transpose = 0 # Transpose is global (ignored by drum tracks)
lineno = -1 # used for error reporting lineno = -1 # used for error reporting
@ -114,10 +102,11 @@ swingSkew = None # this is just for $_SwingMode macro
barNum = 0 # Current line number barNum = 0 # Current line number
synctick = 0 # flag, set if we want a tick on all tracks at offset 0 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. ############# ############# Path and search variables. #############
libPath = '' libPath = ''
for p in ( "c:\\mma\\lib", "/usr/local/share/mma/lib", "/usr/share/mma/lib", "./lib"): for p in ( "c:\\mma\\lib", "/usr/local/share/mma/lib", "/usr/share/mma/lib", "./lib"):
if os.path.isdir(p): if os.path.isdir(p):
@ -163,9 +152,11 @@ chshow = Lchshow = 0
outfile = None outfile = None
infile = None infile = None
docs = 0 createDocs = 0
maxBars = 500 maxBars = 500
makeGrvDefs = 0 makeGrvDefs = 0
cmdSMF = None cmdSMF = None
playFile = 0 # set if we want to call a player
midiPlayer = "aplaymidi"

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

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

View File

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

View File

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

View File

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

View File

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

View File

@ -22,15 +22,15 @@ Bob van der Poel <bob@mellowood.ca>
""" """
import gbl
from MMA.common import *
from MMA.midiM import intToWord, intTo3Byte, intToLong, intToVarNumber from MMA.midiM import intToWord, intTo3Byte, intToLong, intToVarNumber
import MMA.midiC import MMA.midiC
import gbl
from MMA.common import *
splitChannels = [] splitChannels = []
def setSplitChannels(ln): def setSplitChannels(ln):
""" Parser routine, sets up list of track to split. Overwrites existing. """ """ Parser routine, sets up list of track to split. Overwrites existing. """
@ -39,10 +39,10 @@ def setSplitChannels(ln):
splitChannels = [] splitChannels = []
for a in ln: for a in ln:
c = stoi(a) a = stoi(a)
if c < 1 or c >16: if a < 1 or a >16:
error("SplitChannels: Expecting value 1 to 16, not %s" % c) error("SplitChannels: Expecting value 1 to 16, not %s" % a)
splitChannels.append(c) splitChannels.append(a)
if gbl.debug: if gbl.debug:
print "SplitChannels: ", print "SplitChannels: ",
@ -106,15 +106,16 @@ def writeTracks(out):
def writeSplitTrack(channel, out): def writeSplitTrack(channel, out):
""" Split a drum track into a separate track for the non-note """ Split a track. In drum tracks this puts different instruments
stuff and then a track for each note. into individual tracks (useful!); for instrument tracks it puts
each pitch into a track (probably not useful).
""" """
tr = gbl.mtrks[channel].miditrk # track to split tr = gbl.mtrks[channel].miditrk # track to split
""" A dict to store the split midi tracks. We'll end out with """ A dict to store the split midi tracks. We'll end out with
a track for each pitch which appears in the track and a track for each pitch which appears in the track and
a track (labeled -1) to store every other than note on data. a track (labeled -1) to store every other-than-note-on data.
""" """
notes={} notes={}
@ -130,7 +131,7 @@ def writeSplitTrack(channel, out):
else: else:
n = -1 # special value for non-note on events n = -1 # special value for non-note on events
if not notes.has_key(n): # create a new mtrk if needed if not n in notes: # create a new mtrk if needed
notes[n]=Mtrk(10) notes[n]=Mtrk(10)
if offset in notes[n].miditrk: # copy event to new track if offset in notes[n].miditrk: # copy event to new track
@ -166,8 +167,7 @@ def writeSplitTrack(channel, out):
def mkHeader(count, tempo, Mtype): def mkHeader(count, tempo, Mtype):
return "MThd" + intToLong(6) + intToWord(Mtype) + \ return "MThd" + intToLong(6) + intToWord(Mtype) + intToWord(count) + intToWord(tempo)
intToWord(count) + intToWord(tempo)
""" Midi track class. All the midi creation is done here. """ Midi track class. All the midi creation is done here.
@ -188,7 +188,7 @@ class Mtrk:
tr=self.miditrk tr=self.miditrk
lg=len(cmd) lg=len(cmd)
if tr.has_key(offset): if offset in tr:
for i,a in enumerate(tr[offset]): for i,a in enumerate(tr[offset]):
if a[0:lg] == cmd: if a[0:lg] == cmd:
del tr[offset][i] del tr[offset][i]
@ -221,11 +221,13 @@ class Mtrk:
self.delDup(offset, cmd) self.delDup(offset, cmd)
self.addToTrack(offset, cmd + chr(0x02) + chr(n) + chr(mi) ) self.addToTrack(offset, cmd + chr(0x02) + chr(n) + chr(mi) )
def addMarker(self, offset, msg): def addMarker(self, offset, msg):
""" Create a midi MARKER event.""" """ Create a midi MARKER event."""
self.addToTrack(offset, chr(0xff) + chr(0x06) + intToVarNumber(len(msg)) + msg ) self.addToTrack(offset, chr(0xff) + chr(0x06) + intToVarNumber(len(msg)) + msg )
def addText(self, offset, msg): def addText(self, offset, msg):
""" Create a midi TextEvent.""" """ Create a midi TextEvent."""
@ -251,16 +253,25 @@ class Mtrk:
self.addToTrack(offset, cmd + intToVarNumber(len(msg)) + msg ) self.addToTrack(offset, cmd + intToVarNumber(len(msg)) + msg )
def addProgChange( self, offset, program): def addProgChange( self, offset, program, oldprg):
""" Create a midi program change. """ Create a midi program change (handles extended voicing).
program - midi program program - The MIDI program (voice) value
oldprg - existing MIDI program
Returns - packed string
""" """
self.addToTrack(offset, v1, lsb1, msb1 = MMA.midiC.voice2tup(oldprg)
chr(0xc0 | self.channel) + chr(program) ) v2, lsb2, msb2 = MMA.midiC.voice2tup(program)
if msb1 != msb2: # only if CTRL32 has changed
self.addToTrack(offset, chr(0xb0 | self.channel) + chr(0x20) + chr(msb2) )
if lsb1 != lsb2: # only if CTRL0 has changed
self.addToTrack(offset, chr(0xb0 | self.channel) + chr(0x00) + chr(lsb2) )
# Always do voice change. Maybe not necessary, but let's be safe.
self.addToTrack(offset, chr(0xc0 | self.channel) + chr(v2) )
def addGlis(self, offset, v): def addGlis(self, offset, v):
@ -272,22 +283,17 @@ class Mtrk:
""" """
if v == 0: if v == 0:
self.addToTrack(offset, self.addToTrack(offset, chr(0xb0 | self.channel) + chr(0x41) + chr(0x00) )
chr(0xb0 | self.channel) + chr(0x41) + chr(0x00) )
else: else:
self.addToTrack(offset, self.addToTrack(offset, chr(0xb0 | self.channel) + chr(0x41) + chr(0x7f) )
chr(0xb0 | self.channel) + chr(0x41) + chr(0x7f) ) self.addToTrack(offset, chr(0xb0 | self.channel) + chr(0x05) + chr(v) )
self.addToTrack(offset,
chr(0xb0 | self.channel) + chr(0x05) + chr(v) )
def addPan(self, offset, v): def addPan(self, offset, v):
""" Set the lsb of the pan setting.""" """ Set the lsb of the pan setting."""
self.addToTrack(offset, self.addToTrack(offset, chr(0xb0 | self.channel) + chr(0x0a) + chr(v) )
chr(0xb0 | self.channel) + chr(0x0a) + chr(v) )
def addCtl(self, offset, l): def addCtl(self, offset, l):
@ -334,6 +340,21 @@ class Mtrk:
tr=self.miditrk tr=self.miditrk
""" If the -1 flag is set we need to add a terminate
to the end of each track. This is done to make looping
software like seq24 happy. We do this by truncating all
data in the file past the current tick pointer and inserting
an all-notes-off at that position.
"""
if gbl.endsync and self.channel>=0:
eof = gbl.tickOffset
for offset in tr.keys():
if offset > eof:
del tr[offset]
self.addToTrack(eof, chr(0xb0 | self.channel) + chr(0x7b) + chr(0))
""" To every MIDI track we generate we add (if the -0 flag """ To every MIDI track we generate we add (if the -0 flag
was set) an on/off beep at offset 0. This makes for was set) an on/off beep at offset 0. This makes for
easier sync in multi-tracks. easier sync in multi-tracks.
@ -433,7 +454,6 @@ class Mtrk:
Pair1 | on | | | Pair1 | on | | |
Pair2 | | | | off Pair2 | | | | off
""" """
# Start/end offsets # Start/end offsets
@ -520,11 +540,11 @@ class Mtrk:
MIDI data is saved as created in track structures. MIDI data is saved as created in track structures.
Each track has a miditrk dictionary entry which used Each track has a miditrk dictionary entry which used
the time offsets and keys and has the various events the time offsets and keys and has the various events
as data. Each event is packed string of bytes and as data. Each event is a packed string of bytes and
the events are stored as a list in the order they are the events are stored as a list in the order they are
created. Our storage looks like: created. Our storage looks like:
miditrk[123] = [event1, event2, ...] miditrk[OFFSET_VALUE] = [event1, event2, ...]
""" """
if offset<0: if offset<0:
@ -538,8 +558,6 @@ class Mtrk:
tr[offset]=[event] tr[offset]=[event]
class TimeSig: class TimeSig:
""" Track and set the current time signature. """ Track and set the current time signature.

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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

@ -0,0 +1,148 @@
# patch.py
"""
This module is an integeral part of the program
MMA - Musical Midi Accompaniment.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Bob van der Poel <bob@mellowood.ca>
This module contains the various patch manger routines.
"""
from MMA.common import *
from MMA.miditables import *
import MMA.file
import MMA.midiC
def patch(ln):
""" Main routine to manage midi patch names. """
for i,a in enumerate(ln):
if a.count('=') == 1:
a,b = a.split('=')
else:
b=''
a=a.upper()
if a == "LIST":
b=b.upper()
if b == "ALL":
plistall()
elif b == "EXT":
plistext()
elif b == "GM":
plistgm()
else:
error("Expecting All, EXT or GM argument for List")
if a == "RENAME":
prename(ln[i+1:])
break
if a == 'SET':
patchset(ln[i+1:])
break
error("Unknown option for Patch: %s" % a)
# Set a patch value=name
def patchset(ln):
if not ln:
error("Patch Set expecting list of value pairs.")
for a in ln:
try:
v,n = a.split('=', 1)
except:
error("Patch Set expecting value=name pair, not: %s" % a)
v=v.split('.')
if len(v) > 3 or len(v) < 1:
error("Patch Set: Expecting a voice value Prog.MSB.LSB." )
voc = 0
if len(v) > 2: # ctrl32
i = stoi(v[2], "Patch Set LSB expecting integer.")
if i<0 or i>127:
error("LSB must be 0..127, not '%s'." % i)
voc = i << 16
if len(v) > 1: # ctrl0
i = stoi(v[1], "Patch Set MSB expecting integer.")
if i<0 or i>127:
error("MSB must be 0..127, not '%s'." % i)
voc += i << 8
i = stoi(v[0], "Patch Set Voice expecting integer.")
if i<0 or i>127:
error("Program must be 0..127, not '%s'." % i)
voc += i
if voc in voiceNames:
warning("Patch Set duplicating voice name %s with %s=%s" % \
(voiceNames[voc], n, MMA.midiC.extVocStr(voc) ))
if n.upper() in voiceInx:
warning("Patch Set duplicating voice value %s with %s=%s" % \
(MMA.midiC.extVocStr(voiceInx[n.upper()]),
MMA.midiC.extVocStr(voc), n) )
voiceNames[voc]=n
voiceInx[n.upper()]=voc
# Rename
def prename(ln):
if not ln:
error("Patch Rename expecting list of value pairs.")
for a in ln:
if not a.count("=") == 1:
error("Patch Rename expecting oldname=newname pair")
a,b = a.split("=")
if not a.upper() in voiceInx:
error("Patch %s doen't exist, can't be renamed." % a)
if b.upper() in voiceInx:
error("Patch name %s already exists" % b)
v = voiceInx[a.upper()]
voiceNames[v]=b
del voiceInx[a.upper()]
voiceInx[b.upper()]=v
# list funcs
def plistgm():
for v in sorted(voiceNames.keys()):
if v <= 127:
print "%s=%s" % (MMA.midiC.extVocStr(v), voiceNames[v] )
def plistall():
plistgm()
plistext()
def plistext():
for v in sorted(voiceNames.keys()):
if v>127:
print "%s=%s" % (MMA.midiC.extVocStr(v), voiceNames[v])

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

@ -0,0 +1,48 @@
# safe_eval.py
"""
This module is an integeral part of the program
MMA - Musical Midi Accompaniment.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Bob van der Poel <bob@mellowood.ca>
"""
import re
from math import *
from common import error
safeCmds = [ 'ceil', 'fabs', 'floor', 'exp', 'log', 'log10', 'pow',
'sqrt', 'acos', 'asin', 'atan', 'atan2', 'cos', 'hypot',
'sin', 'tan', 'degrees', 'radians', 'cosh', 'sinh',
'int', 'in', '.join', 'str', '.split', 'for' ]
def safe_eval( expr ):
toks = re.split( r'([a-zA-Z_\.]+|.)', expr )
for t in toks:
if len(t)>1 and t not in safeCmds:
error("Illegal/Unknown operator '%s' in $()." % t)
try:
return eval(expr)
except:
error("Illegal operation in '%s'." % expr)

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

@ -0,0 +1,155 @@
# seqrnd.py
"""
This module is an integeral part of the program
MMA - Musical Midi Accompaniment.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Bob van der Poel <bob@mellowood.ca>
"""
import random
from MMA.common import *
""" SeqRnd variable is a list. The first entry is a flag:(0, 1 or x):
0 - not set
1 - set
2 - set for specific tracks, track list starts at position [1]
"""
seqRnd = [0] # set if SEQRND has been set
seqRndWeight = [1]
def setseq():
""" Set up the seqrnd values, called from parse loop.
returns:
0... a random sequence number,
-1 signals that rndseq is not enabled.
There are three methods of rndseq. They depend on the first value
in the list seqRnd[]:
[0] not enabled.
[1] random selection, keeps all tracks in sync.
[2] randomize selected tracks.
The list seqRndWeight has at least the same number of entries in it
as there are in the sequence size. By default each will have
the same value of 1. A list of the valid sequence points is
generated (ie, if seqsize==4 tmp will be [0,1,2,3]). In addition
the weights of each entry in tmp[] is adjusted by the weights in
the seqrndweight[] list.
"""
if seqRnd[0]:
r = getrndseq(seqRndWeight)
if seqRnd[0] == 1:
gbl.seqCount = r
r = -1
else:
r = -1
return ( r, seqRnd[1:] )
def getrndseq(v):
tmp = []
for x, i in enumerate(v):
tmp.extend([x] * i)
tmp=tmp[:gbl.seqSize]
if not len(tmp):
error("SeqRndWeight has generated an empty list")
return random.choice(tmp)
## Main parser routines
def setSeqRnd(ln):
""" Set random order for all tracks. """
global seqRnd
emsg = "use [ON, OFF or TrackList ]"
if not ln:
error("SeqRnd:" + emsg)
a=ln[0].upper()
if a in ("ON", "1") and len(ln) == 1:
seqRnd = [1]
elif a in ("OFF", "0") and len(ln) == 1:
seqRnd = [0]
else:
seqRnd=[2]
for a in ln:
a = a.upper()
if not a in gbl.tnames:
error("SeqRnd: Track '%s' does not exist, %s" % (a, emsg))
if a in seqRnd:
error("SeqRnd: Duplicate track '%s' specified, %s" % (a, emsg))
seqRnd.append(a)
if gbl.debug:
print "SeqRnd:",
if seqRnd[0] == 2:
for a in seqRnd[1:]:
print a,
print
elif seqRnd[0] == 1:
print "On"
else:
print "Off"
def getweights(ln, msg):
ln = lnExpand(ln, msg)
if not ln:
error("Use: %s <weight factors>" % msg)
tmp = []
for n in ln:
n = stoi(n)
if n < 0: error("%s: Values must be 0 or greater" % msg)
tmp.append(n)
tmp = seqBump(tmp)
if gbl.debug:
print "%s: " % msg,
printList(tmp)
return tmp
def setSeqRndWeight(ln):
""" Set global rnd weight. """
global seqRndWeight
seqRndWeight = getweights(ln, "SeqRndWeight")

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:04 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:29:57 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Ballad</H1> <H1>Ballad</H1>
@ -8,6 +8,7 @@
<LI><A Href=#BalladSus>BalladSus</a> <LI><A Href=#BalladSus>BalladSus</a>
<LI><A Href=#Ballad1>Ballad1</a> <LI><A Href=#Ballad1>Ballad1</a>
<LI><A Href=#Ballad1Sus>Ballad1Sus</a> <LI><A Href=#Ballad1Sus>Ballad1Sus</a>
<LI><A Href=#BalladFill>BalladFill</a>
<LI><A Href=#BalladIntro>BalladIntro</a> <LI><A Href=#BalladIntro>BalladIntro</a>
<LI><A Href=#BalladIntro1>BalladIntro1</a> <LI><A Href=#BalladIntro1>BalladIntro1</a>
<LI><A Href=#BalladIntro2>BalladIntro2</a> <LI><A Href=#BalladIntro2>BalladIntro2</a>
@ -116,6 +117,30 @@
</Table> </Table>
</TD></TR> </TD></TR>
</Table> </Table>
<A Name=BalladFill></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> BalladFill </H2>
1 bar fill, good for endings. <B>(1)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Bass </TD> <TD> FretlessBass </TD></TR>
<TR><TD> Chord </TD> <TD> Atmosphere </TD></TR>
<TR><TD> Drum-Bongo </TD> <TD> LowBongo </TD></TR>
<TR><TD> Drum-Cabasa </TD> <TD> Cabasa </TD></TR>
<TR><TD> Drum-Cym </TD> <TD> RideCymbal1 </TD></TR>
<TR><TD> Drum-Hh </TD> <TD> PedalHiHat </TD></TR>
<TR><TD> Drum-Hiconga </TD> <TD> MuteHighConga </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Loconga </TD> <TD> LowConga </TD></TR>
<TR><TD> Drum-Mutetri </TD> <TD> MuteTriangle </TD></TR>
<TR><TD> Drum-Opentri </TD> <TD> OpenTriangle </TD></TR>
<TR><TD> Drum-Shake </TD> <TD> Shaker </TD></TR>
<TR><TD> Drum-Tamb </TD> <TD> Tambourine </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=BalladIntro></a> <A Name=BalladIntro></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%"> <Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD> <TR><TD>

View File

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

View File

@ -0,0 +1,125 @@
<!-- Auto-Generated by MMA on: Sun Sep 28 11:29:57 2008 -->
<HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Ballad68</H1>
<P>A 6/8 Ballad. Written for "Dedicated To The One I Love". This is written with 4 beats to the bar, so you'll probably need to multiply the "real" tempo by 2. Largely based on ballad128, so they should be somewhat compatible.
<ul>
<LI><A Href=#Ballad68>Ballad68</a>
<LI><A Href=#Ballad68Plus>Ballad68Plus</a>
<LI><A Href=#Ballad68Sus>Ballad68Sus</a>
<LI><A Href=#Ballad68SusPlus>Ballad68SusPlus</a>
<LI><A Href=#Ballad68-44>Ballad68-44</a>
<LI><A Href=#Ballad68Intro>Ballad68Intro</a>
<LI><A Href=#Ballad68End>Ballad68End</a>
</ul>
<A Name=Ballad68></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> Ballad68 </H2>
A rock ballad beat in 6/8. <B>(4)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> OrchestralHarp </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> SideKick </TD></TR>
<TR><TD> Drum-Snare </TD> <TD> SnareDrum2 </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=Ballad68Plus></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> Ballad68Plus </H2>
Adds arpeggiated piano. <B>(4)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Arpeggio </TD> <TD> Piano1 </TD></TR>
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> OrchestralHarp </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> SideKick </TD></TR>
<TR><TD> Drum-Snare </TD> <TD> SnareDrum2 </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=Ballad68Sus></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> Ballad68Sus </H2>
Add in sustained TremoloStrings <B>(4)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> OrchestralHarp </TD></TR>
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> SideKick </TD></TR>
<TR><TD> Drum-Snare </TD> <TD> SnareDrum2 </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=Ballad68SusPlus></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> Ballad68SusPlus </H2>
Sustained strings and apreggiating piano. <B>(4)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Arpeggio </TD> <TD> Piano1 </TD></TR>
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> OrchestralHarp </TD></TR>
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> SideKick </TD></TR>
<TR><TD> Drum-Snare </TD> <TD> SnareDrum2 </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=Ballad68-44></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> Ballad68-44 </H2>
A 4/4 fill bar. <B>(1)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> OrchestralHarp </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> SideKick </TD></TR>
<TR><TD> Drum-Snare </TD> <TD> SnareDrum2 </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=Ballad68Intro></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> Ballad68Intro </H2>
This 4 bar intro with arpeggios. <B>(4)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Arpeggio </TD> <TD> OrchestralHarp </TD></TR>
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> SideKick </TD></TR>
<TR><TD> Drum-Snare </TD> <TD> SnareDrum2 </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=Ballad68End></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> Ballad68End </H2>
Simple 2 bar ending. <B>(2)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
<TR><TD> Chord </TD> <TD> OrchestralHarp </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> SideKick </TD></TR>
<TR><TD> Drum-Snare </TD> <TD> SnareDrum2 </TD></TR>
</Table>
</TD></TR>
</Table>
</Body></HTML>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:06 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:29:58 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Chacha</H1> <H1>Chacha</H1>
@ -33,6 +33,7 @@
<LI><A Href=#ChaChaFill>ChaChaFill</a> <LI><A Href=#ChaChaFill>ChaChaFill</a>
<LI><A Href=#ChaCha1Fill>ChaCha1Fill</a> <LI><A Href=#ChaCha1Fill>ChaCha1Fill</a>
<LI><A Href=#ChaChaIntro>ChaChaIntro</a> <LI><A Href=#ChaChaIntro>ChaChaIntro</a>
<LI><A Href=#ChaChaIntro8>ChaChaIntro8</a>
<LI><A Href=#ChaChaEnd>ChaChaEnd</a> <LI><A Href=#ChaChaEnd>ChaChaEnd</a>
</ul> </ul>
<A Name=ChaCha></a> <A Name=ChaCha></a>
@ -194,6 +195,28 @@
</Table> </Table>
</TD></TR> </TD></TR>
</Table> </Table>
<A Name=ChaChaIntro8></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> ChaChaIntro8 </H2>
Same intro expanded to 8 bars. <B>(8)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Bass </TD> <TD> JazzGuitar </TD></TR>
<TR><TD> Chord </TD> <TD> Piano1 </TD></TR>
<TR><TD> Drum-Clave </TD> <TD> Claves </TD></TR>
<TR><TD> Drum-Hconga </TD> <TD> MuteHighConga </TD></TR>
<TR><TD> Drum-Hh </TD> <TD> RideCymbal1 </TD></TR>
<TR><TD> Drum-Htom </TD> <TD> HighTom2 </TD></TR>
<TR><TD> Drum-Lconga </TD> <TD> LowConga </TD></TR>
<TR><TD> Drum-Lguiro </TD> <TD> LongGuiro </TD></TR>
<TR><TD> Drum-Mtom </TD> <TD> MidTom2 </TD></TR>
<TR><TD> Drum-Sguiro </TD> <TD> ShortGuiro </TD></TR>
<TR><TD> Drum-Snare </TD> <TD> SnareDrum1 </TD></TR>
</Table>
</TD></TR>
</Table>
<A Name=ChaChaEnd></a> <A Name=ChaChaEnd></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%"> <Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD> <TR><TD>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,4 +1,4 @@
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:13 2007 --> <!-- Auto-Generated by MMA on: Sun Sep 28 11:30:03 2008 -->
<HTML> <HTML>
<BODY BGCOLOR="#B7DFFF" Text=Black> <BODY BGCOLOR="#B7DFFF" Text=Black>
<H1>Shuffleboggie</H1> <H1>Shuffleboggie</H1>
@ -10,6 +10,7 @@
<LI><A Href=#ShuffleBoggieIntro>ShuffleBoggieIntro</a> <LI><A Href=#ShuffleBoggieIntro>ShuffleBoggieIntro</a>
<LI><A Href=#ShuffleBoggieIntro4>ShuffleBoggieIntro4</a> <LI><A Href=#ShuffleBoggieIntro4>ShuffleBoggieIntro4</a>
<LI><A Href=#ShuffleBoggieEnd>ShuffleBoggieEnd</a> <LI><A Href=#ShuffleBoggieEnd>ShuffleBoggieEnd</a>
<LI><A Href=#ShuffleBoggieFill>ShuffleBoggieFill</a>
</ul> </ul>
<A Name=ShuffleBoggie></a> <A Name=ShuffleBoggie></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%"> <Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
@ -133,5 +134,24 @@
</Table> </Table>
</TD></TR> </TD></TR>
</Table> </Table>
<A Name=ShuffleBoggieFill></a>
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
<TR><TD>
<H2> ShuffleBoggieFill </H2>
Single bar fill. <B>(1)</B>
</TD></TR>
<TR><TD>
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
<TR><TD> Bass </TD> <TD> SlapBass1 </TD></TR>
<TR><TD> Chord-Guitar </TD> <TD> MutedGuitar </TD></TR>
<TR><TD> Chord-Piano </TD> <TD> Piano2 </TD></TR>
<TR><TD> Chord-Sax </TD> <TD> TenorSax </TD></TR>
<TR><TD> Drum-Clap </TD> <TD> HandClap </TD></TR>
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
<TR><TD> Drum-Ohh </TD> <TD> OpenHiHat </TD></TR>
<TR><TD> Drum-Snare </TD> <TD> SnareDrum2 </TD></TR>
</Table>
</TD></TR>
</Table>
</Body></HTML> </Body></HTML>

View File

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

View File

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

View File

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

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