mirror of
https://github.com/microtherion/VocalEasel.git
synced 2024-12-22 03:04:00 +00:00
Updated to MMA 1.4
This commit is contained in:
parent
5b55f5f1cd
commit
fb48baaf09
|
@ -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)
|
||||
|
||||
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
119
mma/MMA/docs.py
119
mma/MMA/docs.py
|
@ -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 = ""
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
448
mma/MMA/grooves.py
Normal 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
|
||||
|
|
@ -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 " + \
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
130
mma/MMA/macro.py
130
mma/MMA/macro.py
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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):
|
||||
|
|
208
mma/MMA/midi.py
208
mma/MMA/midi.py
|
@ -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.
|
||||
|
||||
|
|
105
mma/MMA/midiC.py
105
mma/MMA/midiC.py
|
@ -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"
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -23,6 +23,7 @@ Bob van der Poel <bob@mellowood.ca>
|
|||
|
||||
|
||||
"""
|
||||
|
||||
import gbl
|
||||
from MMA.common import *
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
502
mma/MMA/parse.py
502
mma/MMA/parse.py
|
@ -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,
|
||||
|
|
458
mma/MMA/pat.py
458
mma/MMA/pat.py
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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[:] )
|
||||
|
||||
|
|
|
@ -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
148
mma/MMA/patch.py
Normal 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
48
mma/MMA/safe_eval.py
Normal 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
155
mma/MMA/seqrnd.py
Normal 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")
|
||||
|
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -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!"
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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%">
|
||||
|
|
125
mma/docs/html/lib/stdlib/ballad68.html
Normal file
125
mma/docs/html/lib/stdlib/ballad68.html
Normal 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>
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
91
mma/docs/html/lib/stdlib/rb-ballad.html
Normal file
91
mma/docs/html/lib/stdlib/rb-ballad.html
Normal 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>
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
263
mma/docs/html/lib/stdlib/rockwaltz.html
Normal file
263
mma/docs/html/lib/stdlib/rockwaltz.html
Normal 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>
|
114
mma/docs/html/lib/stdlib/salsa.html
Normal file
114
mma/docs/html/lib/stdlib/salsa.html
Normal 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>
|
|
@ -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%">
|
||||
|
|
168
mma/docs/html/lib/stdlib/showtune.html
Normal file
168
mma/docs/html/lib/stdlib/showtune.html
Normal 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>
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
Loading…
Reference in New Issue
Block a user