mirror of
https://github.com/microtherion/VocalEasel.git
synced 2024-12-22 11:14: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.patArpeggio
|
||||||
import MMA.patSolo
|
import MMA.patSolo
|
||||||
import MMA.patAria
|
import MMA.patAria
|
||||||
|
import MMA.grooves
|
||||||
|
|
||||||
import gbl
|
import gbl
|
||||||
from MMA.common import *
|
from MMA.common import *
|
||||||
|
|
||||||
|
|
||||||
trkClasses = {
|
trkClasses = {
|
||||||
'BASS' : MMA.patBass.Bass,
|
'BASS' : MMA.patBass.Bass,
|
||||||
'CHORD' : MMA.patChord.Chord,
|
'CHORD' : MMA.patChord.Chord,
|
||||||
|
@ -75,9 +76,9 @@ def trackAlloc(name, err):
|
||||||
If not, we either error (err==1) or return (err==0).
|
If not, we either error (err==1) or return (err==0).
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if trkClasses.has_key(base):
|
try:
|
||||||
f = trkClasses[base]
|
f = trkClasses[base]
|
||||||
else:
|
except:
|
||||||
if err:
|
if err:
|
||||||
error("There is no track class '%s' for trackname '%s'" % (base, name) )
|
error("There is no track class '%s' for trackname '%s'" % (base, name) )
|
||||||
else:
|
else:
|
||||||
|
@ -93,7 +94,7 @@ def trackAlloc(name, err):
|
||||||
|
|
||||||
# Update current grooves to reflect new track.
|
# Update current grooves to reflect new track.
|
||||||
|
|
||||||
for slot in gbl.settingsGroove.keys():
|
for slot in MMA.grooves.glist.keys():
|
||||||
newtk.saveGroove(slot)
|
newtk.saveGroove(slot)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -29,10 +29,12 @@ import sys
|
||||||
import pickle
|
import pickle
|
||||||
|
|
||||||
import MMA.midi
|
import MMA.midi
|
||||||
import gbl
|
|
||||||
import MMA.parse
|
import MMA.parse
|
||||||
|
|
||||||
|
import gbl
|
||||||
from MMA.common import *
|
from MMA.common import *
|
||||||
|
|
||||||
|
|
||||||
grooveDir = {}
|
grooveDir = {}
|
||||||
mmadir = ".mmaDB" # constant, name of the lib database file
|
mmadir = ".mmaDB" # constant, name of the lib database file
|
||||||
fileCount = 0
|
fileCount = 0
|
||||||
|
@ -52,8 +54,8 @@ def updateGrooveList(n):
|
||||||
def libUpdate():
|
def libUpdate():
|
||||||
""" Update the mma library database file(s) with -g or -G option.
|
""" Update the mma library database file(s) with -g or -G option.
|
||||||
|
|
||||||
This is called from the main program after the initialization
|
This is called from the main program after the initialization
|
||||||
and other option parsing. No RETURN.
|
and other option parsing. No RETURN.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
global fileCount, gdDate, grooveDir, processedfiles
|
global fileCount, gdDate, grooveDir, processedfiles
|
||||||
|
@ -137,9 +139,9 @@ def dolibupdate(root, subdir):
|
||||||
|
|
||||||
|
|
||||||
""" Get a list of the files in this directory. If the list
|
""" Get a list of the files in this directory. If the list
|
||||||
includes a file called 'MMAIGNORE' the entire directory
|
includes a file called 'MMAIGNORE' the entire directory
|
||||||
(and subdirs) is ignored. Otherwise, each file in the
|
(and subdirs) is ignored. Otherwise, each file in the
|
||||||
directory ending in 'mma' is parsed for groove defs.
|
directory ending in 'mma' is parsed for groove defs.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
p = os.path.join(root,subdir)
|
p = os.path.join(root,subdir)
|
||||||
|
@ -156,9 +158,7 @@ def dolibupdate(root, subdir):
|
||||||
if fn.startswith('.') or fn.startswith('#'):
|
if fn.startswith('.') or fn.startswith('#'):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# Create full path name
|
f=os.path.join(root, subdir, fn) # Create full path name
|
||||||
|
|
||||||
f=os.path.join(root, subdir, fn)
|
|
||||||
|
|
||||||
if os.path.isdir(f):
|
if os.path.isdir(f):
|
||||||
dolibupdate(root, os.path.join(subdir,fn)) # recursive!
|
dolibupdate(root, os.path.join(subdir,fn)) # recursive!
|
||||||
|
@ -168,18 +168,18 @@ def dolibupdate(root, subdir):
|
||||||
|
|
||||||
processedFiles.append(ename)
|
processedFiles.append(ename)
|
||||||
|
|
||||||
if gdDate and grooveDir.has_key(ename) and \
|
if gdDate and ename in grooveDir and os.path.getmtime(f) < gdDate:
|
||||||
os.path.getmtime(f) < gdDate:
|
|
||||||
print " Existing: %s" % f
|
print " Existing: %s" % f
|
||||||
grooveCount += len(grooveDir[ename])
|
grooveCount += len(grooveDir[ename])
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if grooveDir.has_key(ename):
|
if ename in grooveDir:
|
||||||
print " Updating: %s" % f
|
print " Updating: %s" % f
|
||||||
else:
|
else:
|
||||||
print " Creating: %s" % f
|
print " Creating: %s" % f
|
||||||
mkGrooveList = []
|
mkGrooveList = []
|
||||||
gbl.mtrks = {}
|
gbl.mtrks = {}
|
||||||
|
MMA.grooves.aliaslist = {}
|
||||||
for c in gbl.midiAssigns.keys():
|
for c in gbl.midiAssigns.keys():
|
||||||
gbl.midiAssigns[c]=[]
|
gbl.midiAssigns[c]=[]
|
||||||
for a,v in enumerate(gbl.midiAvail):
|
for a,v in enumerate(gbl.midiAvail):
|
||||||
|
|
|
@ -27,7 +27,7 @@ import copy
|
||||||
|
|
||||||
|
|
||||||
from MMA.common import *
|
from MMA.common import *
|
||||||
from MMA.chordtable import chords
|
from MMA.chordtable import chordlist
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -42,7 +42,7 @@ def defChord(ln):
|
||||||
if not len(ln):
|
if not len(ln):
|
||||||
error(emsg)
|
error(emsg)
|
||||||
name = ln.pop(0)
|
name = ln.pop(0)
|
||||||
if name in chords.keys():
|
if name in chordlist.keys():
|
||||||
warning("Redefining chordtype '%s'" % name)
|
warning("Redefining chordtype '%s'" % name)
|
||||||
|
|
||||||
if '/' in name:
|
if '/' in name:
|
||||||
|
@ -77,27 +77,28 @@ def defChord(ln):
|
||||||
scale[i]=v
|
scale[i]=v
|
||||||
|
|
||||||
|
|
||||||
chords[name] = ( notes, scale, "User Defined")
|
chordlist[name] = ( notes, scale, "User Defined")
|
||||||
|
|
||||||
if gbl.debug:
|
if gbl.debug:
|
||||||
print "ChordType '%s', %s" % (name, chords[name])
|
print "ChordType '%s', %s" % (name, chordlist[name])
|
||||||
|
|
||||||
|
|
||||||
def printChord(ln):
|
def printChord(ln):
|
||||||
""" Display the note/scale/def for chord(s). """
|
""" Display the note/scale/def for chord(s). """
|
||||||
|
|
||||||
for c in ln:
|
for c in ln:
|
||||||
if not chords.has_key(c):
|
try:
|
||||||
|
print c, ':', chordlist[c][0], chordlist[c][1], chordlist[c][2]
|
||||||
|
except:
|
||||||
error("Chord '%s' is unknown" % c)
|
error("Chord '%s' is unknown" % c)
|
||||||
print c, ':', chords[c][0], chords[c][1], chords[c][2]
|
|
||||||
|
|
||||||
|
|
||||||
"""
|
""" Table of chord adjustment factors. Since the initial chord is based
|
||||||
Table of chord adjustment factors. Since the initial chord is based
|
on a C scale, we need to shift the chord for different degrees. Note,
|
||||||
on a C scale, we need to shift the chord for different degrees. Note,
|
that with C as a midpoint we shift left for G/A/B and right for D/E/F.
|
||||||
that with C as a midpoint we shift left for G/A/B and right for D/E/F.
|
|
||||||
|
|
||||||
Should the shifts take in account the current key signature?
|
Should the shifts take in account the current key signature?
|
||||||
"""
|
"""
|
||||||
|
|
||||||
cdAdjust = {
|
cdAdjust = {
|
||||||
|
@ -288,14 +289,14 @@ class ChordNotes:
|
||||||
ctype='M'
|
ctype='M'
|
||||||
|
|
||||||
try:
|
try:
|
||||||
notes = chords[ctype][0]
|
notes = chordlist[ctype][0]
|
||||||
adj = cdAdjust[tonic] + octave
|
adj = cdAdjust[tonic] + octave
|
||||||
except:
|
except:
|
||||||
error( "Illegal/Unknown chord name: '%s'" % name )
|
error( "Illegal/Unknown chord name: '%s'" % name )
|
||||||
|
|
||||||
self.noteList = [ x + adj for x in notes ]
|
self.noteList = [ x + adj for x in notes ]
|
||||||
self.bnoteList = tuple(self.noteList)
|
self.bnoteList = tuple(self.noteList)
|
||||||
self.scaleList = tuple([ x + adj for x in chords[ctype][1] ])
|
self.scaleList = tuple([ x + adj for x in chordlist[ctype][1] ])
|
||||||
self.chordType = ctype
|
self.chordType = ctype
|
||||||
self.tonic = tonic
|
self.tonic = tonic
|
||||||
self.rootNote = self.noteList[0]
|
self.rootNote = self.noteList[0]
|
||||||
|
@ -311,11 +312,11 @@ class ChordNotes:
|
||||||
# Do inversions if there is a valid slash notation.
|
# Do inversions if there is a valid slash notation.
|
||||||
|
|
||||||
if slash:
|
if slash:
|
||||||
if not cdAdjust.has_key(slash):
|
try:
|
||||||
|
r=cdAdjust[slash] # r = -6 to 6
|
||||||
|
except KeyError:
|
||||||
error("The note '%s' in the slash chord is unknown" % slash)
|
error("The note '%s' in the slash chord is unknown" % slash)
|
||||||
|
|
||||||
r=cdAdjust[slash] # r = -6 to 6
|
|
||||||
|
|
||||||
# If the slash note is in the chord we invert
|
# If the slash note is in the chord we invert
|
||||||
# the chord so the slash note is in root position.
|
# the chord so the slash note is in root position.
|
||||||
|
|
||||||
|
|
|
@ -53,7 +53,7 @@ A = Bbb= 9
|
||||||
As = Bb = 10
|
As = Bb = 10
|
||||||
B = Cb = 11
|
B = Cb = 11
|
||||||
|
|
||||||
chords = {
|
chordlist = {
|
||||||
'M': ((C, E, G ),
|
'M': ((C, E, G ),
|
||||||
(C, D, E, F, G, A, B),
|
(C, D, E, F, G, A, B),
|
||||||
"Major triad. This is the default and is used in "
|
"Major triad. This is the default and is used in "
|
||||||
|
@ -399,8 +399,8 @@ chords = {
|
||||||
|
|
||||||
|
|
||||||
""" Extend our table with common synomyns. These are real copies,
|
""" Extend our table with common synomyns. These are real copies,
|
||||||
not pointers. This is done so that a user redefine only affects
|
not pointers. This is done so that a user redefine only affects
|
||||||
the original.
|
the original.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
aliases = (
|
aliases = (
|
||||||
|
@ -448,14 +448,15 @@ aliases = (
|
||||||
('9sus', 'sus9', ''),
|
('9sus', 'sus9', ''),
|
||||||
('9-5', '9b5', ''),
|
('9-5', '9b5', ''),
|
||||||
('dim3', 'mb5', 'Diminished triad (non-standard notation).'),
|
('dim3', 'mb5', 'Diminished triad (non-standard notation).'),
|
||||||
('omit3(add9)','omit3add9', '')
|
('omit3(add9)','omit3add9', ''),
|
||||||
|
('9sus4', 'sus9', '')
|
||||||
)
|
)
|
||||||
|
|
||||||
for a,b,d in aliases:
|
for a,b,d in aliases:
|
||||||
n=chords[b][0]
|
n=chordlist[b][0]
|
||||||
s=chords[b][1]
|
s=chordlist[b][1]
|
||||||
if not d:
|
if not d:
|
||||||
d=chords[b][2]
|
d=chordlist[b][2]
|
||||||
|
|
||||||
chords[a] = (n, s, d)
|
chordlist[a] = (n, s, d)
|
||||||
|
|
||||||
|
|
|
@ -56,29 +56,34 @@ def error(msg):
|
||||||
|
|
||||||
if ln:
|
if ln:
|
||||||
ln += '\n'
|
ln += '\n'
|
||||||
|
|
||||||
print "ERROR:%s %s" % (ln, msg)
|
print "ERROR:%s %s" % (ln, msg)
|
||||||
|
|
||||||
|
# Parse though the error message and check for illegal characters.
|
||||||
|
# Report (first only) if any found.
|
||||||
|
|
||||||
|
for a in msg:
|
||||||
|
a=ord(a)
|
||||||
|
if a<0x20 or a >=0x80:
|
||||||
|
print "Corrupt input file? Illegal character 0x%2x found." % a
|
||||||
|
break
|
||||||
|
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
def warning(msg):
|
def warning(msg):
|
||||||
""" Print warning message and return. """
|
""" Print warning message and return. """
|
||||||
|
|
||||||
|
if not gbl.noWarn:
|
||||||
|
ln = ""
|
||||||
|
|
||||||
if gbl.noWarn:
|
if gbl.lineno >= 0:
|
||||||
return
|
ln = "<Line %d>" % gbl.lineno
|
||||||
|
|
||||||
ln = ""
|
if gbl.inpath:
|
||||||
|
ln += "<File:%s>" % gbl.inpath.fname
|
||||||
if gbl.lineno >= 0:
|
|
||||||
ln = "<Line %d>" % gbl.lineno
|
|
||||||
|
|
||||||
if gbl.inpath:
|
|
||||||
ln += "<File:%s>" % gbl.inpath.fname
|
|
||||||
|
|
||||||
print "Warning:%s\n %s" % (ln, msg)
|
|
||||||
|
|
||||||
|
print "Warning:%s\n %s" % (ln, msg)
|
||||||
|
|
||||||
|
|
||||||
def getOffset(ticks, ran=None):
|
def getOffset(ticks, ran=None):
|
||||||
|
@ -124,10 +129,13 @@ def stof(s, errmsg=None):
|
||||||
try:
|
try:
|
||||||
return float(s)
|
return float(s)
|
||||||
except:
|
except:
|
||||||
if errmsg:
|
try:
|
||||||
error(errmsg)
|
return int(s,0)
|
||||||
else:
|
except:
|
||||||
error("Expecting a value, not %s" % s)
|
if errmsg:
|
||||||
|
error(errmsg)
|
||||||
|
else:
|
||||||
|
error("Expecting a value, not %s" % s)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -144,15 +152,15 @@ def printList(l):
|
||||||
def pextract(s, open, close, onlyone=None):
|
def pextract(s, open, close, onlyone=None):
|
||||||
""" Extract a parenthesized set of substrings.
|
""" Extract a parenthesized set of substrings.
|
||||||
|
|
||||||
s - original string
|
s - original string
|
||||||
open - substring start tag \ can be multiple character
|
open - substring start tag \ can be multiple character
|
||||||
close - substring end tag / strings (ie. "<<" or "-->")
|
close - substring end tag / strings (ie. "<<" or "-->")
|
||||||
onlyone - optional, if set only the first set is extracted
|
onlyone - optional, if set only the first set is extracted
|
||||||
|
|
||||||
returns ( original sans subs, [subs, ...] )
|
returns ( original sans subs, [subs, ...] )
|
||||||
|
|
||||||
eg: pextract( "x{123}{666}y", '{', '}' )
|
eg: pextract( "x{123}{666}y", '{', '}' )
|
||||||
Returns: ( 'xy', [ '123', '666' ] )
|
Returns: ( 'xy', [ '123', '666' ] )
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -171,3 +179,34 @@ def pextract(s, open, close, onlyone=None):
|
||||||
|
|
||||||
return s.strip(), subs
|
return s.strip(), subs
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def seqBump(l):
|
||||||
|
""" Expand/contract an existing sequence list to the current seqSize."""
|
||||||
|
|
||||||
|
while len(l) < gbl.seqSize:
|
||||||
|
l += l
|
||||||
|
return l[:gbl.seqSize]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def lnExpand(ln, msg):
|
||||||
|
""" Validate and expand a list passed to a set command. """
|
||||||
|
|
||||||
|
|
||||||
|
if len(ln) > gbl.seqSize:
|
||||||
|
warning("%s list truncated to %s patterns" % (msg, gbl.seqSize) )
|
||||||
|
ln = ln[:gbl.seqSize]
|
||||||
|
|
||||||
|
last = None
|
||||||
|
|
||||||
|
for i,n in enumerate(ln):
|
||||||
|
if n == '/':
|
||||||
|
if not last:
|
||||||
|
error ("%s cannot use a '/' as the first item in list." % cmd)
|
||||||
|
else:
|
||||||
|
ln[i] = last
|
||||||
|
else:
|
||||||
|
last = n
|
||||||
|
|
||||||
|
return ln
|
||||||
|
|
119
mma/MMA/docs.py
119
mma/MMA/docs.py
|
@ -26,9 +26,13 @@ Bob van der Poel <bob@mellowood.ca>
|
||||||
import os
|
import os
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
import MMA.midiC
|
||||||
|
import MMA.grooves
|
||||||
|
|
||||||
import gbl
|
import gbl
|
||||||
from MMA.common import *
|
from MMA.common import *
|
||||||
import MMA.midiC
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def docDrumNames(order):
|
def docDrumNames(order):
|
||||||
|
@ -76,22 +80,22 @@ def docInstNames(order):
|
||||||
|
|
||||||
|
|
||||||
""" Whenever MMA encounters a DOC command, or if it defines
|
""" Whenever MMA encounters a DOC command, or if it defines
|
||||||
a groove with DEFGROOVE it calls the docAdd() function.
|
a groove with DEFGROOVE it calls the docAdd() function.
|
||||||
|
|
||||||
The saved docs are printed to stdout with the docDump() command.
|
The saved docs are printed to stdout with the docDump() command.
|
||||||
This is called whenever parse() encounters an EOF.
|
This is called whenever parse() encounters an EOF.
|
||||||
|
|
||||||
Both routines are ignored if the -Dx command line option has
|
Both routines are ignored if the -Dx command line option has
|
||||||
not been set.
|
not been set.
|
||||||
|
|
||||||
Storage is done is in the following arrays.
|
Storage is done is in the following arrays.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
fname = ''
|
fname = ''
|
||||||
author=""
|
author = ""
|
||||||
notes=""
|
notes = ""
|
||||||
defs=[]
|
defs = []
|
||||||
variables=[]
|
variables = []
|
||||||
|
|
||||||
def docAuthor(ln):
|
def docAuthor(ln):
|
||||||
global author
|
global author
|
||||||
|
@ -104,7 +108,7 @@ def docNote(ln):
|
||||||
|
|
||||||
global fname, notes
|
global fname, notes
|
||||||
|
|
||||||
if not gbl.docs or not ln:
|
if not gbl.createDocs or not ln:
|
||||||
return
|
return
|
||||||
|
|
||||||
# Grab the arg and data, save it
|
# Grab the arg and data, save it
|
||||||
|
@ -119,7 +123,7 @@ def docVars(ln):
|
||||||
|
|
||||||
global fname, variables
|
global fname, variables
|
||||||
|
|
||||||
if not gbl.docs or not ln:
|
if not gbl.createDocs or not ln:
|
||||||
return
|
return
|
||||||
|
|
||||||
fname = os.path.basename(gbl.inpath.fname)
|
fname = os.path.basename(gbl.inpath.fname)
|
||||||
|
@ -129,9 +133,9 @@ def docVars(ln):
|
||||||
def docDefine(ln):
|
def docDefine(ln):
|
||||||
""" Save a DEFGROOVE comment string.
|
""" Save a DEFGROOVE comment string.
|
||||||
|
|
||||||
Entries are stored as a list. Each item in the list is
|
Entries are stored as a list. Each item in the list is
|
||||||
complete groove def looking like:
|
complete groove def looking like:
|
||||||
defs[ [ Name, Seqsize, Description, [ [TRACK,INST]...]] ...]
|
defs[ [ Name, Seqsize, Description, [ [TRACK,INST]...]] ...]
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -149,12 +153,13 @@ def docDefine(ln):
|
||||||
|
|
||||||
defs.append(l)
|
defs.append(l)
|
||||||
|
|
||||||
|
|
||||||
def docDump():
|
def docDump():
|
||||||
""" Print the LaTex docs. """
|
""" Print the LaTex docs. """
|
||||||
|
|
||||||
global fname, author, notes, defs, variables
|
global fname, author, notes, defs, variables
|
||||||
|
|
||||||
if gbl.docs == 1: # latex docs
|
if gbl.createDocs == 1: # latex docs
|
||||||
if notes:
|
if notes:
|
||||||
if fname.endswith(gbl.ext):
|
if fname.endswith(gbl.ext):
|
||||||
fname='.'.join(fname.split('.')[:-1])
|
fname='.'.join(fname.split('.')[:-1])
|
||||||
|
@ -170,13 +175,21 @@ def docDump():
|
||||||
|
|
||||||
if defs:
|
if defs:
|
||||||
for l in defs:
|
for l in defs:
|
||||||
print " \\instable{%s}{%s}{%s}{" % \
|
alias = MMA.grooves.getAlias(l[0])
|
||||||
(totex(l[0]), totex(l[2]), l[1] )
|
if alias:
|
||||||
|
if len(alias)>1:
|
||||||
|
alias="Aliases: %s" % alias
|
||||||
|
else:
|
||||||
|
alias="Alias: %s" % alias
|
||||||
|
else:
|
||||||
|
alias=''
|
||||||
|
print " \\instable{%s}{%s}{%s}{%s}{" % \
|
||||||
|
(totex(l[0]), totex(l[2]), l[1], alias)
|
||||||
for c,v in l[3:]:
|
for c,v in l[3:]:
|
||||||
print " \\insline{%s}{%s}" % (c.title(), totex(v))
|
print " \\insline{%s}{%s}" % (c.title(), totex(v))
|
||||||
print " }"
|
print " }"
|
||||||
|
|
||||||
if gbl.docs == 2: # html docs
|
if gbl.createDocs == 2: # html docs
|
||||||
if notes:
|
if notes:
|
||||||
print '<!-- Auto-Generated by MMA on: %s -->' % time.ctime()
|
print '<!-- Auto-Generated by MMA on: %s -->' % time.ctime()
|
||||||
print '<HTML>'
|
print '<HTML>'
|
||||||
|
@ -213,6 +226,13 @@ def docDump():
|
||||||
print '<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">'
|
print '<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">'
|
||||||
print ' <TR><TD>'
|
print ' <TR><TD>'
|
||||||
print ' <H2> %s </H2> ' % l[0]
|
print ' <H2> %s </H2> ' % l[0]
|
||||||
|
alias=MMA.grooves.getAlias(l[0])
|
||||||
|
if alias:
|
||||||
|
if len(alias)>1:
|
||||||
|
ll="Aliases"
|
||||||
|
else:
|
||||||
|
ll="Alias"
|
||||||
|
print ' <H4> %s: %s </H4>' % (ll, alias)
|
||||||
print ' %s <B>(%s)</B> ' % ( l[2], l[1] )
|
print ' %s <B>(%s)</B> ' % ( l[2], l[1] )
|
||||||
print ' </TD></TR>'
|
print ' </TD></TR>'
|
||||||
print ' <TR><TD>'
|
print ' <TR><TD>'
|
||||||
|
@ -224,17 +244,54 @@ def docDump():
|
||||||
print '</Table>'
|
print '</Table>'
|
||||||
print
|
print
|
||||||
print '</Body></HTML>'
|
print '</Body></HTML>'
|
||||||
|
|
||||||
|
if gbl.createDocs == 3:
|
||||||
|
if notes:
|
||||||
|
if fname.endswith(gbl.ext):
|
||||||
|
fname='.'.join(fname.split('.')[:-1])
|
||||||
|
print "%s.mma %s" % (fname, notes)
|
||||||
|
print
|
||||||
|
|
||||||
|
if variables:
|
||||||
|
print " Variables:"
|
||||||
|
for l in variables:
|
||||||
|
print " %s %s" % ( l[0], l[1] )
|
||||||
|
print
|
||||||
|
|
||||||
|
if defs:
|
||||||
|
for l in defs:
|
||||||
|
print "Groove %s" % l[0].title()
|
||||||
|
|
||||||
|
MMA.grooves.grooveDo(l[0].upper())
|
||||||
|
for t in sorted(gbl.tnames):
|
||||||
|
tr = gbl.tnames[t]
|
||||||
|
sq = tr.sequence
|
||||||
|
if sq[0]:
|
||||||
|
rt = []
|
||||||
|
for a in range(gbl.seqSize):
|
||||||
|
s=sq[a]
|
||||||
|
x = '{' + tr.formatPattern(sq[a]) + '}'
|
||||||
|
rt.append(x)
|
||||||
|
print " %s Sequence %s" % (tr.name, ' '.join(rt))
|
||||||
|
if tr.vtype == 'DRUM':
|
||||||
|
print " %s Tone %s" % (tr.name,
|
||||||
|
' '.join([MMA.midiC.valueToDrum(a) for a in tr.toneList]))
|
||||||
|
else:
|
||||||
|
print " %s Voice %s" % (tr.name,
|
||||||
|
' '.join([MMA.midiC.voiceNames[a] for a in tr.voice]))
|
||||||
|
|
||||||
|
print
|
||||||
|
|
||||||
defs = []
|
defs = []
|
||||||
variables=[]
|
variables=[]
|
||||||
notes = ""
|
notes = ""
|
||||||
author = ""
|
author = ""
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def totex(s):
|
def totex(s):
|
||||||
""" Parse a string and quote tex stuff.
|
""" Parse a string and quote tex stuff.
|
||||||
|
|
||||||
Also handles proper quotation style.
|
Also handles proper quotation style.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
s = s.replace("$", "\$")
|
s = s.replace("$", "\$")
|
||||||
|
@ -254,3 +311,17 @@ def totex(s):
|
||||||
|
|
||||||
|
|
||||||
return s
|
return s
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def docVerbose():
|
||||||
|
""" Print verbose pattern/sequence info: -Dp command line. """
|
||||||
|
|
||||||
|
global fname, author, notes, defs, variables
|
||||||
|
|
||||||
|
|
||||||
|
defs = []
|
||||||
|
variables=[]
|
||||||
|
notes = ""
|
||||||
|
author = ""
|
||||||
|
|
||||||
|
|
|
@ -32,11 +32,11 @@ from MMA.common import *
|
||||||
def locFile(name, lib):
|
def locFile(name, lib):
|
||||||
""" Locate a filename.
|
""" Locate a filename.
|
||||||
|
|
||||||
This checks, in order:
|
This checks, in order:
|
||||||
lib/name + .mma
|
lib/name + .mma
|
||||||
lib/name
|
lib/name
|
||||||
name + .mma
|
name + .mma
|
||||||
name
|
name
|
||||||
"""
|
"""
|
||||||
|
|
||||||
ext=gbl.ext
|
ext=gbl.ext
|
||||||
|
@ -52,7 +52,7 @@ def locFile(name, lib):
|
||||||
t=os.path.join(lib, name)
|
t=os.path.join(lib, name)
|
||||||
if exists(t):
|
if exists(t):
|
||||||
return t
|
return t
|
||||||
|
|
||||||
if not name.endswith(ext):
|
if not name.endswith(ext):
|
||||||
t = name + ext
|
t = name + ext
|
||||||
if exists(t):
|
if exists(t):
|
||||||
|
@ -73,7 +73,7 @@ class ReadFile:
|
||||||
|
|
||||||
class FileData:
|
class FileData:
|
||||||
""" After reading the file in bulk it is parsed and stored in this
|
""" After reading the file in bulk it is parsed and stored in this
|
||||||
data structure. Blanks lines and comments are removed.
|
data structure. Blanks lines and comments are removed.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, lnum, data, label):
|
def __init__(self, lnum, data, label):
|
||||||
|
@ -97,7 +97,6 @@ class ReadFile:
|
||||||
|
|
||||||
try:
|
try:
|
||||||
inpath = file(fname, 'r')
|
inpath = file(fname, 'r')
|
||||||
|
|
||||||
except:
|
except:
|
||||||
error("Unable to open '%s' for input" % fname)
|
error("Unable to open '%s' for input" % fname)
|
||||||
|
|
||||||
|
@ -107,7 +106,6 @@ class ReadFile:
|
||||||
self.fname = fname
|
self.fname = fname
|
||||||
|
|
||||||
""" Read entire file, line by line:
|
""" Read entire file, line by line:
|
||||||
|
|
||||||
- strip off blanks, comments
|
- strip off blanks, comments
|
||||||
- join continuation lines
|
- join continuation lines
|
||||||
- parse out LABELS
|
- parse out LABELS
|
||||||
|
@ -131,11 +129,18 @@ class ReadFile:
|
||||||
if not l:
|
if not l:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
# join lines ending in '\' (the strip() makes this the last char
|
||||||
|
|
||||||
while l[-1] == '\\':
|
while l[-1] == '\\':
|
||||||
l = l[0:-1] + ' ' + inpath.readline().strip()
|
l = l[0:-1] + ' ' + inpath.readline().strip()
|
||||||
lcount +=1
|
lcount +=1
|
||||||
|
|
||||||
|
""" input cleanup ... for now the only cleanup is to convert
|
||||||
|
0xa0 (non-breakable space) to 0x20 (regular space).
|
||||||
|
"""
|
||||||
|
|
||||||
|
l=l.replace('\xa0', '\x20')
|
||||||
|
|
||||||
""" This next line splits the line at the first found
|
""" This next line splits the line at the first found
|
||||||
comment '//', drops the comment, and splits the
|
comment '//', drops the comment, and splits the
|
||||||
remaining line into tokens using whitespace delimiters.
|
remaining line into tokens using whitespace delimiters.
|
||||||
|
@ -200,6 +205,7 @@ class ReadFile:
|
||||||
else:
|
else:
|
||||||
label = None
|
label = None
|
||||||
|
|
||||||
|
|
||||||
# Save the line, linenumber and (maybe) the label.
|
# Save the line, linenumber and (maybe) the label.
|
||||||
|
|
||||||
fdata.append( dataStore(lcount, l, label))
|
fdata.append( dataStore(lcount, l, label))
|
||||||
|
@ -222,15 +228,15 @@ class ReadFile:
|
||||||
def goto(self, l):
|
def goto(self, l):
|
||||||
""" Do a goto jump.
|
""" Do a goto jump.
|
||||||
|
|
||||||
This isn't perfect, but is probably the way most GOTOs work. If
|
This isn't perfect, but is probably the way most GOTOs work. If
|
||||||
inside a repeat/if then nothing more is processed. The jump is
|
inside a repeat/if then nothing more is processed. The jump is
|
||||||
immediate. Of course, you'll run into problems with missing
|
immediate. Of course, you'll run into problems with missing
|
||||||
repeat/repeatend if you try it. Since all repeats are stacked
|
repeat/repeatend if you try it. Since all repeats are stacked
|
||||||
back into the que, we just delete the que. Then we look for a
|
back into the que, we just delete the que. Then we look for a
|
||||||
matching label in the file line array.
|
matching label in the file line array.
|
||||||
|
|
||||||
Label search is linear. Not too efficient, but the lists
|
Label search is linear. Not too efficient, but the lists
|
||||||
will probably never be that long either.
|
will probably never be that long either.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -251,13 +257,13 @@ class ReadFile:
|
||||||
def push(self, q, nums):
|
def push(self, q, nums):
|
||||||
""" Push a list of lines back into the input stream.
|
""" Push a list of lines back into the input stream.
|
||||||
|
|
||||||
Note: This is a list of semi-processed lines, no comments, etc.
|
Note: This is a list of semi-processed lines, no comments, etc.
|
||||||
|
|
||||||
It's quicker to extend a list than to insert, so add to the end.
|
It's quicker to extend a list than to insert, so add to the end.
|
||||||
Note: we reverse the original, extend() then reverse again, just
|
Note: we reverse the original, extend() then reverse again, just
|
||||||
in case the caller cares.
|
in case the caller cares.
|
||||||
|
|
||||||
nums is a list of linenumbers. Needed to report error lines.
|
nums is a list of linenumbers. Needed to report error lines.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if not self.que:
|
if not self.que:
|
||||||
|
@ -276,8 +282,8 @@ class ReadFile:
|
||||||
def read(self):
|
def read(self):
|
||||||
""" Return a line.
|
""" Return a line.
|
||||||
|
|
||||||
This will return either a queued line or a line from the
|
This will return either a queued line or a line from the
|
||||||
file (which was stored/processed earlier).
|
file (which was stored/processed earlier).
|
||||||
"""
|
"""
|
||||||
|
|
||||||
while 1:
|
while 1:
|
||||||
|
|
|
@ -24,7 +24,7 @@ Bob van der Poel <bob@mellowood.ca>
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
version = "1.1" # Version -- March 7/2007
|
version = "1.4" # Version -- Sept/2008
|
||||||
|
|
||||||
""" mtrks is storage for the MIDI data as it is created.
|
""" mtrks is storage for the MIDI data as it is created.
|
||||||
It is a dict of class Mtrk() instances. Keys are the
|
It is a dict of class Mtrk() instances. Keys are the
|
||||||
|
@ -56,7 +56,7 @@ for c in range(0,17):
|
||||||
is inc/decremented.
|
is inc/decremented.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
midiAvail=[ 0 ] * 17 # slots 0..16, slot 0 is not used.
|
midiAvail = [ 0 ] * 17 # slots 0..16, slot 0 is not used.
|
||||||
|
|
||||||
deletedTracks = [] # list of deleted tracks for -c report
|
deletedTracks = [] # list of deleted tracks for -c report
|
||||||
|
|
||||||
|
@ -64,28 +64,14 @@ deletedTracks = [] # list of deleted tracks for -c report
|
||||||
are names, data is a channel. Eg. midiChPrefs['BASS-SUS']==9
|
are names, data is a channel. Eg. midiChPrefs['BASS-SUS']==9
|
||||||
"""
|
"""
|
||||||
|
|
||||||
midiChPrefs={}
|
midiChPrefs = {}
|
||||||
|
|
||||||
|
|
||||||
|
""" Is the -T option is used only the tracks in this list
|
||||||
""" Groove storage. Each entry in settingsGroove{} has a keyname
|
are generated. All other tracks are muted (OFF)
|
||||||
of a saved groove.
|
|
||||||
|
|
||||||
lastGroove and currentGroove are used by macros
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
settingsGroove = {}
|
muteTracks = []
|
||||||
lastGroove = ''
|
|
||||||
currentGroove = ''
|
|
||||||
|
|
||||||
|
|
||||||
""" SeqRnd variable is a list. The first entry is a flag:(0, 1 or x):
|
|
||||||
0 - not set
|
|
||||||
1 - set
|
|
||||||
2 - set for specific tracks, track list starts at position [1]
|
|
||||||
"""
|
|
||||||
|
|
||||||
seqRnd = [0] # set if SEQRND has been set
|
|
||||||
|
|
||||||
|
|
||||||
############# String constants ####################
|
############# String constants ####################
|
||||||
|
@ -98,28 +84,31 @@ ext = ".mma" # extension for song/lib files.
|
||||||
|
|
||||||
|
|
||||||
BperQ = 192 # midi ticks per quarter note
|
BperQ = 192 # midi ticks per quarter note
|
||||||
QperBar = 4 # Beats/bar, set with TIME
|
QperBar = 4 # Beats/bar, set with TIME
|
||||||
tickOffset = 0 # offset of current bar in ticks
|
tickOffset = 0 # offset of current bar in ticks
|
||||||
tempo = 120 # current tempo
|
tempo = 120 # current tempo
|
||||||
seqSize = 1 # variation sequence table size
|
seqSize = 1 # variation sequence table size
|
||||||
seqCount = 0 # running count of variation
|
seqCount = 0 # running count of variation
|
||||||
|
|
||||||
transpose = 0 # Transpose is global (ignored by drum tracks)
|
totTime = 0.0 # running duration count in seconds
|
||||||
|
|
||||||
lineno = -1 # used for error reporting
|
transpose = 0 # Transpose is global (ignored by drum tracks)
|
||||||
|
|
||||||
swingMode = 0 # defaults to 0, set to 1 for swing mode
|
lineno = -1 # used for error reporting
|
||||||
swingSkew = None # this is just for $_SwingMode macro
|
|
||||||
|
|
||||||
barNum = 0 # Current line number
|
swingMode = 0 # defaults to 0, set to 1 for swing mode
|
||||||
|
swingSkew = None # this is just for $_SwingMode macro
|
||||||
|
|
||||||
|
barNum = 0 # Current line number
|
||||||
|
|
||||||
|
synctick = 0 # flag, set if we want a tick on all tracks at offset 0
|
||||||
|
endsync = 0 # flag, set if we want a eof sync
|
||||||
|
|
||||||
synctick = 0 # flag, set if we want a tick on all tracks at offset 0
|
|
||||||
|
|
||||||
############# Path and search variables. #############
|
############# Path and search variables. #############
|
||||||
|
|
||||||
|
|
||||||
libPath = ''
|
libPath = ''
|
||||||
for p in ( "c:\\mma\\lib", "/usr/local/share/mma/lib", "/usr/share/mma/lib", "./lib"):
|
for p in ( "c:\\mma\\lib", "/usr/local/share/mma/lib", "/usr/share/mma/lib", "./lib"):
|
||||||
if os.path.isdir(p):
|
if os.path.isdir(p):
|
||||||
libPath=p
|
libPath=p
|
||||||
break
|
break
|
||||||
|
@ -139,8 +128,8 @@ mmaEnd = [] # list of END files
|
||||||
mmaRC = None # user specified RC file, overrides defaults
|
mmaRC = None # user specified RC file, overrides defaults
|
||||||
inpath = None # input file
|
inpath = None # input file
|
||||||
|
|
||||||
midiFileType = 1 # type 1 file, SMF command can change to 0
|
midiFileType = 1 # type 1 file, SMF command can change to 0
|
||||||
runningStatus = 1 # running status enabled
|
runningStatus = 1 # running status enabled
|
||||||
|
|
||||||
|
|
||||||
############# Options. #############
|
############# Options. #############
|
||||||
|
@ -163,9 +152,11 @@ chshow = Lchshow = 0
|
||||||
|
|
||||||
outfile = None
|
outfile = None
|
||||||
infile = None
|
infile = None
|
||||||
docs = 0
|
createDocs = 0
|
||||||
maxBars = 500
|
maxBars = 500
|
||||||
makeGrvDefs = 0
|
makeGrvDefs = 0
|
||||||
cmdSMF = None
|
cmdSMF = None
|
||||||
|
|
||||||
|
playFile = 0 # set if we want to call a player
|
||||||
|
midiPlayer = "aplaymidi"
|
||||||
|
|
||||||
|
|
448
mma/MMA/grooves.py
Normal file
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):
|
def gethnote(note, chord):
|
||||||
""" Determine harmony notes for a note based on the chord.
|
""" Determine harmony notes for a note based on the chord.
|
||||||
|
|
||||||
note - midi value of the note
|
note - midi value of the note
|
||||||
|
|
||||||
chord - list of midi values for the chord
|
chord - list of midi values for the chord
|
||||||
|
|
||||||
|
|
||||||
This routine works by creating a chord list with all
|
This routine works by creating a chord list with all
|
||||||
its notes having a value less than the note (remember, this
|
its notes having a value less than the note (remember, this
|
||||||
is all MIDI values). We then grab notes from the end of
|
is all MIDI values). We then grab notes from the end of
|
||||||
the chord until one is found which is less than the original
|
the chord until one is found which is less than the original
|
||||||
note.
|
note.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
wm="No harmony note found since no chord, using note " + \
|
wm="No harmony note found since no chord, using note " + \
|
||||||
|
|
|
@ -252,35 +252,37 @@ class Lyric:
|
||||||
|
|
||||||
if self.dupchords:
|
if self.dupchords:
|
||||||
ly = []
|
ly = []
|
||||||
|
for v in ln.split(): # do each chord symbol or '/' mark
|
||||||
|
|
||||||
for v in ln.split():
|
if v != '/':
|
||||||
v = v.replace('&', 'b')
|
v = v.replace('&', 'b') # remember, "&" is optional
|
||||||
if v == 'z':
|
|
||||||
v = 'N.C.'
|
if v == 'z' or v == 'z!': # convert plain z to "NC"
|
||||||
if 'z' in v:
|
v = 'N.C.'
|
||||||
v = v.split('z')[0]
|
|
||||||
while v.startswith('-'):
|
|
||||||
v=v[1:]
|
|
||||||
while v.startswith('+'):
|
|
||||||
v=v[1:]
|
|
||||||
|
|
||||||
if self.transpose:
|
if 'z' in v: # strip out the 'zCDA..' after the chord
|
||||||
tr=0 # Needed in case line is invalid!
|
v = v.split('z')[0]
|
||||||
cn=v[0:2]
|
|
||||||
if self.chordnames.has_key(cn):
|
v = v.lstrip("+-") # strip off leading "+" and "-"
|
||||||
tr=self.chordnames[cn] + self.transpose
|
|
||||||
|
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:
|
if t != None: # use None, 0 is okay
|
||||||
cn=v[0:1]
|
while t>=12: t-=12
|
||||||
if self.chordnames.has_key(cn):
|
while t<=-12: t+=12
|
||||||
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):]
|
|
||||||
|
|
||||||
|
v = self.transNames[self.transKey][t] + v[len(cn):]
|
||||||
|
|
||||||
ly.append(v)
|
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().
|
something like: macros=MMMmacros.Macros().
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import gbl
|
import random
|
||||||
from MMA.common import *
|
|
||||||
from MMA.notelen import getNoteLen
|
|
||||||
import MMA.midiC
|
import MMA.midiC
|
||||||
import MMA.lyric
|
|
||||||
import MMA.translate
|
import MMA.translate
|
||||||
import MMA.patSolo
|
import MMA.patSolo
|
||||||
import MMA.patAria
|
import MMA.patAria
|
||||||
import MMA.volume
|
import MMA.volume
|
||||||
import MMA.notelen
|
import MMA.grooves
|
||||||
|
import MMA.parse
|
||||||
|
import MMA.seqrnd
|
||||||
|
|
||||||
import random
|
import gbl
|
||||||
|
from MMA.lyric import lyric
|
||||||
|
from MMA.common import *
|
||||||
|
from MMA.safe_eval import safe_eval
|
||||||
|
|
||||||
|
|
||||||
class Macros:
|
class Macros:
|
||||||
|
@ -90,15 +93,15 @@ class Macros:
|
||||||
return str(int(MMA.volume.lastVolume * 100))
|
return str(int(MMA.volume.lastVolume * 100))
|
||||||
|
|
||||||
elif s == 'GROOVE':
|
elif s == 'GROOVE':
|
||||||
return gbl.currentGroove
|
return MMA.grooves.currentGroove
|
||||||
|
|
||||||
elif s == 'LASTGROOVE':
|
elif s == 'LASTGROOVE':
|
||||||
return gbl.lastGroove
|
return MMA.grooves.lastGroove
|
||||||
|
|
||||||
elif s == 'SEQRND':
|
elif s == 'SEQRND':
|
||||||
if gbl.seqRnd[0] == 0: return "Off"
|
if MMA.seqrnd.seqRnd[0] == 0: return "Off"
|
||||||
if gbl.seqRnd[0] == 1: return "On"
|
if MMA.seqrnd.seqRnd[0] == 1: return "On"
|
||||||
return ' '.join(gbl.seqRnd[1:])
|
return ' '.join(MMA.seqrnd.seqRnd[1:])
|
||||||
|
|
||||||
elif s == 'SEQSIZE':
|
elif s == 'SEQSIZE':
|
||||||
return str(gbl.seqSize)
|
return str(gbl.seqSize)
|
||||||
|
@ -141,7 +144,7 @@ class Macros:
|
||||||
return ' '.join([str(x) for x in MMA.midi.splitChannels])
|
return ' '.join([str(x) for x in MMA.midi.splitChannels])
|
||||||
|
|
||||||
elif s == 'SEQRNDWEIGHT':
|
elif s == 'SEQRNDWEIGHT':
|
||||||
return ' '.join([str(x) for x in MMA.parse.seqRndWeight])
|
return ' '.join([str(x) for x in MMA.seqrnd.seqRndWeight])
|
||||||
|
|
||||||
elif s == 'AUTOLIBPATH':
|
elif s == 'AUTOLIBPATH':
|
||||||
return gbl.autoLib
|
return gbl.autoLib
|
||||||
|
@ -168,7 +171,7 @@ class Macros:
|
||||||
return str(gbl.lineno)
|
return str(gbl.lineno)
|
||||||
|
|
||||||
elif s == 'LYRIC':
|
elif s == 'LYRIC':
|
||||||
return MMA.lyric.lyric.setting()
|
return lyric.setting()
|
||||||
|
|
||||||
# Track vars ... these are in format TRACKNAME_VAR
|
# Track vars ... these are in format TRACKNAME_VAR
|
||||||
|
|
||||||
|
@ -179,10 +182,10 @@ class Macros:
|
||||||
tname = s[:a]
|
tname = s[:a]
|
||||||
func = s[a+1:]
|
func = s[a+1:]
|
||||||
|
|
||||||
if gbl.tnames.has_key(tname):
|
try:
|
||||||
t=gbl.tnames[tname]
|
t=gbl.tnames[tname]
|
||||||
else:
|
except:
|
||||||
error("System variable $_%s refers to nonexistent track" % s)
|
error("System variable $_%s refers to nonexistent track." % s )
|
||||||
|
|
||||||
|
|
||||||
if func == 'ACCENT':
|
if func == 'ACCENT':
|
||||||
|
@ -246,6 +249,12 @@ class Macros:
|
||||||
|
|
||||||
elif func == 'RVOLUME':
|
elif func == 'RVOLUME':
|
||||||
return ' '.join([str(int(a * 100)) for a in t.rVolume])
|
return ' '.join([str(int(a * 100)) for a in t.rVolume])
|
||||||
|
|
||||||
|
elif func == 'SEQUENCE':
|
||||||
|
tmp = []
|
||||||
|
for a in range(gbl.seqSize):
|
||||||
|
tmp.append('{' + t.formatPattern(t.sequence[a]) + '}')
|
||||||
|
return ' '.join(tmp)
|
||||||
|
|
||||||
elif func == 'SEQRND':
|
elif func == 'SEQRND':
|
||||||
if t.seqRnd: return 'On'
|
if t.seqRnd: return 'On'
|
||||||
|
@ -271,7 +280,8 @@ class Macros:
|
||||||
return ' '.join([str(x) for x in t.unify])
|
return ' '.join([str(x) for x in t.unify])
|
||||||
|
|
||||||
elif func == 'VOICE':
|
elif func == 'VOICE':
|
||||||
return ' '.join([MMA.midiC.voiceNames[a] for a in t.voice])
|
return ' '.join([MMA.midiC.valueToInst(a) for a in t.voice])
|
||||||
|
|
||||||
|
|
||||||
elif func == 'VOICING':
|
elif func == 'VOICING':
|
||||||
if t.vtype != 'CHORD':
|
if t.vtype != 'CHORD':
|
||||||
|
@ -287,7 +297,6 @@ class Macros:
|
||||||
error("Unknown system track variable %s" % s)
|
error("Unknown system track variable %s" % s)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def expand(self, l):
|
def expand(self, l):
|
||||||
""" Loop though input line and make variable subsitutions.
|
""" Loop though input line and make variable subsitutions.
|
||||||
MMA variables are pretty simple ... any word starting
|
MMA variables are pretty simple ... any word starting
|
||||||
|
@ -301,23 +310,36 @@ class Macros:
|
||||||
if not self.expandMode:
|
if not self.expandMode:
|
||||||
return l
|
return l
|
||||||
|
|
||||||
|
gotmath=0
|
||||||
|
|
||||||
while 1: # Loop until no more subsitutions have been done
|
while 1: # Loop until no more subsitutions have been done
|
||||||
sub=0
|
sub=0
|
||||||
|
|
||||||
for i,s in enumerate(l):
|
for i,s in enumerate(l):
|
||||||
if s[:2] == '$$':
|
|
||||||
continue
|
|
||||||
|
|
||||||
if s[0]=='$':
|
if s[0]=='$':
|
||||||
s=s[1:].upper()
|
|
||||||
|
|
||||||
if s.startswith('_'):
|
s = s[1:].upper()
|
||||||
|
frst = s[0]
|
||||||
|
|
||||||
|
if frst == '$': # $$ - don't expand (done in IF clause)
|
||||||
|
continue
|
||||||
|
|
||||||
|
elif frst == '(': # flag math macro
|
||||||
|
gotmath = 1
|
||||||
|
continue
|
||||||
|
|
||||||
|
# we have a var, see if system or user. Set 'ex'
|
||||||
|
|
||||||
|
elif frst == '_': # system var
|
||||||
ex=self.sysvar(s[1:])
|
ex=self.sysvar(s[1:])
|
||||||
|
|
||||||
|
|
||||||
|
elif 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 )
|
error("User variable '%s' has not been defined" % s )
|
||||||
|
|
||||||
else:
|
|
||||||
ex=self.vars[s]
|
|
||||||
|
|
||||||
if type(ex) == type([]): # MSET variable
|
if type(ex) == type([]): # MSET variable
|
||||||
if len(ex):
|
if len(ex):
|
||||||
|
@ -336,6 +358,35 @@ class Macros:
|
||||||
if not sub:
|
if not sub:
|
||||||
break
|
break
|
||||||
|
|
||||||
|
# all the mma internal and system macros are expanded. Now check for math.
|
||||||
|
|
||||||
|
if gotmath:
|
||||||
|
l = ' '.join(l) # join back into one line
|
||||||
|
|
||||||
|
while 1:
|
||||||
|
try:
|
||||||
|
s1 = l.index('$(') # any '$(' left?
|
||||||
|
except:
|
||||||
|
break # nope, done
|
||||||
|
# find trailing )
|
||||||
|
nest=0
|
||||||
|
s2 = s1+2
|
||||||
|
max = len(l)
|
||||||
|
while 1:
|
||||||
|
if l[s2] == '(': nest+=1
|
||||||
|
if l[s2] == ')':
|
||||||
|
if not nest:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
nest-=1
|
||||||
|
s2 += 1
|
||||||
|
if s2 >= max:
|
||||||
|
error("Unmatched delimiter in '%s'." % l)
|
||||||
|
|
||||||
|
l = l[:s1] + str(safe_eval( l[s1+2:s2].strip())) + l[s2+1:]
|
||||||
|
|
||||||
|
l=l.split()
|
||||||
|
|
||||||
return l
|
return l
|
||||||
|
|
||||||
|
|
||||||
|
@ -567,6 +618,7 @@ class Macros:
|
||||||
l=l.upper()
|
l=l.upper()
|
||||||
|
|
||||||
if l[:2] == '$$':
|
if l[:2] == '$$':
|
||||||
|
l=l.upper()
|
||||||
l=l[2:]
|
l=l[2:]
|
||||||
if not l in self.vars:
|
if not l in self.vars:
|
||||||
error("String Variable '%s' does not exist" % l)
|
error("String Variable '%s' does not exist" % l)
|
||||||
|
@ -575,9 +627,12 @@ class Macros:
|
||||||
try:
|
try:
|
||||||
v=float(l)
|
v=float(l)
|
||||||
except:
|
except:
|
||||||
v=None
|
try:
|
||||||
|
v=int(l,0) # this lets us convert HEX/OCTAL
|
||||||
|
except:
|
||||||
|
v=None
|
||||||
|
|
||||||
return ( l, v )
|
return ( l.upper(), v )
|
||||||
|
|
||||||
|
|
||||||
def readblk():
|
def readblk():
|
||||||
|
@ -626,9 +681,9 @@ class Macros:
|
||||||
retpoint = 2
|
retpoint = 2
|
||||||
|
|
||||||
if action == 'DEF':
|
if action == 'DEF':
|
||||||
compare = self.vars.has_key(v)
|
compare = v in self.vars
|
||||||
elif action == 'NDEF':
|
elif action == 'NDEF':
|
||||||
compare = ( not self.vars.has_key(v))
|
compare = ( v not in self.vars )
|
||||||
else:
|
else:
|
||||||
error("Unreachable unary conditional")
|
error("Unreachable unary conditional")
|
||||||
|
|
||||||
|
@ -693,4 +748,19 @@ class Macros:
|
||||||
gbl.inpath.push( q, qnum )
|
gbl.inpath.push( q, qnum )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def domath(s):
|
||||||
|
""" A simple math factoring func. Just does add, sub, mult, divide. """
|
||||||
|
print '>>>',s
|
||||||
|
s = ' '.join(s)
|
||||||
|
|
||||||
|
try:
|
||||||
|
s = eval(s)
|
||||||
|
|
||||||
|
except:
|
||||||
|
error("Error in '%s' expression." % s)
|
||||||
|
print s
|
||||||
|
return str(s)
|
||||||
|
|
||||||
|
|
||||||
macros = Macros()
|
macros = Macros()
|
||||||
|
|
|
@ -24,14 +24,19 @@ Bob van der Poel <bob@mellowood.ca>
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
import time
|
||||||
|
|
||||||
|
import MMA.midi
|
||||||
|
import MMA.parse
|
||||||
|
import MMA.file
|
||||||
|
import MMA.options
|
||||||
|
import MMA.auto
|
||||||
|
import MMA.docs
|
||||||
|
|
||||||
import gbl
|
import gbl
|
||||||
from MMA.common import *
|
from MMA.common import *
|
||||||
import MMA.midi
|
|
||||||
import MMA.docs
|
|
||||||
import MMA.parse
|
|
||||||
from MMA.file import locFile
|
|
||||||
from MMA.lyric import lyric
|
from MMA.lyric import lyric
|
||||||
import MMA.options
|
|
||||||
|
|
||||||
########################################
|
########################################
|
||||||
########################################
|
########################################
|
||||||
|
@ -66,37 +71,36 @@ m.addTrkName(0, 'MetaTrack')
|
||||||
m.addTempo(0, gbl.tempo)
|
m.addTempo(0, gbl.tempo)
|
||||||
MMA.parse.setTimeSig(['4','4']) # most stdlib files will override this
|
MMA.parse.setTimeSig(['4','4']) # most stdlib files will override this
|
||||||
|
|
||||||
|
|
||||||
#####################################
|
#####################################
|
||||||
# Read an RC file. All found files are processed.
|
# Read an RC file. All found files are processed.
|
||||||
|
|
||||||
docOption = gbl.docs # Disable doc printing for RC file
|
docOption = gbl.createDocs # Disable doc printing for RC file
|
||||||
gbl.docs = 0
|
gbl.createDocs = 0
|
||||||
|
|
||||||
rcread=0
|
#rcread=0
|
||||||
|
|
||||||
rcfiles = ('mmarc', 'c:\\mma\\mmarc', '~/.mmarc', '/usr/local/etc/mmarc', '/etc/mmarc' )
|
rcfiles = ('mmarc', 'c:\\mma\\mmarc', '~/.mmarc', '/usr/local/etc/mmarc', '/etc/mmarc' )
|
||||||
if gbl.mmaRC:
|
if gbl.mmaRC:
|
||||||
rcfiles = [ gbl.mmaRC ]
|
rcfiles = [ gbl.mmaRC ]
|
||||||
|
|
||||||
for i in rcfiles:
|
for i in rcfiles:
|
||||||
f = locFile(i, None)
|
f = MMA.file.locFile(i, None)
|
||||||
if f:
|
if f:
|
||||||
if gbl.showrun:
|
if gbl.showrun:
|
||||||
print "Reading RC file '%s'" % f
|
print "Reading RC file '%s'" % f
|
||||||
MMA.parse.parseFile(f)
|
MMA.parse.parseFile(f)
|
||||||
rcread+=1
|
#rcread+=1
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
if gbl.mmaRC:
|
if gbl.mmaRC:
|
||||||
error("Specified init file '%s' not found" % gbl.mmaRC)
|
error("Specified init file '%s' not found" % gbl.mmaRC)
|
||||||
|
|
||||||
if not rcread:
|
else: #if not rcread:
|
||||||
gbl.lineno = -1
|
gbl.lineno = -1
|
||||||
warning("No RC file was found or processed")
|
warning("No RC file was found or processed")
|
||||||
|
|
||||||
|
|
||||||
gbl.docs = docOption # Restore doc options
|
gbl.createDocs = docOption # Restore doc options
|
||||||
|
|
||||||
|
|
||||||
################################################
|
################################################
|
||||||
|
@ -106,8 +110,7 @@ gbl.docs = docOption # Restore doc options
|
||||||
if gbl.makeGrvDefs:
|
if gbl.makeGrvDefs:
|
||||||
if gbl.infile:
|
if gbl.infile:
|
||||||
error("No filename is permitted with the -g option")
|
error("No filename is permitted with the -g option")
|
||||||
from MMA.auto import libUpdate
|
MMA.auto.libUpdate() # update and EXIT
|
||||||
libUpdate() # update and EXIT
|
|
||||||
|
|
||||||
|
|
||||||
################################
|
################################
|
||||||
|
@ -124,7 +127,7 @@ gbl.mtrks[0].addText(0, "Input filename: %s" % gbl.infile)
|
||||||
# Just extract docs (-Dx) to stdout.
|
# Just extract docs (-Dx) to stdout.
|
||||||
|
|
||||||
if docOption:
|
if docOption:
|
||||||
f=locFile(gbl.infile, None)
|
f=MMA.file.locFile(gbl.infile, None)
|
||||||
if not f:
|
if not f:
|
||||||
error("File '%s' not found" % gbl.infile)
|
error("File '%s' not found" % gbl.infile)
|
||||||
MMA.parse.parseFile(f)
|
MMA.parse.parseFile(f)
|
||||||
|
@ -146,15 +149,19 @@ if gbl.cmdSMF:
|
||||||
# 1. strip off the extension if it is .mma,
|
# 1. strip off the extension if it is .mma,
|
||||||
# 2. append .mid
|
# 2. append .mid
|
||||||
|
|
||||||
|
if gbl.playFile and gbl.outfile:
|
||||||
|
error("You cannot use the -f option with -P")
|
||||||
|
|
||||||
if gbl.outfile:
|
if gbl.outfile:
|
||||||
outfile = gbl.outfile
|
outfile = gbl.outfile
|
||||||
|
elif gbl.playFile:
|
||||||
|
outfile = "MMAtmp%s.mid" % os.getpid()
|
||||||
else:
|
else:
|
||||||
outfile, ext = os.path.splitext(gbl.infile)
|
outfile, ext = os.path.splitext(gbl.infile)
|
||||||
if ext != gbl.ext:
|
if ext != gbl.ext:
|
||||||
outfile=gbl.infile
|
outfile=gbl.infile
|
||||||
outfile += '.mid'
|
outfile += '.mid'
|
||||||
|
|
||||||
|
|
||||||
outfile=os.path.expanduser(outfile)
|
outfile=os.path.expanduser(outfile)
|
||||||
|
|
||||||
|
|
||||||
|
@ -164,7 +171,7 @@ outfile=os.path.expanduser(outfile)
|
||||||
# First the mmastart files
|
# First the mmastart files
|
||||||
|
|
||||||
for f in gbl.mmaStart:
|
for f in gbl.mmaStart:
|
||||||
fn = locFile(f, gbl.incPath)
|
fn = MMA.file.locFile(f, gbl.incPath)
|
||||||
if not fn:
|
if not fn:
|
||||||
warning("MmaStart file '%s' not found/processed" % fn)
|
warning("MmaStart file '%s' not found/processed" % fn)
|
||||||
MMA.parse.parseFile(fn)
|
MMA.parse.parseFile(fn)
|
||||||
|
@ -172,7 +179,8 @@ for f in gbl.mmaStart:
|
||||||
|
|
||||||
# The song file specified on the command line
|
# The song file specified on the command line
|
||||||
|
|
||||||
f = locFile(gbl.infile, None)
|
|
||||||
|
f = MMA.file.locFile(gbl.infile, None)
|
||||||
|
|
||||||
if not f:
|
if not f:
|
||||||
gbl.lineno = -1
|
gbl.lineno = -1
|
||||||
|
@ -183,12 +191,11 @@ MMA.parse.parseFile(f)
|
||||||
# Finally, the mmaend files
|
# Finally, the mmaend files
|
||||||
|
|
||||||
for f in gbl.mmaEnd:
|
for f in gbl.mmaEnd:
|
||||||
fn = locFile(f, None)
|
fn = MMA.file.locFile(f, None)
|
||||||
if not fn:
|
if not fn:
|
||||||
warning("MmaEnd file '%s' not found/processed" % f)
|
warning("MmaEnd file '%s' not found/processed" % f)
|
||||||
MMA.parse.parseFile(fn)
|
MMA.parse.parseFile(fn)
|
||||||
|
|
||||||
|
|
||||||
#################################################
|
#################################################
|
||||||
# Just display the channel assignments (-c) and exit...
|
# Just display the channel assignments (-c) and exit...
|
||||||
|
|
||||||
|
@ -253,6 +260,7 @@ if gbl.noOutput:
|
||||||
|
|
||||||
gbl.lineno=-1 # disable line nums for error/warning
|
gbl.lineno=-1 # disable line nums for error/warning
|
||||||
|
|
||||||
|
|
||||||
""" We fix the outPath now. This lets you set outpath in the song file.
|
""" We fix the outPath now. This lets you set outpath in the song file.
|
||||||
|
|
||||||
The filename "outfile" was created above. It is either the input filename
|
The filename "outfile" was created above. It is either the input filename
|
||||||
|
@ -270,7 +278,7 @@ gbl.lineno=-1 # disable line nums for error/warning
|
||||||
otherwise it is inserted before the filename portion.
|
otherwise it is inserted before the filename portion.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if (not outfile.startswith('/')) and gbl.outPath and (not gbl.outfile):
|
if (not outfile.startswith('/')) and gbl.outPath and not gbl.outfile and not gbl.playFile:
|
||||||
if gbl.outPath[0] in '.\\/':
|
if gbl.outPath[0] in '.\\/':
|
||||||
outfile = "%s/%s" % (gbl.outPath, outfile)
|
outfile = "%s/%s" % (gbl.outPath, outfile)
|
||||||
else:
|
else:
|
||||||
|
@ -288,6 +296,7 @@ for n in gbl.tnames.values():
|
||||||
if n.channel:
|
if n.channel:
|
||||||
n.doMidiClear()
|
n.doMidiClear()
|
||||||
n.clearPending()
|
n.clearPending()
|
||||||
|
n.doChannelReset()
|
||||||
if n.riff:
|
if n.riff:
|
||||||
warning("%s has pending Riff(s)" % n.name)
|
warning("%s has pending Riff(s)" % n.name)
|
||||||
|
|
||||||
|
@ -317,7 +326,7 @@ if fileExist:
|
||||||
print "Overwriting existing",
|
print "Overwriting existing",
|
||||||
else:
|
else:
|
||||||
print "Creating new",
|
print "Creating new",
|
||||||
print "midi file (%s bars): '%s'" % (gbl.barNum, outfile)
|
print "midi file (%s bars, %.2f min): '%s'" % (gbl.barNum, gbl.totTime, outfile)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
out = file(outfile, 'wb')
|
out = file(outfile, 'wb')
|
||||||
|
@ -327,6 +336,15 @@ except:
|
||||||
MMA.midi.writeTracks(out)
|
MMA.midi.writeTracks(out)
|
||||||
out.close()
|
out.close()
|
||||||
|
|
||||||
|
if gbl.playFile:
|
||||||
|
print "Playing %s with %s" % (outfile, gbl.midiPlayer)
|
||||||
|
t=time.time()
|
||||||
|
os.system("%s %s" % (gbl.midiPlayer, outfile))
|
||||||
|
os.remove(outfile)
|
||||||
|
print "Play complete (%.2f min), file has been deleted." % ((time.time()-t)/60)
|
||||||
|
|
||||||
if gbl.debug:
|
if gbl.debug:
|
||||||
print "Completed processing file '%s'." % outfile
|
print "Completed processing file '%s'." % outfile
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -26,9 +26,12 @@ the sequences for later recall.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import MMA.midiC
|
||||||
|
|
||||||
import gbl
|
import gbl
|
||||||
from MMA.common import *
|
from MMA.common import *
|
||||||
import MMA.midiC
|
|
||||||
|
|
||||||
class Mdefine:
|
class Mdefine:
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|
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
|
from MMA.midiM import intToWord, intTo3Byte, intToLong, intToVarNumber
|
||||||
import MMA.midiC
|
import MMA.midiC
|
||||||
|
|
||||||
|
import gbl
|
||||||
|
from MMA.common import *
|
||||||
|
|
||||||
splitChannels = []
|
splitChannels = []
|
||||||
|
|
||||||
|
|
||||||
def setSplitChannels(ln):
|
def setSplitChannels(ln):
|
||||||
""" Parser routine, sets up list of track to split. Overwrites existing. """
|
""" Parser routine, sets up list of track to split. Overwrites existing. """
|
||||||
|
|
||||||
|
@ -39,10 +39,10 @@ def setSplitChannels(ln):
|
||||||
splitChannels = []
|
splitChannels = []
|
||||||
|
|
||||||
for a in ln:
|
for a in ln:
|
||||||
c = stoi(a)
|
a = stoi(a)
|
||||||
if c < 1 or c >16:
|
if a < 1 or a >16:
|
||||||
error("SplitChannels: Expecting value 1 to 16, not %s" % c)
|
error("SplitChannels: Expecting value 1 to 16, not %s" % a)
|
||||||
splitChannels.append(c)
|
splitChannels.append(a)
|
||||||
|
|
||||||
if gbl.debug:
|
if gbl.debug:
|
||||||
print "SplitChannels: ",
|
print "SplitChannels: ",
|
||||||
|
@ -106,15 +106,16 @@ def writeTracks(out):
|
||||||
|
|
||||||
|
|
||||||
def writeSplitTrack(channel, out):
|
def writeSplitTrack(channel, out):
|
||||||
""" Split a drum track into a separate track for the non-note
|
""" Split a track. In drum tracks this puts different instruments
|
||||||
stuff and then a track for each note.
|
into individual tracks (useful!); for instrument tracks it puts
|
||||||
|
each pitch into a track (probably not useful).
|
||||||
"""
|
"""
|
||||||
|
|
||||||
tr = gbl.mtrks[channel].miditrk # track to split
|
tr = gbl.mtrks[channel].miditrk # track to split
|
||||||
|
|
||||||
""" A dict to store the split midi tracks. We'll end out with
|
""" A dict to store the split midi tracks. We'll end out with
|
||||||
a track for each pitch which appears in the track and
|
a track for each pitch which appears in the track and
|
||||||
a track (labeled -1) to store every other than note on data.
|
a track (labeled -1) to store every other-than-note-on data.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
notes={}
|
notes={}
|
||||||
|
@ -130,7 +131,7 @@ def writeSplitTrack(channel, out):
|
||||||
else:
|
else:
|
||||||
n = -1 # special value for non-note on events
|
n = -1 # special value for non-note on events
|
||||||
|
|
||||||
if not notes.has_key(n): # create a new mtrk if needed
|
if not n in notes: # create a new mtrk if needed
|
||||||
notes[n]=Mtrk(10)
|
notes[n]=Mtrk(10)
|
||||||
|
|
||||||
if offset in notes[n].miditrk: # copy event to new track
|
if offset in notes[n].miditrk: # copy event to new track
|
||||||
|
@ -149,7 +150,7 @@ def writeSplitTrack(channel, out):
|
||||||
if channel == 10:
|
if channel == 10:
|
||||||
m = "%s" % MMA.midiC.valueToDrum(a)
|
m = "%s" % MMA.midiC.valueToDrum(a)
|
||||||
else:
|
else:
|
||||||
m= "%s-%s" % (gbl.mtrks[channel].trackname, a)
|
m = "%s-%s" % (gbl.mtrks[channel].trackname, a)
|
||||||
|
|
||||||
notes[a].addTrkName(0, m)
|
notes[a].addTrkName(0, m)
|
||||||
|
|
||||||
|
@ -166,8 +167,7 @@ def writeSplitTrack(channel, out):
|
||||||
|
|
||||||
def mkHeader(count, tempo, Mtype):
|
def mkHeader(count, tempo, Mtype):
|
||||||
|
|
||||||
return "MThd" + intToLong(6) + intToWord(Mtype) + \
|
return "MThd" + intToLong(6) + intToWord(Mtype) + intToWord(count) + intToWord(tempo)
|
||||||
intToWord(count) + intToWord(tempo)
|
|
||||||
|
|
||||||
|
|
||||||
""" Midi track class. All the midi creation is done here.
|
""" Midi track class. All the midi creation is done here.
|
||||||
|
@ -188,7 +188,7 @@ class Mtrk:
|
||||||
|
|
||||||
tr=self.miditrk
|
tr=self.miditrk
|
||||||
lg=len(cmd)
|
lg=len(cmd)
|
||||||
if tr.has_key(offset):
|
if offset in tr:
|
||||||
for i,a in enumerate(tr[offset]):
|
for i,a in enumerate(tr[offset]):
|
||||||
if a[0:lg] == cmd:
|
if a[0:lg] == cmd:
|
||||||
del tr[offset][i]
|
del tr[offset][i]
|
||||||
|
@ -221,11 +221,13 @@ class Mtrk:
|
||||||
self.delDup(offset, cmd)
|
self.delDup(offset, cmd)
|
||||||
self.addToTrack(offset, cmd + chr(0x02) + chr(n) + chr(mi) )
|
self.addToTrack(offset, cmd + chr(0x02) + chr(n) + chr(mi) )
|
||||||
|
|
||||||
|
|
||||||
def addMarker(self, offset, msg):
|
def addMarker(self, offset, msg):
|
||||||
""" Create a midi MARKER event."""
|
""" Create a midi MARKER event."""
|
||||||
|
|
||||||
self.addToTrack(offset, chr(0xff) + chr(0x06) + intToVarNumber(len(msg)) + msg )
|
self.addToTrack(offset, chr(0xff) + chr(0x06) + intToVarNumber(len(msg)) + msg )
|
||||||
|
|
||||||
|
|
||||||
def addText(self, offset, msg):
|
def addText(self, offset, msg):
|
||||||
""" Create a midi TextEvent."""
|
""" Create a midi TextEvent."""
|
||||||
|
|
||||||
|
@ -251,16 +253,25 @@ class Mtrk:
|
||||||
self.addToTrack(offset, cmd + intToVarNumber(len(msg)) + msg )
|
self.addToTrack(offset, cmd + intToVarNumber(len(msg)) + msg )
|
||||||
|
|
||||||
|
|
||||||
def addProgChange( self, offset, program):
|
def addProgChange( self, offset, program, oldprg):
|
||||||
""" Create a midi program change.
|
""" Create a midi program change (handles extended voicing).
|
||||||
|
|
||||||
program - midi program
|
program - The MIDI program (voice) value
|
||||||
|
oldprg - existing MIDI program
|
||||||
Returns - packed string
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
self.addToTrack(offset,
|
v1, lsb1, msb1 = MMA.midiC.voice2tup(oldprg)
|
||||||
chr(0xc0 | self.channel) + chr(program) )
|
v2, lsb2, msb2 = MMA.midiC.voice2tup(program)
|
||||||
|
|
||||||
|
if msb1 != msb2: # only if CTRL32 has changed
|
||||||
|
self.addToTrack(offset, chr(0xb0 | self.channel) + chr(0x20) + chr(msb2) )
|
||||||
|
|
||||||
|
if lsb1 != lsb2: # only if CTRL0 has changed
|
||||||
|
self.addToTrack(offset, chr(0xb0 | self.channel) + chr(0x00) + chr(lsb2) )
|
||||||
|
|
||||||
|
# Always do voice change. Maybe not necessary, but let's be safe.
|
||||||
|
|
||||||
|
self.addToTrack(offset, chr(0xc0 | self.channel) + chr(v2) )
|
||||||
|
|
||||||
|
|
||||||
def addGlis(self, offset, v):
|
def addGlis(self, offset, v):
|
||||||
|
@ -272,22 +283,17 @@ class Mtrk:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if v == 0:
|
if v == 0:
|
||||||
self.addToTrack(offset,
|
self.addToTrack(offset, chr(0xb0 | self.channel) + chr(0x41) + chr(0x00) )
|
||||||
chr(0xb0 | self.channel) + chr(0x41) + chr(0x00) )
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
self.addToTrack(offset,
|
self.addToTrack(offset, chr(0xb0 | self.channel) + chr(0x41) + chr(0x7f) )
|
||||||
chr(0xb0 | self.channel) + chr(0x41) + chr(0x7f) )
|
self.addToTrack(offset, chr(0xb0 | self.channel) + chr(0x05) + chr(v) )
|
||||||
self.addToTrack(offset,
|
|
||||||
chr(0xb0 | self.channel) + chr(0x05) + chr(v) )
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def addPan(self, offset, v):
|
def addPan(self, offset, v):
|
||||||
""" Set the lsb of the pan setting."""
|
""" Set the lsb of the pan setting."""
|
||||||
|
|
||||||
self.addToTrack(offset,
|
self.addToTrack(offset, chr(0xb0 | self.channel) + chr(0x0a) + chr(v) )
|
||||||
chr(0xb0 | self.channel) + chr(0x0a) + chr(v) )
|
|
||||||
|
|
||||||
|
|
||||||
def addCtl(self, offset, l):
|
def addCtl(self, offset, l):
|
||||||
|
@ -316,9 +322,9 @@ class Mtrk:
|
||||||
def addTempo(self, offset, beats):
|
def addTempo(self, offset, beats):
|
||||||
""" Create a midi tempo meta event.
|
""" Create a midi tempo meta event.
|
||||||
|
|
||||||
beats - beats per second
|
beats - beats per second
|
||||||
|
|
||||||
Return - packed midi string
|
Return - packed midi string
|
||||||
"""
|
"""
|
||||||
|
|
||||||
cmd = chr(0xff) + chr(0x51)
|
cmd = chr(0xff) + chr(0x51)
|
||||||
|
@ -329,11 +335,26 @@ class Mtrk:
|
||||||
def writeMidiTrack(self, out):
|
def writeMidiTrack(self, out):
|
||||||
""" Create/write the MIDI track.
|
""" Create/write the MIDI track.
|
||||||
|
|
||||||
We convert timing offsets to midi-deltas.
|
We convert timing offsets to midi-deltas.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
tr=self.miditrk
|
tr=self.miditrk
|
||||||
|
|
||||||
|
""" If the -1 flag is set we need to add a terminate
|
||||||
|
to the end of each track. This is done to make looping
|
||||||
|
software like seq24 happy. We do this by truncating all
|
||||||
|
data in the file past the current tick pointer and inserting
|
||||||
|
an all-notes-off at that position.
|
||||||
|
"""
|
||||||
|
|
||||||
|
if gbl.endsync and self.channel>=0:
|
||||||
|
eof = gbl.tickOffset
|
||||||
|
for offset in tr.keys():
|
||||||
|
if offset > eof:
|
||||||
|
del tr[offset]
|
||||||
|
self.addToTrack(eof, chr(0xb0 | self.channel) + chr(0x7b) + chr(0))
|
||||||
|
|
||||||
|
|
||||||
""" To every MIDI track we generate we add (if the -0 flag
|
""" To every MIDI track we generate we add (if the -0 flag
|
||||||
was set) an on/off beep at offset 0. This makes for
|
was set) an on/off beep at offset 0. This makes for
|
||||||
easier sync in multi-tracks.
|
easier sync in multi-tracks.
|
||||||
|
@ -360,19 +381,19 @@ class Mtrk:
|
||||||
# Convert all events to MIDI deltas and store in
|
# Convert all events to MIDI deltas and store in
|
||||||
# the track array/list
|
# the track array/list
|
||||||
|
|
||||||
tdata=[] # empty track container
|
tdata = [] # empty track container
|
||||||
lastSts=None # Running status tracker
|
lastSts = None # Running status tracker
|
||||||
|
|
||||||
for a in sorted(tr.keys()):
|
for a in sorted(tr.keys()):
|
||||||
delta = a-last
|
delta = a-last
|
||||||
for d in tr[a]:
|
for d in tr[a]:
|
||||||
|
|
||||||
""" Running status check. For each packet compare
|
""" Running status check. For each packet compare
|
||||||
the first byte with the first byte of the previous
|
the first byte with the first byte of the previous
|
||||||
packet. If it is can be converted to running status
|
packet. If it is can be converted to running status
|
||||||
we strip out byte 0. Note that valid running status
|
we strip out byte 0. Note that valid running status
|
||||||
byte are 0x80..0xef. 0xfx are system messages
|
byte are 0x80..0xef. 0xfx are system messages
|
||||||
and are note suitable for running status.
|
and are note suitable for running status.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if len(d) > 1:
|
if len(d) > 1:
|
||||||
|
@ -404,35 +425,34 @@ class Mtrk:
|
||||||
def addPairToTrack(self, boffset, startRnd, duration, note, v, unify):
|
def addPairToTrack(self, boffset, startRnd, duration, note, v, unify):
|
||||||
""" Add a note on/off pair to a track.
|
""" Add a note on/off pair to a track.
|
||||||
|
|
||||||
boffset - offset into current bar
|
boffset - offset into current bar
|
||||||
startRnd - rand val start adjustment
|
startRnd - rand val start adjustment
|
||||||
duration - note len
|
duration - note len
|
||||||
note - midi value of note
|
note - midi value of note
|
||||||
v - midi velocity
|
v - midi velocity
|
||||||
unify - if set attempt to unify/compress on/offs
|
unify - if set attempt to unify/compress on/offs
|
||||||
|
|
||||||
This function tries its best to handle overlapping events.
|
This function tries its best to handle overlapping events.
|
||||||
Easy to show effect with a table of note ON/OFF pairs. Both
|
Easy to show effect with a table of note ON/OFF pairs. Both
|
||||||
events are for the same note pitch.
|
events are for the same note pitch.
|
||||||
|
|
||||||
Offsets | 200 | 300 | 320 | 420
|
Offsets | 200 | 300 | 320 | 420
|
||||||
---------|--------|--------|-------|--------
|
---------|--------|--------|-------|--------
|
||||||
Pair1 | on | | off |
|
Pair1 | on | | off |
|
||||||
Pair2 | | on | | off
|
Pair2 | | on | | off
|
||||||
|
|
||||||
The logic here will delete the OFF event at 320 and
|
The logic here will delete the OFF event at 320 and
|
||||||
insert a new OFF at 300. Result is that when playing
|
insert a new OFF at 300. Result is that when playing
|
||||||
Pair1 will turn off at 300 followed by the same note
|
Pair1 will turn off at 300 followed by the same note
|
||||||
in Pair2 beginning sounded right after. Why the on/off?
|
in Pair2 beginning sounded right after. Why the on/off?
|
||||||
Remember: Velocities may be different!
|
Remember: Velocities may be different!
|
||||||
|
|
||||||
However, if the unify flag is set we should end up with:
|
However, if the unify flag is set we should end up with:
|
||||||
|
|
||||||
Offsets | 200 | 300 | 320 | 420
|
|
||||||
---------|--------|--------|-------|--------
|
|
||||||
Pair1 | on | | |
|
|
||||||
Pair2 | | | | off
|
|
||||||
|
|
||||||
|
Offsets | 200 | 300 | 320 | 420
|
||||||
|
---------|--------|--------|-------|--------
|
||||||
|
Pair1 | on | | |
|
||||||
|
Pair2 | | | | off
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -442,31 +462,31 @@ class Mtrk:
|
||||||
offOffset = onOffset + duration
|
offOffset = onOffset + duration
|
||||||
|
|
||||||
# ON/OFF events
|
# ON/OFF events
|
||||||
|
|
||||||
onEvent = chr(0x90 | self.channel) + chr(note) + chr(v)
|
onEvent = chr(0x90 | self.channel) + chr(note) + chr(v)
|
||||||
offEvent = onEvent[:-1] + chr(0)
|
offEvent = onEvent[:-1] + chr(0)
|
||||||
|
|
||||||
""" Check for overlap on last event set for this track and
|
""" Check for overlap on last event set for this track and
|
||||||
do some ugly trickry.
|
do some ugly trickry.
|
||||||
|
|
||||||
- The noOnFlag is set if we don't want to have the main
|
- The noOnFlag is set if we don't want to have the main
|
||||||
routine add in the ON event. This is set when UNIFY is
|
routine add in the ON event. This is set when UNIFY is
|
||||||
set and we have an overlap.
|
set and we have an overlap.
|
||||||
|
|
||||||
- We set F to the stored event time for this note and,
|
- We set F to the stored event time for this note and,
|
||||||
if it's in the same event range as the current event
|
if it's in the same event range as the current event
|
||||||
we loop though the saved events for this track. We are
|
we loop though the saved events for this track. We are
|
||||||
looking for a NOTE OFF event.
|
looking for a NOTE OFF event.
|
||||||
|
|
||||||
- If we get a matching event we then delete it from the
|
- If we get a matching event we then delete it from the
|
||||||
track. This requires 2 statements: one for an event
|
track. This requires 2 statements: one for an event
|
||||||
list with only 1 event, a 2nd for multiple events.
|
list with only 1 event, a 2nd for multiple events.
|
||||||
|
|
||||||
- If UNIFY is NOT set we insert a NOTE OFF at the current
|
- If UNIFY is NOT set we insert a NOTE OFF at the current
|
||||||
on time. This replaces the OFF we just deleted.
|
on time. This replaces the OFF we just deleted.
|
||||||
|
|
||||||
- If UNIFY is SET we skip the above step, and we set the
|
- If UNIFY is SET we skip the above step, and we set the
|
||||||
noOnFlag so that the ON event isn't set.
|
noOnFlag so that the ON event isn't set.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
@ -499,10 +519,10 @@ class Mtrk:
|
||||||
def zapRangeTrack(self, start, end):
|
def zapRangeTrack(self, start, end):
|
||||||
""" Clear NoteOn events from track in range: start ... end.
|
""" Clear NoteOn events from track in range: start ... end.
|
||||||
|
|
||||||
This is called from the fermata function.
|
This is called from the fermata function.
|
||||||
|
|
||||||
We delete the entire event list (3 bytes) from the buffer. This
|
We delete the entire event list (3 bytes) from the buffer. This
|
||||||
can result in empty directory enteries, but that isn't a problem.
|
can result in empty directory enteries, but that isn't a problem.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
trk=self.miditrk
|
trk=self.miditrk
|
||||||
|
@ -517,14 +537,14 @@ class Mtrk:
|
||||||
def addToTrack(self, offset, event):
|
def addToTrack(self, offset, event):
|
||||||
""" Add an event to a track.
|
""" Add an event to a track.
|
||||||
|
|
||||||
MIDI data is saved as created in track structures.
|
MIDI data is saved as created in track structures.
|
||||||
Each track has a miditrk dictionary entry which used
|
Each track has a miditrk dictionary entry which used
|
||||||
the time offsets and keys and has the various events
|
the time offsets and keys and has the various events
|
||||||
as data. Each event is packed string of bytes and
|
as data. Each event is a packed string of bytes and
|
||||||
the events are stored as a list in the order they are
|
the events are stored as a list in the order they are
|
||||||
created. Our storage looks like:
|
created. Our storage looks like:
|
||||||
|
|
||||||
miditrk[123] = [event1, event2, ...]
|
miditrk[OFFSET_VALUE] = [event1, event2, ...]
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if offset<0:
|
if offset<0:
|
||||||
|
@ -538,8 +558,6 @@ class Mtrk:
|
||||||
tr[offset]=[event]
|
tr[offset]=[event]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class TimeSig:
|
class TimeSig:
|
||||||
""" Track and set the current time signature.
|
""" Track and set the current time signature.
|
||||||
|
|
||||||
|
|
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.common import *
|
||||||
from MMA.miditables import *
|
from MMA.miditables import *
|
||||||
|
|
||||||
def drumToValue(name):
|
|
||||||
""" Get the value of the drum tone (-1==error). """
|
|
||||||
|
|
||||||
try:
|
def voice2tup(x):
|
||||||
v=int(name, 0)
|
""" Convert integer into 3 byte tuple: Voice, LSB, MSB. """
|
||||||
except:
|
|
||||||
try:
|
|
||||||
v = upperDrumNames.index(name.upper()) + 27
|
|
||||||
except ValueError:
|
|
||||||
error("Expecting a valid drum name or value for drum tone, not '%s'" % name)
|
|
||||||
|
|
||||||
if v <0 or v > 127:
|
if x>0xffff:
|
||||||
error("Note in Drum Tone list must be 0..127, not %s" % v)
|
msb = x >> 16
|
||||||
|
x &= 0xffff
|
||||||
|
else:
|
||||||
|
msb = 0
|
||||||
|
|
||||||
|
if x>0xff:
|
||||||
|
lsb = x >> 8
|
||||||
|
x &= 0xff
|
||||||
|
else:
|
||||||
|
lsb = 0
|
||||||
|
|
||||||
|
return (x, lsb, msb)
|
||||||
|
|
||||||
|
|
||||||
|
def extVocStr(v):
|
||||||
|
|
||||||
|
v = "%s.%s.%s" % voice2tup(v)
|
||||||
|
if v[-2:] == '.0':
|
||||||
|
v=v[:-2]
|
||||||
|
if v[-2:] == '.0':
|
||||||
|
v=v[:-2]
|
||||||
return v
|
return v
|
||||||
|
|
||||||
|
###############################
|
||||||
|
|
||||||
|
def drumToValue(name):
|
||||||
|
""" Get the value of the drum tone (-1==error).
|
||||||
|
Note that this is quite different from instToValue() ... in that
|
||||||
|
case the caller does a bunch of validation stuff for controllers, etc.
|
||||||
|
"""
|
||||||
|
|
||||||
|
try: # assuming that 'name' is an integer
|
||||||
|
i = int(name, 0)
|
||||||
|
if i>=0 and i<=127:
|
||||||
|
return int(name)
|
||||||
|
else:
|
||||||
|
return -1
|
||||||
|
except:
|
||||||
|
try:
|
||||||
|
return drumInx[ name.upper() ]
|
||||||
|
except KeyError:
|
||||||
|
return -1
|
||||||
|
|
||||||
|
|
||||||
|
def valueToDrum(val):
|
||||||
|
""" Get the name of the drum tone. """
|
||||||
|
|
||||||
|
try:
|
||||||
|
return drumNames[val]
|
||||||
|
except KeyError:
|
||||||
|
return str(val)
|
||||||
|
|
||||||
def instToValue(name):
|
def instToValue(name):
|
||||||
""" Get the value of the instrument name (-1==error). """
|
""" Get the value of the instrument name (-1==error). """
|
||||||
|
|
||||||
try:
|
try:
|
||||||
return upperVoiceNames.index(name.upper())
|
return voiceInx[name.upper()]
|
||||||
except ValueError:
|
except KeyError:
|
||||||
return -1
|
return -1
|
||||||
|
|
||||||
def ctrlToValue(name):
|
|
||||||
""" Get the value of the controler name (-1==error). """
|
|
||||||
|
|
||||||
try:
|
|
||||||
return upperCtrlNames.index(name.upper())
|
|
||||||
except ValueError:
|
|
||||||
return -1
|
|
||||||
|
|
||||||
def valueToInst(val):
|
def valueToInst(val):
|
||||||
""" Get the name of the inst. (or 'ERR'). """
|
""" Get the name of the inst. (or 'ERR'). """
|
||||||
|
|
||||||
try:
|
try:
|
||||||
return voiceNames[val]
|
return voiceNames[val]
|
||||||
except IndexError:
|
except KeyError:
|
||||||
return "ERROR"
|
try:
|
||||||
|
int(val)
|
||||||
|
except:
|
||||||
|
return "ERROR"
|
||||||
|
return extVocStr(val)
|
||||||
|
|
||||||
|
|
||||||
def valueToDrum(val):
|
|
||||||
""" Get the name of the drum tone.
|
|
||||||
|
|
||||||
We return the NAME of the tone, or the original value if there is
|
def ctrlToValue(name):
|
||||||
no name associated with the value (only value 27 to 86 have names).
|
""" Get the value of the controler name (-1==error). """
|
||||||
"""
|
|
||||||
|
|
||||||
if val<27 or val>86:
|
try:
|
||||||
return str(val)
|
return ctrlInx[name.upper()]
|
||||||
else:
|
except keyError:
|
||||||
return drumNames[val-27]
|
return -1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def valueToCtrl(val):
|
def valueToCtrl(val):
|
||||||
""" Get the name of the controller (or 'ERR'). """
|
""" Get the name of the controller (or 'ERR'). """
|
||||||
|
|
||||||
try:
|
try:
|
||||||
return ctrlNames[val]
|
return ctrlNames[val]
|
||||||
except IndexError:
|
except KeyError:
|
||||||
return "ERROR"
|
return "ERROR"
|
||||||
|
|
|
@ -23,11 +23,15 @@ Bob van der Poel <bob@mellowood.ca>
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
import MMA.midiM
|
import MMA.midiM
|
||||||
from MMA.alloc import trackAlloc
|
|
||||||
import gbl
|
import gbl
|
||||||
from MMA.common import *
|
from MMA.common import *
|
||||||
import os
|
from MMA.alloc import trackAlloc
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# The following 2 variables are global. A bit ugly :)
|
# The following 2 variables are global. A bit ugly :)
|
||||||
|
|
||||||
|
@ -149,7 +153,10 @@ def midiinc(ln):
|
||||||
iend = 0xffffff
|
iend = 0xffffff
|
||||||
|
|
||||||
for a in ln:
|
for a in ln:
|
||||||
cmd, opt = a.split('=')
|
try:
|
||||||
|
cmd, opt = a.split('=')
|
||||||
|
except:
|
||||||
|
error("MidiInc expecting cmd=opt pairs, not '%s'." % a)
|
||||||
|
|
||||||
cmd=cmd.upper()
|
cmd=cmd.upper()
|
||||||
|
|
||||||
|
@ -497,7 +504,7 @@ def midiinc(ln):
|
||||||
|
|
||||||
t.clearPending()
|
t.clearPending()
|
||||||
if t.voice[0] != t.ssvoice:
|
if t.voice[0] != t.ssvoice:
|
||||||
gbl.mtrks[t.channel].addProgChange( gbl.tickOffset, t.voice[0])
|
gbl.mtrks[t.channel].addProgChange( gbl.tickOffset, t.voice[0], t.ssvoice)
|
||||||
|
|
||||||
channel = t.channel
|
channel = t.channel
|
||||||
track = gbl.mtrks[channel]
|
track = gbl.mtrks[channel]
|
||||||
|
|
|
@ -27,140 +27,252 @@ MIDI controllers.
|
||||||
Having only the constants in this separate file permits to
|
Having only the constants in this separate file permits to
|
||||||
call this from other programs, mainly the mma doc creators.
|
call this from other programs, mainly the mma doc creators.
|
||||||
|
|
||||||
|
|
||||||
|
**** IMPORTANT *** IMPORTANT
|
||||||
|
|
||||||
|
The tables *Names/*Inx MUST have matching keys/values.
|
||||||
|
The KEYS in the *Inx tables are the values from the
|
||||||
|
*Name tables in UPPERCASE. Be very careful making changes!!!!!
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
# Standard GM drum tone names.
|
||||||
|
|
||||||
|
drumNames={
|
||||||
|
27:'HighQ', 28:'Slap', 29:'ScratchPush',
|
||||||
|
30:'ScratchPull', 31:'Sticks', 32:'SquareClick',
|
||||||
|
33:'MetronomeClick', 34:'MetronomeBell', 35:'KickDrum2',
|
||||||
|
36:'KickDrum1', 37:'SideKick', 38:'SnareDrum1',
|
||||||
|
39:'HandClap', 40:'SnareDrum2', 41:'LowTom2',
|
||||||
|
42:'ClosedHiHat', 43:'LowTom1', 44:'PedalHiHat',
|
||||||
|
45:'MidTom2', 46:'OpenHiHat', 47:'MidTom1',
|
||||||
|
48:'HighTom2', 49:'CrashCymbal1', 50:'HighTom1',
|
||||||
|
51:'RideCymbal1', 52:'ChineseCymbal', 53:'RideBell',
|
||||||
|
54:'Tambourine', 55:'SplashCymbal', 56:'CowBell',
|
||||||
|
57:'CrashCymbal2', 58:'VibraSlap', 59:'RideCymbal2',
|
||||||
|
60:'HighBongo', 61:'LowBongo', 62:'MuteHighConga',
|
||||||
|
63:'OpenHighConga', 64:'LowConga', 65:'HighTimbale',
|
||||||
|
66:'LowTimbale', 67:'HighAgogo', 68:'LowAgogo',
|
||||||
|
69:'Cabasa', 70:'Maracas', 71:'ShortHiWhistle',
|
||||||
|
72:'LongLowWhistle', 73:'ShortGuiro', 74:'LongGuiro',
|
||||||
|
75:'Claves', 76:'HighWoodBlock', 77:'LowWoodBlock',
|
||||||
|
78:'MuteCuica', 79:'OpenCuica', 80:'MuteTriangle',
|
||||||
|
81:'OpenTriangle', 82:'Shaker', 83:'JingleBell',
|
||||||
|
84:'Castanets', 85:'MuteSudro', 86:'OpenSudro'}
|
||||||
|
|
||||||
|
drumInx={
|
||||||
|
'HIGHQ':27, 'SLAP':28, 'SCRATCHPUSH':29,
|
||||||
|
'SCRATCHPULL':30, 'STICKS':31, 'SQUARECLICK':32,
|
||||||
|
'METRONOMECLICK':33, 'METRONOMEBELL':34, 'KICKDRUM2':35,
|
||||||
|
'KICKDRUM1':36, 'SIDEKICK':37, 'SNAREDRUM1':38,
|
||||||
|
'HANDCLAP':39, 'SNAREDRUM2':40, 'LOWTOM2':41,
|
||||||
|
'CLOSEDHIHAT':42, 'LOWTOM1':43, 'PEDALHIHAT':44,
|
||||||
|
'MIDTOM2':45, 'OPENHIHAT':46, 'MIDTOM1':47,
|
||||||
|
'HIGHTOM2':48, 'CRASHCYMBAL1':49, 'HIGHTOM1':50,
|
||||||
|
'RIDECYMBAL1':51, 'CHINESECYMBAL':52, 'RIDEBELL':53,
|
||||||
|
'TAMBOURINE':54, 'SPLASHCYMBAL':55, 'COWBELL':56,
|
||||||
|
'CRASHCYMBAL2':57, 'VIBRASLAP':58, 'RIDECYMBAL2':59,
|
||||||
|
'HIGHBONGO':60, 'LOWBONGO':61, 'MUTEHIGHCONGA':62,
|
||||||
|
'OPENHIGHCONGA':63, 'LOWCONGA':64, 'HIGHTIMBALE':65,
|
||||||
|
'LOWTIMBALE':66, 'HIGHAGOGO':67, 'LOWAGOGO':68,
|
||||||
|
'CABASA':69, 'MARACAS':70, 'SHORTHIWHISTLE':71,
|
||||||
|
'LONGLOWWHISTLE':72, 'SHORTGUIRO':73, 'LONGGUIRO':74,
|
||||||
|
'CLAVES':75, 'HIGHWOODBLOCK':76, 'LOWWOODBLOCK':77,
|
||||||
|
'MUTECUICA':78, 'OPENCUICA':79, 'MUTETRIANGLE':80,
|
||||||
|
'OPENTRIANGLE':81, 'SHAKER':82, 'JINGLEBELL':83,
|
||||||
|
'CASTANETS':84, 'MUTESUDRO':85, 'OPENSUDRO':86}
|
||||||
|
|
||||||
|
|
||||||
""" English names for midi instruments and drums.
|
|
||||||
|
|
||||||
These tables are used by the pattern classes to
|
# Standard GM voice names.
|
||||||
convert inst/drum names to midi values and by the
|
|
||||||
doc routines to print tables.
|
|
||||||
"""
|
|
||||||
|
|
||||||
# The drum names are valid for tones 27 to 87
|
|
||||||
|
|
||||||
drumNames=[
|
|
||||||
'HighQ', 'Slap', 'ScratchPush', 'ScratchPull',
|
|
||||||
'Sticks', 'SquareClick', 'MetronomeClick',
|
|
||||||
'MetronomeBell', 'KickDrum2', 'KickDrum1',
|
|
||||||
'SideKick', 'SnareDrum1', 'HandClap',
|
|
||||||
'SnareDrum2', 'LowTom2', 'ClosedHiHat',
|
|
||||||
'LowTom1', 'PedalHiHat', 'MidTom2', 'OpenHiHat',
|
|
||||||
'MidTom1', 'HighTom2', 'CrashCymbal1',
|
|
||||||
'HighTom1', 'RideCymbal1', 'ChineseCymbal',
|
|
||||||
'RideBell', 'Tambourine', 'SplashCymbal',
|
|
||||||
'CowBell', 'CrashCymbal2', 'VibraSlap',
|
|
||||||
'RideCymbal2', 'HighBongo', 'LowBongo',
|
|
||||||
'MuteHighConga', 'OpenHighConga', 'LowConga',
|
|
||||||
'HighTimbale', 'LowTimbale', 'HighAgogo',
|
|
||||||
'LowAgogo', 'Cabasa', 'Maracas',
|
|
||||||
'ShortHiWhistle', 'LongLowWhistle', 'ShortGuiro',
|
|
||||||
'LongGuiro', 'Claves', 'HighWoodBlock',
|
|
||||||
'LowWoodBlock', 'MuteCuica', 'OpenCuica',
|
|
||||||
'MuteTriangle', 'OpenTriangle', 'Shaker',
|
|
||||||
'JingleBell', 'Castanets', 'MuteSudro',
|
|
||||||
'OpenSudro' ]
|
|
||||||
|
|
||||||
upperDrumNames = [name.upper() for name in drumNames]
|
|
||||||
|
|
||||||
|
|
||||||
voiceNames=[
|
voiceNames={
|
||||||
'Piano1', 'Piano2','Piano3',
|
0:'Piano1', 1:'Piano2', 2:'Piano3',
|
||||||
'Honky-TonkPiano', 'RhodesPiano', 'EPiano',
|
3:'Honky-TonkPiano', 4:'RhodesPiano', 5:'EPiano',
|
||||||
'HarpsiChord', 'Clavinet', 'Celesta',
|
6:'HarpsiChord', 7:'Clavinet', 8:'Celesta',
|
||||||
'Glockenspiel', 'MusicBox', 'Vibraphone',
|
9:'Glockenspiel', 10:'MusicBox', 11:'Vibraphone',
|
||||||
'Marimba', 'Xylophone', 'TubularBells', 'Santur',
|
12:'Marimba', 13:'Xylophone', 14:'TubularBells',
|
||||||
'Organ1', 'Organ2', 'Organ3', 'ChurchOrgan',
|
15:'Santur', 16:'Organ1', 17:'Organ2',
|
||||||
'ReedOrgan', 'Accordion', 'Harmonica',
|
18:'Organ3', 19:'ChurchOrgan', 20:'ReedOrgan',
|
||||||
'Bandoneon', 'NylonGuitar', 'SteelGuitar',
|
21:'Accordion', 22:'Harmonica', 23:'Bandoneon',
|
||||||
'JazzGuitar', 'CleanGuitar', 'MutedGuitar',
|
24:'NylonGuitar', 25:'SteelGuitar', 26:'JazzGuitar',
|
||||||
'OverDriveGuitar', 'DistortonGuitar',
|
27:'CleanGuitar', 28:'MutedGuitar', 29:'OverDriveGuitar',
|
||||||
'GuitarHarmonics', 'AcousticBass',
|
30:'DistortonGuitar', 31:'GuitarHarmonics', 32:'AcousticBass',
|
||||||
'FingeredBass', 'PickedBass', 'FretlessBass',
|
33:'FingeredBass', 34:'PickedBass', 35:'FretlessBass',
|
||||||
'SlapBass1', 'SlapBass2', 'SynthBass1',
|
36:'SlapBass1', 37:'SlapBass2', 38:'SynthBass1',
|
||||||
'SynthBass2', 'Violin', 'Viola', 'Cello',
|
39:'SynthBass2', 40:'Violin', 41:'Viola',
|
||||||
'ContraBass', 'TremoloStrings',
|
42:'Cello', 43:'ContraBass', 44:'TremoloStrings',
|
||||||
'PizzicatoString', 'OrchestralHarp', 'Timpani',
|
45:'PizzicatoString', 46:'OrchestralHarp', 47:'Timpani',
|
||||||
'Strings', 'SlowStrings', 'SynthStrings1',
|
48:'Strings', 49:'SlowStrings', 50:'SynthStrings1',
|
||||||
'SynthStrings2', 'ChoirAahs', 'VoiceOohs',
|
51:'SynthStrings2', 52:'ChoirAahs', 53:'VoiceOohs',
|
||||||
'SynthVox', 'OrchestraHit', 'Trumpet',
|
54:'SynthVox', 55:'OrchestraHit', 56:'Trumpet',
|
||||||
'Trombone', 'Tuba', 'MutedTrumpet', 'FrenchHorn',
|
57:'Trombone', 58:'Tuba', 59:'MutedTrumpet',
|
||||||
'BrassSection', 'SynthBrass1', 'SynthBrass2',
|
60:'FrenchHorn', 61:'BrassSection', 62:'SynthBrass1',
|
||||||
'SopranoSax', 'AltoSax', 'TenorSax',
|
63:'SynthBrass2', 64:'SopranoSax', 65:'AltoSax',
|
||||||
'BaritoneSax', 'Oboe', 'EnglishHorn', 'Bassoon',
|
66:'TenorSax', 67:'BaritoneSax', 68:'Oboe',
|
||||||
'Clarinet', 'Piccolo', 'Flute', 'Recorder',
|
69:'EnglishHorn', 70:'Bassoon', 71:'Clarinet',
|
||||||
'PanFlute', 'BottleBlow', 'Shakuhachi',
|
72:'Piccolo', 73:'Flute', 74:'Recorder',
|
||||||
'Whistle', 'Ocarina', 'SquareWave', 'SawWave',
|
75:'PanFlute', 76:'BottleBlow', 77:'Shakuhachi',
|
||||||
'SynCalliope', 'ChifferLead', 'Charang',
|
78:'Whistle', 79:'Ocarina', 80:'SquareWave',
|
||||||
'SoloVoice', '5thSawWave', 'Bass&Lead',
|
81:'SawWave', 82:'SynCalliope', 83:'ChifferLead',
|
||||||
'Fantasia', 'WarmPad', 'PolySynth', 'SpaceVoice',
|
84:'Charang', 85:'SoloVoice', 86:'5thSawWave',
|
||||||
'BowedGlass', 'MetalPad', 'HaloPad', 'SweepPad',
|
87:'Bass&Lead', 88:'Fantasia', 89:'WarmPad',
|
||||||
'IceRain', 'SoundTrack', 'Crystal', 'Atmosphere',
|
90:'PolySynth', 91:'SpaceVoice', 92:'BowedGlass',
|
||||||
'Brightness', 'Goblins', 'EchoDrops',
|
93:'MetalPad', 94:'HaloPad', 95:'SweepPad',
|
||||||
'StarTheme', 'Sitar', 'Banjo', 'Shamisen',
|
96:'IceRain', 97:'SoundTrack', 98:'Crystal',
|
||||||
'Koto', 'Kalimba', 'BagPipe', 'Fiddle', 'Shanai',
|
99:'Atmosphere', 100:'Brightness', 101:'Goblins',
|
||||||
'TinkleBell', 'AgogoBells', 'SteelDrums',
|
102:'EchoDrops', 103:'StarTheme', 104:'Sitar',
|
||||||
'WoodBlock', 'TaikoDrum', 'MelodicTom1',
|
105:'Banjo', 106:'Shamisen', 107:'Koto',
|
||||||
'SynthDrum', 'ReverseCymbal', 'GuitarFretNoise',
|
108:'Kalimba', 109:'BagPipe', 110:'Fiddle',
|
||||||
'BreathNoise', 'SeaShore', 'BirdTweet',
|
111:'Shanai', 112:'TinkleBell', 113:'AgogoBells',
|
||||||
'TelephoneRing', 'HelicopterBlade',
|
114:'SteelDrums', 115:'WoodBlock', 116:'TaikoDrum',
|
||||||
'Applause/Noise', 'GunShot' ]
|
117:'MelodicTom1', 118:'SynthDrum', 119:'ReverseCymbal',
|
||||||
|
120:'GuitarFretNoise', 121:'BreathNoise', 122:'SeaShore',
|
||||||
|
123:'BirdTweet', 124:'TelephoneRing', 125:'HelicopterBlade',
|
||||||
|
126:'Applause/Noise', 127:'GunShot' }
|
||||||
|
|
||||||
|
voiceInx={
|
||||||
|
'PIANO1':0, 'PIANO2':1, 'PIANO3':2,
|
||||||
|
'HONKY-TONKPIANO':3, 'RHODESPIANO':4, 'EPIANO':5,
|
||||||
|
'HARPSICHORD':6, 'CLAVINET':7, 'CELESTA':8,
|
||||||
|
'GLOCKENSPIEL':9, 'MUSICBOX':10, 'VIBRAPHONE':11,
|
||||||
|
'MARIMBA':12, 'XYLOPHONE':13, 'TUBULARBELLS':14,
|
||||||
|
'SANTUR':15, 'ORGAN1':16, 'ORGAN2':17,
|
||||||
|
'ORGAN3':18, 'CHURCHORGAN':19, 'REEDORGAN':20,
|
||||||
|
'ACCORDION':21, 'HARMONICA':22, 'BANDONEON':23,
|
||||||
|
'NYLONGUITAR':24, 'STEELGUITAR':25, 'JAZZGUITAR':26,
|
||||||
|
'CLEANGUITAR':27, 'MUTEDGUITAR':28, 'OVERDRIVEGUITAR':29,
|
||||||
|
'DISTORTONGUITAR':30, 'GUITARHARMONICS':31, 'ACOUSTICBASS':32,
|
||||||
|
'FINGEREDBASS':33, 'PICKEDBASS':34, 'FRETLESSBASS':35,
|
||||||
|
'SLAPBASS1':36, 'SLAPBASS2':37, 'SYNTHBASS1':38,
|
||||||
|
'SYNTHBASS2':39, 'VIOLIN':40, 'VIOLA':41,
|
||||||
|
'CELLO':42, 'CONTRABASS':43, 'TREMOLOSTRINGS':44,
|
||||||
|
'PIZZICATOSTRING':45, 'ORCHESTRALHARP':46, 'TIMPANI':47,
|
||||||
|
'STRINGS':48, 'SLOWSTRINGS':49, 'SYNTHSTRINGS1':50,
|
||||||
|
'SYNTHSTRINGS2':51, 'CHOIRAAHS':52, 'VOICEOOHS':53,
|
||||||
|
'SYNTHVOX':54, 'ORCHESTRAHIT':55, 'TRUMPET':56,
|
||||||
|
'TROMBONE':57, 'TUBA':58, 'MUTEDTRUMPET':59,
|
||||||
|
'FRENCHHORN':60, 'BRASSSECTION':61, 'SYNTHBRASS1':62,
|
||||||
|
'SYNTHBRASS2':63, 'SOPRANOSAX':64, 'ALTOSAX':65,
|
||||||
|
'TENORSAX':66, 'BARITONESAX':67, 'OBOE':68,
|
||||||
|
'ENGLISHHORN':69, 'BASSOON':70, 'CLARINET':71,
|
||||||
|
'PICCOLO':72, 'FLUTE':73, 'RECORDER':74,
|
||||||
|
'PANFLUTE':75, 'BOTTLEBLOW':76, 'SHAKUHACHI':77,
|
||||||
|
'WHISTLE':78, 'OCARINA':79, 'SQUAREWAVE':80,
|
||||||
|
'SAWWAVE':81, 'SYNCALLIOPE':82, 'CHIFFERLEAD':83,
|
||||||
|
'CHARANG':84, 'SOLOVOICE':85, '5THSAWWAVE':86,
|
||||||
|
'BASS&LEAD':87, 'FANTASIA':88, 'WARMPAD':89,
|
||||||
|
'POLYSYNTH':90, 'SPACEVOICE':91, 'BOWEDGLASS':92,
|
||||||
|
'METALPAD':93, 'HALOPAD':94, 'SWEEPPAD':95,
|
||||||
|
'ICERAIN':96, 'SOUNDTRACK':97, 'CRYSTAL':98,
|
||||||
|
'ATMOSPHERE':99, 'BRIGHTNESS':100, 'GOBLINS':101,
|
||||||
|
'ECHODROPS':102, 'STARTHEME':103, 'SITAR':104,
|
||||||
|
'BANJO':105, 'SHAMISEN':106, 'KOTO':107,
|
||||||
|
'KALIMBA':108, 'BAGPIPE':109, 'FIDDLE':110,
|
||||||
|
'SHANAI':111, 'TINKLEBELL':112, 'AGOGOBELLS':113,
|
||||||
|
'STEELDRUMS':114, 'WOODBLOCK':115, 'TAIKODRUM':116,
|
||||||
|
'MELODICTOM1':117, 'SYNTHDRUM':118, 'REVERSECYMBAL':119,
|
||||||
|
'GUITARFRETNOISE':120, 'BREATHNOISE':121, 'SEASHORE':122,
|
||||||
|
'BIRDTWEET':123, 'TELEPHONERING':124, 'HELICOPTERBLADE':125,
|
||||||
|
'APPLAUSE/NOISE':126, 'GUNSHOT':127 }
|
||||||
|
|
||||||
|
|
||||||
upperVoiceNames = [name.upper() for name in voiceNames]
|
# Controller names. Tables are borrowed from:
|
||||||
|
# http://www.midi.org/about-midi/table3.shtml
|
||||||
|
|
||||||
ctrlNames = [
|
# 0-31 Double Precise Controllers MSB (14-bits, 16,384 values)
|
||||||
### also see: http://www.midi.org/about-midi/table3.shtml
|
# 32-63 Double Precise Controllers LSB (14-bits, 16,384 values)
|
||||||
|
# 64-119 Single Precise Controllers (7-bits, 128 values)
|
||||||
|
# 120-127 Channel Mode Messages
|
||||||
|
|
||||||
### 0-31 Double Precise Controllers
|
ctrlNames = {
|
||||||
### MSB (14-bits, 16,384 values)
|
0:'Bank', 1:'Modulation', 2:'Breath',
|
||||||
|
3:'Ctrl3', 4:'Foot', 5:'Portamento',
|
||||||
|
6:'Data', 7:'Volume', 8:'Balance',
|
||||||
|
9:'Ctrl9', 10:'Pan', 11:'Expression',
|
||||||
|
12:'Effect1', 13:'Effect2', 14:'Ctrl14',
|
||||||
|
15:'Ctrl15', 16:'General1', 17:'General2',
|
||||||
|
18:'General3', 19:'General4', 20:'Ctrl20',
|
||||||
|
21:'Ctrl21', 22:'Ctrl22', 23:'Ctrl23',
|
||||||
|
24:'Ctrl24', 25:'Ctrl25', 26:'Ctrl26',
|
||||||
|
27:'Ctrl27', 28:'Ctrl28', 29:'Ctrl29',
|
||||||
|
30:'Ctrl30', 31:'Ctrl31', 32:'BankLSB',
|
||||||
|
33:'ModulationLSB', 34:'BreathLSB', 35:'Ctrl35',
|
||||||
|
36:'FootLSB', 37:'PortamentoLSB', 38:'DataLSB',
|
||||||
|
39:'VolumeLSB', 40:'BalanceLSB', 41:'Ctrl41',
|
||||||
|
42:'PanLSB', 43:'ExpressionLSB', 44:'Effect1LSB',
|
||||||
|
45:'Effect2LSB', 46:'Ctrl46', 47:'Ctrl47',
|
||||||
|
48:'General1LSB', 49:'General2LSB', 50:'General3LSB',
|
||||||
|
51:'General4LSB', 52:'Ctrl52', 53:'Ctrl53',
|
||||||
|
54:'Ctrl54', 55:'Ctrl55', 56:'Ctrl56',
|
||||||
|
57:'Ctrl57', 58:'Ctrl58', 59:'Ctrl59',
|
||||||
|
60:'Ctrl60', 61:'Ctrl61', 62:'Ctrl62',
|
||||||
|
63:'Ctrl63', 64:'Sustain', 65:'Portamento',
|
||||||
|
66:'Sostenuto', 67:'SoftPedal', 68:'Legato',
|
||||||
|
69:'Hold2', 70:'Variation', 71:'Resonance',
|
||||||
|
72:'ReleaseTime', 73:'AttackTime', 74:'Brightness',
|
||||||
|
75:'DecayTime', 76:'VibratoRate', 77:'VibratoDepth',
|
||||||
|
78:'VibratoDelay', 79:'Ctrl79', 80:'General5',
|
||||||
|
81:'General6', 82:'General7', 83:'General8',
|
||||||
|
84:'PortamentoCtrl', 85:'Ctrl85', 86:'Ctrl86',
|
||||||
|
87:'Ctrl87', 88:'Ctrl88', 89:'Ctrl89',
|
||||||
|
90:'Ctrl90', 91:'Reverb', 92:'Tremolo',
|
||||||
|
93:'Chorus', 94:'Detune', 95:'Phaser',
|
||||||
|
96:'DataInc', 97:'DataDec', 98:'NonRegLSB',
|
||||||
|
99:'NonRegMSB', 100:'RegParLSB', 101:'RegParMSB',
|
||||||
|
102:'Ctrl102', 103:'Ctrl103', 104:'Ctrl104',
|
||||||
|
105:'Ctrl105', 106:'Ctrl106', 107:'Ctrl107',
|
||||||
|
108:'Ctrl108', 109:'Ctrl109', 110:'Ctrl110',
|
||||||
|
111:'Ctrl111', 112:'Ctrl112', 113:'Ctrl113',
|
||||||
|
114:'Ctrl114', 115:'Ctrl115', 116:'Ctrl116',
|
||||||
|
117:'Ctrl117', 118:'Ctrl118', 119:'Ctrl119',
|
||||||
|
120:'AllSoundsOff', 121:'ResetAll', 122:'LocalCtrl',
|
||||||
|
123:'AllNotesOff', 124:'OmniOff', 125:'OmniOn',
|
||||||
|
126:'PolyOff', 127:'PolyOn' }
|
||||||
|
|
||||||
'Bank', 'Modulation', 'Breath', 'Ctrl3',
|
ctrlInx = {
|
||||||
'Foot', 'Portamento', 'Data', 'Volume',
|
'BANK':0, 'MODULATION':1, 'BREATH':2,
|
||||||
'Balance', 'Ctrl9', 'Pan', 'Expression',
|
'CTRL3':3, 'FOOT':4, 'PORTAMENTO':5,
|
||||||
'Effect1', 'Effect2', 'Ctrl14', 'Ctrl15',
|
'DATA':6, 'VOLUME':7, 'BALANCE':8,
|
||||||
'General1','General2','General3','General4',
|
'CTRL9':9, 'PAN':10, 'EXPRESSION':11,
|
||||||
'Ctrl20', 'Ctrl21', 'Ctrl22', 'Ctrl23',
|
'EFFECT1':12, 'EFFECT2':13, 'CTRL14':14,
|
||||||
'Ctrl24', 'Ctrl25', 'Ctrl26', 'Ctrl27',
|
'CTRL15':15, 'GENERAL1':16, 'GENERAL2':17,
|
||||||
'Ctrl28', 'Ctrl29', 'Ctrl30', 'Ctrl31',
|
'GENERAL3':18, 'GENERAL4':19, 'CTRL20':20,
|
||||||
### 32-63 Double Precise Controllers
|
'CTRL21':21, 'CTRL22':22, 'CTRL23':23,
|
||||||
### LSB (14-bits, 16,384 values)
|
'CTRL24':24, 'CTRL25':25, 'CTRL26':26,
|
||||||
'BankLSB', 'ModulationLSB', 'BreathLSB',
|
'CTRL27':27, 'CTRL28':28, 'CTRL29':29,
|
||||||
'Ctrl35', 'FootLSB', 'PortamentoLSB',
|
'CTRL30':30, 'CTRL31':31, 'BANKLSB':32,
|
||||||
'DataLSB','VolumeLSB','BalanceLSB',
|
'MODULATIONLSB':33, 'BREATHLSB':34, 'CTRL35':35,
|
||||||
'Ctrl41','PanLSB','ExpressionLSB',
|
'FOOTLSB':36, 'PORTAMENTOLSB':37, 'DATALSB':38,
|
||||||
'Effect1LSB', 'Effect2LSB','Ctrl46', 'Ctrl47',
|
'VOLUMELSB':39, 'BALANCELSB':40, 'CTRL41':41,
|
||||||
'General1LSB','General2LSB', 'General3LSB',
|
'PANLSB':42, 'EXPRESSIONLSB':43, 'EFFECT1LSB':44,
|
||||||
'General4LSB', 'Ctrl52','Ctrl53', 'Ctrl54',
|
'EFFECT2LSB':45, 'CTRL46':46, 'CTRL47':47,
|
||||||
'Ctrl55', 'Ctrl56', 'Ctrl57', 'Ctrl58',
|
'GENERAL1LSB':48, 'GENERAL2LSB':49, 'GENERAL3LSB':50,
|
||||||
'Ctrl59', 'Ctrl60', 'Ctrl61', 'Ctrl62',
|
'GENERAL4LSB':51, 'CTRL52':52, 'CTRL53':53,
|
||||||
'Ctrl63',
|
'CTRL54':54, 'CTRL55':55, 'CTRL56':56,
|
||||||
|
'CTRL57':57, 'CTRL58':58, 'CTRL59':59,
|
||||||
|
'CTRL60':60, 'CTRL61':61, 'CTRL62':62,
|
||||||
|
'CTRL63':63, 'SUSTAIN':64, 'PORTAMENTO':65,
|
||||||
|
'SOSTENUTO':66, 'SOFTPEDAL':67, 'LEGATO':68,
|
||||||
|
'HOLD2':69, 'VARIATION':70, 'RESONANCE':71,
|
||||||
|
'RELEASETIME':72, 'ATTACKTIME':73, 'BRIGHTNESS':74,
|
||||||
|
'DECAYTIME':75, 'VIBRATORATE':76, 'VIBRATODEPTH':77,
|
||||||
|
'VIBRATODELAY':78, 'CTRL79':79, 'GENERAL5':80,
|
||||||
|
'GENERAL6':81, 'GENERAL7':82, 'GENERAL8':83,
|
||||||
|
'PORTAMENTOCTRL':84, 'CTRL85':85, 'CTRL86':86,
|
||||||
|
'CTRL87':87, 'CTRL88':88, 'CTRL89':89,
|
||||||
|
'CTRL90':90, 'REVERB':91, 'TREMOLO':92,
|
||||||
|
'CHORUS':93, 'DETUNE':94, 'PHASER':95,
|
||||||
|
'DATAINC':96, 'DATADEC':97, 'NONREGLSB':98,
|
||||||
|
'NONREGMSB':99, 'REGPARLSB':100, 'REGPARMSB':101,
|
||||||
|
'CTRL102':102, 'CTRL103':103, 'CTRL104':104,
|
||||||
|
'CTRL105':105, 'CTRL106':106, 'CTRL107':107,
|
||||||
|
'CTRL108':108, 'CTRL109':109, 'CTRL110':110,
|
||||||
|
'CTRL111':111, 'CTRL112':112, 'CTRL113':113,
|
||||||
|
'CTRL114':114, 'CTRL115':115, 'CTRL116':116,
|
||||||
|
'CTRL117':117, 'CTRL118':118, 'CTRL119':119,
|
||||||
|
'ALLSOUNDSOFF':120, 'RESETALL':121, 'LOCALCTRL':122,
|
||||||
|
'ALLNOTESOFF':123, 'OMNIOFF':124, 'OMNION':125,
|
||||||
|
'POLYOFF':126, 'POLYON':127 }
|
||||||
|
|
||||||
### 64-119 Single Precise Controllers
|
|
||||||
### (7-bits, 128 values)
|
|
||||||
|
|
||||||
'Sustain', 'Portamento', 'Sostenuto',
|
|
||||||
'SoftPedal', 'Legato', 'Hold2', 'Variation',
|
|
||||||
'Resonance', 'ReleaseTime','AttackTime', 'Brightness',
|
|
||||||
'DecayTime','VibratoRate','VibratoDepth', 'VibratoDelay',
|
|
||||||
'Ctrl79','General5','General6','General7',
|
|
||||||
'General8','PortamentoCtrl','Ctrl85','Ctrl86',
|
|
||||||
'Ctrl87', 'Ctrl88', 'Ctrl89', 'Ctrl90',
|
|
||||||
'Reverb', 'Tremolo', 'Chorus','Detune',
|
|
||||||
'Phaser', 'DataInc','DataDec',
|
|
||||||
'NonRegLSB', 'NonRegMSB',
|
|
||||||
'RegParLSB', 'RegParMSB',
|
|
||||||
'Ctrl102','Ctrl103','Ctrl104','Ctrl105',
|
|
||||||
'Ctrl106','Ctrl107','Ctrl108','Ctrl109',
|
|
||||||
'Ctrl110','Ctrl111','Ctrl112','Ctrl113',
|
|
||||||
'Ctrl114','Ctrl115','Ctrl116','Ctrl117',
|
|
||||||
'Ctrl118','Ctrl119',
|
|
||||||
|
|
||||||
### 120-127 Channel Mode Messages
|
|
||||||
|
|
||||||
'AllSoundsOff','ResetAll',
|
|
||||||
'LocalCtrl','AllNotesOff',
|
|
||||||
'OmniOff','OmniOn', 'PolyOff','PolyOn' ]
|
|
||||||
|
|
||||||
upperCtrlNames = [name.upper() for name in ctrlNames]
|
|
||||||
|
|
|
@ -23,6 +23,7 @@ Bob van der Poel <bob@mellowood.ca>
|
||||||
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import gbl
|
import gbl
|
||||||
from MMA.common import *
|
from MMA.common import *
|
||||||
|
|
||||||
|
|
|
@ -28,23 +28,22 @@ Bob van der Poel <bob@mellowood.ca>
|
||||||
import getopt
|
import getopt
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
import gbl
|
|
||||||
from MMA.common import *
|
|
||||||
import MMA.docs
|
import MMA.docs
|
||||||
import MMA.parse
|
import MMA.parse
|
||||||
import MMA.alloc
|
|
||||||
import MMA.chords
|
import MMA.chords
|
||||||
from MMA.macro import macros
|
import MMA.alloc
|
||||||
|
import MMA.volume
|
||||||
|
|
||||||
|
import gbl
|
||||||
|
from MMA.common import *
|
||||||
|
from MMA.macro import macros
|
||||||
|
|
||||||
def opts():
|
def opts():
|
||||||
""" Option parser. """
|
""" Option parser. """
|
||||||
|
|
||||||
try:
|
try:
|
||||||
opts, args = getopt.gnu_getopt(sys.argv[1:],
|
opts, args = getopt.gnu_getopt(sys.argv[1:],
|
||||||
"dpsS:ri:wneom:f:M:cgGvD:0", [] )
|
"dpsS:ri:wneom:f:M:cgGvD:01PT:", [] )
|
||||||
|
|
||||||
|
|
||||||
except getopt.GetoptError:
|
except getopt.GetoptError:
|
||||||
usage()
|
usage()
|
||||||
|
|
||||||
|
@ -110,24 +109,32 @@ def opts():
|
||||||
else:
|
else:
|
||||||
error("Only a '0' or '1' is permitted for the -M arg")
|
error("Only a '0' or '1' is permitted for the -M arg")
|
||||||
|
|
||||||
|
elif o == '-T': # set tracks to generate, mute all others
|
||||||
|
gbl.muteTracks = a.upper().split(',')
|
||||||
|
|
||||||
|
|
||||||
elif o == '-D':
|
elif o == '-D':
|
||||||
if a == 'xl':
|
if a == 'xl':
|
||||||
gbl.docs = 1
|
gbl.createDocs = 1
|
||||||
|
|
||||||
elif a == 'xh':
|
elif a == 'xh':
|
||||||
gbl.docs = 2
|
gbl.createDocs = 2
|
||||||
|
|
||||||
|
elif a == 'v':
|
||||||
|
gbl.createDocs = 3
|
||||||
|
|
||||||
elif a == 'k':
|
elif a == 'k':
|
||||||
|
|
||||||
def pl(msg, lst):
|
def pl(msg, lst, adds):
|
||||||
print msg,
|
print msg,
|
||||||
for i in sorted(lst.keys()):
|
for i in sorted(lst.keys() + adds):
|
||||||
print i,
|
print i,
|
||||||
print "\n"
|
print "\n"
|
||||||
|
|
||||||
pl("Base track names:", MMA.alloc.trkClasses )
|
pl("Base track names:", MMA.alloc.trkClasses, [])
|
||||||
pl("Commands:", MMA.parse.simpleFuncs)
|
pl("Commands:", MMA.parse.simpleFuncs,
|
||||||
pl("TrackCommands:", MMA.parse.trackFuncs)
|
["BEGIN", "END",] )
|
||||||
|
pl("TrackCommands:", MMA.parse.trackFuncs, [])
|
||||||
print "Not complete ... subcommands, comments, chords..."
|
print "Not complete ... subcommands, comments, chords..."
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
|
@ -138,14 +145,25 @@ def opts():
|
||||||
elif o == '-0':
|
elif o == '-0':
|
||||||
gbl.synctick = 1
|
gbl.synctick = 1
|
||||||
|
|
||||||
|
elif o == '-1':
|
||||||
|
gbl.endsync = 1
|
||||||
|
|
||||||
|
elif o == '-P':
|
||||||
|
gbl.playFile = 1
|
||||||
|
|
||||||
else:
|
else:
|
||||||
usage() # unreachable??
|
usage() # unreachable??
|
||||||
|
|
||||||
if args:
|
# we have processed all the args. Should just have a filename left
|
||||||
if gbl.infile:
|
|
||||||
usage("Only one input filename is permitted.")
|
|
||||||
gbl.infile = args.pop(0)
|
|
||||||
|
|
||||||
|
if len(args)>1:
|
||||||
|
usage("Only one input filename is permitted, %s given on command line." % len(args) )
|
||||||
|
|
||||||
|
if gbl.infile:
|
||||||
|
usage("Input filename already assigned ... should not happen.")
|
||||||
|
|
||||||
|
if args:
|
||||||
|
gbl.infile = args[0]
|
||||||
|
|
||||||
def usage(msg=''):
|
def usage(msg=''):
|
||||||
""" Usage message. """
|
""" Usage message. """
|
||||||
|
@ -162,6 +180,7 @@ def usage(msg=''):
|
||||||
" -Dk print list of MMA keywords",
|
" -Dk print list of MMA keywords",
|
||||||
" -Dxl eXtract Latex doc blocks from file",
|
" -Dxl eXtract Latex doc blocks from file",
|
||||||
" -Dxh eXtract HTML doc blocks from file",
|
" -Dxh eXtract HTML doc blocks from file",
|
||||||
|
" -Dv extract lots of info about the grooves/seqs in file",
|
||||||
" -e show parsed/Expanded lines",
|
" -e show parsed/Expanded lines",
|
||||||
" -f <file> set output Filename",
|
" -f <file> set output Filename",
|
||||||
" -g update Groove dependency database",
|
" -g update Groove dependency database",
|
||||||
|
@ -175,9 +194,11 @@ def usage(msg=''):
|
||||||
" -r display Running progress",
|
" -r display Running progress",
|
||||||
" -s display Sequence info during run",
|
" -s display Sequence info during run",
|
||||||
" -S <var[=data]> Set macro 'var' to 'data'",
|
" -S <var[=data]> Set macro 'var' to 'data'",
|
||||||
|
" -T <tracks> Limit generation to specified tracks",
|
||||||
" -v display Version number",
|
" -v display Version number",
|
||||||
" -w disable Warning messages",
|
" -w disable Warning messages",
|
||||||
" -0 create sync at start of all channel tracks" ]
|
" -0 create sync at start of all channel tracks",
|
||||||
|
" -1 create sync at end of all channel tracks" ]
|
||||||
|
|
||||||
|
|
||||||
for a in txt:
|
for a in txt:
|
||||||
|
|
502
mma/MMA/parse.py
502
mma/MMA/parse.py
|
@ -34,35 +34,39 @@ import random
|
||||||
import copy
|
import copy
|
||||||
|
|
||||||
import gbl
|
import gbl
|
||||||
|
from MMA.common import *
|
||||||
|
|
||||||
import MMA.notelen
|
import MMA.notelen
|
||||||
import MMA.chords
|
import MMA.chords
|
||||||
import MMA.file
|
import MMA.file
|
||||||
import MMA.docs
|
|
||||||
import MMA.midi
|
import MMA.midi
|
||||||
import MMA.midiIn
|
import MMA.midiIn
|
||||||
|
import MMA.grooves
|
||||||
|
import MMA.docs
|
||||||
import MMA.auto
|
import MMA.auto
|
||||||
from MMA.alloc import trackAlloc
|
|
||||||
from MMA.common import *
|
|
||||||
import MMA.translate
|
import MMA.translate
|
||||||
from MMA.lyric import lyric
|
|
||||||
import MMA.patSolo
|
import MMA.patSolo
|
||||||
from MMA.macro import macros
|
|
||||||
import MMA.mdefine
|
import MMA.mdefine
|
||||||
import MMA.volume
|
import MMA.volume
|
||||||
from MMA.pat import seqBump
|
import MMA.seqrnd
|
||||||
|
import MMA.patch
|
||||||
|
|
||||||
|
import gbl
|
||||||
|
|
||||||
|
from MMA.common import *
|
||||||
|
from MMA.lyric import lyric
|
||||||
|
from MMA.macro import macros
|
||||||
|
from MMA.alloc import trackAlloc
|
||||||
|
|
||||||
lastChord = None # tracks last chord for "/ /" data lines.
|
lastChord = None # tracks last chord for "/ /" data lines.
|
||||||
|
|
||||||
beginData = [] # Current data set by a BEGIN statement
|
beginData = [] # Current data set by a BEGIN statement
|
||||||
beginPoints = [] # since BEGINs can be nested, we need ptrs for backing out of BEGINs
|
beginPoints = [] # since BEGINs can be nested, we need ptrs for backing out of BEGINs
|
||||||
|
|
||||||
seqRndWeight = [1]
|
|
||||||
|
|
||||||
groovesList = None
|
|
||||||
groovesCount = 0
|
|
||||||
|
|
||||||
gmagic = 9988 # magic name for groove saved with USE
|
gmagic = 9988 # magic name for groove saved with USE
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
""" This table is passed to the track classes. It has
|
""" This table is passed to the track classes. It has
|
||||||
an instance for each chord in the current bar.
|
an instance for each chord in the current bar.
|
||||||
"""
|
"""
|
||||||
|
@ -105,15 +109,14 @@ def parse(inpath):
|
||||||
""" Process a mma input file. """
|
""" Process a mma input file. """
|
||||||
|
|
||||||
global beginData, lastChord
|
global beginData, lastChord
|
||||||
global groovesList, groovesCount
|
|
||||||
|
|
||||||
gbl.inpath = inpath
|
gbl.inpath = inpath
|
||||||
|
|
||||||
curline = None
|
curline = None
|
||||||
|
|
||||||
while 1:
|
while 1:
|
||||||
curline = inpath.read()
|
curline = inpath.read()
|
||||||
|
|
||||||
if curline == None:
|
if curline == None:
|
||||||
MMA.docs.docDump()
|
MMA.docs.docDump()
|
||||||
break
|
break
|
||||||
|
@ -130,18 +133,22 @@ def parse(inpath):
|
||||||
encountered.
|
encountered.
|
||||||
|
|
||||||
The placement here is pretty deliberate. Variable expand comes
|
The placement here is pretty deliberate. Variable expand comes
|
||||||
later so you can't macorize BEGIN ... I think this makes sense.
|
later so you can't macroize BEGIN ... I think this makes sense.
|
||||||
|
|
||||||
|
The tests for 'begin', 'end' and the appending of the current
|
||||||
|
begin[] stuff have to be here, in this order.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
key=l[0].upper()
|
action=l[0].upper() # 1st arg in line
|
||||||
if key == 'BEGIN':
|
|
||||||
|
if action == 'BEGIN':
|
||||||
if not l:
|
if not l:
|
||||||
error("Use: Begin STUFF")
|
error("Use: Begin STUFF")
|
||||||
beginPoints.append(len(beginData))
|
beginPoints.append(len(beginData))
|
||||||
beginData.extend(l[1:])
|
beginData.extend(l[1:])
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if key == 'END':
|
if action == 'END':
|
||||||
if len(l) > 1:
|
if len(l) > 1:
|
||||||
error("No arguments permitted for END")
|
error("No arguments permitted for END")
|
||||||
if not beginData:
|
if not beginData:
|
||||||
|
@ -151,9 +158,9 @@ def parse(inpath):
|
||||||
|
|
||||||
if beginData:
|
if beginData:
|
||||||
l = beginData + l
|
l = beginData + l
|
||||||
|
action = l[0].upper()
|
||||||
|
|
||||||
action = l[0].upper()
|
|
||||||
|
|
||||||
if gbl.showExpand and action !='REPEAT':
|
if gbl.showExpand and action !='REPEAT':
|
||||||
print l
|
print l
|
||||||
|
|
||||||
|
@ -180,7 +187,7 @@ def parse(inpath):
|
||||||
if len(l) < 2:
|
if len(l) < 2:
|
||||||
error("Expecting argument after '%s'" % name)
|
error("Expecting argument after '%s'" % name)
|
||||||
action = l[1].upper()
|
action = l[1].upper()
|
||||||
|
|
||||||
if action in trackFuncs:
|
if action in trackFuncs:
|
||||||
trackFuncs[action](name, l[2:])
|
trackFuncs[action](name, l[2:])
|
||||||
else:
|
else:
|
||||||
|
@ -197,7 +204,7 @@ def parse(inpath):
|
||||||
a line number on a line by itself it okay.
|
a line number on a line by itself it okay.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if l[0].isdigit():
|
if action.isdigit(): # isdigit() matches '1', '1234' but not '1a'!
|
||||||
l = l[1:]
|
l = l[1:]
|
||||||
if not l: # ignore empty lines
|
if not l: # ignore empty lines
|
||||||
continue
|
continue
|
||||||
|
@ -221,26 +228,28 @@ def parse(inpath):
|
||||||
l = ' '.join(l)
|
l = ' '.join(l)
|
||||||
l = MMA.patSolo.extractSolo(l, rptcount)
|
l = MMA.patSolo.extractSolo(l, rptcount)
|
||||||
|
|
||||||
""" Set lyrics from [stuff] in the current line or
|
""" Set lyrics from [stuff] in the current line.
|
||||||
stuff previously stored with LYRICS SET.
|
NOTE: lyric.extract() inserts previously created
|
||||||
|
data from LYRICS SET and inserts the chord names
|
||||||
|
if that flag is active.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
l, lyrics = lyric.extract(l, rptcount)
|
l, lyrics = lyric.extract(l, rptcount)
|
||||||
|
|
||||||
|
l = l.split()
|
||||||
|
|
||||||
""" At this point we have only chord info. A number
|
""" At this point we have only chord info. A number
|
||||||
of sanity checks are made:
|
of sanity checks are made:
|
||||||
1. Make sure there is some chord data,
|
1. Make sure there is some chord data,
|
||||||
2. Ensure the correct number of chords.
|
2. Ensure the correct number of chords.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
l = l.split()
|
|
||||||
|
|
||||||
if not l:
|
if not l:
|
||||||
error("Expecting music (chord) data. Even lines with\n"
|
error("Expecting music (chord) data. Even lines with\n"
|
||||||
" lyrics or solos still need a chord")
|
" lyrics or solos still need a chord")
|
||||||
|
|
||||||
i = gbl.QperBar - len(l)
|
i = gbl.QperBar - len(l)
|
||||||
if i<0:
|
if i < 0:
|
||||||
error("Too many chords in line. Max is %s, not %s" %
|
error("Too many chords in line. Max is %s, not %s" %
|
||||||
(gbl.QperBar, len(l) ) )
|
(gbl.QperBar, len(l) ) )
|
||||||
if i:
|
if i:
|
||||||
|
@ -249,7 +258,7 @@ def parse(inpath):
|
||||||
|
|
||||||
""" We now have a valid line. It'll look something like:
|
""" We now have a valid line. It'll look something like:
|
||||||
|
|
||||||
['Cm', '/', 'z', 'F#']
|
['Cm', '/', 'z', 'F#'] or ['C', '/', '/', '/' ]
|
||||||
|
|
||||||
For each bar we create a ctable structure. This is just
|
For each bar we create a ctable structure. This is just
|
||||||
a list of CTables, one for each beat division.
|
a list of CTables, one for each beat division.
|
||||||
|
@ -275,19 +284,24 @@ def parse(inpath):
|
||||||
|
|
||||||
# Create MIDI data for the bar
|
# Create MIDI data for the bar
|
||||||
|
|
||||||
for rpt in range(rptcount):
|
for rpt in range(rptcount): # for each bar in the repeat count ( Cm * 3)
|
||||||
|
|
||||||
|
""" Handle global (de)cresc by popping a new volume off stack. """
|
||||||
|
|
||||||
if MMA.volume.futureVol:
|
if MMA.volume.futureVol:
|
||||||
MMA.volume.volume = MMA.volume.futureVol.pop(0)
|
MMA.volume.volume = MMA.volume.futureVol.pop(0)
|
||||||
|
if MMA.volume.futureVol:
|
||||||
|
MMA.volume.nextVolume = MMA.volume.futureVol[0]
|
||||||
|
else:
|
||||||
|
MMA.volume.nextVolume = None
|
||||||
|
|
||||||
tmp = []
|
|
||||||
for x, i in enumerate(seqRndWeight):
|
""" Set up for rnd seq. This may set the current seq point. If return
|
||||||
tmp.extend([x] * i)
|
is >=0 then we're doing track rnd.
|
||||||
if not len(tmp):
|
"""
|
||||||
error("SeqRndWeight has generated an empty list")
|
|
||||||
randomSeq = random.choice(tmp)
|
rsq, seqlist = MMA.seqrnd.setseq()
|
||||||
|
|
||||||
if gbl.seqRnd[0] == 1:
|
|
||||||
gbl.seqCount = randomSeq
|
|
||||||
|
|
||||||
""" Process each track. It is important that the track classes
|
""" Process each track. It is important that the track classes
|
||||||
are written so that the ctable passed to them IS NOT MODIFIED.
|
are written so that the ctable passed to them IS NOT MODIFIED.
|
||||||
|
@ -296,16 +310,20 @@ def parse(inpath):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
for a in gbl.tnames.values():
|
for a in gbl.tnames.values():
|
||||||
seqSave = gbl.seqCount
|
if rsq >= 0:
|
||||||
if a.name in gbl.seqRnd:
|
seqSave = gbl.seqCount
|
||||||
gbl.seqCount = randomSeq
|
if a.name in seqlist: # for seqrnd with tracklist
|
||||||
|
gbl.seqCount = rsq
|
||||||
|
|
||||||
a.bar(ctable) ## process entire bar!
|
a.bar(ctable) ## process entire bar!
|
||||||
|
|
||||||
gbl.seqCount = seqSave
|
if rsq >= 0:
|
||||||
|
gbl.seqCount = seqSave
|
||||||
|
|
||||||
# Adjust counters
|
# Adjust counters
|
||||||
|
|
||||||
|
gbl.totTime += float(gbl.QperBar) / gbl.tempo
|
||||||
|
|
||||||
gbl.barNum += 1
|
gbl.barNum += 1
|
||||||
|
|
||||||
if gbl.barNum > gbl.maxBars:
|
if gbl.barNum > gbl.maxBars:
|
||||||
|
@ -316,27 +334,7 @@ def parse(inpath):
|
||||||
|
|
||||||
gbl.seqCount = (gbl.seqCount+1) % gbl.seqSize
|
gbl.seqCount = (gbl.seqCount+1) % gbl.seqSize
|
||||||
|
|
||||||
""" Handle groove lists. If there is more than 1 entry
|
MMA.grooves.nextGroove() # using groove list? Advance.
|
||||||
in the groove list, advance (circle). We don't have
|
|
||||||
to qualify grooves since they were verified when
|
|
||||||
this list was created. groovesList==None if there
|
|
||||||
is only one groove (or none).
|
|
||||||
"""
|
|
||||||
|
|
||||||
if groovesList:
|
|
||||||
groovesCount += 1
|
|
||||||
if groovesCount > len(groovesList)-1:
|
|
||||||
groovesCount = 0
|
|
||||||
slot = groovesList[groovesCount]
|
|
||||||
|
|
||||||
if slot != gbl.currentGroove:
|
|
||||||
grooveDo(slot)
|
|
||||||
|
|
||||||
gbl.lastGroove = gbl.currentGroove
|
|
||||||
gbl.currentGroove = slot
|
|
||||||
|
|
||||||
if gbl.debug:
|
|
||||||
print "Groove (list) setting restored from '%s'." % slot
|
|
||||||
|
|
||||||
# Enabled with the -r command line option
|
# Enabled with the -r command line option
|
||||||
|
|
||||||
|
@ -519,7 +517,7 @@ def repeat(ln):
|
||||||
while 1:
|
while 1:
|
||||||
if act in ('REPEATEND', 'ENDREPEAT'):
|
if act in ('REPEATEND', 'ENDREPEAT'):
|
||||||
if l:
|
if l:
|
||||||
l=macros.expand(l)
|
l = macros.expand(l)
|
||||||
if len(l) == 2 and l[0].upper() == 'NOWARN':
|
if len(l) == 2 and l[0].upper() == 'NOWARN':
|
||||||
l=l[1:]
|
l=l[1:]
|
||||||
warn=0
|
warn=0
|
||||||
|
@ -561,7 +559,7 @@ def repeat(ln):
|
||||||
ending = 1
|
ending = 1
|
||||||
|
|
||||||
if l:
|
if l:
|
||||||
l=macros.expand(l)
|
l = macros.expand(l)
|
||||||
if len(l) == 2 and l[0].upper() == 'NOWARN':
|
if len(l) == 2 and l[0].upper() == 'NOWARN':
|
||||||
warn=0
|
warn=0
|
||||||
l=l[1:]
|
l=l[1:]
|
||||||
|
@ -701,6 +699,9 @@ def tempo(ln):
|
||||||
print "Set future Tempo to %s over %s beats" % \
|
print "Set future Tempo to %s over %s beats" % \
|
||||||
( int(tempo), numbeats)
|
( int(tempo), numbeats)
|
||||||
|
|
||||||
|
if gbl.tempo <=0:
|
||||||
|
error("Tempo setting must be greater than 0.")
|
||||||
|
|
||||||
|
|
||||||
def beatAdjust(ln):
|
def beatAdjust(ln):
|
||||||
""" Delete or insert some beats into the sequence.
|
""" Delete or insert some beats into the sequence.
|
||||||
|
@ -717,6 +718,8 @@ def beatAdjust(ln):
|
||||||
|
|
||||||
gbl.tickOffset += int(adj * gbl.BperQ)
|
gbl.tickOffset += int(adj * gbl.BperQ)
|
||||||
|
|
||||||
|
gbl.totTime += adj / gbl.tempo # adjust total time
|
||||||
|
|
||||||
if gbl.debug:
|
if gbl.debug:
|
||||||
print "BeatAdjust: inserted %s at bar %s." % (adj, gbl.barNum + 1)
|
print "BeatAdjust: inserted %s at bar %s." % (adj, gbl.barNum + 1)
|
||||||
|
|
||||||
|
@ -803,205 +806,7 @@ def fermata(ln):
|
||||||
% (start, end)
|
% (start, end)
|
||||||
|
|
||||||
|
|
||||||
#######################################
|
|
||||||
# Groove stuff
|
|
||||||
|
|
||||||
|
|
||||||
def grooveDefine(ln):
|
|
||||||
""" Define a groove.
|
|
||||||
|
|
||||||
Current settings are assigned to a groove name.
|
|
||||||
"""
|
|
||||||
|
|
||||||
if not len(ln):
|
|
||||||
error("Use: DefGroove Name")
|
|
||||||
|
|
||||||
slot=ln[0].upper()
|
|
||||||
|
|
||||||
# Slot names can't contain a '/' (reserved) or be an integer (used in groove select).
|
|
||||||
|
|
||||||
if '/' in slot:
|
|
||||||
error("The '/' is not permitted in a groove name")
|
|
||||||
|
|
||||||
if slot.isdigit():
|
|
||||||
error("Invalid slot name '%s'. Cannot be only digits" % slot)
|
|
||||||
|
|
||||||
grooveDefineDo(slot)
|
|
||||||
|
|
||||||
if gbl.debug:
|
|
||||||
print "Groove settings saved to '%s'." % slot
|
|
||||||
|
|
||||||
if gbl.makeGrvDefs:
|
|
||||||
MMA.auto.updateGrooveList(slot)
|
|
||||||
|
|
||||||
if len(ln) > 1:
|
|
||||||
MMA.docs.docDefine(ln)
|
|
||||||
|
|
||||||
|
|
||||||
def grooveDefineDo(slot):
|
|
||||||
|
|
||||||
for n in gbl.tnames.values():
|
|
||||||
n.saveGroove(slot)
|
|
||||||
|
|
||||||
gbl.settingsGroove[slot] = {
|
|
||||||
'SEQSIZE': gbl.seqSize,
|
|
||||||
'SEQRNDWT': seqRndWeight[:],
|
|
||||||
'QPERBAR': gbl.QperBar,
|
|
||||||
'SEQRND': gbl.seqRnd[:],
|
|
||||||
'TIMESIG': MMA.midi.timeSig.get(),
|
|
||||||
'81': MMA.notelen.noteLenTable['81'],
|
|
||||||
'82': MMA.notelen.noteLenTable['82'],
|
|
||||||
'SWINGMODE': gbl.swingMode ,
|
|
||||||
'SWINGSKEW': gbl.swingSkew,
|
|
||||||
'VRATIO': (MMA.volume.vTRatio, MMA.volume.vMRatio)}
|
|
||||||
|
|
||||||
|
|
||||||
def groove(ln):
|
|
||||||
""" Select a previously defined groove. """
|
|
||||||
|
|
||||||
global groovesList, groovesCount
|
|
||||||
|
|
||||||
if not ln:
|
|
||||||
error("Groove: needs agrument(s)")
|
|
||||||
|
|
||||||
tmpList =[]
|
|
||||||
|
|
||||||
if ln[0].isdigit():
|
|
||||||
wh=stoi(ln[0])
|
|
||||||
if wh<1:
|
|
||||||
error("Groove selection must be > 0, not '%s'" % wh)
|
|
||||||
ln=ln[1:]
|
|
||||||
else:
|
|
||||||
wh = None
|
|
||||||
|
|
||||||
for slot in ln:
|
|
||||||
slot = slot.upper()
|
|
||||||
if slot == "/":
|
|
||||||
if len(tmpList):
|
|
||||||
slot=tmpList[-1]
|
|
||||||
else:
|
|
||||||
error("A previous groove name is needed before a '/'")
|
|
||||||
|
|
||||||
if not slot in gbl.settingsGroove:
|
|
||||||
|
|
||||||
if gbl.debug:
|
|
||||||
print "Groove '%s' not defined. Trying auto-load from libraries" \
|
|
||||||
% slot
|
|
||||||
|
|
||||||
l=MMA.auto.loadGrooveDir(slot) # name of the lib file with groove
|
|
||||||
|
|
||||||
if l:
|
|
||||||
if gbl.debug:
|
|
||||||
print "Attempting to load groove '%s' from '%s'." \
|
|
||||||
% (slot, l)
|
|
||||||
|
|
||||||
usefile([os.path.join(gbl.autoLib, l)])
|
|
||||||
|
|
||||||
if not slot in gbl.settingsGroove:
|
|
||||||
error("Groove '%s' not found. Have libraries changed "
|
|
||||||
"since last 'mma -g' run?" % slot)
|
|
||||||
|
|
||||||
else:
|
|
||||||
error("Groove '%s' could not be found in memory or library files" % slot )
|
|
||||||
|
|
||||||
tmpList.append(slot)
|
|
||||||
|
|
||||||
if not len(tmpList):
|
|
||||||
error("Use: Groove [selection] Name [...]")
|
|
||||||
|
|
||||||
""" If the first arg to list was an int() (ie: 3 groove1 groove2 grooveFoo)
|
|
||||||
we select from the list. After the selection, we reset the list to be
|
|
||||||
just the selected entry. This was, if there are multiple groove names without
|
|
||||||
a leading int() we process the list as groove list changing with each bar.
|
|
||||||
"""
|
|
||||||
|
|
||||||
if wh:
|
|
||||||
wh = (wh-1) % len(tmpList)
|
|
||||||
tmpList=tmpList[wh:wh+1]
|
|
||||||
|
|
||||||
slot=tmpList[0]
|
|
||||||
grooveDo(slot)
|
|
||||||
|
|
||||||
groovesCount = 0
|
|
||||||
if len(tmpList)==1:
|
|
||||||
groovesList=None
|
|
||||||
else:
|
|
||||||
groovesList=tmpList
|
|
||||||
|
|
||||||
gbl.lastGroove = gbl.currentGroove
|
|
||||||
gbl.currentGroove = slot
|
|
||||||
if gbl.lastGroove == '':
|
|
||||||
gbl.lastGroove = slot
|
|
||||||
|
|
||||||
if gbl.debug:
|
|
||||||
print "Groove settings restored from '%s'." % slot
|
|
||||||
|
|
||||||
def grooveDo(slot):
|
|
||||||
""" This is separate from groove() so we can call it from
|
|
||||||
usefile() with a qualified name. """
|
|
||||||
|
|
||||||
global seqRndWeight
|
|
||||||
|
|
||||||
oldSeqSize = gbl.seqSize
|
|
||||||
|
|
||||||
g=gbl.settingsGroove[slot]
|
|
||||||
|
|
||||||
gbl.seqSize = g['SEQSIZE']
|
|
||||||
seqRndWeight = g['SEQRNDWT']
|
|
||||||
gbl.QperBar = g['QPERBAR']
|
|
||||||
gbl.seqRnd = g['SEQRND']
|
|
||||||
MMA.midi.timeSig.set( *g['TIMESIG']) # passing tuple as 2 args.
|
|
||||||
MMA.notelen.noteLenTable['81'] = g['81']
|
|
||||||
MMA.notelen.noteLenTable['82'] = g['82']
|
|
||||||
gbl.swingMode = g['SWINGMODE']
|
|
||||||
gbl.swingSkew = g['SWINGSKEW']
|
|
||||||
MMA.volume.vTRatio, MMA.volume.vMRatio = g['VRATIO']
|
|
||||||
|
|
||||||
for n in gbl.tnames.values():
|
|
||||||
n.restoreGroove(slot)
|
|
||||||
|
|
||||||
""" This is important! Tracks NOT overwritten by saved grooves way
|
|
||||||
have the wrong sequence length. I don't see any easy way to hit
|
|
||||||
just the unchanged/unrestored tracks so we do them all.
|
|
||||||
Only done if a change in seqsize ... doesn't take long to be safe.
|
|
||||||
"""
|
|
||||||
|
|
||||||
if oldSeqSize != gbl.seqSize:
|
|
||||||
for a in gbl.tnames.values():
|
|
||||||
a.setSeqSize()
|
|
||||||
|
|
||||||
seqRndWeight = MMA.pat.seqBump(seqRndWeight)
|
|
||||||
|
|
||||||
gbl.seqCount = 0
|
|
||||||
|
|
||||||
def grooveClear(ln):
|
|
||||||
""" Delete all previously loaded grooves from memory."""
|
|
||||||
|
|
||||||
global groovesList, groovesCount
|
|
||||||
|
|
||||||
if ln:
|
|
||||||
error("GrooveClear does not have any arguments.")
|
|
||||||
|
|
||||||
groovesList = {}
|
|
||||||
groovesCount = 0
|
|
||||||
|
|
||||||
try:
|
|
||||||
a= gbl.settingsGroove[gmagic]
|
|
||||||
except:
|
|
||||||
a=None
|
|
||||||
|
|
||||||
gbl.settingsGroove={}
|
|
||||||
|
|
||||||
if a:
|
|
||||||
gbl.settingsGroove[gmagic]=a
|
|
||||||
|
|
||||||
gbl.lastGroove = ''
|
|
||||||
gbl.currentGroove = ''
|
|
||||||
|
|
||||||
|
|
||||||
if gbl.debug:
|
|
||||||
print "All grooves deleted."
|
|
||||||
|
|
||||||
#######################################
|
#######################################
|
||||||
# File and I/O
|
# File and I/O
|
||||||
|
|
||||||
|
@ -1047,10 +852,9 @@ def usefile(ln):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
slot = gmagic
|
slot = gmagic
|
||||||
grooveDefineDo(slot)
|
MMA.grooves.grooveDefineDo(slot)
|
||||||
parseFile(fn)
|
parseFile(fn)
|
||||||
grooveDo(slot)
|
MMA.grooves.grooveDo(slot)
|
||||||
|
|
||||||
|
|
||||||
def mmastart(ln):
|
def mmastart(ln):
|
||||||
if not ln:
|
if not ln:
|
||||||
|
@ -1099,9 +903,9 @@ def setAutoPath(ln):
|
||||||
|
|
||||||
# To avoid conflicts, delete all existing grooves (current seq not effected)
|
# To avoid conflicts, delete all existing grooves (current seq not effected)
|
||||||
|
|
||||||
gbl.settingsGroove = {}
|
MMA.grooves.glist = {}
|
||||||
gbl.lastGroove = ''
|
MMA.grooves.lastGroove = ''
|
||||||
gbl.currentGroove = ''
|
MMA.grooves.currentGroove = ''
|
||||||
|
|
||||||
if gbl.debug:
|
if gbl.debug:
|
||||||
print "AutoLibPath set to", f
|
print "AutoLibPath set to", f
|
||||||
|
@ -1135,6 +939,20 @@ def setOutPath(ln):
|
||||||
else:
|
else:
|
||||||
gbl.outPath = os.path.expanduser(ln[0])
|
gbl.outPath = os.path.expanduser(ln[0])
|
||||||
|
|
||||||
|
if gbl.debug:
|
||||||
|
print "OutPath set to", gbl.outPath
|
||||||
|
|
||||||
|
|
||||||
|
def setMidiPlayer(ln):
|
||||||
|
""" Set the MIDI file player (used with -P). """
|
||||||
|
|
||||||
|
if len(ln) != 1:
|
||||||
|
error("Use: MidiPlayer <program name>")
|
||||||
|
|
||||||
|
gbl.midiPlayer = ln[0]
|
||||||
|
|
||||||
|
if gbl.debug:
|
||||||
|
print "MidiPlayer set to", gbl.MidiPlayer
|
||||||
|
|
||||||
|
|
||||||
#######################################
|
#######################################
|
||||||
|
@ -1143,13 +961,14 @@ def setOutPath(ln):
|
||||||
def seqsize(ln):
|
def seqsize(ln):
|
||||||
""" Set the length of sequences. """
|
""" Set the length of sequences. """
|
||||||
|
|
||||||
global seqRndWeight
|
|
||||||
|
|
||||||
if len(ln) !=1:
|
if len(ln) !=1:
|
||||||
error("Usage 'SeqSize N'")
|
error("Usage 'SeqSize N'")
|
||||||
|
|
||||||
n = stoi(ln[0], "Argument for SeqSize must be integer")
|
n = stoi(ln[0], "Argument for SeqSize must be integer")
|
||||||
|
|
||||||
|
if n < 1:
|
||||||
|
error("SeqSize: sequence size must be 1 or greater, not '%s'." % n)
|
||||||
|
|
||||||
# Setting the sequence size always resets the seq point
|
# Setting the sequence size always resets the seq point
|
||||||
|
|
||||||
gbl.seqCount = 0
|
gbl.seqCount = 0
|
||||||
|
@ -1164,7 +983,7 @@ def seqsize(ln):
|
||||||
for a in gbl.tnames.values():
|
for a in gbl.tnames.values():
|
||||||
a.setSeqSize()
|
a.setSeqSize()
|
||||||
|
|
||||||
seqRndWeight = seqBump(seqRndWeight)
|
MMA.seqrnd.seqRndWeight = seqBump(MMA.seqrnd.seqRndWeight)
|
||||||
|
|
||||||
if gbl.debug:
|
if gbl.debug:
|
||||||
print "Set SeqSize to ", n
|
print "Set SeqSize to ", n
|
||||||
|
@ -1193,9 +1012,9 @@ def seq(ln):
|
||||||
|
|
||||||
gbl.seqCount = s-1
|
gbl.seqCount = s-1
|
||||||
|
|
||||||
if gbl.seqRnd[0] == 1:
|
if MMA.seqrnd.seqRnd[0] == 1:
|
||||||
warning("SeqRnd has been disabled by a Seq command")
|
warning("SeqRnd has been disabled by a Seq command")
|
||||||
seqRnd = [0]
|
MMA.seqrnd.seqRnd = [0]
|
||||||
|
|
||||||
|
|
||||||
def seqClear(ln):
|
def seqClear(ln):
|
||||||
|
@ -1209,67 +1028,9 @@ def seqClear(ln):
|
||||||
n.clearSequence()
|
n.clearSequence()
|
||||||
MMA.volume.futureVol = []
|
MMA.volume.futureVol = []
|
||||||
|
|
||||||
setSeqRndWeight(['1'])
|
MMA.seqrnd.setSeqRndWeight(['1'])
|
||||||
|
|
||||||
|
|
||||||
def setSeqRnd(ln):
|
|
||||||
""" Set random order for all tracks. """
|
|
||||||
|
|
||||||
emsg = "use [ON, OFF | TrackList ]"
|
|
||||||
if not ln:
|
|
||||||
error("SeqRnd:" + emsg)
|
|
||||||
|
|
||||||
a=ln[0].upper()
|
|
||||||
|
|
||||||
if a in ("ON", "1") and len(ln) == 1:
|
|
||||||
gbl.seqRnd = [1]
|
|
||||||
|
|
||||||
elif a in ("OFF", "0") and len(ln) == 1:
|
|
||||||
gbl.seqRnd = [0]
|
|
||||||
|
|
||||||
else:
|
|
||||||
gbl.seqRnd=[2]
|
|
||||||
for a in ln:
|
|
||||||
a = a.upper()
|
|
||||||
if not a in gbl.tnames:
|
|
||||||
error("SeqRnd: Track '%s' does not exist, %s" % (a, emsg))
|
|
||||||
if a in gbl.seqRnd:
|
|
||||||
error("SeqRnd: Duplicate track '%s' specified, %s" % (a, emsg))
|
|
||||||
gbl.seqRnd.append(a)
|
|
||||||
|
|
||||||
if gbl.debug:
|
|
||||||
print "SeqRnd:",
|
|
||||||
if gbl.seqRnd[0] == 2:
|
|
||||||
for a in gbl.seqRnd[1:]:
|
|
||||||
print a,
|
|
||||||
print
|
|
||||||
else:
|
|
||||||
if gbl.seqRnd[0] == 1:
|
|
||||||
print "On"
|
|
||||||
else:
|
|
||||||
print "Off"
|
|
||||||
|
|
||||||
|
|
||||||
def setSeqRndWeight(ln):
|
|
||||||
""" Set global rnd weight. """
|
|
||||||
|
|
||||||
global seqRndWeight
|
|
||||||
|
|
||||||
if not ln:
|
|
||||||
error("Use: RndWeight <weight factors>")
|
|
||||||
|
|
||||||
tmp = []
|
|
||||||
for n in ln:
|
|
||||||
n = stoi(n)
|
|
||||||
if n < 0: error("RndWeight: Values must be 0 or greater")
|
|
||||||
tmp.append(n)
|
|
||||||
|
|
||||||
seqRndWeight = seqBump(tmp)
|
|
||||||
|
|
||||||
if gbl.debug:
|
|
||||||
print "RndWeight: ",
|
|
||||||
printList(seqRndWeight)
|
|
||||||
|
|
||||||
|
|
||||||
def restart(ln):
|
def restart(ln):
|
||||||
""" Restart all tracks to almost-default condidions. """
|
""" Restart all tracks to almost-default condidions. """
|
||||||
|
@ -1448,6 +1209,20 @@ def setTimeSig(ln):
|
||||||
#######################################
|
#######################################
|
||||||
# Misc
|
# Misc
|
||||||
|
|
||||||
|
def synchronize(ln):
|
||||||
|
""" Set synchronization in the MIDI. A file mode for -0 and -1. """
|
||||||
|
|
||||||
|
if not ln:
|
||||||
|
error("SYNCHRONIZE: requires args END and/or START.")
|
||||||
|
|
||||||
|
for a in ln:
|
||||||
|
if a.upper() == 'END':
|
||||||
|
gbl.endsync = 1
|
||||||
|
elif a.upper() == 'START':
|
||||||
|
gbl.synctick = 1
|
||||||
|
else:
|
||||||
|
error("SYNCHRONIZE: expecting END or START")
|
||||||
|
|
||||||
|
|
||||||
def rndseed(ln):
|
def rndseed(ln):
|
||||||
""" Reseed the random number generator. """
|
""" Reseed the random number generator. """
|
||||||
|
@ -1486,7 +1261,7 @@ def lnPrint(ln):
|
||||||
def printActive(ln):
|
def printActive(ln):
|
||||||
""" Print a list of the active tracks. """
|
""" Print a list of the active tracks. """
|
||||||
|
|
||||||
print "Active tracks, groove:", gbl.currentGroove, ' '.join(ln)
|
print "Active tracks, groove:", MMA.grooves.currentGroove, ' '.join(ln)
|
||||||
|
|
||||||
for a in sorted(gbl.tnames.keys()):
|
for a in sorted(gbl.tnames.keys()):
|
||||||
f=gbl.tnames[a]
|
f=gbl.tnames[a]
|
||||||
|
@ -1700,31 +1475,6 @@ def trackRestart(name, ln):
|
||||||
gbl.tnames[name].restart()
|
gbl.tnames[name].restart()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def trackGroove(name, ln):
|
|
||||||
""" Select a previously defined groove for a single track. """
|
|
||||||
|
|
||||||
if len(ln) != 1:
|
|
||||||
error("Use: %s Groove Name" % name)
|
|
||||||
|
|
||||||
|
|
||||||
slot = ln[0].upper()
|
|
||||||
|
|
||||||
if not slot in gbl.settingsGroove:
|
|
||||||
error("Groove '%s' not defined" % slot)
|
|
||||||
|
|
||||||
g=gbl.tnames[name]
|
|
||||||
g.restoreGroove(slot)
|
|
||||||
|
|
||||||
if g.sequence == [None] * len(g.sequence):
|
|
||||||
warning("'%s' Track Groove has no sequence. Track name error?" % name)
|
|
||||||
|
|
||||||
g.setSeqSize()
|
|
||||||
|
|
||||||
if gbl.debug:
|
|
||||||
print "%s Groove settings restored from '%s'." % (name, slot)
|
|
||||||
|
|
||||||
|
|
||||||
def trackRiff(name, ln):
|
def trackRiff(name, ln):
|
||||||
""" Set a riff for a track. """
|
""" Set a riff for a track. """
|
||||||
|
|
||||||
|
@ -1776,6 +1526,8 @@ def trackRvolume(name, ln):
|
||||||
|
|
||||||
gbl.tnames[name].setRVolume(ln)
|
gbl.tnames[name].setRVolume(ln)
|
||||||
|
|
||||||
|
def trackSwell(name, ln):
|
||||||
|
gbl.tnames[name].setSwell(ln)
|
||||||
|
|
||||||
def trackCresc(name, ln):
|
def trackCresc(name, ln):
|
||||||
gbl.tnames[name].setCresc(1, ln)
|
gbl.tnames[name].setCresc(1, ln)
|
||||||
|
@ -2125,11 +1877,10 @@ def trackVoice(name, ln):
|
||||||
def trackPan(name, ln):
|
def trackPan(name, ln):
|
||||||
""" Set the Midi Pan value for a track."""
|
""" Set the Midi Pan value for a track."""
|
||||||
|
|
||||||
if len(ln) != 1:
|
if len(ln)==1 or len(ln)==3:
|
||||||
error("Use: %s PAN NN" % name)
|
gbl.tnames[name].setPan(ln)
|
||||||
|
else:
|
||||||
gbl.tnames[name].setPan(ln[0])
|
error("Use %s MidiPAN [Value] OR [Initvalue DestValue Beats]." % name)
|
||||||
|
|
||||||
|
|
||||||
def trackOff(name, ln):
|
def trackOff(name, ln):
|
||||||
""" Turn a track off """
|
""" Turn a track off """
|
||||||
|
@ -2253,19 +2004,22 @@ def trackUnify(name, ln):
|
||||||
|
|
||||||
simpleFuncs={
|
simpleFuncs={
|
||||||
'ADJUSTVOLUME': MMA.volume.adjvolume,
|
'ADJUSTVOLUME': MMA.volume.adjvolume,
|
||||||
|
'ALLGROOVES': MMA.grooves.allgrooves,
|
||||||
'ALLTRACKS': allTracks,
|
'ALLTRACKS': allTracks,
|
||||||
'AUTHOR': MMA.docs.docAuthor,
|
'AUTHOR': MMA.docs.docAuthor,
|
||||||
'AUTOSOLOTRACKS': MMA.patSolo.setAutoSolo,
|
'AUTOSOLOTRACKS': MMA.patSolo.setAutoSolo,
|
||||||
'BEATADJUST': beatAdjust,
|
'BEATADJUST': beatAdjust,
|
||||||
'CHANNELPREF': setChPref,
|
'CHANNELPREF': setChPref,
|
||||||
|
'CHORDADJUST': MMA.chords.chordAdjust,
|
||||||
'COMMENT': comment,
|
'COMMENT': comment,
|
||||||
'CRESC': MMA.volume.setCresc,
|
'CRESC': MMA.volume.setCresc,
|
||||||
'CUT': cut,
|
'CUT': cut,
|
||||||
'DEBUG': setDebug,
|
'DEBUG': setDebug,
|
||||||
'DEC': macros.vardec,
|
'DEC': macros.vardec,
|
||||||
'DECRESC': MMA.volume.setDecresc,
|
'DECRESC': MMA.volume.setDecresc,
|
||||||
|
'DEFALIAS': MMA.grooves.grooveAlias,
|
||||||
'DEFCHORD': MMA.chords.defChord,
|
'DEFCHORD': MMA.chords.defChord,
|
||||||
'DEFGROOVE': grooveDefine,
|
'DEFGROOVE': MMA.grooves.grooveDefine,
|
||||||
'DELETE': deleteTrks,
|
'DELETE': deleteTrks,
|
||||||
'DOC': MMA.docs.docNote,
|
'DOC': MMA.docs.docNote,
|
||||||
'DOCVAR': MMA.docs.docVars,
|
'DOCVAR': MMA.docs.docVars,
|
||||||
|
@ -2277,8 +2031,8 @@ simpleFuncs={
|
||||||
'EOF': eof,
|
'EOF': eof,
|
||||||
'FERMATA': fermata,
|
'FERMATA': fermata,
|
||||||
'GOTO': goto,
|
'GOTO': goto,
|
||||||
'GROOVE': groove,
|
'GROOVE': MMA.grooves.groove,
|
||||||
'GROOVECLEAR': grooveClear,
|
'GROOVECLEAR': MMA.grooves.grooveClear,
|
||||||
'IF': macros.varIF,
|
'IF': macros.varIF,
|
||||||
'IFEND': ifend,
|
'IFEND': ifend,
|
||||||
'INC': macros.varinc,
|
'INC': macros.varinc,
|
||||||
|
@ -2297,7 +2051,7 @@ simpleFuncs={
|
||||||
'MSET': macros.msetvar,
|
'MSET': macros.msetvar,
|
||||||
'MSETEND': endmset,
|
'MSETEND': endmset,
|
||||||
'NEWSET': macros.newsetvar,
|
'NEWSET': macros.newsetvar,
|
||||||
'CHORDADJUST': MMA.chords.chordAdjust,
|
'PATCH': MMA.patch.patch,
|
||||||
'PRINT': lnPrint,
|
'PRINT': lnPrint,
|
||||||
'PRINTACTIVE': printActive,
|
'PRINTACTIVE': printActive,
|
||||||
'PRINTCHORD': MMA.chords.printChord,
|
'PRINTCHORD': MMA.chords.printChord,
|
||||||
|
@ -2309,17 +2063,20 @@ simpleFuncs={
|
||||||
'RNDSET': macros.rndvar,
|
'RNDSET': macros.rndvar,
|
||||||
'SEQ': seq,
|
'SEQ': seq,
|
||||||
'SEQCLEAR': seqClear,
|
'SEQCLEAR': seqClear,
|
||||||
'SEQRND': setSeqRnd,
|
'SEQRND': MMA.seqrnd.setSeqRnd,
|
||||||
'SEQRNDWEIGHT': setSeqRndWeight,
|
'SEQRNDWEIGHT': MMA.seqrnd.setSeqRndWeight,
|
||||||
'SEQSIZE': seqsize,
|
'SEQSIZE': seqsize,
|
||||||
'SET': macros.setvar,
|
'SET': macros.setvar,
|
||||||
'SETAUTOLIBPATH': setAutoPath,
|
'SETAUTOLIBPATH': setAutoPath,
|
||||||
'SETINCPATH': setIncPath,
|
'SETINCPATH': setIncPath,
|
||||||
'SETLIBPATH': setLibPath,
|
'SETLIBPATH': setLibPath,
|
||||||
|
'SETMIDIPLAYER': setMidiPlayer,
|
||||||
'SETOUTPATH': setOutPath,
|
'SETOUTPATH': setOutPath,
|
||||||
'SHOWVARS': macros.showvars,
|
'SHOWVARS': macros.showvars,
|
||||||
'STACKVALUE': macros.stackValue,
|
'STACKVALUE': macros.stackValue,
|
||||||
|
'SWELL': MMA.volume.setSwell,
|
||||||
'SWINGMODE': MMA.notelen.swingMode,
|
'SWINGMODE': MMA.notelen.swingMode,
|
||||||
|
'SYNCHRONIZE': synchronize,
|
||||||
'TEMPO': tempo,
|
'TEMPO': tempo,
|
||||||
'TIME': setTime,
|
'TIME': setTime,
|
||||||
'TIMESIG': setTimeSig,
|
'TIMESIG': setTimeSig,
|
||||||
|
@ -2350,7 +2107,7 @@ trackFuncs={
|
||||||
'DRUMTYPE': trackDrumType,
|
'DRUMTYPE': trackDrumType,
|
||||||
'DUPROOT': trackDupRoot,
|
'DUPROOT': trackDupRoot,
|
||||||
'FORCEOUT': trackForceOut,
|
'FORCEOUT': trackForceOut,
|
||||||
'GROOVE': trackGroove,
|
'GROOVE': MMA.grooves.trackGroove,
|
||||||
'HARMONY': trackHarmony,
|
'HARMONY': trackHarmony,
|
||||||
'HARMONYONLY': trackHarmonyOnly,
|
'HARMONYONLY': trackHarmonyOnly,
|
||||||
'HARMONYVOLUME': trackHarmonyVolume,
|
'HARMONYVOLUME': trackHarmonyVolume,
|
||||||
|
@ -2379,6 +2136,7 @@ trackFuncs={
|
||||||
'SEQRND': trackSeqRnd,
|
'SEQRND': trackSeqRnd,
|
||||||
'SEQUENCE': trackSequence,
|
'SEQUENCE': trackSequence,
|
||||||
'SEQRNDWEIGHT': trackSeqRndWeight,
|
'SEQRNDWEIGHT': trackSeqRndWeight,
|
||||||
|
'SWELL': trackSwell,
|
||||||
'NOTESPAN': trackSpan,
|
'NOTESPAN': trackSpan,
|
||||||
'STRUM': trackStrum,
|
'STRUM': trackStrum,
|
||||||
'TONE': trackTone,
|
'TONE': trackTone,
|
||||||
|
|
458
mma/MMA/pat.py
458
mma/MMA/pat.py
|
@ -28,34 +28,30 @@ import copy
|
||||||
import random
|
import random
|
||||||
import math
|
import math
|
||||||
|
|
||||||
import gbl
|
import MMA.notelen
|
||||||
from MMA.common import *
|
|
||||||
from MMA.notelen import getNoteLen
|
|
||||||
import MMA.translate
|
import MMA.translate
|
||||||
import MMA.midi
|
import MMA.midi
|
||||||
import MMA.midiC
|
import MMA.midiC
|
||||||
import MMA.alloc
|
|
||||||
import MMA.mdefine
|
import MMA.mdefine
|
||||||
import MMA.volume
|
import MMA.volume
|
||||||
|
import MMA.alloc
|
||||||
|
import MMA.seqrnd
|
||||||
|
|
||||||
|
import gbl
|
||||||
|
from MMA.common import *
|
||||||
|
|
||||||
|
|
||||||
class Voicing:
|
class Voicing:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.mode = None
|
self.mode = None
|
||||||
self.range = 12
|
self.range = 12
|
||||||
self.center = 4
|
self.center = 4
|
||||||
self.random = 0
|
self.random = 0
|
||||||
self.percent = 0
|
self.percent = 0
|
||||||
self.bcount = 0
|
self.bcount = 0
|
||||||
self.dir = 0
|
self.dir = 0
|
||||||
|
|
||||||
|
|
||||||
def seqBump(l):
|
|
||||||
""" Expand/contract an existing sequence list to the current seqSize."""
|
|
||||||
|
|
||||||
while len(l) < gbl.seqSize:
|
|
||||||
l += l
|
|
||||||
return l[:gbl.seqSize]
|
|
||||||
|
|
||||||
pats = {} # Storage for all pattern defines
|
pats = {} # Storage for all pattern defines
|
||||||
|
|
||||||
|
|
||||||
|
@ -77,14 +73,14 @@ class PC:
|
||||||
|
|
||||||
def __init__(self, nm):
|
def __init__(self, nm):
|
||||||
|
|
||||||
self.inited = 0
|
self.inited = 0
|
||||||
self.name = nm
|
self.name = nm
|
||||||
self.channel = 0
|
self.channel = 0
|
||||||
self.grooves = {}
|
self.grooves = {}
|
||||||
self.saveVols = {}
|
self.saveVols = {}
|
||||||
self.ssvoice = -1 # Track the voice set for the track
|
self.ssvoice = -1 # Track the voice set for the track
|
||||||
self.smidiVoice = () # Track MIDIVoice cmds to avoid dups
|
self.smidiVoice = () # Track MIDIVoice cmds to avoid dups
|
||||||
self.midiSent = 0 # if set, MIDICLEAR invoked.
|
self.midiSent = 0 # if set, MIDICLEAR invoked.
|
||||||
|
|
||||||
|
|
||||||
""" Midi commands like Pan, Glis, etc. are stacked until musical
|
""" Midi commands like Pan, Glis, etc. are stacked until musical
|
||||||
|
@ -100,9 +96,13 @@ class PC:
|
||||||
|
|
||||||
self.clearSequence()
|
self.clearSequence()
|
||||||
|
|
||||||
|
self.nextVolume = None
|
||||||
|
|
||||||
self.inited = 1
|
self.inited = 1
|
||||||
|
|
||||||
|
if gbl.muteTracks and nm not in gbl.muteTracks:
|
||||||
|
self.disable = 1
|
||||||
|
|
||||||
|
|
||||||
##########################################
|
##########################################
|
||||||
## These are called from process() to set options
|
## These are called from process() to set options
|
||||||
|
@ -110,7 +110,7 @@ class PC:
|
||||||
def setCompress(self, ln):
|
def setCompress(self, ln):
|
||||||
""" set/unset the compress flag. """
|
""" set/unset the compress flag. """
|
||||||
|
|
||||||
ln=self.lnExpand(ln, 'Compress')
|
ln = lnExpand(ln, '%s Compress' % self.name)
|
||||||
|
|
||||||
tmp = []
|
tmp = []
|
||||||
|
|
||||||
|
@ -140,7 +140,7 @@ class PC:
|
||||||
def setRange(self, ln):
|
def setRange(self, ln):
|
||||||
""" set range. """
|
""" set range. """
|
||||||
|
|
||||||
ln=self.lnExpand(ln, 'Range')
|
ln = lnExpand(ln, '%s Range' % self.name)
|
||||||
|
|
||||||
tmp = []
|
tmp = []
|
||||||
|
|
||||||
|
@ -322,9 +322,9 @@ class PC:
|
||||||
return
|
return
|
||||||
|
|
||||||
""" Get name of track to share with and make sure it exists.
|
""" Get name of track to share with and make sure it exists.
|
||||||
If not, trackAlloc() will create the track. Do some
|
If not, trackAlloc() will create the track. Do some
|
||||||
sanity checks and ensure that the shared track has
|
sanity checks and ensure that the shared track has
|
||||||
a channel assigned.
|
a channel assigned.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
sc = ln.upper()
|
sc = ln.upper()
|
||||||
|
@ -357,7 +357,6 @@ class PC:
|
||||||
self.voice = gbl.tnames[sc].voice[:]
|
self.voice = gbl.tnames[sc].voice[:]
|
||||||
self.octave = gbl.tnames[sc].octave[:]
|
self.octave = gbl.tnames[sc].octave[:]
|
||||||
|
|
||||||
|
|
||||||
# Update the avail. lists
|
# Update the avail. lists
|
||||||
|
|
||||||
gbl.midiAssigns[self.channel].append(self.name)
|
gbl.midiAssigns[self.channel].append(self.name)
|
||||||
|
@ -384,17 +383,56 @@ class PC:
|
||||||
print "Set %s track name for MIDI to %s" % (self.name, n)
|
print "Set %s track name for MIDI to %s" % (self.name, n)
|
||||||
|
|
||||||
def setPan(self, ln):
|
def setPan(self, ln):
|
||||||
""" Set MIDI Pan for this track. """
|
""" Set MIDI Pan for this track. Parse sends 1 or 3 args. """
|
||||||
|
|
||||||
|
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:
|
if initPan<0 or initPan>127:
|
||||||
error("PAN value must be 0..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:
|
if gbl.debug:
|
||||||
print "Set %s MIDIPan to %s" % (self.name, v)
|
if beats:
|
||||||
|
print "Set %s MIDIPan from %s to %s over %s beats." % \
|
||||||
|
(self.name, initPan, newPan, beats)
|
||||||
|
else:
|
||||||
|
print "Set %s MIDIPan to %s" % (self.name, newPan)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -428,8 +466,12 @@ class PC:
|
||||||
def setOn(self):
|
def setOn(self):
|
||||||
""" Turn ON track. """
|
""" Turn ON track. """
|
||||||
|
|
||||||
self.disable = 0
|
if gbl.muteTracks and self.name not in gbl.muteTracks:
|
||||||
self.ssvoice = -1
|
warning("Attempt to enable muted track %s ignored." % self.name)
|
||||||
|
|
||||||
|
else:
|
||||||
|
self.disable = 0
|
||||||
|
self.ssvoice = -1
|
||||||
|
|
||||||
if gbl.debug:
|
if gbl.debug:
|
||||||
print "%s Enabled" % self.name
|
print "%s Enabled" % self.name
|
||||||
|
@ -448,7 +490,7 @@ class PC:
|
||||||
def setRVolume(self, ln):
|
def setRVolume(self, ln):
|
||||||
""" Set the volume randomizer for a track. """
|
""" Set the volume randomizer for a track. """
|
||||||
|
|
||||||
ln = self.lnExpand(ln, 'RVolume')
|
ln = lnExpand(ln, '%s RVolume' % self.name)
|
||||||
tmp = []
|
tmp = []
|
||||||
|
|
||||||
for n in ln:
|
for n in ln:
|
||||||
|
@ -466,7 +508,7 @@ class PC:
|
||||||
self.rVolume = seqBump(tmp)
|
self.rVolume = seqBump(tmp)
|
||||||
|
|
||||||
if gbl.debug:
|
if gbl.debug:
|
||||||
print "Set %s Rvolume to:" % self.name,
|
print "Set %s Rvolume to:" % self.name,
|
||||||
for n in self.rVolume:
|
for n in self.rVolume:
|
||||||
print int(n * 100),
|
print int(n * 100),
|
||||||
print
|
print
|
||||||
|
@ -475,7 +517,7 @@ class PC:
|
||||||
def setRSkip(self, ln):
|
def setRSkip(self, ln):
|
||||||
""" Set the note random skip factor for a track. """
|
""" Set the note random skip factor for a track. """
|
||||||
|
|
||||||
ln = self.lnExpand(ln, 'RSkip')
|
ln = lnExpand(ln, '%s RSkip' % self.name)
|
||||||
tmp = []
|
tmp = []
|
||||||
|
|
||||||
for n in ln:
|
for n in ln:
|
||||||
|
@ -498,7 +540,7 @@ class PC:
|
||||||
def setRTime(self, ln):
|
def setRTime(self, ln):
|
||||||
""" Set the timing randomizer for a track. """
|
""" Set the timing randomizer for a track. """
|
||||||
|
|
||||||
ln=self.lnExpand(ln, 'RTime')
|
ln = lnExpand(ln, '%s RTime' % self.name)
|
||||||
tmp = []
|
tmp = []
|
||||||
|
|
||||||
for n in ln:
|
for n in ln:
|
||||||
|
@ -538,7 +580,7 @@ class PC:
|
||||||
def setRndWeight(self, ln):
|
def setRndWeight(self, ln):
|
||||||
""" Set weighting factors for seqrnd. """
|
""" Set weighting factors for seqrnd. """
|
||||||
|
|
||||||
ln = self.lnExpand(ln, "SeqRndWeight")
|
ln = lnExpand(ln, "%s SeqRndWeight" % self.name)
|
||||||
tmp = []
|
tmp = []
|
||||||
|
|
||||||
for n in ln:
|
for n in ln:
|
||||||
|
@ -556,7 +598,7 @@ class PC:
|
||||||
def setDirection(self, ln):
|
def setDirection(self, ln):
|
||||||
""" Set scale direction. """
|
""" Set scale direction. """
|
||||||
|
|
||||||
ln = self.lnExpand(ln, "Direction")
|
ln = lnExpand(ln, "%s Direction" % self.name)
|
||||||
tmp = []
|
tmp = []
|
||||||
|
|
||||||
for n in ln:
|
for n in ln:
|
||||||
|
@ -594,7 +636,7 @@ class PC:
|
||||||
by one rotation for each value.
|
by one rotation for each value.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
ln=self.lnExpand(ln, "Invert")
|
ln = lnExpand(ln, "%s Invert" % self.name)
|
||||||
|
|
||||||
vwarn = 0
|
vwarn = 0
|
||||||
tmp = []
|
tmp = []
|
||||||
|
@ -623,7 +665,7 @@ class PC:
|
||||||
def setOctave(self, ln):
|
def setOctave(self, ln):
|
||||||
""" Set the octave for a track. """
|
""" Set the octave for a track. """
|
||||||
|
|
||||||
ln=self.lnExpand(ln, 'Octave')
|
ln = lnExpand(ln, '%s Octave' % self.name)
|
||||||
tmp = []
|
tmp = []
|
||||||
|
|
||||||
for n in ln:
|
for n in ln:
|
||||||
|
@ -662,7 +704,7 @@ class PC:
|
||||||
def setHarmony(self, ln):
|
def setHarmony(self, ln):
|
||||||
""" Set the harmony. """
|
""" Set the harmony. """
|
||||||
|
|
||||||
ln=self.lnExpand(ln, 'Harmony')
|
ln = lnExpand(ln, '%s Harmony' % self.name)
|
||||||
tmp = []
|
tmp = []
|
||||||
|
|
||||||
for n in ln:
|
for n in ln:
|
||||||
|
@ -686,7 +728,7 @@ class PC:
|
||||||
""" Set the harmony only. """
|
""" Set the harmony only. """
|
||||||
|
|
||||||
|
|
||||||
ln=self.lnExpand(ln, 'HarmonyOnly')
|
ln = lnExpand(ln, '%s HarmonyOnly' % self.name)
|
||||||
tmp = []
|
tmp = []
|
||||||
|
|
||||||
for n in ln:
|
for n in ln:
|
||||||
|
@ -710,7 +752,7 @@ class PC:
|
||||||
def setHarmonyVolume(self, ln):
|
def setHarmonyVolume(self, ln):
|
||||||
""" Set harmony volume adjustment. """
|
""" Set harmony volume adjustment. """
|
||||||
|
|
||||||
ln=self.lnExpand(ln, 'HarmonyOnly')
|
ln = lnExpand(ln, '%s HarmonyOnly' % self.name)
|
||||||
tmp = []
|
tmp = []
|
||||||
|
|
||||||
for n in ln:
|
for n in ln:
|
||||||
|
@ -766,24 +808,46 @@ class PC:
|
||||||
def setVoice(self, ln):
|
def setVoice(self, ln):
|
||||||
""" Set the voice for a track.
|
""" Set the voice for a track.
|
||||||
|
|
||||||
Note, this just sets flags, the voice is set in bar().
|
Note, this just sets flags, the voice is set in bar().
|
||||||
ln[] is not nesc. set to the correct length.
|
ln[] is not nesc. set to the correct length.
|
||||||
|
|
||||||
|
the voice can be gm-string, user-def-string, or value.
|
||||||
|
A value can be xx.yy.vv, yy.vv or vv
|
||||||
"""
|
"""
|
||||||
|
|
||||||
ln=self.lnExpand(ln, 'Voice')
|
ln = lnExpand(ln, '%s Voice' % self.name)
|
||||||
tmp = []
|
tmp = []
|
||||||
|
|
||||||
for n in ln:
|
for n in ln:
|
||||||
n = MMA.translate.vtable.get(n)
|
n = MMA.translate.vtable.get(n)
|
||||||
a=MMA.midiC.instToValue(n)
|
voc=MMA.midiC.instToValue(n)
|
||||||
|
|
||||||
if a < 0:
|
if voc < 0 and n[0].isalpha():
|
||||||
a=stoi(n, "Expecting a valid voice name or value, "
|
error("Voice '%s' is not defined." % n)
|
||||||
"not '%s'" % n)
|
if voc < 0: # not a valid name, assume vv.msb(ctrl0).lsb(ctrl32) value
|
||||||
if a <0 or a > 127:
|
nn = n.split('.')
|
||||||
error("Voice must be 0..127")
|
if len(nn) > 3 or len(nn) < 1:
|
||||||
tmp.append( a )
|
error("Expecting a voice value Prog.MSB.LSB, not '%s'" % n)
|
||||||
|
voc = 0
|
||||||
|
if len(nn) > 2:
|
||||||
|
i = stoi(nn[2])
|
||||||
|
if i<0 or i>127:
|
||||||
|
error("LSB must be 0..127, not '%s'" % i)
|
||||||
|
voc = i << 16
|
||||||
|
|
||||||
|
if len(nn) > 1:
|
||||||
|
i = stoi(nn[1])
|
||||||
|
if i<0 or i>127:
|
||||||
|
error("MSB must be 0..127, not '%s'" % i)
|
||||||
|
voc += i << 8
|
||||||
|
|
||||||
|
i = stoi(nn[0])
|
||||||
|
if i<0 or i>127:
|
||||||
|
error("Program must be 0..127, not '%s'" % i)
|
||||||
|
voc += i
|
||||||
|
|
||||||
|
tmp.append( voc )
|
||||||
|
|
||||||
self.voice = seqBump(tmp)
|
self.voice = seqBump(tmp)
|
||||||
|
|
||||||
if self.channel and len(gbl.midiAssigns[self.channel])>1:
|
if self.channel and len(gbl.midiAssigns[self.channel])>1:
|
||||||
|
@ -794,11 +858,10 @@ class PC:
|
||||||
warning("Track %s is shared with %s,\n"
|
warning("Track %s is shared with %s,\n"
|
||||||
" changing voice may create conflict" % (a,self.name))
|
" changing voice may create conflict" % (a,self.name))
|
||||||
|
|
||||||
|
|
||||||
if gbl.debug:
|
if gbl.debug:
|
||||||
print "Set %s Voice to:" % self.name,
|
print "Set %s Voice to:" % self.name,
|
||||||
for a in self.voice:
|
for i in self.voice:
|
||||||
print MMA.midiC.valueToInst(a),
|
print MMA.midiC.valueToInst(i),
|
||||||
print
|
print
|
||||||
|
|
||||||
|
|
||||||
|
@ -828,7 +891,12 @@ class PC:
|
||||||
gbl.mtrks[self.channel].addCtl(gbl.tickOffset, i[1])
|
gbl.mtrks[self.channel].addCtl(gbl.tickOffset, i[1])
|
||||||
|
|
||||||
self.midiSent = 0
|
self.midiSent = 0
|
||||||
|
|
||||||
|
def doChannelReset(self):
|
||||||
|
""" Reset the midi voicing to 'sane'. Called when track ended. """
|
||||||
|
|
||||||
|
if self.ssvoice > 127:
|
||||||
|
gbl.mtrks[self.channel].addProgChange( gbl.tickOffset, 0, self.ssvoice)
|
||||||
|
|
||||||
def setMidiSeq(self, ln):
|
def setMidiSeq(self, ln):
|
||||||
""" Set a midi sequence for a track.
|
""" Set a midi sequence for a track.
|
||||||
|
@ -842,7 +910,7 @@ class PC:
|
||||||
""" lnExpand() works here! The midi data has been converted to
|
""" lnExpand() works here! The midi data has been converted to
|
||||||
pseudo-macros already in the parser. """
|
pseudo-macros already in the parser. """
|
||||||
|
|
||||||
ln=self.lnExpand(ln, "MidiSeq")
|
ln = lnExpand(ln, "%s MidiSeq" % self.name)
|
||||||
|
|
||||||
seq = []
|
seq = []
|
||||||
for a in ln:
|
for a in ln:
|
||||||
|
@ -875,7 +943,7 @@ class PC:
|
||||||
""" lnExpand() works here! The midi data has been converted to
|
""" lnExpand() works here! The midi data has been converted to
|
||||||
pseudo-macros already in the parser. """
|
pseudo-macros already in the parser. """
|
||||||
|
|
||||||
ln = self.lnExpand(ln, 'MIDIVoice')
|
ln = lnExpand(ln, '%s MIDIVoice' % self.name)
|
||||||
|
|
||||||
seq = []
|
seq = []
|
||||||
for a in ln:
|
for a in ln:
|
||||||
|
@ -916,7 +984,7 @@ class PC:
|
||||||
ln[] not nesc. correct length
|
ln[] not nesc. correct length
|
||||||
"""
|
"""
|
||||||
|
|
||||||
ln=self.lnExpand(ln, 'Volume')
|
ln = lnExpand(ln, '%s Volume' % self.name)
|
||||||
tmp = [None] * len(ln)
|
tmp = [None] * len(ln)
|
||||||
|
|
||||||
for i,n in enumerate(ln):
|
for i,n in enumerate(ln):
|
||||||
|
@ -944,6 +1012,9 @@ class PC:
|
||||||
self.setVolume([ln[0]])
|
self.setVolume([ln[0]])
|
||||||
ln=ln[1:]
|
ln=ln[1:]
|
||||||
|
|
||||||
|
if len(ln) != 2:
|
||||||
|
error("Cresc expecting 2 or 3 args.")
|
||||||
|
|
||||||
vol = self.volume[0]
|
vol = self.volume[0]
|
||||||
|
|
||||||
if self.volume.count(vol) != len(self.volume):
|
if self.volume.count(vol) != len(self.volume):
|
||||||
|
@ -951,7 +1022,53 @@ class PC:
|
||||||
|
|
||||||
self.futureVols = MMA.volume.fvolume(dir, vol, ln)
|
self.futureVols = MMA.volume.fvolume(dir, vol, ln)
|
||||||
|
|
||||||
|
if gbl.debug:
|
||||||
|
print "Set %s Cresc to:" % self.name,
|
||||||
|
for a in self.futureVols:
|
||||||
|
print int(a*100),
|
||||||
|
print
|
||||||
|
|
||||||
|
|
||||||
|
def setSwell(self, ln):
|
||||||
|
""" Set a swell (cresc<>decresc) for track. """
|
||||||
|
|
||||||
|
if len(ln) == 3: # 3 args, 1st is intial setting
|
||||||
|
self.setVolume([ln[0]])
|
||||||
|
ln=ln[1:]
|
||||||
|
|
||||||
|
if len(ln) != 2:
|
||||||
|
error("%s Swell expecting 2 or 3 args." % self.name)
|
||||||
|
|
||||||
|
if self.volume.count(self.volume[0]) != len(self.volume):
|
||||||
|
warning("%s Swell being used with track with variable sequence volumes." \
|
||||||
|
% self.name)
|
||||||
|
|
||||||
|
count = stoi(ln[1])
|
||||||
|
if count < 2:
|
||||||
|
error("%s Swell bar count must be 2 or greater." % self.name)
|
||||||
|
|
||||||
|
count += 1
|
||||||
|
c = int(count/2)
|
||||||
|
if count % 2: # even number of bars (we bumped count)
|
||||||
|
offset = 1
|
||||||
|
c+=1
|
||||||
|
else: # odd number
|
||||||
|
offset = 0
|
||||||
|
c=str(c)
|
||||||
|
|
||||||
|
self.futureVols = MMA.volume.fvolume(0 ,self.volume[0],
|
||||||
|
[ ln[0], c ] )
|
||||||
|
|
||||||
|
self.futureVols.extend(MMA.volume.fvolume(0, self.futureVols[-1],
|
||||||
|
[str(int(self.volume[0]*100)), c ] )[offset:] )
|
||||||
|
|
||||||
|
if gbl.debug:
|
||||||
|
print "Set %s Swell to:" % self.name,
|
||||||
|
for a in self.futureVols:
|
||||||
|
print int(a*100),
|
||||||
|
print
|
||||||
|
|
||||||
|
|
||||||
def setMallet(self, ln):
|
def setMallet(self, ln):
|
||||||
""" Mallet (repeat) settngs. """
|
""" Mallet (repeat) settngs. """
|
||||||
|
|
||||||
|
@ -962,7 +1079,7 @@ class PC:
|
||||||
error("Each Mallet option must contain a '=', not '%s'" % l)
|
error("Each Mallet option must contain a '=', not '%s'" % l)
|
||||||
|
|
||||||
if mode == 'RATE':
|
if mode == 'RATE':
|
||||||
self.mallet = getNoteLen(val)
|
self.mallet = MMA.notelen.getNoteLen(val)
|
||||||
|
|
||||||
elif mode == 'DECAY':
|
elif mode == 'DECAY':
|
||||||
val = stof(val, "Mallet Decay must be a value, not '%s'" % val)
|
val = stof(val, "Mallet Decay must be a value, not '%s'" % val)
|
||||||
|
@ -983,45 +1100,44 @@ class PC:
|
||||||
tmp = []
|
tmp = []
|
||||||
|
|
||||||
|
|
||||||
""" We can do "Track Accent 1 20 3 -10" or "Track Accent {1 20 3 -10}"
|
""" 2 ways to call this:
|
||||||
or even something like "Track Accent {1 20} / {/} {3 20}"
|
|
||||||
Note that the "/" can or not have {}s.
|
Track Accent 1 20 3 -10 -- fix up by adding {} around entire option list,
|
||||||
|
Track Accent {1 20 3 -10} -- okay
|
||||||
|
Track Accent {1 20} / {/} {3 20} -- okay.
|
||||||
|
|
||||||
|
At this point ln is a string. We extract each set of {}s and build a
|
||||||
|
new ln[].
|
||||||
|
|
||||||
|
Note that the "/" can or not have {}s.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
ln = ' '.join(ln)
|
ln = ' '.join(ln)
|
||||||
if not ln.startswith('{'):
|
if not ln.startswith('{'):
|
||||||
ln='{' + ln +"}"
|
ln='{' + ln +"}"
|
||||||
|
|
||||||
# Convert string to list. One entry per seq.
|
|
||||||
|
|
||||||
l=[]
|
l=[]
|
||||||
while ln:
|
while ln:
|
||||||
if not ln.startswith("{"):
|
if ln[0] == "/": # / not delimited with {}
|
||||||
if ln[0]=='/':
|
ln = "{/}" + ln[1:]
|
||||||
l.append('/')
|
|
||||||
ln=ln[1:].strip()
|
a,b = pextract(ln, "{", "}", 1)
|
||||||
else:
|
ln=a.strip()
|
||||||
error("Unknown value in %s Accent: %s" % (self.name, ln[0]))
|
if len(b)==1 and b[0]=='/': # convert ['/'] to '/' for lnExpand()
|
||||||
|
l.append('/')
|
||||||
else:
|
else:
|
||||||
a,b = pextract(ln, "{", "}", 1)
|
l.append(b[0].split())
|
||||||
ln=a.strip()
|
|
||||||
if len(b)==1 and b[0]=='/':
|
ln = lnExpand(l, '%s Accent' % self.name)
|
||||||
l.append('/')
|
|
||||||
else:
|
|
||||||
l.append(b[0].split())
|
|
||||||
|
|
||||||
|
|
||||||
ln=self.lnExpand(l, 'Accent')
|
|
||||||
|
|
||||||
|
|
||||||
for l in ln:
|
for l in ln:
|
||||||
tt=[]
|
tt=[]
|
||||||
if len(l)/2*2 != len(l):
|
if len(l)/2*2 != len(l):
|
||||||
error("Use: %s Accent Beat Percentage [...]" % self.name)
|
error("Use: %s Accent Beat Percentage [...]" % self.name)
|
||||||
|
|
||||||
for b, v in zip(l[::2], l[1::2]):
|
for b, v in zip(l[::2], l[1::2]):
|
||||||
b=self.setBarOffset( b )
|
b=self.setBarOffset( b )
|
||||||
v=stoi(v, "Bbeat offset must be a value, not '%s'" % v)
|
v=stoi(v, "Beat offset must be a value, not '%s'" % v)
|
||||||
if v < -100 or v > 100:
|
if v < -100 or v > 100:
|
||||||
error("Velocity adjustment (as percentage) must "
|
error("Velocity adjustment (as percentage) must "
|
||||||
"be -100..100, not '%s'" % v)
|
"be -100..100, not '%s'" % v)
|
||||||
|
@ -1044,7 +1160,7 @@ class PC:
|
||||||
def setArtic(self, ln):
|
def setArtic(self, ln):
|
||||||
""" Set the note articuation value. """
|
""" Set the note articuation value. """
|
||||||
|
|
||||||
ln=self.lnExpand(ln, 'Articulate')
|
ln = lnExpand(ln, '%s Articulate' % self.name)
|
||||||
tmp = []
|
tmp = []
|
||||||
|
|
||||||
for n in ln:
|
for n in ln:
|
||||||
|
@ -1067,7 +1183,7 @@ class PC:
|
||||||
def setUnify(self, ln):
|
def setUnify(self, ln):
|
||||||
""" Set unify. """
|
""" Set unify. """
|
||||||
|
|
||||||
ln = self.lnExpand(ln, "Unify")
|
ln = lnExpand(ln, "%s Unify" % self.name)
|
||||||
tmp = []
|
tmp = []
|
||||||
|
|
||||||
for n in ln:
|
for n in ln:
|
||||||
|
@ -1086,29 +1202,6 @@ class PC:
|
||||||
printList(self.unify)
|
printList(self.unify)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def lnExpand(self, ln, cmd):
|
|
||||||
""" Validate and expand a list passed to a set command. """
|
|
||||||
|
|
||||||
if len(ln) > gbl.seqSize:
|
|
||||||
warning("%s list truncated to %s patterns" % (self.name, gbl.seqSize) )
|
|
||||||
ln = ln[:gbl.seqSize]
|
|
||||||
|
|
||||||
last = None
|
|
||||||
|
|
||||||
for i,n in enumerate(ln):
|
|
||||||
if n == '/':
|
|
||||||
if not last:
|
|
||||||
error ("You cannot use a '/' as the first item "
|
|
||||||
"in a %s list" % cmd)
|
|
||||||
else:
|
|
||||||
ln[i] = last
|
|
||||||
else:
|
|
||||||
last = n
|
|
||||||
|
|
||||||
return ln
|
|
||||||
|
|
||||||
|
|
||||||
def copySettings(self, cp):
|
def copySettings(self, cp):
|
||||||
""" Copy the voicing from a 2nd voice to the current one. """
|
""" Copy the voicing from a 2nd voice to the current one. """
|
||||||
|
|
||||||
|
@ -1174,25 +1267,25 @@ class PC:
|
||||||
'HARMONYO': self.harmonyOnly[:],
|
'HARMONYO': self.harmonyOnly[:],
|
||||||
'HARMONYV': self.harmonyVolume[:],
|
'HARMONYV': self.harmonyVolume[:],
|
||||||
'INVERT': self.invert[:],
|
'INVERT': self.invert[:],
|
||||||
'LIMIT': self.chordLimit,
|
'LIMIT': self.chordLimit,
|
||||||
'RANGE': self.chordRange[:],
|
'RANGE': self.chordRange[:],
|
||||||
'OCTAVE': self.octave[:],
|
'OCTAVE': self.octave[:],
|
||||||
'RSKIP': self.rSkip[:],
|
'RSKIP': self.rSkip[:],
|
||||||
'RTIME': self.rTime[:],
|
'RTIME': self.rTime[:],
|
||||||
'RVOLUME': self.rVolume[:],
|
'RVOLUME': self.rVolume[:],
|
||||||
'SCALE': self.scaleType[:],
|
'SCALE': self.scaleType[:],
|
||||||
'SEQ': self.sequence[:],
|
'SEQ': self.sequence[:],
|
||||||
'SEQRND': self.seqRnd,
|
'SEQRND': self.seqRnd,
|
||||||
'SEQRNDWT': self.seqRndWeight[:],
|
'SEQRNDWT': self.seqRndWeight[:],
|
||||||
'STRUM': self.strum[:],
|
'STRUM': self.strum[:],
|
||||||
'VOICE': self.voice[:],
|
'VOICE': self.voice[:],
|
||||||
'VOLUME': self.volume[:],
|
'VOLUME': self.volume[:],
|
||||||
'UNIFY': self.unify[:],
|
'UNIFY': self.unify[:],
|
||||||
'MIDISEQ': self.midiSeq[:],
|
'MIDISEQ': self.midiSeq[:],
|
||||||
'MIDIVOICE':self.midiVoice[:],
|
'MIDIVOICE': self.midiVoice[:],
|
||||||
'MIDICLEAR':self.midiClear[:],
|
'MIDICLEAR': self.midiClear[:],
|
||||||
'SPAN': (self.spanStart, self.spanEnd),
|
'SPAN': (self.spanStart, self.spanEnd),
|
||||||
'MALLET': (self.mallet, self.malletDecay),
|
'MALLET': (self.mallet, self.malletDecay),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1291,7 +1384,7 @@ class PC:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
ln=self.lnExpand(ln, 'Sequence')
|
ln = lnExpand(ln, '%s Sequence' % self.name)
|
||||||
tmp = [None] * len(ln)
|
tmp = [None] * len(ln)
|
||||||
|
|
||||||
for i, n in enumerate(ln):
|
for i, n in enumerate(ln):
|
||||||
|
@ -1555,9 +1648,9 @@ class PC:
|
||||||
plist.sort(patsort)
|
plist.sort(patsort)
|
||||||
|
|
||||||
if gbl.swingMode:
|
if gbl.swingMode:
|
||||||
len8 = getNoteLen('8')
|
len8 = MMA.notelen.getNoteLen('8')
|
||||||
len81 = getNoteLen('81')
|
len81 = MMA.notelen.getNoteLen('81')
|
||||||
len82 = getNoteLen('82')
|
len82 = MMA.notelen.getNoteLen('82')
|
||||||
|
|
||||||
onBeats = [ x * gbl.BperQ for x in range(gbl.QperBar)]
|
onBeats = [ x * gbl.BperQ for x in range(gbl.QperBar)]
|
||||||
offBeats = [ (x * gbl.BperQ + len8) for x in range(gbl.QperBar)]
|
offBeats = [ (x * gbl.BperQ + len8) for x in range(gbl.QperBar)]
|
||||||
|
@ -1574,19 +1667,26 @@ class PC:
|
||||||
p.offset = onBeats[i] + len81
|
p.offset = onBeats[i] + len81
|
||||||
|
|
||||||
return plist
|
return plist
|
||||||
|
|
||||||
|
|
||||||
def printPattern(self, pat):
|
def printPattern(self, pat):
|
||||||
""" Print a pattern. Used by debugging code."""
|
""" Print a pattern. Used by debugging code."""
|
||||||
|
|
||||||
s=[]
|
print self.formatPattern(pat)
|
||||||
|
|
||||||
|
def formatPattern(self, pat):
|
||||||
|
pp=[]
|
||||||
|
if not pat:
|
||||||
|
return ' z '
|
||||||
|
|
||||||
for p in pat:
|
for p in pat:
|
||||||
s.append(" %2.2f %2.0f" % (1+(p.offset/float(gbl.BperQ)),
|
s=[]
|
||||||
|
s.append("%.2f %.0f" % (1+(p.offset/float(gbl.BperQ)),
|
||||||
p.duration))
|
p.duration))
|
||||||
|
|
||||||
if self.vtype == 'CHORD':
|
if self.vtype == 'CHORD':
|
||||||
for a in p.vol:
|
for a in p.vol:
|
||||||
s.append( " %2.0f" % a)
|
s.append( "%.0f" % a)
|
||||||
|
|
||||||
elif self.vtype == 'BASS':
|
elif self.vtype == 'BASS':
|
||||||
f=str(p.noteoffset+1)
|
f=str(p.noteoffset+1)
|
||||||
|
@ -1601,21 +1701,20 @@ class PC:
|
||||||
elif p.addoctave < 0:
|
elif p.addoctave < 0:
|
||||||
f+="-" * (p.addoctave/-12)
|
f+="-" * (p.addoctave/-12)
|
||||||
|
|
||||||
s.append( " %s %2.0f" % (f, p.vol ) )
|
s.append( "%s %.0f" % (f, p.vol ) )
|
||||||
|
|
||||||
elif self.vtype == 'ARPEGGIO':
|
elif self.vtype == 'ARPEGGIO':
|
||||||
s.append( " %2.0f " % p.vol )
|
s.append( "%.0f " % p.vol )
|
||||||
|
|
||||||
elif self.vtype == 'DRUM':
|
elif self.vtype == 'DRUM':
|
||||||
s.append(" %2.0f" % p.vol)
|
s.append("%.0f" % p.vol)
|
||||||
|
|
||||||
elif self.vtype == 'WALK':
|
elif self.vtype == 'WALK':
|
||||||
s.append(" %2.0f" % p.vol )
|
s.append("%.0f" % p.vol )
|
||||||
|
|
||||||
s.append(' ;')
|
pp.append(' '.join(s))
|
||||||
s.append('\n')
|
|
||||||
s[-2]=' '
|
return "; ".join(pp)
|
||||||
print "".join(s)
|
|
||||||
|
|
||||||
|
|
||||||
def insertVoice(self):
|
def insertVoice(self):
|
||||||
|
@ -1624,13 +1723,13 @@ class PC:
|
||||||
sc = gbl.seqCount
|
sc = gbl.seqCount
|
||||||
|
|
||||||
""" 1st pass for MIDIVOICE. There's a separate slot for
|
""" 1st pass for MIDIVOICE. There's a separate slot for
|
||||||
each bar in the sequence, plus the data can be sent
|
each bar in the sequence, plus the data can be sent
|
||||||
before or after 'voice' commands. This first loop
|
before or after 'voice' commands. This first loop
|
||||||
sends MIDIVOICE data with an offset of 0. Note, we
|
sends MIDIVOICE data with an offset of 0. Note, we
|
||||||
don't set the value for 'self.smidiVoice' until we
|
don't set the value for 'self.smidiVoice' until we
|
||||||
do this again, later. All this is needed since some
|
do this again, later. All this is needed since some
|
||||||
MIDIVOICE commands NEED to be sent BEFORE voice selection,
|
MIDIVOICE commands NEED to be sent BEFORE voice selection,
|
||||||
and others AFTER.
|
and others AFTER.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if self.midiVoice:
|
if self.midiVoice:
|
||||||
|
@ -1644,18 +1743,20 @@ class PC:
|
||||||
|
|
||||||
v=self.voice[sc]
|
v=self.voice[sc]
|
||||||
if v != self.ssvoice:
|
if v != self.ssvoice:
|
||||||
gbl.mtrks[self.channel].addProgChange( gbl.tickOffset, v)
|
|
||||||
|
gbl.mtrks[self.channel].addProgChange( gbl.tickOffset, v, self.ssvoice)
|
||||||
self.ssvoice = v
|
self.ssvoice = v
|
||||||
|
|
||||||
# Mark ssvoice also in shared tracks
|
# Mark ssvoice also in shared tracks
|
||||||
|
|
||||||
for a in gbl.midiAssigns[self.channel]:
|
for a in gbl.midiAssigns[self.channel]:
|
||||||
if gbl.tnames.has_key(a):
|
try:
|
||||||
gbl.tnames[a].ssvoice = v
|
gbl.tnames[a].ssvoice = v
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
if gbl.debug:
|
if gbl.debug:
|
||||||
print "Track %s Voice %s inserted" \
|
print "Track %s Voice %s inserted" % (self.name,MMA.midiC.valueToInst(v) )
|
||||||
% (self.name, MMA.midiC.valueToInst(v) )
|
|
||||||
|
|
||||||
""" Our 2nd stab at MIDIVOICE. This time any sequences
|
""" Our 2nd stab at MIDIVOICE. This time any sequences
|
||||||
with offsets >0 are sent. AND the smidiVoice and midiSent
|
with offsets >0 are sent. AND the smidiVoice and midiSent
|
||||||
|
@ -1685,6 +1786,10 @@ class PC:
|
||||||
|
|
||||||
if self.futureVols:
|
if self.futureVols:
|
||||||
self.volume = seqBump([self.futureVols.pop(0)])
|
self.volume = seqBump([self.futureVols.pop(0)])
|
||||||
|
if self.futureVols:
|
||||||
|
self.nextVolume = self.futureVols[0]
|
||||||
|
else:
|
||||||
|
self.nextVolume = None
|
||||||
|
|
||||||
# If track is off don't do anything else.
|
# If track is off don't do anything else.
|
||||||
|
|
||||||
|
@ -1702,12 +1807,7 @@ class PC:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if self.seqRnd:
|
if self.seqRnd:
|
||||||
tmp = []
|
self.seq = MMA.seqrnd.getrndseq(self.seqRndWeight)
|
||||||
for x, i in enumerate(self.seqRndWeight):
|
|
||||||
tmp.extend([x] * i)
|
|
||||||
if not len(tmp):
|
|
||||||
error("SeqRndWeight has generated an empty list")
|
|
||||||
self.seq = random.choice(tmp)
|
|
||||||
else:
|
else:
|
||||||
self.seq = gbl.seqCount
|
self.seq = gbl.seqCount
|
||||||
|
|
||||||
|
@ -1717,7 +1817,6 @@ class PC:
|
||||||
|
|
||||||
if self.riff:
|
if self.riff:
|
||||||
pattern = self.riff.pop(0)
|
pattern = self.riff.pop(0)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
pattern = self.sequence[sc]
|
pattern = self.sequence[sc]
|
||||||
|
|
||||||
|
@ -1816,11 +1915,25 @@ class PC:
|
||||||
a1 = self.volume[sc]
|
a1 = self.volume[sc]
|
||||||
if not a1:
|
if not a1:
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
if self.nextVolume: # inter-bar cresc adjust
|
||||||
|
bt=beat
|
||||||
|
if bt<1: # might have negative offsets, cres code ignores
|
||||||
|
bt=0
|
||||||
|
a1 += (self.nextVolume - a1) * bt / (gbl.BperQ * gbl.QperBar)
|
||||||
|
|
||||||
a1 *= MMA.volume.vTRatio
|
a1 *= MMA.volume.vTRatio
|
||||||
|
|
||||||
a2 = MMA.volume.volume
|
a2 = MMA.volume.volume
|
||||||
if not a2:
|
if not a2:
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
if MMA.volume.nextVolume: # inter-bar cresc adjust
|
||||||
|
bt=beat
|
||||||
|
if bt<1: # might have negative offsets, cres code ignores
|
||||||
|
bt=0
|
||||||
|
a2 += (MMA.volume.nextVolume - a2) * bt / (gbl.BperQ * gbl.QperBar)
|
||||||
|
|
||||||
a2 *= MMA.volume.vMRatio
|
a2 *= MMA.volume.vMRatio
|
||||||
|
|
||||||
v *= ( a1 + a2 )
|
v *= ( a1 + a2 )
|
||||||
|
@ -1895,12 +2008,11 @@ class PC:
|
||||||
else:
|
else:
|
||||||
note = None
|
note = None
|
||||||
|
|
||||||
|
|
||||||
v=stof(v, "Value for %s bar offset must be integer/float" % self.name)
|
v=stof(v, "Value for %s bar offset must be integer/float" % self.name)
|
||||||
v = (v-1) * gbl.BperQ
|
v = (v-1) * gbl.BperQ
|
||||||
|
|
||||||
if note:
|
if note:
|
||||||
v += getNoteLen(note) * sign
|
v += MMA.notelen.getNoteLen(note) * sign
|
||||||
|
|
||||||
if v < 0:
|
if v < 0:
|
||||||
if v<-gbl.BperQ:
|
if v<-gbl.BperQ:
|
||||||
|
@ -1938,7 +2050,7 @@ class PC:
|
||||||
|
|
||||||
if not velocity:
|
if not velocity:
|
||||||
return
|
return
|
||||||
|
|
||||||
sc = self.seq
|
sc = self.seq
|
||||||
|
|
||||||
rptr = self.mallet
|
rptr = self.mallet
|
||||||
|
|
|
@ -23,15 +23,15 @@ Bob van der Poel <bob@mellowood.ca>
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import random
|
||||||
|
|
||||||
|
import MMA.notelen
|
||||||
|
import MMA.harmony
|
||||||
|
|
||||||
import gbl
|
import gbl
|
||||||
from MMA.notelen import getNoteLen
|
|
||||||
from MMA.common import *
|
from MMA.common import *
|
||||||
from MMA.harmony import harmonize
|
from MMA.pat import PC
|
||||||
from MMA.pat import PC, seqBump
|
|
||||||
|
|
||||||
import random
|
|
||||||
|
|
||||||
class Aria(PC):
|
class Aria(PC):
|
||||||
""" Pattern class for an aria (auto-melody) track. """
|
""" Pattern class for an aria (auto-melody) track. """
|
||||||
|
@ -70,7 +70,7 @@ class Aria(PC):
|
||||||
a = struct()
|
a = struct()
|
||||||
|
|
||||||
a.offset = self.setBarOffset(ev[0])
|
a.offset = self.setBarOffset(ev[0])
|
||||||
a.duration = getNoteLen( ev[1] )
|
a.duration = MMA.notelen.getNoteLen( ev[1] )
|
||||||
a.vol = stoi(ev[2], "Note volume in Aria definition not int")
|
a.vol = stoi(ev[2], "Note volume in Aria definition not int")
|
||||||
|
|
||||||
return a
|
return a
|
||||||
|
@ -79,7 +79,7 @@ class Aria(PC):
|
||||||
def setScaletype(self, ln):
|
def setScaletype(self, ln):
|
||||||
""" Set scale type. """
|
""" Set scale type. """
|
||||||
|
|
||||||
ln = self.lnExpand(ln, "ScaleType")
|
ln = lnExpand(ln, "%s ScaleType" % self.name)
|
||||||
tmp = []
|
tmp = []
|
||||||
|
|
||||||
for n in ln:
|
for n in ln:
|
||||||
|
@ -213,7 +213,7 @@ class Aria(PC):
|
||||||
|
|
||||||
|
|
||||||
if self.harmony[sc]:
|
if self.harmony[sc]:
|
||||||
h = harmonize(self.harmony[sc], note, ct.chord.noteList)
|
h = MMA.harmony.harmonize(self.harmony[sc], note, ct.chord.noteList)
|
||||||
for n in h:
|
for n in h:
|
||||||
self.sendNote(
|
self.sendNote(
|
||||||
p.offset,
|
p.offset,
|
||||||
|
|
|
@ -25,14 +25,13 @@ Bob van der Poel <bob@mellowood.ca>
|
||||||
|
|
||||||
import random
|
import random
|
||||||
|
|
||||||
|
import MMA.notelen
|
||||||
|
import MMA.harmony
|
||||||
|
|
||||||
import gbl
|
import gbl
|
||||||
from MMA.notelen import getNoteLen
|
|
||||||
from MMA.common import *
|
from MMA.common import *
|
||||||
from MMA.harmony import harmonize
|
|
||||||
from MMA.pat import PC
|
from MMA.pat import PC
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Arpeggio(PC):
|
class Arpeggio(PC):
|
||||||
""" Pattern class for an arpeggio track. """
|
""" Pattern class for an arpeggio track. """
|
||||||
|
|
||||||
|
@ -52,7 +51,7 @@ class Arpeggio(PC):
|
||||||
"for apreggio define, not '%s'" % ' '.join(ev) )
|
"for apreggio define, not '%s'" % ' '.join(ev) )
|
||||||
|
|
||||||
a.offset = self.setBarOffset(ev[0])
|
a.offset = self.setBarOffset(ev[0])
|
||||||
a.duration = getNoteLen(ev[1])
|
a.duration = MMA.notelen.getNoteLen(ev[1])
|
||||||
a.vol = stoi(ev[2], "Type error in Arpeggio definition")
|
a.vol = stoi(ev[2], "Type error in Arpeggio definition")
|
||||||
|
|
||||||
return a
|
return a
|
||||||
|
@ -147,7 +146,7 @@ class Arpeggio(PC):
|
||||||
|
|
||||||
|
|
||||||
if self.harmony[sc]:
|
if self.harmony[sc]:
|
||||||
h = harmonize(self.harmony[sc], note, ourChord)
|
h = MMA.harmony.harmonize(self.harmony[sc], note, ourChord)
|
||||||
for n in h:
|
for n in h:
|
||||||
self.sendNote(
|
self.sendNote(
|
||||||
p.offset,
|
p.offset,
|
||||||
|
|
|
@ -24,11 +24,11 @@ Bob van der Poel <bob@mellowood.ca>
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
import MMA.notelen
|
||||||
|
import MMA.harmony
|
||||||
|
|
||||||
import gbl
|
import gbl
|
||||||
from MMA.notelen import getNoteLen
|
|
||||||
from MMA.common import *
|
from MMA.common import *
|
||||||
from MMA.harmony import harmonize
|
|
||||||
from MMA.pat import PC
|
from MMA.pat import PC
|
||||||
|
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ class Bass(PC):
|
||||||
a = struct()
|
a = struct()
|
||||||
|
|
||||||
a.offset = self.setBarOffset(ev[0])
|
a.offset = self.setBarOffset(ev[0])
|
||||||
a.duration = getNoteLen( ev[1] )
|
a.duration = MMA.notelen.getNoteLen( ev[1] )
|
||||||
|
|
||||||
offset = ev[2]
|
offset = ev[2]
|
||||||
n=offset[0]
|
n=offset[0]
|
||||||
|
@ -119,7 +119,7 @@ class Bass(PC):
|
||||||
|
|
||||||
|
|
||||||
if self.harmony[sc]:
|
if self.harmony[sc]:
|
||||||
h = harmonize(self.harmony[sc], note, ct.chord.noteList)
|
h = MMA.harmony.harmonize(self.harmony[sc], note, ct.chord.noteList)
|
||||||
for n in h:
|
for n in h:
|
||||||
self.sendNote(
|
self.sendNote(
|
||||||
p.offset,
|
p.offset,
|
||||||
|
|
|
@ -26,10 +26,12 @@ Bob van der Poel <bob@mellowood.ca>
|
||||||
|
|
||||||
import random
|
import random
|
||||||
|
|
||||||
|
|
||||||
|
import MMA.notelen
|
||||||
|
|
||||||
import gbl
|
import gbl
|
||||||
from MMA.notelen import getNoteLen
|
|
||||||
from MMA.common import *
|
from MMA.common import *
|
||||||
from MMA.pat import PC, seqBump
|
from MMA.pat import PC
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -136,7 +138,7 @@ class Chord(PC):
|
||||||
""" set/unset root duplication. Only for CHORDs """
|
""" set/unset root duplication. Only for CHORDs """
|
||||||
|
|
||||||
|
|
||||||
ln=self.lnExpand(ln, 'DupRoot')
|
ln = lnExpand(ln, '%s DupRoot' % self.name)
|
||||||
tmp = []
|
tmp = []
|
||||||
|
|
||||||
for n in ln:
|
for n in ln:
|
||||||
|
@ -157,7 +159,7 @@ class Chord(PC):
|
||||||
def setStrum(self, ln):
|
def setStrum(self, ln):
|
||||||
""" Set Strum time. """
|
""" Set Strum time. """
|
||||||
|
|
||||||
ln=self.lnExpand(ln, 'Strum')
|
ln = lnExpand(ln, '%s Strum' % self.name)
|
||||||
tmp = []
|
tmp = []
|
||||||
|
|
||||||
for n in ln:
|
for n in ln:
|
||||||
|
@ -187,7 +189,7 @@ class Chord(PC):
|
||||||
a = struct()
|
a = struct()
|
||||||
|
|
||||||
a.offset = self.setBarOffset(ev[0])
|
a.offset = self.setBarOffset(ev[0])
|
||||||
a.duration = getNoteLen(ev[1])
|
a.duration = MMA.notelen.getNoteLen(ev[1])
|
||||||
|
|
||||||
vv = ev[2:]
|
vv = ev[2:]
|
||||||
if len(vv)>8:
|
if len(vv)>8:
|
||||||
|
@ -401,4 +403,3 @@ class Chord(PC):
|
||||||
self.voicing.bcount -= 1
|
self.voicing.bcount -= 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -23,12 +23,12 @@ Bob van der Poel <bob@mellowood.ca>
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import MMA.notelen
|
||||||
|
import MMA.translate
|
||||||
|
|
||||||
import gbl
|
import gbl
|
||||||
from MMA.common import *
|
from MMA.common import *
|
||||||
from MMA.notelen import getNoteLen
|
from MMA.pat import PC
|
||||||
import MMA.translate
|
|
||||||
from MMA.pat import PC, seqBump
|
|
||||||
|
|
||||||
|
|
||||||
class Drum(PC):
|
class Drum(PC):
|
||||||
""" Pattern class for a drum track. """
|
""" Pattern class for a drum track. """
|
||||||
|
@ -51,7 +51,7 @@ class Drum(PC):
|
||||||
ln[] is not nesc. the right length.
|
ln[] is not nesc. the right length.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
ln=self.lnExpand(ln, 'Tone')
|
ln = lnExpand(ln, '%s Tone' % self.name)
|
||||||
tmp = []
|
tmp = []
|
||||||
|
|
||||||
for n in ln:
|
for n in ln:
|
||||||
|
@ -77,7 +77,7 @@ class Drum(PC):
|
||||||
a = struct()
|
a = struct()
|
||||||
|
|
||||||
a.offset = self.setBarOffset(ev[0])
|
a.offset = self.setBarOffset(ev[0])
|
||||||
a.duration = getNoteLen(ev[1])
|
a.duration = MMA.notelen.getNoteLen(ev[1])
|
||||||
a.vol = stoi(ev[2], "Type error in Drum volume")
|
a.vol = stoi(ev[2], "Type error in Drum volume")
|
||||||
|
|
||||||
return a
|
return a
|
||||||
|
|
|
@ -25,12 +25,12 @@ Bob van der Poel <bob@mellowood.ca>
|
||||||
|
|
||||||
import random
|
import random
|
||||||
|
|
||||||
from MMA.harmony import harmonize
|
import MMA.harmony
|
||||||
from MMA.notelen import getNoteLen
|
import MMA.notelen
|
||||||
|
from MMA.pat import PC
|
||||||
|
|
||||||
import gbl
|
import gbl
|
||||||
from MMA.common import *
|
from MMA.common import *
|
||||||
from MMA.pat import PC, seqBump
|
|
||||||
|
|
||||||
|
|
||||||
class Scale(PC):
|
class Scale(PC):
|
||||||
""" Pattern class for a Scale track. """
|
""" Pattern class for a Scale track. """
|
||||||
|
@ -60,7 +60,7 @@ class Scale(PC):
|
||||||
a = struct()
|
a = struct()
|
||||||
|
|
||||||
a.offset = self.setBarOffset(ev[0])
|
a.offset = self.setBarOffset(ev[0])
|
||||||
a.duration = getNoteLen(ev[1])
|
a.duration = MMA.notelen.getNoteLen(ev[1])
|
||||||
a.vol = stoi(ev[2], "Type error in Scale definition")
|
a.vol = stoi(ev[2], "Type error in Scale definition")
|
||||||
|
|
||||||
|
|
||||||
|
@ -69,7 +69,7 @@ class Scale(PC):
|
||||||
def setScaletype(self, ln):
|
def setScaletype(self, ln):
|
||||||
""" Set scale type. """
|
""" Set scale type. """
|
||||||
|
|
||||||
ln = self.lnExpand(ln, "ScaleType")
|
ln = lnExpand(ln, "%s ScaleType" % self.name)
|
||||||
tmp = []
|
tmp = []
|
||||||
|
|
||||||
for n in ln:
|
for n in ln:
|
||||||
|
@ -220,7 +220,7 @@ class Scale(PC):
|
||||||
|
|
||||||
if self.harmony[sc]:
|
if self.harmony[sc]:
|
||||||
ch = self.getChordInPos(p.offset, ctable).chord.noteList
|
ch = self.getChordInPos(p.offset, ctable).chord.noteList
|
||||||
h = harmonize(self.harmony[sc], note, ch)
|
h = MMA.harmony.harmonize(self.harmony[sc], note, ch)
|
||||||
for n in h:
|
for n in h:
|
||||||
self.sendNote(
|
self.sendNote(
|
||||||
p.offset,
|
p.offset,
|
||||||
|
|
|
@ -23,14 +23,16 @@ Bob van der Poel <bob@mellowood.ca>
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import MMA.notelen
|
||||||
|
import MMA.translate
|
||||||
|
import MMA.harmony
|
||||||
|
import MMA.volume
|
||||||
|
import MMA.alloc
|
||||||
|
|
||||||
import gbl
|
import gbl
|
||||||
from MMA.common import *
|
from MMA.common import *
|
||||||
from MMA.notelen import getNoteLen
|
|
||||||
import MMA.translate
|
|
||||||
from MMA.harmony import harmonize
|
|
||||||
from MMA.pat import PC
|
from MMA.pat import PC
|
||||||
import MMA.alloc
|
|
||||||
import MMA.volume
|
|
||||||
|
|
||||||
|
|
||||||
class NoteList:
|
class NoteList:
|
||||||
|
@ -79,9 +81,10 @@ class Melody(PC):
|
||||||
|
|
||||||
if len(ln) > 1:
|
if len(ln) > 1:
|
||||||
error("Only 1 value permitted for Drum Tone in Solo tracks")
|
error("Only 1 value permitted for Drum Tone in Solo tracks")
|
||||||
|
|
||||||
|
|
||||||
self.drumTone = MMA.translate.dtable.get(ln[0])
|
self.drumTone = MMA.translate.dtable.get(ln[0])
|
||||||
|
|
||||||
|
|
||||||
def getLine(self, pat, ctable):
|
def getLine(self, pat, ctable):
|
||||||
""" Extract a melodyline for solo/melody tracks.
|
""" Extract a melodyline for solo/melody tracks.
|
||||||
|
@ -128,25 +131,25 @@ class Melody(PC):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if gbl.swingMode:
|
if gbl.swingMode:
|
||||||
len8 = getNoteLen('8')
|
len8 = MMA.notelen.getNoteLen('8')
|
||||||
len81 = getNoteLen('81')
|
len81 = MMA.notelen.getNoteLen('81')
|
||||||
len82 = getNoteLen('82')
|
len82 = MMA.notelen.getNoteLen('82')
|
||||||
onBeats = [ x * gbl.BperQ for x in range(gbl.QperBar)]
|
onBeats = [ x * gbl.BperQ for x in range(gbl.QperBar)]
|
||||||
offBeats = [ (x * gbl.BperQ + len8) for x in range(gbl.QperBar)]
|
offBeats = [ (x * gbl.BperQ + len8) for x in range(gbl.QperBar)]
|
||||||
|
|
||||||
|
|
||||||
length = getNoteLen('4') # default note length
|
length = MMA.notelen.getNoteLen('4') # default note length
|
||||||
lastc = '' # last parsed note
|
lastc = '' # last parsed note
|
||||||
velocity = 90 # intial/default velocity for solo notes
|
velocity = 90 # intial/default velocity for solo notes
|
||||||
|
|
||||||
notes={} # A dict of NoteList, keys == offset
|
notes={} # A dict of NoteList, keys == offset
|
||||||
|
|
||||||
if self.drumType:
|
if self.drumType:
|
||||||
isdrum = 1
|
isdrum = 1
|
||||||
lastc = str(self.drumTone)
|
lastc = str(self.drumTone)
|
||||||
else:
|
else:
|
||||||
isdrum = None
|
isdrum = None
|
||||||
|
|
||||||
pat = pat.replace(' ', '').split(';')[:-1]
|
pat = pat.replace(' ', '').split(';')[:-1]
|
||||||
|
|
||||||
# set initial offset into bar
|
# set initial offset into bar
|
||||||
|
@ -206,7 +209,7 @@ class Melody(PC):
|
||||||
i+=1
|
i+=1
|
||||||
|
|
||||||
if i:
|
if i:
|
||||||
l=getNoteLen(a[0:i])
|
l=MMA.notelen.getNoteLen(a[0:i])
|
||||||
c=a[i:]
|
c=a[i:]
|
||||||
else:
|
else:
|
||||||
l=length
|
l=length
|
||||||
|
@ -220,7 +223,6 @@ class Melody(PC):
|
||||||
length = l # set defaults for next loop
|
length = l # set defaults for next loop
|
||||||
lastc = c
|
lastc = c
|
||||||
|
|
||||||
|
|
||||||
""" Convert the note part into a series of midi values
|
""" Convert the note part into a series of midi values
|
||||||
Notes can be a single note, or a series of notes. And
|
Notes can be a single note, or a series of notes. And
|
||||||
each note can be a letter a-g (or r), a '#,&,n' plus
|
each note can be a letter a-g (or r), a '#,&,n' plus
|
||||||
|
@ -286,7 +288,7 @@ class Melody(PC):
|
||||||
elif name == '*':
|
elif name == '*':
|
||||||
v = self.drumTone
|
v = self.drumTone
|
||||||
else:
|
else:
|
||||||
v = MMA.translate.dtable.get(name)
|
v = int(MMA.translate.dtable.get(name))
|
||||||
|
|
||||||
|
|
||||||
""" Swingmode -- This tests for successive 8ths on/off beat
|
""" Swingmode -- This tests for successive 8ths on/off beat
|
||||||
|
@ -310,7 +312,7 @@ class Melody(PC):
|
||||||
notes[offset] = NoteList(l)
|
notes[offset] = NoteList(l)
|
||||||
|
|
||||||
# add note event to note[] array
|
# add note event to note[] array
|
||||||
|
|
||||||
notes[offset].nl.append(v)
|
notes[offset].nl.append(v)
|
||||||
notes[offset].velocity.append(self.adjustVolume(velocity, offset))
|
notes[offset].velocity.append(self.adjustVolume(velocity, offset))
|
||||||
|
|
||||||
|
@ -336,7 +338,7 @@ class Melody(PC):
|
||||||
|
|
||||||
def addHarmony(self, notes, ctable):
|
def addHarmony(self, notes, ctable):
|
||||||
""" Add harmony to solo notes. """
|
""" Add harmony to solo notes. """
|
||||||
|
|
||||||
sc=self.seq
|
sc=self.seq
|
||||||
|
|
||||||
harmony = self.harmony[sc]
|
harmony = self.harmony[sc]
|
||||||
|
@ -352,7 +354,7 @@ class Melody(PC):
|
||||||
if tb.chordZ:
|
if tb.chordZ:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
h = harmonize(harmony, nn.nl[0], tb.chord.bnoteList)
|
h = MMA.harmony.harmonize(harmony, nn.nl[0], tb.chord.bnoteList)
|
||||||
|
|
||||||
""" If harmonyonly set then drop note, substitute harmony,
|
""" If harmonyonly set then drop note, substitute harmony,
|
||||||
else append harmony notes to chord.
|
else append harmony notes to chord.
|
||||||
|
@ -622,7 +624,7 @@ def extractSolo(ln, rptcount):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
for t in autoSoloTracks[1:]:
|
for t in autoSoloTracks[1:]:
|
||||||
if gbl.tnames.has_key(t) and gbl.tnames[t].riff == [] \
|
if t in gbl.tnames and gbl.tnames[t].riff == [] \
|
||||||
and max(gbl.tnames[t].harmonyOnly):
|
and max(gbl.tnames[t].harmonyOnly):
|
||||||
gbl.tnames[t].setRiff( firstSolo[:] )
|
gbl.tnames[t].setRiff( firstSolo[:] )
|
||||||
|
|
||||||
|
|
|
@ -26,13 +26,14 @@ Bob van der Poel <bob@mellowood.ca>
|
||||||
|
|
||||||
import random
|
import random
|
||||||
|
|
||||||
from MMA.harmony import harmonize
|
|
||||||
from MMA.notelen import getNoteLen
|
import MMA.harmony
|
||||||
|
import MMA.notelen
|
||||||
|
|
||||||
import gbl
|
import gbl
|
||||||
from MMA.common import *
|
from MMA.common import *
|
||||||
from MMA.pat import PC
|
from MMA.pat import PC
|
||||||
|
|
||||||
|
|
||||||
class Walk(PC):
|
class Walk(PC):
|
||||||
""" Pattern class for a walking bass track. """
|
""" Pattern class for a walking bass track. """
|
||||||
|
|
||||||
|
@ -52,7 +53,7 @@ class Walk(PC):
|
||||||
a = struct()
|
a = struct()
|
||||||
|
|
||||||
a.offset = self.setBarOffset(ev[0])
|
a.offset = self.setBarOffset(ev[0])
|
||||||
a.duration = getNoteLen(ev[1])
|
a.duration = MMA.notelen.getNoteLen(ev[1])
|
||||||
a.vol = stoi(ev[2], "Type error in Walking Bass definition")
|
a.vol = stoi(ev[2], "Type error in Walking Bass definition")
|
||||||
|
|
||||||
return a
|
return a
|
||||||
|
@ -152,7 +153,7 @@ class Walk(PC):
|
||||||
|
|
||||||
if self.harmony[sc]:
|
if self.harmony[sc]:
|
||||||
ch = self.getChordInPos(p.offset, ctable).chord.noteList
|
ch = self.getChordInPos(p.offset, ctable).chord.noteList
|
||||||
h = harmonize(self.harmony[sc], note, ch)
|
h = MMA.harmony.harmonize(self.harmony[sc], note, ch)
|
||||||
for n in h:
|
for n in h:
|
||||||
self.sendNote(
|
self.sendNote(
|
||||||
p.offset,
|
p.offset,
|
||||||
|
|
148
mma/MMA/patch.py
Normal file
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 MMA.midiC
|
||||||
|
|
||||||
|
import gbl
|
||||||
from MMA.common import *
|
from MMA.common import *
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
""" Translation table for VOICE. This is ONLY used when a voice is set
|
""" Translation table for VOICE. This is ONLY used when a voice is set
|
||||||
from the VOICE command. If a translation exists the translation is
|
from the VOICE command. If a translation exists the translation is
|
||||||
substituted.
|
substituted.
|
||||||
|
@ -78,10 +80,9 @@ class Vtable:
|
||||||
""" Return a translation or original. """
|
""" Return a translation or original. """
|
||||||
|
|
||||||
name=name.upper()
|
name=name.upper()
|
||||||
if self.table.has_key(name):
|
try:
|
||||||
return self.table[name]
|
return self.table[name]
|
||||||
|
except KeyError:
|
||||||
else:
|
|
||||||
return name
|
return name
|
||||||
|
|
||||||
vtable=Vtable() # Create single class instance.
|
vtable=Vtable() # Create single class instance.
|
||||||
|
@ -123,24 +124,32 @@ class Dtable:
|
||||||
error("Each translation pair must be in the format Voice=Alias")
|
error("Each translation pair must be in the format Voice=Alias")
|
||||||
v,a = l.split('=')
|
v,a = l.split('=')
|
||||||
|
|
||||||
v=MMA.midiC.drumToValue(v)
|
v1=MMA.midiC.drumToValue(v)
|
||||||
a=MMA.midiC.drumToValue(a)
|
if v1<0:
|
||||||
|
error("Drum Tone '%s' not defined." % v)
|
||||||
|
a1=MMA.midiC.drumToValue(a)
|
||||||
|
if a1<0:
|
||||||
|
error("Drum Tone '%s' not defined." % a)
|
||||||
|
|
||||||
self.table[v] = a
|
self.table[v1] = a1
|
||||||
if gbl.debug:
|
if gbl.debug:
|
||||||
print "DrumTone Translation: %s=%s" % \
|
print "DrumTone Translation: %s=%s" % \
|
||||||
(MMA.midiC.valueToDrum(v), MMA.midiC.valueToDrum(a))
|
(MMA.midiC.valueToDrum(v), MMA.midiC.valueToDrum(a))
|
||||||
|
|
||||||
|
|
||||||
def get(self, name):
|
def get(self, name):
|
||||||
""" Return a translation or original. """
|
""" Return a translation or original. Note that this also does
|
||||||
|
validation of 'name'. It is called from patDrum and patSolo.
|
||||||
|
"""
|
||||||
|
|
||||||
v=MMA.midiC.drumToValue(name)
|
v=MMA.midiC.drumToValue(name)
|
||||||
|
|
||||||
|
if v<0:
|
||||||
|
error("Drum Tone '%s' not defined." % name)
|
||||||
|
|
||||||
if self.table.has_key(v):
|
try:
|
||||||
return self.table[v]
|
return self.table[v]
|
||||||
|
except KeyError:
|
||||||
else:
|
|
||||||
return v
|
return v
|
||||||
|
|
||||||
|
|
||||||
|
@ -195,10 +204,10 @@ class VoiceVolTable:
|
||||||
def get(self, v, vol):
|
def get(self, v, vol):
|
||||||
""" Return an adjusted value or original. """
|
""" Return an adjusted value or original. """
|
||||||
|
|
||||||
if self.table.has_key(v):
|
try:
|
||||||
vol = int(vol * self.table[v])
|
vol = int(vol * self.table[v])
|
||||||
|
except KeyError:
|
||||||
return vol
|
return vol
|
||||||
|
|
||||||
|
|
||||||
voiceVolTable=VoiceVolTable()
|
voiceVolTable=VoiceVolTable()
|
||||||
|
@ -245,10 +254,10 @@ class DrumVolTable:
|
||||||
def get(self, v, vol):
|
def get(self, v, vol):
|
||||||
""" Return an adjusted value or original. """
|
""" Return an adjusted value or original. """
|
||||||
|
|
||||||
if self.table.has_key(v):
|
try:
|
||||||
vol = int(vol * self.table[v])
|
vol = int(vol * self.table[v])
|
||||||
|
except KeyError:
|
||||||
return vol
|
return vol
|
||||||
|
|
||||||
|
|
||||||
drumVolTable=DrumVolTable()
|
drumVolTable=DrumVolTable()
|
||||||
|
|
|
@ -42,6 +42,9 @@ vols={ 'OFF': 0.00, 'PPPP': 0.05, 'PPP': 0.10,
|
||||||
'FF': 1.60, 'FFF': 1.80, 'FFFF': 2.00 }
|
'FF': 1.60, 'FFF': 1.80, 'FFFF': 2.00 }
|
||||||
|
|
||||||
volume = vols['M'] # default global volume
|
volume = vols['M'] # default global volume
|
||||||
|
nextVolume = None # main parser sets this to the next volume
|
||||||
|
# when future volumes are stacked. It's used
|
||||||
|
# by the volume adjust to smooth out (de)crescendos.
|
||||||
lastVolume = volume
|
lastVolume = volume
|
||||||
futureVol = []
|
futureVol = []
|
||||||
vTRatio = .6
|
vTRatio = .6
|
||||||
|
@ -141,14 +144,56 @@ def setVolume(ln):
|
||||||
print "Volume: %s%%" % volume
|
print "Volume: %s%%" % volume
|
||||||
|
|
||||||
|
|
||||||
# The next 2 are called from the parser.
|
# The next 3 are called from the parser.
|
||||||
|
|
||||||
|
|
||||||
def setCresc(ln):
|
def setCresc(ln):
|
||||||
|
""" Master Crescendo. """
|
||||||
|
|
||||||
setCrescendo(1, ln)
|
setCrescendo(1, ln)
|
||||||
|
|
||||||
def setDecresc(ln):
|
def setDecresc(ln):
|
||||||
|
""" Master Decrescendo (Diminuendo). """
|
||||||
setCrescendo(-1, ln)
|
setCrescendo(-1, ln)
|
||||||
|
|
||||||
|
def setSwell(ln):
|
||||||
|
""" Set a swell (cresc<>decresc). """
|
||||||
|
|
||||||
|
global futureVol, volume, lastVolume
|
||||||
|
|
||||||
|
lastVolume = volume
|
||||||
|
|
||||||
|
if len(ln) == 3: # 3 args, 1st is intial setting
|
||||||
|
setVolume([ln[0]])
|
||||||
|
ln=ln[1:]
|
||||||
|
|
||||||
|
if len(ln) != 2:
|
||||||
|
error("Swell expecting 2 or 3 args.")
|
||||||
|
|
||||||
|
count = stoi(ln[1])
|
||||||
|
if count < 2:
|
||||||
|
error("Swell bar count must be 2 or greater.")
|
||||||
|
|
||||||
|
if count % 2:
|
||||||
|
c=(count+1)/2
|
||||||
|
offset=1
|
||||||
|
else:
|
||||||
|
c=count/2
|
||||||
|
offset=0
|
||||||
|
|
||||||
|
c=str(c)
|
||||||
|
|
||||||
|
futureVol = fvolume(0, volume, [ ln[0], c ] )
|
||||||
|
futureVol.extend(fvolume(0, futureVol[-1],
|
||||||
|
[str(int(volume*100)), c ])[offset:])
|
||||||
|
|
||||||
|
|
||||||
|
if gbl.debug:
|
||||||
|
print "Set Swell to:",
|
||||||
|
for a in futureVol:
|
||||||
|
print int(a*100),
|
||||||
|
print
|
||||||
|
|
||||||
|
|
||||||
def setCrescendo(dir, ln):
|
def setCrescendo(dir, ln):
|
||||||
""" Combined (de)cresc() """
|
""" Combined (de)cresc() """
|
||||||
|
@ -165,7 +210,14 @@ def setCrescendo(dir, ln):
|
||||||
ln=ln[1:]
|
ln=ln[1:]
|
||||||
|
|
||||||
futureVol = fvolume(dir, volume, ln)
|
futureVol = fvolume(dir, volume, ln)
|
||||||
|
|
||||||
|
if gbl.debug:
|
||||||
|
print "Set (De)Cresc to:",
|
||||||
|
for a in futureVol:
|
||||||
|
print int(a*100),
|
||||||
|
print
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Used by both the 2 funcs above and from TRACK.setCresc()
|
# Used by both the 2 funcs above and from TRACK.setCresc()
|
||||||
|
|
||||||
|
@ -173,14 +225,17 @@ def fvolume(dir, startvol, ln):
|
||||||
""" Create a list of future vols. Called by (De)Cresc. """
|
""" Create a list of future vols. Called by (De)Cresc. """
|
||||||
|
|
||||||
# Get destination volume
|
# Get destination volume
|
||||||
|
|
||||||
destvol = calcVolume(ln[0], startvol)
|
destvol = calcVolume(ln[0], startvol)
|
||||||
|
|
||||||
bcount = stoi(ln[1], "Type error in bar count for (De)Cresc, '%s'" % ln[1] )
|
bcount = stoi(ln[1], "Type error in bar count for (De)Cresc, '%s'" % ln[1] )
|
||||||
|
|
||||||
if bcount <= 0:
|
if bcount <= 0:
|
||||||
error("Bar count for (De)Cresc must be postive")
|
error("Bar count for (De)Cresc must be postive")
|
||||||
|
|
||||||
|
# Test to see if (de)cresc is contrary to current settings.
|
||||||
|
# Using 'dir' of 0 will bypass this (used by SWELL).
|
||||||
|
|
||||||
if dir > 0 and destvol < startvol:
|
if dir > 0 and destvol < startvol:
|
||||||
warning("Cresc volume less than current setting" )
|
warning("Cresc volume less than current setting" )
|
||||||
|
|
||||||
|
@ -190,17 +245,17 @@ def fvolume(dir, startvol, ln):
|
||||||
elif destvol == startvol:
|
elif destvol == startvol:
|
||||||
warning("(De)Cresc volume equal to current setting" )
|
warning("(De)Cresc volume equal to current setting" )
|
||||||
|
|
||||||
bcount -= 1
|
if bcount> 1:
|
||||||
step = ( destvol-startvol ) / bcount
|
bcount -= 1
|
||||||
|
step = ( destvol-startvol ) / bcount
|
||||||
volList=[startvol]
|
volList=[startvol]
|
||||||
|
|
||||||
for a in range(bcount-1):
|
for a in range(bcount-1):
|
||||||
startvol += step
|
startvol += step
|
||||||
volList.append( startvol)
|
volList.append( startvol)
|
||||||
|
|
||||||
volList.append(destvol)
|
volList.append(destvol)
|
||||||
|
|
||||||
return volList
|
return volList
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -136,6 +136,9 @@ os.system("%s -G" % bin)
|
||||||
print "Setting permissions on MMADIR database file for user update."
|
print "Setting permissions on MMADIR database file for user update."
|
||||||
os.system("chmod a+w " + dest+"/lib/stdlib/.mmaDB")
|
os.system("chmod a+w " + dest+"/lib/stdlib/.mmaDB")
|
||||||
|
|
||||||
|
## man pages
|
||||||
|
|
||||||
|
print "There are some man pages in %s/docs/man that you may wish to install." % dest
|
||||||
|
|
||||||
|
|
||||||
|
print "Install complete. Have fun!"
|
||||||
|
|
|
@ -84,6 +84,7 @@ information from the each library file:
|
||||||
<li> <A Href = stdlib/8beat.html> stdlib/8beat.mma </a> </li>
|
<li> <A Href = stdlib/8beat.html> stdlib/8beat.mma </a> </li>
|
||||||
<li> <A Href = stdlib/ballad.html> stdlib/ballad.mma </a> </li>
|
<li> <A Href = stdlib/ballad.html> stdlib/ballad.mma </a> </li>
|
||||||
<li> <A Href = stdlib/ballad128.html> stdlib/ballad128.mma </a> </li>
|
<li> <A Href = stdlib/ballad128.html> stdlib/ballad128.mma </a> </li>
|
||||||
|
<li> <A Href = stdlib/ballad68.html> stdlib/ballad68.mma </a> </li>
|
||||||
<li> <A Href = stdlib/basicrock.html> stdlib/basicrock.mma </a> </li>
|
<li> <A Href = stdlib/basicrock.html> stdlib/basicrock.mma </a> </li>
|
||||||
<li> <A Href = stdlib/beguine.html> stdlib/beguine.mma </a> </li>
|
<li> <A Href = stdlib/beguine.html> stdlib/beguine.mma </a> </li>
|
||||||
<li> <A Href = stdlib/bigband.html> stdlib/bigband.mma </a> </li>
|
<li> <A Href = stdlib/bigband.html> stdlib/bigband.mma </a> </li>
|
||||||
|
@ -125,15 +126,20 @@ information from the each library file:
|
||||||
<li> <A Href = stdlib/polka.html> stdlib/polka.mma </a> </li>
|
<li> <A Href = stdlib/polka.html> stdlib/polka.mma </a> </li>
|
||||||
<li> <A Href = stdlib/popballad.html> stdlib/popballad.mma </a> </li>
|
<li> <A Href = stdlib/popballad.html> stdlib/popballad.mma </a> </li>
|
||||||
<li> <A Href = stdlib/quickstep.html> stdlib/quickstep.mma </a> </li>
|
<li> <A Href = stdlib/quickstep.html> stdlib/quickstep.mma </a> </li>
|
||||||
|
<li> <A Href = stdlib/rb-ballad.html> stdlib/rb-ballad.mma </a> </li>
|
||||||
<li> <A Href = stdlib/rb.html> stdlib/rb.mma </a> </li>
|
<li> <A Href = stdlib/rb.html> stdlib/rb.mma </a> </li>
|
||||||
<li> <A Href = stdlib/rhumba.html> stdlib/rhumba.mma </a> </li>
|
<li> <A Href = stdlib/rhumba.html> stdlib/rhumba.mma </a> </li>
|
||||||
<li> <A Href = stdlib/rock-128.html> stdlib/rock-128.mma </a> </li>
|
<li> <A Href = stdlib/rock-128.html> stdlib/rock-128.mma </a> </li>
|
||||||
<li> <A Href = stdlib/rockballad.html> stdlib/rockballad.mma </a> </li>
|
<li> <A Href = stdlib/rockballad.html> stdlib/rockballad.mma </a> </li>
|
||||||
|
<li> <A Href = stdlib/rockwaltz.html> stdlib/rockwaltz.mma </a> </li>
|
||||||
|
<li> <A Href = stdlib/salsa.html> stdlib/salsa.mma </a> </li>
|
||||||
<li> <A Href = stdlib/samba.html> stdlib/samba.mma </a> </li>
|
<li> <A Href = stdlib/samba.html> stdlib/samba.mma </a> </li>
|
||||||
|
<li> <A Href = stdlib/showtune.html> stdlib/showtune.mma </a> </li>
|
||||||
<li> <A Href = stdlib/shuffleboggie.html> stdlib/shuffleboggie.mma </a> </li>
|
<li> <A Href = stdlib/shuffleboggie.html> stdlib/shuffleboggie.mma </a> </li>
|
||||||
<li> <A Href = stdlib/ska.html> stdlib/ska.mma </a> </li>
|
<li> <A Href = stdlib/ska.html> stdlib/ska.mma </a> </li>
|
||||||
<li> <A Href = stdlib/slowblues.html> stdlib/slowblues.mma </a> </li>
|
<li> <A Href = stdlib/slowblues.html> stdlib/slowblues.mma </a> </li>
|
||||||
<li> <A Href = stdlib/slowbolero.html> stdlib/slowbolero.mma </a> </li>
|
<li> <A Href = stdlib/slowbolero.html> stdlib/slowbolero.mma </a> </li>
|
||||||
|
<li> <A Href = stdlib/slowbroadway.html> stdlib/slowbroadway.mma </a> </li>
|
||||||
<li> <A Href = stdlib/slowcountry.html> stdlib/slowcountry.mma </a> </li>
|
<li> <A Href = stdlib/slowcountry.html> stdlib/slowcountry.mma </a> </li>
|
||||||
<li> <A Href = stdlib/slowjazz.html> stdlib/slowjazz.mma </a> </li>
|
<li> <A Href = stdlib/slowjazz.html> stdlib/slowjazz.mma </a> </li>
|
||||||
<li> <A Href = stdlib/softrock.html> stdlib/softrock.mma </a> </li>
|
<li> <A Href = stdlib/softrock.html> stdlib/softrock.mma </a> </li>
|
||||||
|
@ -141,6 +147,7 @@ information from the each library file:
|
||||||
<li> <A Href = stdlib/son.html> stdlib/son.mma </a> </li>
|
<li> <A Href = stdlib/son.html> stdlib/son.mma </a> </li>
|
||||||
<li> <A Href = stdlib/swing.html> stdlib/swing.mma </a> </li>
|
<li> <A Href = stdlib/swing.html> stdlib/swing.mma </a> </li>
|
||||||
<li> <A Href = stdlib/tango.html> stdlib/tango.mma </a> </li>
|
<li> <A Href = stdlib/tango.html> stdlib/tango.mma </a> </li>
|
||||||
|
<li> <A Href = stdlib/trance.html> stdlib/trance.mma </a> </li>
|
||||||
<li> <A Href = stdlib/vienesewaltz.html> stdlib/vienesewaltz.mma </a> </li>
|
<li> <A Href = stdlib/vienesewaltz.html> stdlib/vienesewaltz.mma </a> </li>
|
||||||
<li> <A Href = stdlib/waltz.html> stdlib/waltz.mma </a> </li>
|
<li> <A Href = stdlib/waltz.html> stdlib/waltz.mma </a> </li>
|
||||||
<li> <A Href = stdlib/zydeco.html> stdlib/zydeco.mma </a> </li>
|
<li> <A Href = stdlib/zydeco.html> stdlib/zydeco.mma </a> </li>
|
||||||
|
@ -158,6 +165,8 @@ information from the each library file:
|
||||||
<ul>
|
<ul>
|
||||||
<li> <A Href = yamaha/mambo.html> yamaha/mambo.mma </a> </li>
|
<li> <A Href = yamaha/mambo.html> yamaha/mambo.mma </a> </li>
|
||||||
<li> <A Href = yamaha/quando-g.s280.html> yamaha/quando-g.s280.mma </a> </li>
|
<li> <A Href = yamaha/quando-g.s280.html> yamaha/quando-g.s280.mma </a> </li>
|
||||||
|
<li> <A Href = yamaha/salsa1.html> yamaha/salsa1.mma </a> </li>
|
||||||
|
<li> <A Href = yamaha/salsa2.html> yamaha/salsa2.mma </a> </li>
|
||||||
<li> <A Href = yamaha/w-rock.html> yamaha/w-rock.mma </a> </li>
|
<li> <A Href = yamaha/w-rock.html> yamaha/w-rock.mma </a> </li>
|
||||||
<li> <A Href = yamaha/western.html> yamaha/western.mma </a> </li>
|
<li> <A Href = yamaha/western.html> yamaha/western.mma </a> </li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -168,4 +177,4 @@ information from the each library file:
|
||||||
<P>It is a part of the MMA distribution
|
<P>It is a part of the MMA distribution
|
||||||
and is protected by the same copyrights as MMA (the GNU General Public License).
|
and is protected by the same copyrights as MMA (the GNU General Public License).
|
||||||
|
|
||||||
<P> Created: Wed Mar 7 11:50:18 2007<HTML>
|
<P> Created: Sun Sep 28 11:30:06 2008<HTML>
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:15 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:30:04 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>K50S_Rock</H1>
|
<H1>K50S_Rock</H1>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:16 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:30:05 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Kfunk1</H1>
|
<H1>Kfunk1</H1>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:16 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:30:05 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Twi</H1>
|
<H1>Twi</H1>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:03 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:29:57 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>50Srock</H1>
|
<H1>50Srock</H1>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:03 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:29:57 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>60Srock</H1>
|
<H1>60Srock</H1>
|
||||||
|
@ -8,6 +8,7 @@
|
||||||
<LI><A Href=#60sRock1>60sRock1</a>
|
<LI><A Href=#60sRock1>60sRock1</a>
|
||||||
<LI><A Href=#60sRockSus>60sRockSus</a>
|
<LI><A Href=#60sRockSus>60sRockSus</a>
|
||||||
<LI><A Href=#60sRock1Sus>60sRock1Sus</a>
|
<LI><A Href=#60sRock1Sus>60sRock1Sus</a>
|
||||||
|
<LI><A Href=#60sRockIntro>60sRockIntro</a>
|
||||||
<LI><A Href=#60sRockEnd>60sRockEnd</a>
|
<LI><A Href=#60sRockEnd>60sRockEnd</a>
|
||||||
</ul>
|
</ul>
|
||||||
<A Name=60sRock></a>
|
<A Name=60sRock></a>
|
||||||
|
@ -82,6 +83,23 @@
|
||||||
</Table>
|
</Table>
|
||||||
</TD></TR>
|
</TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
<A Name=60sRockIntro></a>
|
||||||
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
|
<TR><TD>
|
||||||
|
<H2> 60sRockIntro </H2>
|
||||||
|
4 bar intro. <B>(4)</B>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD>
|
||||||
|
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||||
|
<TR><TD> Chord </TD> <TD> CleanGuitar </TD></TR>
|
||||||
|
<TR><TD> Chord-Straight </TD> <TD> CleanGuitar </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
|
<TR><TD> Drum-Ohh </TD> <TD> OpenHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Snare </TD> <TD> SnareDrum2 </TD></TR>
|
||||||
|
<TR><TD> Walk </TD> <TD> FretlessBass </TD></TR>
|
||||||
|
</Table>
|
||||||
|
</TD></TR>
|
||||||
|
</Table>
|
||||||
<A Name=60sRockEnd></a>
|
<A Name=60sRockEnd></a>
|
||||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
<TR><TD>
|
<TR><TD>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:03 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:29:57 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>8Beat</H1>
|
<H1>8Beat</H1>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:04 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:29:57 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Ballad</H1>
|
<H1>Ballad</H1>
|
||||||
|
@ -8,6 +8,7 @@
|
||||||
<LI><A Href=#BalladSus>BalladSus</a>
|
<LI><A Href=#BalladSus>BalladSus</a>
|
||||||
<LI><A Href=#Ballad1>Ballad1</a>
|
<LI><A Href=#Ballad1>Ballad1</a>
|
||||||
<LI><A Href=#Ballad1Sus>Ballad1Sus</a>
|
<LI><A Href=#Ballad1Sus>Ballad1Sus</a>
|
||||||
|
<LI><A Href=#BalladFill>BalladFill</a>
|
||||||
<LI><A Href=#BalladIntro>BalladIntro</a>
|
<LI><A Href=#BalladIntro>BalladIntro</a>
|
||||||
<LI><A Href=#BalladIntro1>BalladIntro1</a>
|
<LI><A Href=#BalladIntro1>BalladIntro1</a>
|
||||||
<LI><A Href=#BalladIntro2>BalladIntro2</a>
|
<LI><A Href=#BalladIntro2>BalladIntro2</a>
|
||||||
|
@ -116,6 +117,30 @@
|
||||||
</Table>
|
</Table>
|
||||||
</TD></TR>
|
</TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
<A Name=BalladFill></a>
|
||||||
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
|
<TR><TD>
|
||||||
|
<H2> BalladFill </H2>
|
||||||
|
1 bar fill, good for endings. <B>(1)</B>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD>
|
||||||
|
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||||
|
<TR><TD> Bass </TD> <TD> FretlessBass </TD></TR>
|
||||||
|
<TR><TD> Chord </TD> <TD> Atmosphere </TD></TR>
|
||||||
|
<TR><TD> Drum-Bongo </TD> <TD> LowBongo </TD></TR>
|
||||||
|
<TR><TD> Drum-Cabasa </TD> <TD> Cabasa </TD></TR>
|
||||||
|
<TR><TD> Drum-Cym </TD> <TD> RideCymbal1 </TD></TR>
|
||||||
|
<TR><TD> Drum-Hh </TD> <TD> PedalHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Hiconga </TD> <TD> MuteHighConga </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
|
<TR><TD> Drum-Loconga </TD> <TD> LowConga </TD></TR>
|
||||||
|
<TR><TD> Drum-Mutetri </TD> <TD> MuteTriangle </TD></TR>
|
||||||
|
<TR><TD> Drum-Opentri </TD> <TD> OpenTriangle </TD></TR>
|
||||||
|
<TR><TD> Drum-Shake </TD> <TD> Shaker </TD></TR>
|
||||||
|
<TR><TD> Drum-Tamb </TD> <TD> Tambourine </TD></TR>
|
||||||
|
</Table>
|
||||||
|
</TD></TR>
|
||||||
|
</Table>
|
||||||
<A Name=BalladIntro></a>
|
<A Name=BalladIntro></a>
|
||||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
<TR><TD>
|
<TR><TD>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:04 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:29:57 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Ballad128</H1>
|
<H1>Ballad128</H1>
|
||||||
|
@ -31,7 +31,7 @@
|
||||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
<TR><TD>
|
<TR><TD>
|
||||||
<H2> Ballad128Plus </H2>
|
<H2> Ballad128Plus </H2>
|
||||||
Adds arpeggiated . <B>(4)</B>
|
Adds arpeggiated piano. <B>(4)</B>
|
||||||
</TD></TR>
|
</TD></TR>
|
||||||
<TR><TD>
|
<TR><TD>
|
||||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||||
|
|
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>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Basicrock</H1>
|
<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>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Beguine</H1>
|
<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>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Bigband</H1>
|
<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>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Bluegrass</H1>
|
<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>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Blues</H1>
|
<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>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Boggiewoggie</H1>
|
<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>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Bolero</H1>
|
<H1>Bolero</H1>
|
||||||
|
@ -8,6 +8,10 @@
|
||||||
<LI><A Href=#BoleroFill>BoleroFill</a>
|
<LI><A Href=#BoleroFill>BoleroFill</a>
|
||||||
<LI><A Href=#BoleroSus>BoleroSus</a>
|
<LI><A Href=#BoleroSus>BoleroSus</a>
|
||||||
<LI><A Href=#BoleroSusFill>BoleroSusFill</a>
|
<LI><A Href=#BoleroSusFill>BoleroSusFill</a>
|
||||||
|
<LI><A Href=#BoleroAlt>BoleroAlt</a>
|
||||||
|
<LI><A Href=#BoleroAltSus>BoleroAltSus</a>
|
||||||
|
<LI><A Href=#BoleroAltFill>BoleroAltFill</a>
|
||||||
|
<LI><A Href=#BoleroAltSusFill>BoleroAltSusFill</a>
|
||||||
<LI><A Href=#BoleroIntro>BoleroIntro</a>
|
<LI><A Href=#BoleroIntro>BoleroIntro</a>
|
||||||
<LI><A Href=#BoleroEnd>BoleroEnd</a>
|
<LI><A Href=#BoleroEnd>BoleroEnd</a>
|
||||||
<LI><A Href=#Bolero1>Bolero1</a>
|
<LI><A Href=#Bolero1>Bolero1</a>
|
||||||
|
@ -97,6 +101,90 @@
|
||||||
</Table>
|
</Table>
|
||||||
</TD></TR>
|
</TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
<A Name=BoleroAlt></a>
|
||||||
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
|
<TR><TD>
|
||||||
|
<H2> BoleroAlt </H2>
|
||||||
|
Arpeggiated guitars. <B>(4)</B>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD>
|
||||||
|
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||||
|
<TR><TD> Arpeggio-Guitar </TD> <TD> NylonGuitar </TD></TR>
|
||||||
|
<TR><TD> Bass </TD> <TD> FingeredBass </TD></TR>
|
||||||
|
<TR><TD> Bass-Guitar </TD> <TD> NylonGuitar </TD></TR>
|
||||||
|
<TR><TD> Chord </TD> <TD> SteelGuitar </TD></TR>
|
||||||
|
<TR><TD> Drum-Claves </TD> <TD> Claves </TD></TR>
|
||||||
|
<TR><TD> Drum-Hbongo </TD> <TD> HighBongo </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
|
<TR><TD> Drum-Lbongo </TD> <TD> LowBongo </TD></TR>
|
||||||
|
<TR><TD> Drum-Maraca </TD> <TD> Maracas </TD></TR>
|
||||||
|
</Table>
|
||||||
|
</TD></TR>
|
||||||
|
</Table>
|
||||||
|
<A Name=BoleroAltSus></a>
|
||||||
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
|
<TR><TD>
|
||||||
|
<H2> BoleroAltSus </H2>
|
||||||
|
Sustain with Arpeggiated guitars. <B>(4)</B>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD>
|
||||||
|
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||||
|
<TR><TD> Arpeggio-Guitar </TD> <TD> NylonGuitar </TD></TR>
|
||||||
|
<TR><TD> Bass </TD> <TD> FingeredBass </TD></TR>
|
||||||
|
<TR><TD> Bass-Guitar </TD> <TD> NylonGuitar </TD></TR>
|
||||||
|
<TR><TD> Chord </TD> <TD> SteelGuitar </TD></TR>
|
||||||
|
<TR><TD> Chord-Sus </TD> <TD> Strings </TD></TR>
|
||||||
|
<TR><TD> Drum-Claves </TD> <TD> Claves </TD></TR>
|
||||||
|
<TR><TD> Drum-Hbongo </TD> <TD> HighBongo </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
|
<TR><TD> Drum-Lbongo </TD> <TD> LowBongo </TD></TR>
|
||||||
|
<TR><TD> Drum-Maraca </TD> <TD> Maracas </TD></TR>
|
||||||
|
</Table>
|
||||||
|
</TD></TR>
|
||||||
|
</Table>
|
||||||
|
<A Name=BoleroAltFill></a>
|
||||||
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
|
<TR><TD>
|
||||||
|
<H2> BoleroAltFill </H2>
|
||||||
|
Arpeggiated flutes and guitars. <B>(4)</B>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD>
|
||||||
|
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||||
|
<TR><TD> Arpeggio </TD> <TD> Flute </TD></TR>
|
||||||
|
<TR><TD> Arpeggio-Guitar </TD> <TD> NylonGuitar </TD></TR>
|
||||||
|
<TR><TD> Bass </TD> <TD> FingeredBass </TD></TR>
|
||||||
|
<TR><TD> Bass-Guitar </TD> <TD> NylonGuitar </TD></TR>
|
||||||
|
<TR><TD> Chord </TD> <TD> SteelGuitar </TD></TR>
|
||||||
|
<TR><TD> Drum-Claves </TD> <TD> Claves </TD></TR>
|
||||||
|
<TR><TD> Drum-Hbongo </TD> <TD> HighBongo </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
|
<TR><TD> Drum-Lbongo </TD> <TD> LowBongo </TD></TR>
|
||||||
|
<TR><TD> Drum-Maraca </TD> <TD> Maracas </TD></TR>
|
||||||
|
</Table>
|
||||||
|
</TD></TR>
|
||||||
|
</Table>
|
||||||
|
<A Name=BoleroAltSusFill></a>
|
||||||
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
|
<TR><TD>
|
||||||
|
<H2> BoleroAltSusFill </H2>
|
||||||
|
Sustain with arpeggiated flutes and guitars. <B>(4)</B>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD>
|
||||||
|
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||||
|
<TR><TD> Arpeggio </TD> <TD> Flute </TD></TR>
|
||||||
|
<TR><TD> Arpeggio-Guitar </TD> <TD> NylonGuitar </TD></TR>
|
||||||
|
<TR><TD> Bass </TD> <TD> FingeredBass </TD></TR>
|
||||||
|
<TR><TD> Bass-Guitar </TD> <TD> NylonGuitar </TD></TR>
|
||||||
|
<TR><TD> Chord </TD> <TD> SteelGuitar </TD></TR>
|
||||||
|
<TR><TD> Chord-Sus </TD> <TD> Strings </TD></TR>
|
||||||
|
<TR><TD> Drum-Claves </TD> <TD> Claves </TD></TR>
|
||||||
|
<TR><TD> Drum-Hbongo </TD> <TD> HighBongo </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
|
<TR><TD> Drum-Lbongo </TD> <TD> LowBongo </TD></TR>
|
||||||
|
<TR><TD> Drum-Maraca </TD> <TD> Maracas </TD></TR>
|
||||||
|
</Table>
|
||||||
|
</TD></TR>
|
||||||
|
</Table>
|
||||||
<A Name=BoleroIntro></a>
|
<A Name=BoleroIntro></a>
|
||||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
<TR><TD>
|
<TR><TD>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:05 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:29:58 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Bossanova</H1>
|
<H1>Bossanova</H1>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:06 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:29:58 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Broadway</H1>
|
<H1>Broadway</H1>
|
||||||
|
@ -9,7 +9,7 @@
|
||||||
<LI><A Href=#BroadwaySus>BroadwaySus</a>
|
<LI><A Href=#BroadwaySus>BroadwaySus</a>
|
||||||
<LI><A Href=#Broadway1Sus>Broadway1Sus</a>
|
<LI><A Href=#Broadway1Sus>Broadway1Sus</a>
|
||||||
<LI><A Href=#BroadwayIntro>BroadwayIntro</a>
|
<LI><A Href=#BroadwayIntro>BroadwayIntro</a>
|
||||||
<LI><A Href=#BroadWayEnd>BroadWayEnd</a>
|
<LI><A Href=#BroadwayEnd>BroadwayEnd</a>
|
||||||
</ul>
|
</ul>
|
||||||
<A Name=Broadway></a>
|
<A Name=Broadway></a>
|
||||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
|
@ -110,10 +110,10 @@
|
||||||
</Table>
|
</Table>
|
||||||
</TD></TR>
|
</TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
<A Name=BroadWayEnd></a>
|
<A Name=BroadwayEnd></a>
|
||||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
<TR><TD>
|
<TR><TD>
|
||||||
<H2> BroadWayEnd </H2>
|
<H2> BroadwayEnd </H2>
|
||||||
A 2 bar ending reminiscent of a cha-cha. <B>(2)</B>
|
A 2 bar ending reminiscent of a cha-cha. <B>(2)</B>
|
||||||
</TD></TR>
|
</TD></TR>
|
||||||
<TR><TD>
|
<TR><TD>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:06 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:29:58 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Calypso</H1>
|
<H1>Calypso</H1>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:06 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:29:58 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Chacha</H1>
|
<H1>Chacha</H1>
|
||||||
|
@ -33,6 +33,7 @@
|
||||||
<LI><A Href=#ChaChaFill>ChaChaFill</a>
|
<LI><A Href=#ChaChaFill>ChaChaFill</a>
|
||||||
<LI><A Href=#ChaCha1Fill>ChaCha1Fill</a>
|
<LI><A Href=#ChaCha1Fill>ChaCha1Fill</a>
|
||||||
<LI><A Href=#ChaChaIntro>ChaChaIntro</a>
|
<LI><A Href=#ChaChaIntro>ChaChaIntro</a>
|
||||||
|
<LI><A Href=#ChaChaIntro8>ChaChaIntro8</a>
|
||||||
<LI><A Href=#ChaChaEnd>ChaChaEnd</a>
|
<LI><A Href=#ChaChaEnd>ChaChaEnd</a>
|
||||||
</ul>
|
</ul>
|
||||||
<A Name=ChaCha></a>
|
<A Name=ChaCha></a>
|
||||||
|
@ -194,6 +195,28 @@
|
||||||
</Table>
|
</Table>
|
||||||
</TD></TR>
|
</TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
<A Name=ChaChaIntro8></a>
|
||||||
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
|
<TR><TD>
|
||||||
|
<H2> ChaChaIntro8 </H2>
|
||||||
|
Same intro expanded to 8 bars. <B>(8)</B>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD>
|
||||||
|
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||||
|
<TR><TD> Bass </TD> <TD> JazzGuitar </TD></TR>
|
||||||
|
<TR><TD> Chord </TD> <TD> Piano1 </TD></TR>
|
||||||
|
<TR><TD> Drum-Clave </TD> <TD> Claves </TD></TR>
|
||||||
|
<TR><TD> Drum-Hconga </TD> <TD> MuteHighConga </TD></TR>
|
||||||
|
<TR><TD> Drum-Hh </TD> <TD> RideCymbal1 </TD></TR>
|
||||||
|
<TR><TD> Drum-Htom </TD> <TD> HighTom2 </TD></TR>
|
||||||
|
<TR><TD> Drum-Lconga </TD> <TD> LowConga </TD></TR>
|
||||||
|
<TR><TD> Drum-Lguiro </TD> <TD> LongGuiro </TD></TR>
|
||||||
|
<TR><TD> Drum-Mtom </TD> <TD> MidTom2 </TD></TR>
|
||||||
|
<TR><TD> Drum-Sguiro </TD> <TD> ShortGuiro </TD></TR>
|
||||||
|
<TR><TD> Drum-Snare </TD> <TD> SnareDrum1 </TD></TR>
|
||||||
|
</Table>
|
||||||
|
</TD></TR>
|
||||||
|
</Table>
|
||||||
<A Name=ChaChaEnd></a>
|
<A Name=ChaChaEnd></a>
|
||||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
<TR><TD>
|
<TR><TD>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:06 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:29:58 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Countryblues</H1>
|
<H1>Countryblues</H1>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:06 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:29:59 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Countryswing</H1>
|
<H1>Countryswing</H1>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:07 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:29:59 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Countrywaltz</H1>
|
<H1>Countrywaltz</H1>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:07 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:29:59 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Desert</H1>
|
<H1>Desert</H1>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:07 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:29:59 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Dixie</H1>
|
<H1>Dixie</H1>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:07 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:29:59 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Dixiemarch</H1>
|
<H1>Dixiemarch</H1>
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:07 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:29:59 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Easyswing</H1>
|
<H1>Easyswing</H1>
|
||||||
<P>Soft guitar strumming. Great of tunes like "Beyond The Sea" and "Summertime".
|
<P>Soft guitar strumming. Great for tunes like "Beyond The Sea" and "Summertime".
|
||||||
<ul>
|
<ul>
|
||||||
<LI><A Href=#EasySwing>EasySwing</a>
|
<LI><A Href=#EasySwing>EasySwing</a>
|
||||||
<LI><A Href=#EasySwingSus>EasySwingSus</a>
|
<LI><A Href=#EasySwingSus>EasySwingSus</a>
|
||||||
|
@ -39,6 +39,7 @@
|
||||||
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
||||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||||
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
||||||
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
@ -56,6 +57,7 @@
|
||||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||||
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
|
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
|
||||||
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
||||||
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
@ -73,6 +75,7 @@
|
||||||
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
||||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||||
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
||||||
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
@ -88,6 +91,7 @@
|
||||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||||
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
||||||
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
@ -104,6 +108,7 @@
|
||||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||||
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
|
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
|
||||||
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
||||||
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
@ -121,6 +126,7 @@
|
||||||
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
||||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||||
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
||||||
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
@ -137,6 +143,7 @@
|
||||||
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
||||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||||
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
||||||
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
@ -154,6 +161,7 @@
|
||||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||||
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
|
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
|
||||||
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
||||||
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
@ -171,6 +179,7 @@
|
||||||
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
||||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||||
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
||||||
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
@ -187,6 +196,7 @@
|
||||||
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
||||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||||
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
||||||
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
@ -204,6 +214,7 @@
|
||||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||||
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
|
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
|
||||||
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
||||||
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
@ -221,6 +232,7 @@
|
||||||
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
||||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||||
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
||||||
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
@ -237,6 +249,7 @@
|
||||||
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
||||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||||
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
||||||
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
@ -254,6 +267,7 @@
|
||||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||||
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
|
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
|
||||||
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
||||||
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
@ -271,6 +285,7 @@
|
||||||
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
||||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||||
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
||||||
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
@ -286,6 +301,7 @@
|
||||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||||
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
||||||
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
@ -302,6 +318,7 @@
|
||||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||||
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
|
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
|
||||||
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
||||||
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
@ -318,6 +335,7 @@
|
||||||
<TR><TD> Arpeggio </TD> <TD> JazzGuitar </TD></TR>
|
<TR><TD> Arpeggio </TD> <TD> JazzGuitar </TD></TR>
|
||||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||||
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
||||||
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
@ -334,6 +352,7 @@
|
||||||
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
||||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||||
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
</TD></TR>
|
</TD></TR>
|
||||||
|
@ -349,6 +368,7 @@
|
||||||
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
||||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||||
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
</TD></TR>
|
</TD></TR>
|
||||||
|
@ -364,6 +384,7 @@
|
||||||
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
||||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||||
<TR><TD> Drum-Hh </TD> <TD> RideCymbal1 </TD></TR>
|
<TR><TD> Drum-Hh </TD> <TD> RideCymbal1 </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
</TD></TR>
|
</TD></TR>
|
||||||
|
@ -380,6 +401,7 @@
|
||||||
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
||||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||||
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
</TD></TR>
|
</TD></TR>
|
||||||
|
@ -395,6 +417,7 @@
|
||||||
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
||||||
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||||
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
<TR><TD> Drum-Hh </TD> <TD> OpenHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
||||||
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:07 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:29:59 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Fastblues</H1>
|
<H1>Fastblues</H1>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:08 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:29:59 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Folk</H1>
|
<H1>Folk</H1>
|
||||||
|
@ -7,6 +7,8 @@
|
||||||
<LI><A Href=#Folk>Folk</a>
|
<LI><A Href=#Folk>Folk</a>
|
||||||
<LI><A Href=#FolkWalk>FolkWalk</a>
|
<LI><A Href=#FolkWalk>FolkWalk</a>
|
||||||
<LI><A Href=#FolkArticulated>FolkArticulated</a>
|
<LI><A Href=#FolkArticulated>FolkArticulated</a>
|
||||||
|
<LI><A Href=#FolkSus>FolkSus</a>
|
||||||
|
<LI><A Href=#FolkArticulatedSus>FolkArticulatedSus</a>
|
||||||
<LI><A Href=#FolkIntro>FolkIntro</a>
|
<LI><A Href=#FolkIntro>FolkIntro</a>
|
||||||
<LI><A Href=#FolkEnd>FolkEnd</a>
|
<LI><A Href=#FolkEnd>FolkEnd</a>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -54,6 +56,38 @@
|
||||||
</Table>
|
</Table>
|
||||||
</TD></TR>
|
</TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
<A Name=FolkSus></a>
|
||||||
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
|
<TR><TD>
|
||||||
|
<H2> FolkSus </H2>
|
||||||
|
Some nice harmonica chords with the guitar. <B>(8)</B>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD>
|
||||||
|
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||||
|
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
||||||
|
<TR><TD> Chord </TD> <TD> NylonGuitar </TD></TR>
|
||||||
|
<TR><TD> Chord-Sus </TD> <TD> Harmonica </TD></TR>
|
||||||
|
<TR><TD> Drum-Tamb </TD> <TD> Tambourine </TD></TR>
|
||||||
|
</Table>
|
||||||
|
</TD></TR>
|
||||||
|
</Table>
|
||||||
|
<A Name=FolkArticulatedSus></a>
|
||||||
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
|
<TR><TD>
|
||||||
|
<H2> FolkArticulatedSus </H2>
|
||||||
|
Articulated version with harmonica. <B>(8)</B>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD>
|
||||||
|
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||||
|
<TR><TD> Arpeggio </TD> <TD> NylonGuitar </TD></TR>
|
||||||
|
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
||||||
|
<TR><TD> Chord </TD> <TD> NylonGuitar </TD></TR>
|
||||||
|
<TR><TD> Chord-Sus </TD> <TD> Harmonica </TD></TR>
|
||||||
|
<TR><TD> Drum-Tamb </TD> <TD> Tambourine </TD></TR>
|
||||||
|
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
||||||
|
</Table>
|
||||||
|
</TD></TR>
|
||||||
|
</Table>
|
||||||
<A Name=FolkIntro></a>
|
<A Name=FolkIntro></a>
|
||||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
<TR><TD>
|
<TR><TD>
|
||||||
|
|
|
@ -1,8 +1,22 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:08 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:29:59 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Foxtrot</H1>
|
<H1>Foxtrot</H1>
|
||||||
<P>Just about any old-fashioned dance piece can be set to a foxtrot.
|
<P>Just about any old-fashioned dance piece can be set to a foxtrot.
|
||||||
|
<P>
|
||||||
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
|
<TR><TD>
|
||||||
|
<H2> Variables </H2>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD>
|
||||||
|
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="100%">
|
||||||
|
<TR>
|
||||||
|
<TD Valign=Top> <B> ArpeggioVoice </B> </TD>
|
||||||
|
<TD Valign=Top> Voice for the alternating apreggios in the Plus versions (Default=Piano1). Also used in Introduction and Ending. </TD>
|
||||||
|
</TR>
|
||||||
|
</Table>
|
||||||
|
</TD></TR>
|
||||||
|
</Table>
|
||||||
<ul>
|
<ul>
|
||||||
<LI><A Href=#Foxtrot>Foxtrot</a>
|
<LI><A Href=#Foxtrot>Foxtrot</a>
|
||||||
<LI><A Href=#FoxtrotSus>FoxtrotSus</a>
|
<LI><A Href=#FoxtrotSus>FoxtrotSus</a>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:08 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:29:59 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Frenchwaltz</H1>
|
<H1>Frenchwaltz</H1>
|
||||||
|
@ -38,7 +38,7 @@
|
||||||
<LI><A Href=#FrenchWaltz2FillSus>FrenchWaltz2FillSus</a>
|
<LI><A Href=#FrenchWaltz2FillSus>FrenchWaltz2FillSus</a>
|
||||||
<LI><A Href=#FrenchWaltz3>FrenchWaltz3</a>
|
<LI><A Href=#FrenchWaltz3>FrenchWaltz3</a>
|
||||||
<LI><A Href=#FrenchWaltz3Fill>FrenchWaltz3Fill</a>
|
<LI><A Href=#FrenchWaltz3Fill>FrenchWaltz3Fill</a>
|
||||||
<LI><A Href=#FrenchWaltz2Sus>FrenchWaltz2Sus</a>
|
<LI><A Href=#FrenchWaltz3Sus>FrenchWaltz3Sus</a>
|
||||||
<LI><A Href=#FrenchWaltz3FillSus>FrenchWaltz3FillSus</a>
|
<LI><A Href=#FrenchWaltz3FillSus>FrenchWaltz3FillSus</a>
|
||||||
<LI><A Href=#FrenchWaltzIntro>FrenchWaltzIntro</a>
|
<LI><A Href=#FrenchWaltzIntro>FrenchWaltzIntro</a>
|
||||||
<LI><A Href=#FrenchWaltzEnd>FrenchWaltzEnd</a>
|
<LI><A Href=#FrenchWaltzEnd>FrenchWaltzEnd</a>
|
||||||
|
@ -284,10 +284,10 @@
|
||||||
</Table>
|
</Table>
|
||||||
</TD></TR>
|
</TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
<A Name=FrenchWaltz2Sus></a>
|
<A Name=FrenchWaltz3Sus></a>
|
||||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
<TR><TD>
|
<TR><TD>
|
||||||
<H2> FrenchWaltz2Sus </H2>
|
<H2> FrenchWaltz3Sus </H2>
|
||||||
Viola counter melody and sustained strings. <B>(8)</B>
|
Viola counter melody and sustained strings. <B>(8)</B>
|
||||||
</TD></TR>
|
</TD></TR>
|
||||||
<TR><TD>
|
<TR><TD>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:08 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:30:00 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Guitarballad</H1>
|
<H1>Guitarballad</H1>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:08 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:30:00 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Hillcountry</H1>
|
<H1>Hillcountry</H1>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:09 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:30:00 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Jazz-54</H1>
|
<H1>Jazz-54</H1>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:09 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:30:00 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Jazzguitar</H1>
|
<H1>Jazzguitar</H1>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:09 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:30:00 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Jazzwaltz</H1>
|
<H1>Jazzwaltz</H1>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:09 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:30:00 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Jive</H1>
|
<H1>Jive</H1>
|
||||||
|
@ -17,6 +17,7 @@
|
||||||
<LI><A Href=#Jive1Plus>Jive1Plus</a>
|
<LI><A Href=#Jive1Plus>Jive1Plus</a>
|
||||||
<LI><A Href=#Jive1SusPlus>Jive1SusPlus</a>
|
<LI><A Href=#Jive1SusPlus>Jive1SusPlus</a>
|
||||||
<LI><A Href=#JiveIntro>JiveIntro</a>
|
<LI><A Href=#JiveIntro>JiveIntro</a>
|
||||||
|
<LI><A Href=#JiveIntro8>JiveIntro8</a>
|
||||||
<LI><A Href=#JiveEnd>JiveEnd</a>
|
<LI><A Href=#JiveEnd>JiveEnd</a>
|
||||||
</ul>
|
</ul>
|
||||||
<A Name=Jive></a>
|
<A Name=Jive></a>
|
||||||
|
@ -95,7 +96,7 @@
|
||||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
<TR><TD>
|
<TR><TD>
|
||||||
<H2> JivePlus </H2>
|
<H2> JivePlus </H2>
|
||||||
Add some additional apreggios. <B>(4)</B>
|
Add some additional arpeggios. <B>(4)</B>
|
||||||
</TD></TR>
|
</TD></TR>
|
||||||
<TR><TD>
|
<TR><TD>
|
||||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||||
|
@ -113,7 +114,7 @@
|
||||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
<TR><TD>
|
<TR><TD>
|
||||||
<H2> JiveSusPlus </H2>
|
<H2> JiveSusPlus </H2>
|
||||||
Apreggios plus strings. <B>(4)</B>
|
Arpeggios plus strings. <B>(4)</B>
|
||||||
</TD></TR>
|
</TD></TR>
|
||||||
<TR><TD>
|
<TR><TD>
|
||||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||||
|
@ -255,6 +256,24 @@
|
||||||
</Table>
|
</Table>
|
||||||
</TD></TR>
|
</TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
<A Name=JiveIntro8></a>
|
||||||
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
|
<TR><TD>
|
||||||
|
<H2> JiveIntro8 </H2>
|
||||||
|
8 bar intro. <B>(8)</B>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD>
|
||||||
|
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||||
|
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
||||||
|
<TR><TD> Bass-Sax </TD> <TD> AltoSax </TD></TR>
|
||||||
|
<TR><TD> Chord </TD> <TD> Piano2 </TD></TR>
|
||||||
|
<TR><TD> Drum-Clap </TD> <TD> SnareDrum1 </TD></TR>
|
||||||
|
<TR><TD> Drum-Hh </TD> <TD> ClosedHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
|
<TR><TD> Drum-Snare </TD> <TD> SnareDrum1 </TD></TR>
|
||||||
|
</Table>
|
||||||
|
</TD></TR>
|
||||||
|
</Table>
|
||||||
<A Name=JiveEnd></a>
|
<A Name=JiveEnd></a>
|
||||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
<TR><TD>
|
<TR><TD>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:09 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:30:00 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Lfusion</H1>
|
<H1>Lfusion</H1>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:09 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:30:00 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Lighttango</H1>
|
<H1>Lighttango</H1>
|
||||||
|
@ -10,7 +10,9 @@
|
||||||
<LI><A Href=#LightTango1Sus>LightTango1Sus</a>
|
<LI><A Href=#LightTango1Sus>LightTango1Sus</a>
|
||||||
<LI><A Href=#LightTangoFill>LightTangoFill</a>
|
<LI><A Href=#LightTangoFill>LightTangoFill</a>
|
||||||
<LI><A Href=#LightTangoIntro>LightTangoIntro</a>
|
<LI><A Href=#LightTangoIntro>LightTangoIntro</a>
|
||||||
|
<LI><A Href=#LightTangoIntro1>LightTangoIntro1</a>
|
||||||
<LI><A Href=#LightTangoEnd>LightTangoEnd</a>
|
<LI><A Href=#LightTangoEnd>LightTangoEnd</a>
|
||||||
|
<LI><A Href=#LightTango4End>LightTango4End</a>
|
||||||
</ul>
|
</ul>
|
||||||
<A Name=LightTango></a>
|
<A Name=LightTango></a>
|
||||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
|
@ -133,6 +135,25 @@
|
||||||
</Table>
|
</Table>
|
||||||
</TD></TR>
|
</TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
<A Name=LightTangoIntro1></a>
|
||||||
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
|
<TR><TD>
|
||||||
|
<H2> LightTangoIntro1 </H2>
|
||||||
|
Smoother version of basic introduction. <B>(4)</B>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD>
|
||||||
|
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||||
|
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
||||||
|
<TR><TD> Chord-Guitar </TD> <TD> NylonGuitar </TD></TR>
|
||||||
|
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
|
||||||
|
<TR><TD> Drum-Clave </TD> <TD> Claves </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
|
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Snare </TD> <TD> SnareDrum1 </TD></TR>
|
||||||
|
<TR><TD> Drum-Tam </TD> <TD> Tambourine </TD></TR>
|
||||||
|
</Table>
|
||||||
|
</TD></TR>
|
||||||
|
</Table>
|
||||||
<A Name=LightTangoEnd></a>
|
<A Name=LightTangoEnd></a>
|
||||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
<TR><TD>
|
<TR><TD>
|
||||||
|
@ -150,5 +171,25 @@
|
||||||
</Table>
|
</Table>
|
||||||
</TD></TR>
|
</TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
<A Name=LightTango4End></a>
|
||||||
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
|
<TR><TD>
|
||||||
|
<H2> LightTango4End </H2>
|
||||||
|
Smoother 4 bar ending. <B>(4)</B>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD>
|
||||||
|
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||||
|
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
||||||
|
<TR><TD> Chord-Accordion </TD> <TD> Accordion </TD></TR>
|
||||||
|
<TR><TD> Chord-Guitar </TD> <TD> NylonGuitar </TD></TR>
|
||||||
|
<TR><TD> Chord-Sus </TD> <TD> TremoloStrings </TD></TR>
|
||||||
|
<TR><TD> Drum-Clave </TD> <TD> Claves </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
|
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Snare </TD> <TD> SnareDrum1 </TD></TR>
|
||||||
|
<TR><TD> Drum-Tam </TD> <TD> Tambourine </TD></TR>
|
||||||
|
</Table>
|
||||||
|
</TD></TR>
|
||||||
|
</Table>
|
||||||
|
|
||||||
</Body></HTML>
|
</Body></HTML>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:10 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:30:00 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Lullaby</H1>
|
<H1>Lullaby</H1>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:10 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:30:01 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Mambo</H1>
|
<H1>Mambo</H1>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:10 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:30:01 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>March</H1>
|
<H1>March</H1>
|
||||||
|
|
|
@ -1,8 +1,22 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:10 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:30:01 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Merengue</H1>
|
<H1>Merengue</H1>
|
||||||
<P>This is a very fast dance rhythm native to the Dominican Republic. The demo song for this ``Compadre Pedro Juan''. Note that you'll have to double up on the tempo for this to sound right. Patterns are from ``Latin Rhythms: Mystery Unraveled'' by Victor Lopez.
|
<P>This is a very fast dance rhythm native to the Dominican Republic. The demo song for this ``Compadre Pedro Juan''. Note that you'll have to double up on the tempo for this to sound right. Patterns are from ``Latin Rhythms: Mystery Unraveled'' by Victor Lopez.
|
||||||
|
<P>
|
||||||
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
|
<TR><TD>
|
||||||
|
<H2> Variables </H2>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD>
|
||||||
|
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="100%">
|
||||||
|
<TR>
|
||||||
|
<TD Valign=Top> <B> BandoneonOctave </B> </TD>
|
||||||
|
<TD Valign=Top> The Octave setting for the bandoneon (default=6) </TD>
|
||||||
|
</TR>
|
||||||
|
</Table>
|
||||||
|
</TD></TR>
|
||||||
|
</Table>
|
||||||
<ul>
|
<ul>
|
||||||
<LI><A Href=#Merengue>Merengue</a>
|
<LI><A Href=#Merengue>Merengue</a>
|
||||||
<LI><A Href=#Merengue1>Merengue1</a>
|
<LI><A Href=#Merengue1>Merengue1</a>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:10 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:30:01 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Metronome</H1>
|
<H1>Metronome</H1>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:11 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:30:01 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Metronome3</H1>
|
<H1>Metronome3</H1>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:11 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:30:01 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Modernjazz</H1>
|
<H1>Modernjazz</H1>
|
||||||
|
@ -11,8 +11,12 @@
|
||||||
<TR><TD>
|
<TR><TD>
|
||||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="100%">
|
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="100%">
|
||||||
<TR>
|
<TR>
|
||||||
<TD Valign=Top> <B> ApreggioVoice </B> </TD>
|
<TD Valign=Top> <B> ArpeggioVoice </B> </TD>
|
||||||
<TD Valign=Top> Voice for the alternating apreggios in ModernJazz1 (Default=MutedTrumpet). Also used in Introduction and Ending. </TD>
|
<TD Valign=Top> Voice for the alternating arpeggios in ModernJazz1 and ModernJazz2 (plus the SUS versions of 1 and 2). </TD>
|
||||||
|
</TR>
|
||||||
|
<TR>
|
||||||
|
<TD Valign=Top> <B> (Default=MutedTrumpet). </B> </TD>
|
||||||
|
<TD Valign=Top> Also used in Introduction and Ending. </TD>
|
||||||
</TR>
|
</TR>
|
||||||
</Table>
|
</Table>
|
||||||
</TD></TR>
|
</TD></TR>
|
||||||
|
@ -22,6 +26,8 @@
|
||||||
<LI><A Href=#ModernJazz1>ModernJazz1</a>
|
<LI><A Href=#ModernJazz1>ModernJazz1</a>
|
||||||
<LI><A Href=#ModernJazzSus>ModernJazzSus</a>
|
<LI><A Href=#ModernJazzSus>ModernJazzSus</a>
|
||||||
<LI><A Href=#ModernJazz1Sus>ModernJazz1Sus</a>
|
<LI><A Href=#ModernJazz1Sus>ModernJazz1Sus</a>
|
||||||
|
<LI><A Href=#ModernJazz2>ModernJazz2</a>
|
||||||
|
<LI><A Href=#ModernJazz2Sus>ModernJazz2Sus</a>
|
||||||
<LI><A Href=#ModernJazzIntro>ModernJazzIntro</a>
|
<LI><A Href=#ModernJazzIntro>ModernJazzIntro</a>
|
||||||
<LI><A Href=#ModernJazzEnd>ModernJazzEnd</a>
|
<LI><A Href=#ModernJazzEnd>ModernJazzEnd</a>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -107,6 +113,49 @@
|
||||||
</Table>
|
</Table>
|
||||||
</TD></TR>
|
</TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
<A Name=ModernJazz2></a>
|
||||||
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
|
<TR><TD>
|
||||||
|
<H2> ModernJazz2 </H2>
|
||||||
|
A slower version of alternate-bar trumpet for faster tempos. <B>(4)</B>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD>
|
||||||
|
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||||
|
<TR><TD> Arpeggio </TD> <TD> MutedTrumpet </TD></TR>
|
||||||
|
<TR><TD> Bass-Trp </TD> <TD> MutedTrumpet </TD></TR>
|
||||||
|
<TR><TD> Chord-Guitar </TD> <TD> JazzGuitar </TD></TR>
|
||||||
|
<TR><TD> Chord-Piano </TD> <TD> Piano2 </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
|
<TR><TD> Drum-Ohh </TD> <TD> OpenHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Ride </TD> <TD> RideCymbal1 </TD></TR>
|
||||||
|
<TR><TD> Drum-Side </TD> <TD> SnareDrum1 </TD></TR>
|
||||||
|
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
||||||
|
</Table>
|
||||||
|
</TD></TR>
|
||||||
|
</Table>
|
||||||
|
<A Name=ModernJazz2Sus></a>
|
||||||
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
|
<TR><TD>
|
||||||
|
<H2> ModernJazz2Sus </H2>
|
||||||
|
Slower alternate-bar trumpets with violins for faster tempos. <B>(4)</B>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD>
|
||||||
|
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||||
|
<TR><TD> Arpeggio </TD> <TD> MutedTrumpet </TD></TR>
|
||||||
|
<TR><TD> Bass-Trp </TD> <TD> MutedTrumpet </TD></TR>
|
||||||
|
<TR><TD> Chord-Guitar </TD> <TD> JazzGuitar </TD></TR>
|
||||||
|
<TR><TD> Chord-Piano </TD> <TD> Piano2 </TD></TR>
|
||||||
|
<TR><TD> Chord-Sus </TD> <TD> VoiceOohs </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
|
<TR><TD> Drum-Ohh </TD> <TD> OpenHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Phh </TD> <TD> PedalHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Ride </TD> <TD> RideCymbal1 </TD></TR>
|
||||||
|
<TR><TD> Drum-Side </TD> <TD> SnareDrum1 </TD></TR>
|
||||||
|
<TR><TD> Walk </TD> <TD> AcousticBass </TD></TR>
|
||||||
|
</Table>
|
||||||
|
</TD></TR>
|
||||||
|
</Table>
|
||||||
<A Name=ModernJazzIntro></a>
|
<A Name=ModernJazzIntro></a>
|
||||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
<TR><TD>
|
<TR><TD>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:11 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:30:01 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Pianoballad</H1>
|
<H1>Pianoballad</H1>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:11 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:30:01 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Polka</H1>
|
<H1>Polka</H1>
|
||||||
|
@ -13,6 +13,7 @@
|
||||||
<LI><A Href=#Polka1Arp>Polka1Arp</a>
|
<LI><A Href=#Polka1Arp>Polka1Arp</a>
|
||||||
<LI><A Href=#Polka1SusArp>Polka1SusArp</a>
|
<LI><A Href=#Polka1SusArp>Polka1SusArp</a>
|
||||||
<LI><A Href=#PolkaIntro>PolkaIntro</a>
|
<LI><A Href=#PolkaIntro>PolkaIntro</a>
|
||||||
|
<LI><A Href=#PolkaIntro8>PolkaIntro8</a>
|
||||||
<LI><A Href=#PolkaEnd>PolkaEnd</a>
|
<LI><A Href=#PolkaEnd>PolkaEnd</a>
|
||||||
</ul>
|
</ul>
|
||||||
<A Name=Polka></a>
|
<A Name=Polka></a>
|
||||||
|
@ -193,6 +194,24 @@
|
||||||
</Table>
|
</Table>
|
||||||
</TD></TR>
|
</TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
<A Name=PolkaIntro8></a>
|
||||||
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
|
<TR><TD>
|
||||||
|
<H2> PolkaIntro8 </H2>
|
||||||
|
Expanded version of PolkaIntro for 8 bars. <B>(8)</B>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD>
|
||||||
|
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||||
|
<TR><TD> Bass </TD> <TD> Tuba </TD></TR>
|
||||||
|
<TR><TD> Chord </TD> <TD> Accordion </TD></TR>
|
||||||
|
<TR><TD> Chord-Guitar </TD> <TD> JazzGuitar </TD></TR>
|
||||||
|
<TR><TD> Drum </TD> <TD> Slap </TD></TR>
|
||||||
|
<TR><TD> Drum-Cym </TD> <TD> CrashCymbal1 </TD></TR>
|
||||||
|
<TR><TD> Drum-Hh </TD> <TD> ClosedHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Snare </TD> <TD> SnareDrum1 </TD></TR>
|
||||||
|
</Table>
|
||||||
|
</TD></TR>
|
||||||
|
</Table>
|
||||||
<A Name=PolkaEnd></a>
|
<A Name=PolkaEnd></a>
|
||||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
<TR><TD>
|
<TR><TD>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:11 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:30:01 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Popballad</H1>
|
<H1>Popballad</H1>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:11 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:30:01 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Quickstep</H1>
|
<H1>Quickstep</H1>
|
||||||
|
@ -11,6 +11,7 @@
|
||||||
<LI><A Href=#QuickStepDuh>QuickStepDuh</a>
|
<LI><A Href=#QuickStepDuh>QuickStepDuh</a>
|
||||||
<LI><A Href=#QuickStepDuhSus>QuickStepDuhSus</a>
|
<LI><A Href=#QuickStepDuhSus>QuickStepDuhSus</a>
|
||||||
<LI><A Href=#QuickStepIntro>QuickStepIntro</a>
|
<LI><A Href=#QuickStepIntro>QuickStepIntro</a>
|
||||||
|
<LI><A Href=#QuickStepIntro8>QuickStepIntro8</a>
|
||||||
<LI><A Href=#QuickStepEnd>QuickStepEnd</a>
|
<LI><A Href=#QuickStepEnd>QuickStepEnd</a>
|
||||||
</ul>
|
</ul>
|
||||||
<A Name=QuickStep></a>
|
<A Name=QuickStep></a>
|
||||||
|
@ -139,6 +140,23 @@
|
||||||
</Table>
|
</Table>
|
||||||
</TD></TR>
|
</TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
<A Name=QuickStepIntro8></a>
|
||||||
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
|
<TR><TD>
|
||||||
|
<H2> QuickStepIntro8 </H2>
|
||||||
|
The 4 bar intro stretched to 8. <B>(8)</B>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD>
|
||||||
|
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||||
|
<TR><TD> Bass </TD> <TD> AcousticBass </TD></TR>
|
||||||
|
<TR><TD> Chord-Guitar </TD> <TD> JazzGuitar </TD></TR>
|
||||||
|
<TR><TD> Chord-Piano </TD> <TD> Piano2 </TD></TR>
|
||||||
|
<TR><TD> Drum-Closedhh </TD> <TD> ClosedHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
|
<TR><TD> Drum-Openhh </TD> <TD> OpenHiHat </TD></TR>
|
||||||
|
</Table>
|
||||||
|
</TD></TR>
|
||||||
|
</Table>
|
||||||
<A Name=QuickStepEnd></a>
|
<A Name=QuickStepEnd></a>
|
||||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
<TR><TD>
|
<TR><TD>
|
||||||
|
|
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>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Rb</H1>
|
<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>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Rhumba</H1>
|
<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>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Rock-128</H1>
|
<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>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Rockballad</H1>
|
<H1>Rockballad</H1>
|
||||||
|
@ -27,7 +27,9 @@
|
||||||
<LI><A Href=#RockBalladFill>RockBalladFill</a>
|
<LI><A Href=#RockBalladFill>RockBalladFill</a>
|
||||||
<LI><A Href=#RockBallad1Fill>RockBallad1Fill</a>
|
<LI><A Href=#RockBallad1Fill>RockBallad1Fill</a>
|
||||||
<LI><A Href=#RockBalladVoice>RockBalladVoice</a>
|
<LI><A Href=#RockBalladVoice>RockBalladVoice</a>
|
||||||
|
<LI><A Href=#RockBallad1Voice>RockBallad1Voice</a>
|
||||||
<LI><A Href=#RockBalladIntro>RockBalladIntro</a>
|
<LI><A Href=#RockBalladIntro>RockBalladIntro</a>
|
||||||
|
<LI><A Href=#RockBalladSusIntro>RockBalladSusIntro</a>
|
||||||
<LI><A Href=#RockBalladEnd>RockBalladEnd</a>
|
<LI><A Href=#RockBalladEnd>RockBalladEnd</a>
|
||||||
<LI><A Href=#RockBalladEnd1>RockBalladEnd1</a>
|
<LI><A Href=#RockBalladEnd1>RockBalladEnd1</a>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -119,6 +121,24 @@
|
||||||
</Table>
|
</Table>
|
||||||
</TD></TR>
|
</TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
<A Name=RockBallad1Voice></a>
|
||||||
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
|
<TR><TD>
|
||||||
|
<H2> RockBallad1Voice </H2>
|
||||||
|
Cheese without 4th bar triplets. <B>(4)</B>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD>
|
||||||
|
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||||
|
<TR><TD> Bass </TD> <TD> FretlessBass </TD></TR>
|
||||||
|
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||||
|
<TR><TD> Chord-Sus </TD> <TD> ChoirAahs </TD></TR>
|
||||||
|
<TR><TD> Drum </TD> <TD> ClosedHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
|
<TR><TD> Drum-Snare </TD> <TD> SnareDrum1 </TD></TR>
|
||||||
|
<TR><TD> Walk </TD> <TD> FretlessBass </TD></TR>
|
||||||
|
</Table>
|
||||||
|
</TD></TR>
|
||||||
|
</Table>
|
||||||
<A Name=RockBalladIntro></a>
|
<A Name=RockBalladIntro></a>
|
||||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
<TR><TD>
|
<TR><TD>
|
||||||
|
@ -132,7 +152,23 @@
|
||||||
<TR><TD> Drum </TD> <TD> ClosedHiHat </TD></TR>
|
<TR><TD> Drum </TD> <TD> ClosedHiHat </TD></TR>
|
||||||
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
<TR><TD> Drum-Snare </TD> <TD> SnareDrum1 </TD></TR>
|
<TR><TD> Drum-Snare </TD> <TD> SnareDrum1 </TD></TR>
|
||||||
<TR><TD> Walk </TD> <TD> FretlessBass </TD></TR>
|
</Table>
|
||||||
|
</TD></TR>
|
||||||
|
</Table>
|
||||||
|
<A Name=RockBalladSusIntro></a>
|
||||||
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
|
<TR><TD>
|
||||||
|
<H2> RockBalladSusIntro </H2>
|
||||||
|
4 bar intro with mostly strings. <B>(4)</B>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD>
|
||||||
|
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||||
|
<TR><TD> Bass </TD> <TD> FretlessBass </TD></TR>
|
||||||
|
<TR><TD> Chord </TD> <TD> JazzGuitar </TD></TR>
|
||||||
|
<TR><TD> Chord-Sus </TD> <TD> ChoirAahs </TD></TR>
|
||||||
|
<TR><TD> Drum </TD> <TD> ClosedHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
|
<TR><TD> Drum-Snare </TD> <TD> SnareDrum1 </TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
</TD></TR>
|
</TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
|
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>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Samba</H1>
|
<H1>Samba</H1>
|
||||||
|
@ -37,7 +37,7 @@
|
||||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
<TR><TD>
|
<TR><TD>
|
||||||
<H2> SambaFill </H2>
|
<H2> SambaFill </H2>
|
||||||
Adds a whistle to the sandard beat. <B>(4)</B>
|
Adds a whistle to the standard beat. <B>(4)</B>
|
||||||
</TD></TR>
|
</TD></TR>
|
||||||
<TR><TD>
|
<TR><TD>
|
||||||
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||||
|
|
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>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Shuffleboggie</H1>
|
<H1>Shuffleboggie</H1>
|
||||||
|
@ -10,6 +10,7 @@
|
||||||
<LI><A Href=#ShuffleBoggieIntro>ShuffleBoggieIntro</a>
|
<LI><A Href=#ShuffleBoggieIntro>ShuffleBoggieIntro</a>
|
||||||
<LI><A Href=#ShuffleBoggieIntro4>ShuffleBoggieIntro4</a>
|
<LI><A Href=#ShuffleBoggieIntro4>ShuffleBoggieIntro4</a>
|
||||||
<LI><A Href=#ShuffleBoggieEnd>ShuffleBoggieEnd</a>
|
<LI><A Href=#ShuffleBoggieEnd>ShuffleBoggieEnd</a>
|
||||||
|
<LI><A Href=#ShuffleBoggieFill>ShuffleBoggieFill</a>
|
||||||
</ul>
|
</ul>
|
||||||
<A Name=ShuffleBoggie></a>
|
<A Name=ShuffleBoggie></a>
|
||||||
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
|
@ -133,5 +134,24 @@
|
||||||
</Table>
|
</Table>
|
||||||
</TD></TR>
|
</TD></TR>
|
||||||
</Table>
|
</Table>
|
||||||
|
<A Name=ShuffleBoggieFill></a>
|
||||||
|
<Table Border=3 CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="60%">
|
||||||
|
<TR><TD>
|
||||||
|
<H2> ShuffleBoggieFill </H2>
|
||||||
|
Single bar fill. <B>(1)</B>
|
||||||
|
</TD></TR>
|
||||||
|
<TR><TD>
|
||||||
|
<Table CELLSPACING=0 CELLPADDING=5 BGColor="#eeeeee" Width="10%">
|
||||||
|
<TR><TD> Bass </TD> <TD> SlapBass1 </TD></TR>
|
||||||
|
<TR><TD> Chord-Guitar </TD> <TD> MutedGuitar </TD></TR>
|
||||||
|
<TR><TD> Chord-Piano </TD> <TD> Piano2 </TD></TR>
|
||||||
|
<TR><TD> Chord-Sax </TD> <TD> TenorSax </TD></TR>
|
||||||
|
<TR><TD> Drum-Clap </TD> <TD> HandClap </TD></TR>
|
||||||
|
<TR><TD> Drum-Kick </TD> <TD> KickDrum1 </TD></TR>
|
||||||
|
<TR><TD> Drum-Ohh </TD> <TD> OpenHiHat </TD></TR>
|
||||||
|
<TR><TD> Drum-Snare </TD> <TD> SnareDrum2 </TD></TR>
|
||||||
|
</Table>
|
||||||
|
</TD></TR>
|
||||||
|
</Table>
|
||||||
|
|
||||||
</Body></HTML>
|
</Body></HTML>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:13 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:30:03 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Ska</H1>
|
<H1>Ska</H1>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:13 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:30:03 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Slowblues</H1>
|
<H1>Slowblues</H1>
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<!-- Auto-Generated by MMA on: Wed Mar 7 11:50:13 2007 -->
|
<!-- Auto-Generated by MMA on: Sun Sep 28 11:30:03 2008 -->
|
||||||
<HTML>
|
<HTML>
|
||||||
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
<BODY BGCOLOR="#B7DFFF" Text=Black>
|
||||||
<H1>Slowbolero</H1>
|
<H1>Slowbolero</H1>
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user