Updated to MMA 1.4

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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

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

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

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

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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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